diff --git a/Cargo.lock b/Cargo.lock index 1391ead446c89a4629376d16e15ac0a3f351891e..196c97b5edc6e6ef8e1bbf6a12d5f259ec94bd6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1458,7 +1458,7 @@ dependencies = [ "async-tungstenite", "collections", "db", - "feature_flags", + "feature_flags2", "futures 0.3.28", "gpui2", "image", @@ -2676,6 +2676,14 @@ dependencies = [ "gpui", ] +[[package]] +name = "feature_flags2" +version = "0.1.0" +dependencies = [ + "anyhow", + "gpui2", +] + [[package]] name = "feedback" version = "0.1.0" diff --git a/crates/client2/Cargo.toml b/crates/client2/Cargo.toml index 79ab72c41c588cfac25185827ebdeca4b3da87f1..8e892ea298285530e3c56cbb12071299bafcd1f1 100644 --- a/crates/client2/Cargo.toml +++ b/crates/client2/Cargo.toml @@ -19,7 +19,7 @@ util = { path = "../util" } rpc = { path = "../rpc" } text = { path = "../text" } settings2 = { path = "../settings2" } -feature_flags = { path = "../feature_flags" } +feature_flags2 = { path = "../feature_flags2" } sum_tree = { path = "../sum_tree" } anyhow.workspace = true diff --git a/crates/client2/src/user.rs b/crates/client2/src/user.rs index ec023c4a8c8c6cc69cff99442913fd5a289e13b3..2c96a09c3c3f58d5e32bfe804a0591cea6765011 100644 --- a/crates/client2/src/user.rs +++ b/crates/client2/src/user.rs @@ -193,16 +193,14 @@ impl UserStore { } Status::SignedOut => { current_user_tx.send(None).await.ok(); - if let Some(this) = this.upgrade(&cx) { - this.update(&mut cx, |this, cx| { - cx.notify(); - this.clear_contacts() - }) - .await; - } + this.update(&mut cx, |this, cx| { + cx.notify(); + this.clear_contacts() + }) + .await; } Status::ConnectionLost => { - if let Some(this) = this.upgrade(&cx) { + if let Some(this) = this.upgrade() { this.update(&mut cx, |this, cx| { cx.notify(); this.clear_contacts() diff --git a/crates/feature_flags2/Cargo.toml b/crates/feature_flags2/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..ad77330ac3f4396f96d8a4f8f34052a46d721663 --- /dev/null +++ b/crates/feature_flags2/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "feature_flags2" +version = "0.1.0" +edition = "2021" +publish = false + +[lib] +path = "src/feature_flags2.rs" + +[dependencies] +gpui2 = { path = "../gpui2" } +anyhow.workspace = true diff --git a/crates/feature_flags2/src/feature_flags2.rs b/crates/feature_flags2/src/feature_flags2.rs new file mode 100644 index 0000000000000000000000000000000000000000..671205553d80a526aed42f9ec7a2d8f46ea1cd9c --- /dev/null +++ b/crates/feature_flags2/src/feature_flags2.rs @@ -0,0 +1,79 @@ +use gpui2::{AppContext, Subscription, ViewContext}; + +#[derive(Default)] +struct FeatureFlags { + flags: Vec, + staff: bool, +} + +impl FeatureFlags { + fn has_flag(&self, flag: &str) -> bool { + self.staff || self.flags.iter().find(|f| f.as_str() == flag).is_some() + } +} + +pub trait FeatureFlag { + const NAME: &'static str; +} + +pub enum ChannelsAlpha {} + +impl FeatureFlag for ChannelsAlpha { + const NAME: &'static str = "channels_alpha"; +} + +pub trait FeatureFlagViewExt { + fn observe_flag(&mut self, callback: F) -> Subscription + where + F: Fn(bool, &mut V, &mut ViewContext) + 'static; +} + +impl FeatureFlagViewExt for ViewContext<'_, '_, V> { + fn observe_flag(&mut self, callback: F) -> Subscription + where + F: Fn(bool, &mut V, &mut ViewContext) + 'static, + { + self.observe_global::(move |v, cx| { + let feature_flags = cx.global::(); + callback(feature_flags.has_flag(::NAME), v, cx); + }) + } +} + +pub trait FeatureFlagAppExt { + fn update_flags(&mut self, staff: bool, flags: Vec); + fn set_staff(&mut self, staff: bool); + fn has_flag(&self) -> bool; + fn is_staff(&self) -> bool; +} + +impl FeatureFlagAppExt for AppContext { + fn update_flags(&mut self, staff: bool, flags: Vec) { + self.update_default_global::(|feature_flags, _| { + feature_flags.staff = staff; + feature_flags.flags = flags; + }) + } + + fn set_staff(&mut self, staff: bool) { + self.update_default_global::(|feature_flags, _| { + feature_flags.staff = staff; + }) + } + + fn has_flag(&self) -> bool { + if self.has_global::() { + self.global::().has_flag(T::NAME) + } else { + false + } + } + + fn is_staff(&self) -> bool { + if self.has_global::() { + return self.global::().staff; + } else { + false + } + } +}