Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

31 changes: 30 additions & 1 deletion packages/oneclient_app/src/hooks/actions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -233,9 +233,38 @@ impl Actions {
}

pub fn accept_tos(&self, terms_version: u32, privacy_version: u32) {
if let Some(updated) = self.mutate_settings(|settings| {
let mut was_declined = false;

let Some(updated) = self.mutate_settings(|settings| {
was_declined = settings.declined_tos;
settings.accepted_tos_version = terms_version;
settings.accepted_privacy_version = privacy_version;
settings.declined_tos = false;
}) else {
return;
};

self.persist(updated);

if was_declined {
self.notify("Restart to finish")
.body(
"Thanks. OneClient reconnects to Polyfrost services the next time you start \
it.",
)
.icon(IconType::RefreshCw01)
.send();
}
}

pub fn decline_tos(&self) {
oneclient_common::consent::decline();

if let Some(updated) = self.mutate_settings(|settings| {
settings.declined_tos = true;
settings.accepted_tos_version = 0;
settings.accepted_privacy_version = 0;
settings.seen_onboarding = true;
}) {
self.persist(updated);
}
Expand Down
2 changes: 2 additions & 0 deletions packages/oneclient_app/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ fn main() {

let settings = rt.block_on(oneclient_core::settings::store::load_settings(None));

oneclient_common::consent::init(settings.declined_tos);

if settings.log_debug {
oneclient_core::logger::init_debug()
} else {
Expand Down
24 changes: 23 additions & 1 deletion packages/oneclient_app/src/view/app/settings/launcher.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
use freya::prelude::*;
use freya::router::RouterContext;

use super::settings_page;
use crate::components::{IconType, link_button, toggle};
use crate::components::{Button, IconType, link_button, toggle};
use crate::hooks::{use_dispatch, use_launcher, use_settings_snapshot};
use crate::platform;
use crate::routes::Route;
use crate::view::app::settings::{section_header, settings_row};

#[derive(PartialEq)]
Expand Down Expand Up @@ -45,6 +47,20 @@ impl Component for SettingsLauncher {
let folder = data_dir.clone();
let open_folder = link_button().on_press(move |_| platform::open_url(&folder));

// The only way back for someone who declined during onboarding
let consent_summary = if settings.declined_tos {
"Declined. Polyfrost services stay off until you accept and restart OneClient."
} else {
"Accepted. Review them again at any time."
};
let review_terms = Button::new()
.secondary()
.small()
.on_press(|_| {
let _ = RouterContext::get().replace(Route::OnboardingTerms {});
})
.text("Review");

settings_page()
.child(section_header("GENERAL"))
.child(settings_row(
Expand All @@ -59,6 +75,12 @@ impl Component for SettingsLauncher {
"Send anonymous crash and error reports to help fix bugs. Applies on restart.",
toggle(crash_reporting),
))
.child(settings_row(
IconType::File02,
"Terms & Privacy",
consent_summary,
review_terms,
))
.child(section_header("FOLDERS AND FILES"))
.child(settings_row(
IconType::Folder,
Expand Down
136 changes: 124 additions & 12 deletions packages/oneclient_app/src/view/onboarding/terms.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ impl Component for OnboardingTerms {

let accepted = use_state(|| false);
let tab = use_state(|| LegalTab::Terms);
let confirming_decline = use_state(|| false);

let returning = settings.seen_onboarding;
let next = if returning {
Expand Down Expand Up @@ -74,6 +75,8 @@ impl Component for OnboardingTerms {
fallback_body(error.as_deref(), query)
};

let deciding = *confirming_decline.read();

let content = rect()
.vertical()
.width(Size::fill())
Expand All @@ -85,17 +88,40 @@ impl Component for OnboardingTerms {
.maybe_child(tabs)
.child(body)
.child(link_row(terms_url, privacy_url))
.child(accept_row(accepted))
.child(if deciding {
decline_warning()
} else {
accept_row(accepted)
})
.into_element();

onboarding_page(
onboarding_illustration(IconType::File02),
content,
terms_nav(back, *accepted.read() && !loading, move || {
dispatch.accept_tos(terms_version, privacy_version);
let _ = RouterContext::get().replace(next.clone());
}),
)
let nav = if deciding {
decline_nav(
move || {
let mut confirming = confirming_decline;
confirming.set(false);
},
move || {
dispatch.decline_tos();
let _ = RouterContext::get().replace(Route::Home {});
},
)
} else {
terms_nav(
back,
*accepted.read() && !loading,
move || {
let mut confirming = confirming_decline;
confirming.set(true);
},
move || {
dispatch.accept_tos(terms_version, privacy_version);
let _ = RouterContext::get().replace(next.clone());
},
)
};

onboarding_page(onboarding_illustration(IconType::File02), content, nav)
}
}

Expand Down Expand Up @@ -234,7 +260,7 @@ fn external_link_button(text: &'static str, url: String) -> impl IntoElement {
.child(Icon::new(IconType::LinkExternal01).size(14.))
}

fn accept_row(accepted: State<bool>) -> impl IntoElement {
fn accept_row(accepted: State<bool>) -> Element {
rect()
.horizontal()
.width(Size::fill())
Expand All @@ -259,7 +285,7 @@ fn accept_row(accepted: State<bool>) -> impl IntoElement {
)
.child(
label()
.text("Required to use OneClient.")
.text("Required for Poly+, downloads and updates.")
.font_size(11.)
.color(colors::fg_secondary()),
),
Expand All @@ -268,11 +294,62 @@ fn accept_row(accepted: State<bool>) -> impl IntoElement {
.into_element()
}

fn decline_warning() -> Element {
rect()
.vertical()
.width(Size::fill())
.spacing(8.)
.padding(Gaps::new_symmetric(14., 16.))
.corner_radius(CornerRadius::new_all(12.))
.background(colors::page_elevated())
.border(border_all_color(1., colors::danger()))
.child(
rect()
.horizontal()
.cross_align(Alignment::Center)
.spacing(8.)
.child(
Icon::new(IconType::AlertTriangle)
.size(18.)
.color(colors::code_warn()),
)
.child(
label()
.text("Continue without accepting?")
.font_size(14.)
.font_weight(FontWeight::MEDIUM)
.color(colors::fg_primary()),
),
)
.child(
label()
.text(
"OneClient stops contacting Polyfrost entirely: no Poly+, no crash reports, \
and no version, mod or bundle downloads. Instances you have already \
installed keep working, and signing in to Minecraft still works.",
)
.font_size(12.)
.color(colors::fg_secondary()),
)
.child(
label()
.text(
"You can accept later under Settings > Launcher. That takes effect after a \
restart.",
)
.font_size(11.)
.color(colors::fg_secondary().with_a(180)),
)
.into_element()
}

fn terms_nav(
back: Option<Route>,
next_enabled: bool,
on_decline: impl FnMut() + 'static,
on_next: impl FnMut() + 'static,
) -> impl IntoElement {
) -> Element {
let mut on_decline = on_decline;
let mut on_next = on_next;
rect()
.horizontal()
Expand All @@ -291,6 +368,13 @@ fn terms_nav(
.text("Back")
.into_element()
}))
.child(
Button::new()
.secondary()
.width(Size::px(128.))
.on_press(move |_| on_decline())
.text("Decline"),
)
.child(
Button::new()
.primary()
Expand All @@ -302,3 +386,31 @@ fn terms_nav(
)
.into_element()
}

fn decline_nav(on_cancel: impl FnMut() + 'static, on_confirm: impl FnMut() + 'static) -> Element {
let mut on_cancel = on_cancel;
let mut on_confirm = on_confirm;

rect()
.horizontal()
.width(Size::fill())
.main_align(Alignment::End)
.cross_align(Alignment::Center)
.spacing(12.)
.padding(Gaps::new(0., 40., 32., 40.))
.child(
Button::new()
.secondary()
.width(Size::px(128.))
.on_press(move |_| on_cancel())
.text("Go back"),
)
.child(
Button::new()
.danger()
.width(Size::px(220.))
.on_press(move |_| on_confirm())
.text("Decline and continue"),
)
.into_element()
}
4 changes: 3 additions & 1 deletion packages/oneclient_app/src/view/startup.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,9 @@ impl Component for Startup {
let stale = settings.settings.accepted_tos_version < required_terms
|| settings.settings.accepted_privacy_version < required_privacy;

let destination = if !settings.settings.seen_onboarding {
let destination = if settings.settings.declined_tos {
Route::Home {}
} else if !settings.settings.seen_onboarding {
Route::OnboardingWelcome {}
} else if stale {
Route::OnboardingTerms {}
Expand Down
2 changes: 2 additions & 0 deletions packages/oneclient_common/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,5 @@ directories.workspace = true
serde.workspace = true
strum.workspace = true
thiserror.workspace = true

url.workspace = true
Loading