diff --git a/zed/src/lib.rs b/zed/src/lib.rs index 2290d5cf28aa476a65658ea35665a6d67fcd4483..d674fd5ea662cd49eb5582bb00fb724a7c6987b5 100644 --- a/zed/src/lib.rs +++ b/zed/src/lib.rs @@ -19,16 +19,18 @@ mod util; pub mod workspace; pub mod worktree; +use crate::util::TryFutureExt; use channel::ChannelList; use gpui::{action, ModelHandle}; -pub use settings::Settings; - use parking_lot::Mutex; use postage::watch; use std::sync::Arc; +pub use settings::Settings; + action!(About); action!(Quit); +action!(Authenticate); pub struct AppState { pub settings_tx: Arc>>, @@ -40,8 +42,17 @@ pub struct AppState { pub channel_list: ModelHandle, } -pub fn init(cx: &mut gpui::MutableAppContext) { +pub fn init(app_state: &Arc, cx: &mut gpui::MutableAppContext) { cx.add_global_action(quit); + + cx.add_global_action({ + let rpc = app_state.rpc.clone(); + move |_: &Authenticate, cx| { + let rpc = rpc.clone(); + cx.spawn(|cx| async move { rpc.authenticate_and_connect(cx).log_err().await }) + .detach(); + } + }); } fn quit(_: &Quit, cx: &mut gpui::MutableAppContext) { diff --git a/zed/src/main.rs b/zed/src/main.rs index e3e365d15e888d70983c19cb0eae4917bfd2e5eb..1e77edd151ff3ef4032ac66cb6cde1cc5771d11e 100644 --- a/zed/src/main.rs +++ b/zed/src/main.rs @@ -39,11 +39,11 @@ fn main() { fs: Arc::new(RealFs), }); - zed::init(cx); + zed::init(&app_state, cx); workspace::init(cx); editor::init(cx); file_finder::init(cx); - theme_selector::init(cx, &app_state); + theme_selector::init(&app_state, cx); cx.set_menus(menus::menus(&app_state.clone())); diff --git a/zed/src/menus.rs b/zed/src/menus.rs index c43d72a87dfb83fd8d6dc2332fa183001bb16f8f..9ba28f9cef875b699bdc9ab5cc401c2f0c87332e 100644 --- a/zed/src/menus.rs +++ b/zed/src/menus.rs @@ -16,6 +16,11 @@ pub fn menus(state: &Arc) -> Vec> { action: Box::new(super::About), }, MenuItem::Separator, + MenuItem::Action { + name: "Sign In", + keystroke: None, + action: Box::new(super::Authenticate), + }, MenuItem::Action { name: "Share", keystroke: None, diff --git a/zed/src/rpc.rs b/zed/src/rpc.rs index b8909a988a5d1bbf4adfa08a1114d52092d0888e..b9992de6633604b2c066f625d57a1d393cd1ca43 100644 --- a/zed/src/rpc.rs +++ b/zed/src/rpc.rs @@ -124,7 +124,10 @@ impl Client { } } - pub async fn log_in_and_connect(self: &Arc, cx: AsyncAppContext) -> surf::Result<()> { + pub async fn authenticate_and_connect( + self: &Arc, + cx: AsyncAppContext, + ) -> anyhow::Result<()> { if self.state.read().connection_id.is_some() { return Ok(()); } @@ -161,7 +164,7 @@ impl Client { user_id: u64, conn: Conn, cx: AsyncAppContext, - ) -> surf::Result<()> + ) -> anyhow::Result<()> where Conn: 'static + futures::Sink diff --git a/zed/src/theme_selector.rs b/zed/src/theme_selector.rs index bfe5977e2e175a227ff5810ebdbb27894245c669..eb062899c171505120996b39089f1c30569619e9 100644 --- a/zed/src/theme_selector.rs +++ b/zed/src/theme_selector.rs @@ -34,7 +34,7 @@ action!(Confirm); action!(Toggle, Arc); action!(Reload, Arc); -pub fn init(cx: &mut MutableAppContext, app_state: &Arc) { +pub fn init(app_state: &Arc, cx: &mut MutableAppContext) { cx.add_action(ThemeSelector::confirm); cx.add_action(ThemeSelector::select_prev); cx.add_action(ThemeSelector::select_next); diff --git a/zed/src/workspace.rs b/zed/src/workspace.rs index 28ed2701d123035c81493a5ce0d3e5b373b7a32e..4013b068a3bc62d7d70d0663b4ce616312878d2b 100644 --- a/zed/src/workspace.rs +++ b/zed/src/workspace.rs @@ -791,7 +791,7 @@ impl Workspace { let platform = cx.platform(); let task = cx.spawn(|this, mut cx| async move { - rpc.log_in_and_connect(cx.clone()).await?; + rpc.authenticate_and_connect(cx.clone()).await?; let share_task = this.update(&mut cx, |this, cx| { let worktree = this.worktrees.iter().next()?; @@ -823,7 +823,7 @@ impl Workspace { let languages = self.languages.clone(); let task = cx.spawn(|this, mut cx| async move { - rpc.log_in_and_connect(cx.clone()).await?; + rpc.authenticate_and_connect(cx.clone()).await?; let worktree_url = cx .platform()