From f3671c3e0750b79be1f19655a07a0e9932289b3f Mon Sep 17 00:00:00 2001 From: Eli Bosley Date: Tue, 8 Jul 2025 16:28:38 -0400 Subject: [PATCH] fix: sign out doesn't work (#1486) ## Summary by CodeRabbit * **Refactor** * Improved handling of Connect account sign-in and sign-out with persistent mutation instances for better status updates and error reporting. * **Chores** * Expanded allowed command patterns in configuration for development, build, and testing tasks. * **Tests** * Enhanced mutation mocks in component tests to increase test reliability. --- .claude/settings.local.json | 9 +- .../components/HeaderOsVersion.test.ts | 5 + web/__test__/components/Registration.test.ts | 5 + web/store/account.ts | 135 ++++++++---------- 4 files changed, 81 insertions(+), 73 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 6f9df3fa2..34eec413d 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -2,7 +2,14 @@ "permissions": { "allow": [ "Bash(rg:*)", - "Bash(find:*)" + "Bash(find:*)", + "Bash(pnpm codegen:*)", + "Bash(pnpm dev:*)", + "Bash(pnpm build:*)", + "Bash(pnpm test:*)", + "Bash(grep:*)", + "Bash(pnpm type-check:*)", + "Bash(pnpm lint:*)" ] }, "enableAllProjectMcpServers": false diff --git a/web/__test__/components/HeaderOsVersion.test.ts b/web/__test__/components/HeaderOsVersion.test.ts index 92a6bddf2..65c9287ff 100644 --- a/web/__test__/components/HeaderOsVersion.test.ts +++ b/web/__test__/components/HeaderOsVersion.test.ts @@ -38,6 +38,11 @@ vi.mock('@vue/apollo-composable', () => ({ onResult: vi.fn(), onError: vi.fn(), }), + useMutation: () => ({ + mutate: vi.fn(), + onDone: vi.fn(), + onError: vi.fn(), + }), provideApolloClient: vi.fn(), })); diff --git a/web/__test__/components/Registration.test.ts b/web/__test__/components/Registration.test.ts index b6a0edc59..e2d1f6573 100644 --- a/web/__test__/components/Registration.test.ts +++ b/web/__test__/components/Registration.test.ts @@ -41,6 +41,11 @@ vi.mock('@vue/apollo-composable', () => ({ onResult: vi.fn(), onError: vi.fn(), }), + useMutation: () => ({ + mutate: vi.fn(), + onDone: vi.fn(), + onError: vi.fn(), + }), provideApolloClient: vi.fn(), })); diff --git a/web/store/account.ts b/web/store/account.ts index 8fd7377f8..a74a5e11d 100644 --- a/web/store/account.ts +++ b/web/store/account.ts @@ -61,6 +61,59 @@ export const useAccountStore = defineStore('account', () => { accountActionStatus.value = 'waiting'; } }; + + // Initialize mutations during store setup to maintain Apollo context + const { mutate: signOutMutation, onDone: onSignOutDone, onError: onSignOutError } = useMutation(CONNECT_SIGN_OUT); + const { mutate: signInMutation, onDone: onSignInDone, onError: onSignInError } = useMutation(CONNECT_SIGN_IN); + + // Handle sign out mutation results + onSignOutDone((res) => { + console.debug('[connectSignOutMutation]', res); + accountActionStatus.value = 'success'; + setQueueConnectSignOut(false); // reset + }); + + onSignOutError((error) => { + logErrorMessages(error); + accountActionStatus.value = 'failed'; + errorsStore.setError({ + heading: 'Failed to update Connect account configuration', + message: error.message, + level: 'error', + ref: 'connectSignOutMutation', + type: 'account', + }); + }); + + // Handle sign in mutation results + onSignInDone((res) => { + if (res.data?.connectSignIn) { + accountActionStatus.value = 'success'; + setConnectSignInPayload(undefined); // reset + return; + } + accountActionStatus.value = 'failed'; + errorsStore.setError({ + heading: 'unraid-api failed to update Connect account configuration', + message: 'Sign In mutation unsuccessful', + level: 'error', + ref: 'connectSignInMutation', + type: 'account', + }); + }); + + onSignInError((error) => { + logErrorMessages(error); + accountActionStatus.value = 'failed'; + errorsStore.setError({ + heading: 'unraid-api failed to update Connect account configuration', + message: error.message, + level: 'error', + ref: 'connectSignInMutation', + type: 'account', + }); + }); + watchEffect(() => { if (unraidApiClient.value && connectSignInPayload.value) { // connectSignInMutation(); @@ -258,7 +311,7 @@ export const useAccountStore = defineStore('account', () => { ); }; - const connectSignInMutation = async () => { + const connectSignInMutation = () => { if ( !connectSignInPayload.value || (connectSignInPayload.value && @@ -271,83 +324,21 @@ export const useAccountStore = defineStore('account', () => { } accountActionStatus.value = 'updating'; - const { - mutate: signInMutation, - onDone, - onError, - } = await useMutation(CONNECT_SIGN_IN, { - variables: { - input: { - apiKey: connectSignInPayload.value.apiKey, - userInfo: { - email: connectSignInPayload.value.email, - preferred_username: connectSignInPayload.value.preferred_username, - }, + + return signInMutation({ + input: { + apiKey: connectSignInPayload.value.apiKey, + userInfo: { + email: connectSignInPayload.value.email, + preferred_username: connectSignInPayload.value.preferred_username, }, }, }); - - signInMutation(); - - onDone((res) => { - if (res.data?.connectSignIn) { - accountActionStatus.value = 'success'; - setConnectSignInPayload(undefined); // reset - return; - } - accountActionStatus.value = 'failed'; - errorsStore.setError({ - heading: 'unraid-api failed to update Connect account configuration', - message: 'Sign In mutation unsuccessful', - level: 'error', - ref: 'connectSignInMutation', - type: 'account', - }); - }); - - onError((error) => { - logErrorMessages(error); - accountActionStatus.value = 'failed'; - errorsStore.setError({ - heading: 'unraid-api failed to update Connect account configuration', - message: error.message, - level: 'error', - ref: 'connectSignInMutation', - type: 'account', - }); - }); }; - const connectSignOutMutation = async () => { + const connectSignOutMutation = () => { accountActionStatus.value = 'updating'; - // @todo is this still needed here with the change to a mutation? - // if (!serverStore.registered && accountAction.value && !accountAction.value?.user) { - // accountActionHide.value = true; - // accountActionStatus.value = 'success'; - // return; - // } - - const { mutate: signOutMutation, onDone, onError } = await useMutation(CONNECT_SIGN_OUT); - - signOutMutation(); - - onDone((res) => { - console.debug('[connectSignOutMutation]', res); - accountActionStatus.value = 'success'; - setQueueConnectSignOut(false); // reset - }); - - onError((error) => { - logErrorMessages(error); - accountActionStatus.value = 'failed'; - errorsStore.setError({ - heading: 'Failed to update Connect account configuration', - message: error.message, - level: 'error', - ref: 'connectSignOutMutation', - type: 'account', - }); - }); + return signOutMutation(); }; const setAccountAction = (action: ExternalSignIn | ExternalSignOut) => {