Lock private profile sync state
This commit is contained in:
@@ -8,7 +8,7 @@ use gpui::{
|
|||||||
px, rgb,
|
px, rgb,
|
||||||
};
|
};
|
||||||
use gpui_component::{
|
use gpui_component::{
|
||||||
IconName, Selectable, Sizable, StyledExt,
|
Disableable, IconName, Selectable, Sizable, StyledExt,
|
||||||
button::{Button, ButtonVariants},
|
button::{Button, ButtonVariants},
|
||||||
scroll::ScrollableElement,
|
scroll::ScrollableElement,
|
||||||
};
|
};
|
||||||
@@ -146,7 +146,13 @@ fn render_profile_row(
|
|||||||
default_for_active_space,
|
default_for_active_space,
|
||||||
cx,
|
cx,
|
||||||
))
|
))
|
||||||
.child(render_profile_sync_action(index, sync_profile_id, sync_policy, cx))
|
.child(render_profile_sync_action(
|
||||||
|
index,
|
||||||
|
sync_profile_id,
|
||||||
|
profile.allows_sync(),
|
||||||
|
sync_policy,
|
||||||
|
cx,
|
||||||
|
))
|
||||||
.child(render_profile_action(index, profile_id, active, cx)),
|
.child(render_profile_action(index, profile_id, active, cx)),
|
||||||
)
|
)
|
||||||
.into_any_element()
|
.into_any_element()
|
||||||
@@ -220,9 +226,21 @@ fn render_profile_action(
|
|||||||
fn render_profile_sync_action(
|
fn render_profile_sync_action(
|
||||||
index: usize,
|
index: usize,
|
||||||
profile_id: ProfileId,
|
profile_id: ProfileId,
|
||||||
|
allows_sync: bool,
|
||||||
sync_policy: ProfileSyncPolicy,
|
sync_policy: ProfileSyncPolicy,
|
||||||
cx: &mut Context<ElyShell>,
|
cx: &mut Context<ElyShell>,
|
||||||
) -> AnyElement {
|
) -> AnyElement {
|
||||||
|
if !allows_sync {
|
||||||
|
return Button::new(("profile-sync-policy", index))
|
||||||
|
.ghost()
|
||||||
|
.xsmall()
|
||||||
|
.selected(true)
|
||||||
|
.disabled(true)
|
||||||
|
.label("Sync Paused")
|
||||||
|
.tooltip("Private Profiles keep Sync paused")
|
||||||
|
.into_any_element();
|
||||||
|
}
|
||||||
|
|
||||||
let next_policy = sync_policy.toggled();
|
let next_policy = sync_policy.toggled();
|
||||||
let paused = sync_policy == ProfileSyncPolicy::Paused;
|
let paused = sync_policy == ProfileSyncPolicy::Paused;
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ pub enum CoreError {
|
|||||||
#[error("profile not found: {id}")]
|
#[error("profile not found: {id}")]
|
||||||
ProfileNotFound { id: ProfileId },
|
ProfileNotFound { id: ProfileId },
|
||||||
|
|
||||||
|
#[error("private profile keeps sync paused: {id}")]
|
||||||
|
PrivateProfileSyncLocked { id: ProfileId },
|
||||||
|
|
||||||
#[error("download not found: {id}")]
|
#[error("download not found: {id}")]
|
||||||
DownloadNotFound { id: DownloadId },
|
DownloadNotFound { id: DownloadId },
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,9 @@ impl BrowserCore {
|
|||||||
.iter_mut()
|
.iter_mut()
|
||||||
.find(|profile| profile.id() == profile_id)
|
.find(|profile| profile.id() == profile_id)
|
||||||
.ok_or_else(|| CoreError::ProfileNotFound { id: profile_id.clone() })?;
|
.ok_or_else(|| CoreError::ProfileNotFound { id: profile_id.clone() })?;
|
||||||
|
if sync_policy == ProfileSyncPolicy::Enabled && !profile.allows_sync() {
|
||||||
|
return Err(CoreError::PrivateProfileSyncLocked { id: profile_id.clone() });
|
||||||
|
}
|
||||||
|
|
||||||
profile.set_sync_policy(sync_policy);
|
profile.set_sync_policy(sync_policy);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
use ely_browser_core::{BrowserCore, InitialBrowserConfig};
|
use ely_browser_core::{BrowserCore, CoreError, InitialBrowserConfig};
|
||||||
use ely_domain::{CommandIntent, ProfileKind, ProfileSyncPolicy, UrlText};
|
use ely_domain::{CommandIntent, ProfileKind, ProfileSyncPolicy, UrlText};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -85,3 +85,25 @@ fn profile_sync_policy_can_pause_one_profile() -> Result<(), Box<dyn Error>> {
|
|||||||
assert_eq!(research_profile.sync_policy(), ProfileSyncPolicy::Paused);
|
assert_eq!(research_profile.sync_policy(), ProfileSyncPolicy::Paused);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn private_profile_sync_policy_stays_paused() -> Result<(), Box<dyn Error>> {
|
||||||
|
let mut core = BrowserCore::new(InitialBrowserConfig::ely_defaults()?)?;
|
||||||
|
let private_profile_id = core.create_profile("Private", 0x807d72, ProfileKind::Private)?;
|
||||||
|
|
||||||
|
let result = core.set_profile_sync_policy(&private_profile_id, ProfileSyncPolicy::Enabled);
|
||||||
|
let error = match result {
|
||||||
|
Ok(()) => return Err("private profile sync enabled".into()),
|
||||||
|
Err(error) => error,
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_eq!(error, CoreError::PrivateProfileSyncLocked { id: private_profile_id.clone() });
|
||||||
|
let snapshot = core.snapshot()?;
|
||||||
|
let Some(private_profile) =
|
||||||
|
snapshot.profiles.iter().find(|profile| profile.id() == &private_profile_id)
|
||||||
|
else {
|
||||||
|
return Err("missing private profile".into());
|
||||||
|
};
|
||||||
|
assert_eq!(private_profile.sync_policy(), ProfileSyncPolicy::Paused);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|||||||
@@ -97,11 +97,19 @@ impl Profile {
|
|||||||
self.sync_policy
|
self.sync_policy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn allows_sync(&self) -> bool {
|
||||||
|
self.kind == ProfileKind::Standard
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_download_policy(&mut self, download_policy: DownloadPolicy) {
|
pub fn set_download_policy(&mut self, download_policy: DownloadPolicy) {
|
||||||
self.download_policy = download_policy;
|
self.download_policy = download_policy;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_sync_policy(&mut self, sync_policy: ProfileSyncPolicy) {
|
pub fn set_sync_policy(&mut self, sync_policy: ProfileSyncPolicy) {
|
||||||
self.sync_policy = sync_policy;
|
self.sync_policy = match self.kind {
|
||||||
|
ProfileKind::Standard => sync_policy,
|
||||||
|
ProfileKind::Private => ProfileSyncPolicy::Paused,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user