diff --git a/Cargo.lock b/Cargo.lock index 10828e1..47f46e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -542,6 +542,7 @@ dependencies = [ "anyhow", "common", "gpui", + "instant", "log", "semver", "serde", @@ -1058,6 +1059,7 @@ dependencies = [ "futures", "fuzzy-matcher", "gpui", + "instant", "itertools 0.13.0", "log", "nostr-sdk", @@ -1259,6 +1261,7 @@ dependencies = [ "dirs 5.0.1", "futures", "gpui", + "instant", "itertools 0.13.0", "log", "nostr", @@ -1725,6 +1728,7 @@ dependencies = [ "common", "flume 0.11.1", "gpui", + "instant", "log", "nostr-sdk", "person", @@ -3491,6 +3495,15 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + [[package]] name = "interpolate_name" version = "0.2.4" @@ -4919,6 +4932,7 @@ dependencies = [ "common", "flume 0.11.1", "gpui", + "instant", "log", "nostr-sdk", "smallvec", @@ -6663,6 +6677,7 @@ dependencies = [ "futures", "gpui", "gpui_tokio", + "instant", "log", "mime_guess", "nostr", @@ -7551,6 +7566,7 @@ dependencies = [ "anyhow", "common", "gpui", + "instant", "itertools 0.13.0", "log", "lsp-types", @@ -8993,6 +9009,7 @@ dependencies = [ "common", "device", "gpui", + "instant", "log", "nostr-connect", "nostr-sdk", diff --git a/Cargo.toml b/Cargo.toml index 94be91f..3ac4266 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,6 +44,7 @@ smol = "2" webbrowser = "1.0.4" tracing-subscriber = { version = "0.3.18", features = ["fmt", "env-filter"] } errno = { version = "0.3.14", default-features = false } +instant = "0.1" [patch.crates-io] # Use stacker's psm version which may have better WASM support diff --git a/crates/auto_update/Cargo.toml b/crates/auto_update/Cargo.toml index aff6855..6c3767a 100644 --- a/crates/auto_update/Cargo.toml +++ b/crates/auto_update/Cargo.toml @@ -8,6 +8,7 @@ publish.workspace = true common = { path = "../common" } gpui.workspace = true +instant.workspace = true anyhow.workspace = true log.workspace = true smallvec.workspace = true diff --git a/crates/auto_update/src/lib.rs b/crates/auto_update/src/lib.rs index b57f292..8a46a73 100644 --- a/crates/auto_update/src/lib.rs +++ b/crates/auto_update/src/lib.rs @@ -3,7 +3,6 @@ use std::ffi::OsString; use std::path::{Path, PathBuf}; use std::sync::Arc; -use std::time::Duration; use anyhow::{Context as AnyhowContext, Error, anyhow}; use gpui::http_client::{AsyncBody, HttpClient}; @@ -11,6 +10,7 @@ use gpui::{ App, AppContext, AsyncApp, BackgroundExecutor, Context, Entity, Global, Subscription, Task, Window, }; +use instant::Duration; use semver::Version; use serde::Deserialize; use smallvec::{SmallVec, smallvec}; diff --git a/crates/chat/Cargo.toml b/crates/chat/Cargo.toml index 01f1184..ad7fd71 100644 --- a/crates/chat/Cargo.toml +++ b/crates/chat/Cargo.toml @@ -13,6 +13,7 @@ settings = { path = "../settings" } gpui.workspace = true nostr-sdk.workspace = true +instant.workspace = true anyhow.workspace = true itertools.workspace = true diff --git a/crates/chat/src/lib.rs b/crates/chat/src/lib.rs index 78e9184..9f7a0fe 100644 --- a/crates/chat/src/lib.rs +++ b/crates/chat/src/lib.rs @@ -2,7 +2,7 @@ use std::cmp::Reverse; use std::collections::{BTreeSet, HashMap, HashSet}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, LazyLock, RwLock}; -use std::time::Duration; +use instant::Duration; use anyhow::{Error, anyhow}; use common::EventExt; diff --git a/crates/chat/src/room.rs b/crates/chat/src/room.rs index 88cdbd0..d207c05 100644 --- a/crates/chat/src/room.rs +++ b/crates/chat/src/room.rs @@ -1,6 +1,6 @@ use std::cmp::Ordering; use std::hash::{Hash, Hasher}; -use std::time::Duration; +use instant::Duration; use anyhow::{Error, anyhow}; use common::EventExt; diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index bdad290..4c8c198 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -7,6 +7,7 @@ publish.workspace = true [dependencies] gpui.workspace = true nostr.workspace = true +instant.workspace = true nostr-sdk.workspace = true itertools.workspace = true diff --git a/crates/common/src/debounced_delay.rs b/crates/common/src/debounced_delay.rs index 995e983..17e1c22 100644 --- a/crates/common/src/debounced_delay.rs +++ b/crates/common/src/debounced_delay.rs @@ -1,5 +1,5 @@ use std::marker::PhantomData; -use std::time::Duration; +use instant::Duration; use futures::channel::oneshot; use futures::FutureExt; diff --git a/crates/device/Cargo.toml b/crates/device/Cargo.toml index 20131b2..fa2b0c3 100644 --- a/crates/device/Cargo.toml +++ b/crates/device/Cargo.toml @@ -14,6 +14,7 @@ settings = { path = "../settings" } gpui.workspace = true nostr-sdk.workspace = true +instant.workspace = true anyhow.workspace = true smallvec.workspace = true log.workspace = true diff --git a/crates/device/src/lib.rs b/crates/device/src/lib.rs index 98efdf7..32c2ea1 100644 --- a/crates/device/src/lib.rs +++ b/crates/device/src/lib.rs @@ -4,7 +4,7 @@ use std::path::PathBuf; use std::rc::Rc; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; -use std::time::Duration; +use instant::Duration; use anyhow::{Context as AnyhowContext, Error, anyhow}; use gpui::{ diff --git a/crates/person/Cargo.toml b/crates/person/Cargo.toml index 9ba05ed..ea15a5b 100644 --- a/crates/person/Cargo.toml +++ b/crates/person/Cargo.toml @@ -10,6 +10,7 @@ state = { path = "../state" } gpui.workspace = true nostr-sdk.workspace = true +instant.workspace = true anyhow.workspace = true smallvec.workspace = true flume.workspace = true diff --git a/crates/person/src/lib.rs b/crates/person/src/lib.rs index f2ebd82..a0a46e2 100644 --- a/crates/person/src/lib.rs +++ b/crates/person/src/lib.rs @@ -1,6 +1,6 @@ use std::collections::{HashMap, HashSet}; use std::sync::RwLock; -use std::time::Duration; +use instant::Duration; use anyhow::{Error, anyhow}; use common::EventExt; diff --git a/crates/state/Cargo.toml b/crates/state/Cargo.toml index 15e6006..273dbe2 100644 --- a/crates/state/Cargo.toml +++ b/crates/state/Cargo.toml @@ -14,6 +14,7 @@ nostr-blossom.workspace = true nostr-connect.workspace = true gpui.workspace = true +instant.workspace = true flume.workspace = true futures.workspace = true log.workspace = true diff --git a/crates/state/src/lib.rs b/crates/state/src/lib.rs index 9064300..1f236f4 100644 --- a/crates/state/src/lib.rs +++ b/crates/state/src/lib.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use std::time::Duration; +use instant::Duration; use anyhow::{Error, anyhow}; use common::config_dir; diff --git a/crates/ui/Cargo.toml b/crates/ui/Cargo.toml index 921d37a..ce16ba9 100644 --- a/crates/ui/Cargo.toml +++ b/crates/ui/Cargo.toml @@ -9,6 +9,7 @@ common = { path = "../common" } theme = { path = "../theme" } gpui.workspace = true +instant.workspace = true serde.workspace = true smallvec.workspace = true anyhow.workspace = true diff --git a/crates/ui/src/checkbox.rs b/crates/ui/src/checkbox.rs index 0434032..1ce8e19 100644 --- a/crates/ui/src/checkbox.rs +++ b/crates/ui/src/checkbox.rs @@ -1,5 +1,5 @@ use std::rc::Rc; -use std::time::Duration; +use instant::Duration; use gpui::prelude::FluentBuilder as _; use gpui::{ diff --git a/crates/ui/src/history.rs b/crates/ui/src/history.rs index d933c4c..56785f0 100644 --- a/crates/ui/src/history.rs +++ b/crates/ui/src/history.rs @@ -1,5 +1,5 @@ use std::fmt::Debug; -use std::time::{Duration, Instant}; +use instant::{Duration, Instant}; /// A HistoryItem represents a single change in the history. /// It must implement Clone and PartialEq to be used in the History. diff --git a/crates/ui/src/indicator.rs b/crates/ui/src/indicator.rs index b07bb65..f606559 100644 --- a/crates/ui/src/indicator.rs +++ b/crates/ui/src/indicator.rs @@ -1,4 +1,4 @@ -use std::time::Duration; +use instant::Duration; use gpui::prelude::FluentBuilder as _; use gpui::{ diff --git a/crates/ui/src/input/blink_cursor.rs b/crates/ui/src/input/blink_cursor.rs index 98b112d..a0c2c97 100644 --- a/crates/ui/src/input/blink_cursor.rs +++ b/crates/ui/src/input/blink_cursor.rs @@ -1,4 +1,4 @@ -use std::time::Duration; +use instant::Duration; use gpui::{Context, Pixels, Task, px}; diff --git a/crates/ui/src/input/state.rs b/crates/ui/src/input/state.rs index 5bd5fcf..429ac86 100644 --- a/crates/ui/src/input/state.rs +++ b/crates/ui/src/input/state.rs @@ -383,7 +383,7 @@ impl InputState { pub fn new(window: &mut Window, cx: &mut Context) -> Self { let focus_handle = cx.focus_handle().tab_stop(true); let blink_cursor = cx.new(|_| BlinkCursor::new()); - let history = History::new().group_interval(std::time::Duration::from_secs(1)); + let history = History::new().group_interval(instant::Duration::from_secs(1)); let _subscriptions = vec![ // Observe the blink cursor to repaint the view when it changes. diff --git a/crates/ui/src/list/list.rs b/crates/ui/src/list/list.rs index d0ab462..8b2d4d6 100644 --- a/crates/ui/src/list/list.rs +++ b/crates/ui/src/list/list.rs @@ -1,5 +1,4 @@ use std::ops::Range; -use std::time::Duration; use gpui::prelude::FluentBuilder; use gpui::{ @@ -9,6 +8,7 @@ use gpui::{ SharedString, StatefulInteractiveElement, StyleRefinement, Styled, Subscription, Task, UniformListScrollHandle, Window, div, px, size, uniform_list, }; +use instant::Duration; use theme::ActiveTheme; use crate::actions::{Cancel, Confirm, SelectDown, SelectUp}; diff --git a/crates/ui/src/modal.rs b/crates/ui/src/modal.rs index afa2b75..b93bfc0 100644 --- a/crates/ui/src/modal.rs +++ b/crates/ui/src/modal.rs @@ -1,5 +1,5 @@ use std::rc::Rc; -use std::time::Duration; +use instant::Duration; use gpui::prelude::FluentBuilder; use gpui::{ diff --git a/crates/ui/src/notification.rs b/crates/ui/src/notification.rs index 4779a37..b297d4e 100644 --- a/crates/ui/src/notification.rs +++ b/crates/ui/src/notification.rs @@ -1,7 +1,7 @@ use std::any::TypeId; use std::collections::{HashMap, VecDeque}; use std::rc::Rc; -use std::time::Duration; +use instant::Duration; use gpui::prelude::FluentBuilder; use gpui::{ diff --git a/crates/ui/src/scroll/scrollbar.rs b/crates/ui/src/scroll/scrollbar.rs index da946fb..bce26e9 100644 --- a/crates/ui/src/scroll/scrollbar.rs +++ b/crates/ui/src/scroll/scrollbar.rs @@ -2,7 +2,6 @@ use std::cell::Cell; use std::ops::Deref; use std::panic::Location; use std::rc::Rc; -use std::time::{Duration, Instant}; use gpui::{ Anchor, App, Axis, BorderStyle, Bounds, ContentMask, CursorStyle, Edges, Element, ElementId, @@ -11,6 +10,7 @@ use gpui::{ Position, ScrollHandle, ScrollWheelEvent, Size, Style, UniformListScrollHandle, Window, fill, point, px, relative, size, }; +use instant::{Duration, Instant}; use theme::{ActiveTheme, AxisExt, ScrollbarMode}; /// The width of the scrollbar (THUMB_ACTIVE_INSET * 2 + THUMB_ACTIVE_WIDTH) @@ -157,7 +157,7 @@ impl ScrollbarStateInner { let mut state = *self; state.hovered_axis = axis; if axis.is_some() { - state.last_scroll_time = Some(std::time::Instant::now()); + state.last_scroll_time = Some(instant::Instant::now()); } state } @@ -166,7 +166,7 @@ impl ScrollbarStateInner { let mut state = *self; state.hovered_on_thumb = axis; if self.is_scrollbar_visible() && axis.is_some() { - state.last_scroll_time = Some(std::time::Instant::now()); + state.last_scroll_time = Some(instant::Instant::now()); } state } diff --git a/crates/ui/src/skeleton.rs b/crates/ui/src/skeleton.rs index 441296d..ebb2bc8 100644 --- a/crates/ui/src/skeleton.rs +++ b/crates/ui/src/skeleton.rs @@ -1,4 +1,4 @@ -use std::time::Duration; +use instant::Duration; use gpui::{ bounce, div, ease_in_out, Animation, AnimationExt, IntoElement, RenderOnce, StyleRefinement, diff --git a/crates/ui/src/switch.rs b/crates/ui/src/switch.rs index 70aa3b6..375da35 100644 --- a/crates/ui/src/switch.rs +++ b/crates/ui/src/switch.rs @@ -1,6 +1,6 @@ use std::cell::RefCell; use std::rc::Rc; -use std::time::Duration; +use instant::Duration; use gpui::prelude::FluentBuilder as _; use gpui::{ diff --git a/crates/workspace/Cargo.toml b/crates/workspace/Cargo.toml index f37ed1e..61bb5c6 100644 --- a/crates/workspace/Cargo.toml +++ b/crates/workspace/Cargo.toml @@ -17,6 +17,7 @@ person = { path = "../person" } gpui.workspace = true nostr-sdk.workspace = true +instant.workspace = true nostr-connect.workspace = true anyhow.workspace = true diff --git a/crates/workspace/src/dialogs/import.rs b/crates/workspace/src/dialogs/import.rs index 37a6763..3ff1189 100644 --- a/crates/workspace/src/dialogs/import.rs +++ b/crates/workspace/src/dialogs/import.rs @@ -1,4 +1,4 @@ -use std::time::Duration; +use instant::Duration; use anyhow::{Error, anyhow}; use gpui::prelude::FluentBuilder; diff --git a/crates/workspace/src/dialogs/restore.rs b/crates/workspace/src/dialogs/restore.rs index b51424b..958d387 100644 --- a/crates/workspace/src/dialogs/restore.rs +++ b/crates/workspace/src/dialogs/restore.rs @@ -1,4 +1,4 @@ -use std::time::Duration; +use instant::Duration; use anyhow::Error; use device::DeviceRegistry; diff --git a/crates/workspace/src/dialogs/screening.rs b/crates/workspace/src/dialogs/screening.rs index a5e7c06..744e4cd 100644 --- a/crates/workspace/src/dialogs/screening.rs +++ b/crates/workspace/src/dialogs/screening.rs @@ -1,5 +1,4 @@ use std::collections::HashMap; -use std::time::Duration; use anyhow::Error; use common::TimestampExt; @@ -8,6 +7,7 @@ use gpui::{ App, AppContext, Context, Div, Entity, InteractiveElement, IntoElement, ParentElement, Render, SharedString, Styled, Subscription, Task, Window, div, px, relative, uniform_list, }; +use instant::Duration; use nostr_sdk::prelude::*; use person::{Person, PersonRegistry, shorten_pubkey}; use smallvec::{SmallVec, smallvec}; diff --git a/crates/workspace/src/lib.rs b/crates/workspace/src/lib.rs index ef5b812..143185e 100644 --- a/crates/workspace/src/lib.rs +++ b/crates/workspace/src/lib.rs @@ -79,20 +79,16 @@ impl Workspace { let device = DeviceRegistry::global(cx); let nostr = NostrRegistry::global(cx); - let dock = cx.new(|cx| DockArea::new(window, cx)); + let dock = cx.new(|cx| { + let mut this = DockArea::new(window, cx); + let left = DockItem::panel(Arc::new(sidebar::init(window, cx))); + this.set_left_dock(left, Some(SIDEBAR_WIDTH), true, window, cx); + this + }); + let image_cache = CoopImageCache::new(IMAGE_CACHE_SIZE, cx); - let mut subscriptions = smallvec![]; - subscriptions.push( - // Observe sign in state changes - cx.observe_in(&nostr, window, move |this, nostr, window, cx| { - if nostr.read(cx).current_user().is_some() { - this.set_center_layout(window, cx); - } - }), - ); - subscriptions.push( // Observe system appearance and update theme cx.observe_window_appearance(window, |_this, window, cx| { @@ -105,11 +101,7 @@ impl Workspace { cx.subscribe_in(&nostr, window, move |this, _state, event, window, cx| { match event { StateEvent::SignerChanged => { - this.set_center_layout(window, cx); - - cx.defer_in(window, |_this, window, cx| { - window.close_all_modals(cx); - }); + window.close_all_modals(cx); } StateEvent::NoSigner => { this.import_identity(window, cx); @@ -241,9 +233,15 @@ impl Workspace { }), ); - // Set the layout at the end of cycle cx.defer_in(window, |this, window, cx| { - this.set_layout(window, cx); + let dock = this.dock.downgrade(); + let greeter = Arc::new(greeter::init(window, cx)); + let tabs = DockItem::tabs(vec![greeter], None, &dock, window, cx); + let center = DockItem::split(Axis::Vertical, vec![tabs], &dock, window, cx); + + this.dock.update(cx, |this, cx| { + this.set_center(center, window, cx); + }); }); Self { @@ -281,29 +279,6 @@ impl Workspace { .collect() } - /// Set the dock layout - fn set_layout(&mut self, window: &mut Window, cx: &mut Context) { - let left = DockItem::panel(Arc::new(sidebar::init(window, cx))); - - // Update the dock layout with sidebar on the left - self.dock.update(cx, |this, cx| { - this.set_left_dock(left, Some(SIDEBAR_WIDTH), true, window, cx); - }); - } - - /// Set the center dock layout - fn set_center_layout(&mut self, window: &mut Window, cx: &mut Context) { - let dock = self.dock.downgrade(); - let greeter = Arc::new(greeter::init(window, cx)); - let tabs = DockItem::tabs(vec![greeter], None, &dock, window, cx); - let center = DockItem::split(Axis::Vertical, vec![tabs], &dock, window, cx); - - // Update the layout with center dock - self.dock.update(cx, |this, cx| { - this.set_center(center, window, cx); - }); - } - /// Handle command events fn on_command(&mut self, command: &Command, window: &mut Window, cx: &mut Context) { match command { @@ -834,7 +809,7 @@ impl Render for Workspace { let notification_layer = Root::render_notification_layer(window, cx); div() - .id(SharedString::from("workspace")) + .id("workspace") .on_action(cx.listener(Self::on_command)) .relative() .size_full() diff --git a/crates/workspace/src/panels/backup.rs b/crates/workspace/src/panels/backup.rs index 498ba46..df130cd 100644 --- a/crates/workspace/src/panels/backup.rs +++ b/crates/workspace/src/panels/backup.rs @@ -1,4 +1,4 @@ -use std::time::Duration; +use instant::Duration; use anyhow::Error; use gpui::{ diff --git a/crates/workspace/src/panels/contact_list.rs b/crates/workspace/src/panels/contact_list.rs index 47188e1..0e035fb 100644 --- a/crates/workspace/src/panels/contact_list.rs +++ b/crates/workspace/src/panels/contact_list.rs @@ -1,5 +1,5 @@ use std::collections::HashSet; -use std::time::Duration; +use instant::Duration; use anyhow::Error; use gpui::prelude::FluentBuilder; diff --git a/crates/workspace/src/panels/messaging_relays.rs b/crates/workspace/src/panels/messaging_relays.rs index b89ca81..f95af38 100644 --- a/crates/workspace/src/panels/messaging_relays.rs +++ b/crates/workspace/src/panels/messaging_relays.rs @@ -1,5 +1,5 @@ use std::collections::HashSet; -use std::time::Duration; +use instant::Duration; use anyhow::{Error, anyhow}; use gpui::prelude::FluentBuilder; diff --git a/crates/workspace/src/panels/profile.rs b/crates/workspace/src/panels/profile.rs index 0ef620e..39c8e91 100644 --- a/crates/workspace/src/panels/profile.rs +++ b/crates/workspace/src/panels/profile.rs @@ -1,5 +1,4 @@ use std::str::FromStr; -use std::time::Duration; use anyhow::{Context as AnyhowContext, Error}; use gpui::{ @@ -7,6 +6,7 @@ use gpui::{ Focusable, IntoElement, ParentElement, PathPromptOptions, Render, SharedString, Styled, Task, Window, div, }; +use instant::Duration; use nostr_sdk::prelude::*; use person::{Person, PersonRegistry, shorten_pubkey}; use settings::AppSettings; diff --git a/crates/workspace/src/panels/relay_list.rs b/crates/workspace/src/panels/relay_list.rs index df3eabe..f82e8f6 100644 --- a/crates/workspace/src/panels/relay_list.rs +++ b/crates/workspace/src/panels/relay_list.rs @@ -1,5 +1,5 @@ use std::collections::HashSet; -use std::time::Duration; +use instant::Duration; use anyhow::{Error, anyhow}; use gpui::prelude::FluentBuilder; diff --git a/crates/workspace/src/sidebar/mod.rs b/crates/workspace/src/sidebar/mod.rs index 0b884ec..ec61c89 100644 --- a/crates/workspace/src/sidebar/mod.rs +++ b/crates/workspace/src/sidebar/mod.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; use std::ops::Range; -use std::time::Duration; +use instant::Duration; use anyhow::Error; use chat::{ChatEvent, ChatRegistry, Room, RoomKind};