From 079485db53487089cb5f5316b4d3846354c82b59 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Mar 2026 19:20:10 +0000 Subject: [PATCH 1/4] Initial plan From 182493e68ff245475afe2433d3909655dcc100ac Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Mar 2026 19:28:50 +0000 Subject: [PATCH 2/4] Add Init and No-Telemetry-Star pages to onboarding preview Co-authored-by: sawka <2722291+sawka@users.noreply.github.com> --- frontend/app/onboarding/onboarding.tsx | 16 +++++++++------- frontend/preview/previews/onboarding.preview.tsx | 7 +++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/frontend/app/onboarding/onboarding.tsx b/frontend/app/onboarding/onboarding.tsx index fc4c566ae4..7a3acbef39 100644 --- a/frontend/app/onboarding/onboarding.tsx +++ b/frontend/app/onboarding/onboarding.tsx @@ -9,13 +9,14 @@ import { ClientModel } from "@/app/store/client-model"; import { atoms } from "@/app/store/global"; import { disableGlobalKeybindings, enableGlobalKeybindings, globalRefocus } from "@/app/store/keymodel"; import { modalsModel } from "@/app/store/modalmodel"; +import { isPreviewWindow } from "@/app/store/windowtype"; import * as WOS from "@/app/store/wos"; import { RpcApi } from "@/app/store/wshclientapi"; import { TabRpcClient } from "@/app/store/wshrpcutil"; import { WorkspaceLayoutModel } from "@/app/workspace/workspace-layout-model"; import * as services from "@/store/services"; -import { fireAndForget } from "@/util/util"; -import { atom, PrimitiveAtom, useAtom, useAtomValue, useSetAtom } from "jotai"; +import { fireAndForget, NullAtom } from "@/util/util"; +import { atom, Atom, PrimitiveAtom, useAtom, useAtomValue, useSetAtom } from "jotai"; import { OverlayScrollbarsComponent } from "overlayscrollbars-react"; import { useEffect, useRef, useState } from "react"; import { debounce } from "throttle-debounce"; @@ -29,13 +30,14 @@ type PageName = "init" | "notelemetrystar" | "features"; const pageNameAtom: PrimitiveAtom = atom("init"); const InitPage = ({ isCompact }: { isCompact: boolean }) => { - const settings = useAtomValue(atoms.settingsAtom); - const clientData = useAtomValue(ClientModel.getInstance().clientAtom); - const [telemetryEnabled, setTelemetryEnabled] = useState(!!settings["telemetry:enabled"]); + const previewWindow = isPreviewWindow(); + const settings = useAtomValue((previewWindow ? NullAtom : atoms.settingsAtom) as Atom); + const clientData = useAtomValue((previewWindow ? NullAtom : ClientModel.getInstance().clientAtom) as Atom); + const [telemetryEnabled, setTelemetryEnabled] = useState(!!settings?.["telemetry:enabled"]); const setPageName = useSetAtom(pageNameAtom); const acceptTos = () => { - if (!clientData.tosagreed) { + if (!clientData?.tosagreed) { fireAndForget(services.ClientService.AgreeTos); } if (telemetryEnabled) { @@ -310,4 +312,4 @@ const NewInstallOnboardingModal = () => { NewInstallOnboardingModal.displayName = "NewInstallOnboardingModal"; -export { NewInstallOnboardingModal }; +export { InitPage, NewInstallOnboardingModal, NoTelemetryStarPage }; diff --git a/frontend/preview/previews/onboarding.preview.tsx b/frontend/preview/previews/onboarding.preview.tsx index 6ea2312d3e..0cf0b91e43 100644 --- a/frontend/preview/previews/onboarding.preview.tsx +++ b/frontend/preview/previews/onboarding.preview.tsx @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import Logo from "@/app/asset/logo.svg"; +import { InitPage, NoTelemetryStarPage } from "@/app/onboarding/onboarding"; import { DurableSessionPage } from "@/app/onboarding/onboarding-durable"; import { FilesPage, MagnifyBlocksPage, WaveAIPage } from "@/app/onboarding/onboarding-features"; import { UpgradeOnboardingVersions } from "@/app/onboarding/onboarding-upgrade-patch"; @@ -10,6 +11,12 @@ function OnboardingFeaturesV() { const noop = () => {}; return (
+
+ +
+
+ +
From d86a3872861cbf50be90172491ed8ae41efbe309 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Mar 2026 20:02:44 +0000 Subject: [PATCH 3/4] refactor: use settings key atom for onboarding telemetry in preview Co-authored-by: sawka <2722291+sawka@users.noreply.github.com> --- frontend/app/onboarding/onboarding.tsx | 14 ++++++-------- frontend/preview/preview.tsx | 2 ++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/app/onboarding/onboarding.tsx b/frontend/app/onboarding/onboarding.tsx index 7a3acbef39..381339e6f0 100644 --- a/frontend/app/onboarding/onboarding.tsx +++ b/frontend/app/onboarding/onboarding.tsx @@ -6,17 +6,16 @@ import { Button } from "@/app/element/button"; import { FlexiModal } from "@/app/modals/modal"; import { OnboardingFeatures } from "@/app/onboarding/onboarding-features"; import { ClientModel } from "@/app/store/client-model"; -import { atoms } from "@/app/store/global"; +import { useSettingsKeyAtom } from "@/app/store/global"; import { disableGlobalKeybindings, enableGlobalKeybindings, globalRefocus } from "@/app/store/keymodel"; import { modalsModel } from "@/app/store/modalmodel"; -import { isPreviewWindow } from "@/app/store/windowtype"; import * as WOS from "@/app/store/wos"; import { RpcApi } from "@/app/store/wshclientapi"; import { TabRpcClient } from "@/app/store/wshrpcutil"; import { WorkspaceLayoutModel } from "@/app/workspace/workspace-layout-model"; import * as services from "@/store/services"; -import { fireAndForget, NullAtom } from "@/util/util"; -import { atom, Atom, PrimitiveAtom, useAtom, useAtomValue, useSetAtom } from "jotai"; +import { fireAndForget } from "@/util/util"; +import { atom, PrimitiveAtom, useAtom, useAtomValue, useSetAtom } from "jotai"; import { OverlayScrollbarsComponent } from "overlayscrollbars-react"; import { useEffect, useRef, useState } from "react"; import { debounce } from "throttle-debounce"; @@ -30,10 +29,9 @@ type PageName = "init" | "notelemetrystar" | "features"; const pageNameAtom: PrimitiveAtom = atom("init"); const InitPage = ({ isCompact }: { isCompact: boolean }) => { - const previewWindow = isPreviewWindow(); - const settings = useAtomValue((previewWindow ? NullAtom : atoms.settingsAtom) as Atom); - const clientData = useAtomValue((previewWindow ? NullAtom : ClientModel.getInstance().clientAtom) as Atom); - const [telemetryEnabled, setTelemetryEnabled] = useState(!!settings?.["telemetry:enabled"]); + const telemetrySetting = useSettingsKeyAtom("telemetry:enabled"); + const clientData = useAtomValue(ClientModel.getInstance().clientAtom); + const [telemetryEnabled, setTelemetryEnabled] = useState(!!telemetrySetting); const setPageName = useSetAtom(pageNameAtom); const acceptTos = () => { diff --git a/frontend/preview/preview.tsx b/frontend/preview/preview.tsx index c38c9fe297..564a822fd6 100644 --- a/frontend/preview/preview.tsx +++ b/frontend/preview/preview.tsx @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import Logo from "@/app/asset/logo.svg"; +import { ClientModel } from "@/app/store/client-model"; import { setWaveWindowType } from "@/app/store/windowtype"; import { loadFonts } from "@/util/fontutil"; import React, { lazy, Suspense } from "react"; @@ -119,6 +120,7 @@ function PreviewApp() { function initPreview() { setWaveWindowType("preview"); + ClientModel.getInstance().initialize(null); loadFonts(); const root = createRoot(document.getElementById("main")!); root.render(); From 7a734e0a9845659220b7774f37a416af711b76e5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 2 Mar 2026 20:07:11 +0000 Subject: [PATCH 4/4] docs: clarify preview client model init rationale Co-authored-by: sawka <2722291+sawka@users.noreply.github.com> --- frontend/preview/preview.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/preview/preview.tsx b/frontend/preview/preview.tsx index 564a822fd6..3b0e8d7825 100644 --- a/frontend/preview/preview.tsx +++ b/frontend/preview/preview.tsx @@ -120,6 +120,7 @@ function PreviewApp() { function initPreview() { setWaveWindowType("preview"); + // Preview mode has no connected backend client object, but onboarding previews read clientAtom. ClientModel.getInstance().initialize(null); loadFonts(); const root = createRoot(document.getElementById("main")!);