- {errorMessage}
+
{errorMessage}
+ {requiresAppDataReset ? (
+
+
+
+ This wipes locally stored secrets and accounts on this device. Your cloud
+ account is unaffected — you can sign in again right after.
+
+ {resetError ? (
+
{resetError}
+ ) : null}
+
+ ) : null}
) : null}
diff --git a/app/src/pages/__tests__/Welcome.test.tsx b/app/src/pages/__tests__/Welcome.test.tsx
index f5f926c16..93bacac78 100644
--- a/app/src/pages/__tests__/Welcome.test.tsx
+++ b/app/src/pages/__tests__/Welcome.test.tsx
@@ -52,6 +52,13 @@ vi.mock('../../components/oauth/providerConfigs', () => ({
vi.mock('../../store/deepLinkAuthState', () => ({ useDeepLinkAuthState: vi.fn() }));
+const { mockClearAllAppData } = vi.hoisted(() => ({
+ mockClearAllAppData: vi.fn().mockResolvedValue(undefined),
+}));
+vi.mock('../../utils/clearAllAppData', () => ({
+ clearAllAppData: (...args: unknown[]) => mockClearAllAppData(...args),
+}));
+
vi.mock('../../services/coreRpcClient', () => ({
clearCoreRpcUrlCache: vi.fn(),
testCoreRpcConnection: vi.fn(),
@@ -90,7 +97,11 @@ describe('Welcome auth entrypoint', () => {
beforeEach(() => {
oauthButtonSpy.mockReset();
oauthOverrideSpy.mockReset();
- vi.mocked(useDeepLinkAuthState).mockReturnValue({ isProcessing: false, errorMessage: null });
+ vi.mocked(useDeepLinkAuthState).mockReturnValue({
+ isProcessing: false,
+ errorMessage: null,
+ requiresAppDataReset: false,
+ });
vi.mocked(clearCoreRpcUrlCache).mockReset();
vi.mocked(clearBackendUrlCache).mockReset();
vi.mocked(storeRpcUrl).mockReset();
@@ -125,7 +136,11 @@ describe('Welcome auth entrypoint', () => {
});
it('shows the deep-link processing state when auth is already in progress', () => {
- vi.mocked(useDeepLinkAuthState).mockReturnValue({ isProcessing: true, errorMessage: null });
+ vi.mocked(useDeepLinkAuthState).mockReturnValue({
+ isProcessing: true,
+ errorMessage: null,
+ requiresAppDataReset: false,
+ });
render(