Skip to content

Commit 3127082

Browse files
committed
refactor(cloud): redeem desktop login codes via strip-on-capture and a single install site
1 parent 7dc8bfd commit 3127082

13 files changed

Lines changed: 807 additions & 812 deletions

src/composables/useUrlActionLoaders.test.ts

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,9 @@ const mocks = vi.hoisted(() => ({
1818
loadInvite: vi.fn().mockResolvedValue(undefined),
1919
loadCreateWorkspace: vi.fn().mockResolvedValue(undefined),
2020
loadPricingTable: vi.fn().mockResolvedValue(undefined),
21-
redeemDesktopLogin: vi.fn().mockResolvedValue(undefined),
2221
useInvite: vi.fn(),
2322
useCreateWorkspace: vi.fn(),
24-
usePricingTable: vi.fn(),
25-
useDesktopLoginRedemption: vi.fn()
23+
usePricingTable: vi.fn()
2624
}))
2725
mocks.useInvite.mockImplementation(() => ({
2826
loadInviteFromUrl: mocks.loadInvite
@@ -33,9 +31,6 @@ mocks.useCreateWorkspace.mockImplementation(() => ({
3331
mocks.usePricingTable.mockImplementation(() => ({
3432
loadPricingTableFromUrl: mocks.loadPricingTable
3533
}))
36-
mocks.useDesktopLoginRedemption.mockImplementation(() => ({
37-
redeemIfPresent: mocks.redeemDesktopLogin
38-
}))
3934

4035
vi.mock('@/platform/workspace/composables/useInviteUrlLoader', () => ({
4136
useInviteUrlLoader: mocks.useInvite
@@ -47,10 +42,6 @@ vi.mock(
4742
'@/platform/cloud/subscription/composables/usePricingTableUrlLoader',
4843
() => ({ usePricingTableUrlLoader: mocks.usePricingTable })
4944
)
50-
vi.mock(
51-
'@/platform/cloud/onboarding/composables/useDesktopLoginRedemption',
52-
() => ({ useDesktopLoginRedemption: mocks.useDesktopLoginRedemption })
53-
)
5445

5546
describe('useUrlActionLoaders', () => {
5647
beforeEach(() => {
@@ -68,11 +59,9 @@ describe('useUrlActionLoaders', () => {
6859
expect(mocks.useInvite).not.toHaveBeenCalled()
6960
expect(mocks.useCreateWorkspace).not.toHaveBeenCalled()
7061
expect(mocks.usePricingTable).not.toHaveBeenCalled()
71-
expect(mocks.useDesktopLoginRedemption).not.toHaveBeenCalled()
7262
expect(mocks.loadInvite).not.toHaveBeenCalled()
7363
expect(mocks.loadCreateWorkspace).not.toHaveBeenCalled()
7464
expect(mocks.loadPricingTable).not.toHaveBeenCalled()
75-
expect(mocks.redeemDesktopLogin).not.toHaveBeenCalled()
7665
})
7766

7867
it('runs all loaders on cloud when team workspaces are enabled', async () => {
@@ -82,7 +71,6 @@ describe('useUrlActionLoaders', () => {
8271
expect(mocks.loadInvite).toHaveBeenCalledOnce()
8372
expect(mocks.loadCreateWorkspace).toHaveBeenCalledOnce()
8473
expect(mocks.loadPricingTable).toHaveBeenCalledOnce()
85-
expect(mocks.redeemDesktopLogin).toHaveBeenCalledOnce()
8674
})
8775

8876
it('runs the pricing loader but skips the flag-gated loaders when team workspaces are disabled', async () => {
@@ -105,15 +93,4 @@ describe('useUrlActionLoaders', () => {
10593
expect(mocks.loadInvite).toHaveBeenCalledOnce()
10694
expect(mocks.loadCreateWorkspace).toHaveBeenCalledOnce()
10795
})
108-
109-
it('does not let a pending desktop-login redemption block the other loaders', async () => {
110-
mocks.redeemDesktopLogin.mockReturnValueOnce(new Promise(() => {}))
111-
112-
const { runUrlActionLoaders } = useUrlActionLoaders()
113-
await expect(runUrlActionLoaders()).resolves.toBeUndefined()
114-
115-
expect(mocks.loadInvite).toHaveBeenCalledOnce()
116-
expect(mocks.loadCreateWorkspace).toHaveBeenCalledOnce()
117-
expect(mocks.loadPricingTable).toHaveBeenCalledOnce()
118-
})
11996
})

src/composables/useUrlActionLoaders.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { useFeatureFlags } from '@/composables/useFeatureFlags'
2-
import { useDesktopLoginRedemption } from '@/platform/cloud/onboarding/composables/useDesktopLoginRedemption'
32
import { usePricingTableUrlLoader } from '@/platform/cloud/subscription/composables/usePricingTableUrlLoader'
43
import { isCloud } from '@/platform/distribution/types'
54
import { useCreateWorkspaceUrlLoader } from '@/platform/workspace/composables/useCreateWorkspaceUrlLoader'
@@ -18,13 +17,8 @@ export function useUrlActionLoaders() {
1817
? useCreateWorkspaceUrlLoader()
1918
: null
2019
const pricingTableUrlLoader = isCloud ? usePricingTableUrlLoader() : null
21-
const desktopLoginRedemption = isCloud ? useDesktopLoginRedemption() : null
2220

2321
async function runUrlActionLoaders() {
24-
// Redeem a desktop login code (?desktop_login_code=dlc_...) in the
25-
// background: it can await user approval and must not delay the others.
26-
void desktopLoginRedemption?.redeemIfPresent()
27-
2822
// Accept workspace invite from URL if present (e.g., ?invite=TOKEN).
2923
// WorkspaceAuthGate ensures flag state is resolved before the app mounts.
3024
if (inviteUrlLoader && flags.teamWorkspacesEnabled) {

src/locales/en/main.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2421,7 +2421,9 @@
24212421
"successSummary": "Signed in",
24222422
"successDetail": "You can return to the ComfyUI desktop app.",
24232423
"expiredSummary": "Desktop sign-in failed",
2424-
"expiredDetail": "The sign-in request expired or was already used. Start signing in again from the ComfyUI desktop app."
2424+
"expiredDetail": "The sign-in request expired or was already used. Start signing in again from the ComfyUI desktop app.",
2425+
"failedSummary": "Desktop sign-in failed",
2426+
"failedDetail": "Something went wrong completing the desktop sign-in. Start signing in again from the ComfyUI desktop app."
24252427
},
24262428
"validation": {
24272429
"invalidEmail": "Invalid email address",

src/platform/cloud/onboarding/CloudLoginView.vue

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ import { useRoute, useRouter } from 'vue-router'
103103
import Button from '@/components/ui/button/Button.vue'
104104
import { useAuthActions } from '@/composables/auth/useAuthActions'
105105
import CloudSignInForm from '@/platform/cloud/onboarding/components/CloudSignInForm.vue'
106-
import { useDesktopLoginRedemption } from '@/platform/cloud/onboarding/composables/useDesktopLoginRedemption'
107106
import { usePostAuthRedirect } from '@/platform/cloud/onboarding/composables/usePostAuthRedirect'
108107
import type { SignInData } from '@/schemas/signInSchema'
109108
import { getGoogleSsoBlockedReason } from '@/base/webviewDetection'
@@ -122,10 +121,6 @@ const { onAuthSuccess } = usePostAuthRedirect({
122121
defaultRedirect: () => ({ name: 'cloud-user-check' })
123122
})
124123
125-
// Strip a ?desktop_login_code=... from the visible URL immediately; pre-auth
126-
// the composable stashes the code and exits silently.
127-
void useDesktopLoginRedemption().redeemIfPresent()
128-
129124
function switchToEmailForm() {
130125
showEmailForm.value = true
131126
}

src/platform/cloud/onboarding/CloudSignupView.vue

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@ import { useRoute, useRouter } from 'vue-router'
134134
import SignUpForm from '@/components/dialog/content/signin/SignUpForm.vue'
135135
import Button from '@/components/ui/button/Button.vue'
136136
import { useAuthActions } from '@/composables/auth/useAuthActions'
137-
import { useDesktopLoginRedemption } from '@/platform/cloud/onboarding/composables/useDesktopLoginRedemption'
138137
import { useFreeTierOnboarding } from '@/platform/cloud/onboarding/composables/useFreeTierOnboarding'
139138
import { usePostAuthRedirect } from '@/platform/cloud/onboarding/composables/usePostAuthRedirect'
140139
import { useTelemetry } from '@/platform/telemetry'
@@ -163,10 +162,6 @@ const { onAuthSuccess } = usePostAuthRedirect({
163162
defaultRedirect: () => ({ path: '/', query: route.query })
164163
})
165164
166-
// Strip a ?desktop_login_code=... from the visible URL immediately; pre-auth
167-
// the composable stashes the code and exits silently.
168-
void useDesktopLoginRedemption().redeemIfPresent()
169-
170165
const navigateToLogin = async () => {
171166
await router.push({ name: 'cloud-login', query: route.query })
172167
}

src/platform/cloud/onboarding/CloudSurveyView.vue

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,13 @@ import {
1818
getSurveyCompletedStatus,
1919
submitSurvey
2020
} from '@/platform/cloud/onboarding/auth'
21-
import { useDesktopLoginRedemption } from '@/platform/cloud/onboarding/composables/useDesktopLoginRedemption'
2221
import { remoteConfig } from '@/platform/remoteConfig/remoteConfig'
2322
import { useTelemetry } from '@/platform/telemetry'
2423
2524
import DynamicSurveyForm from './survey/DynamicSurveyForm.vue'
2625
import { defaultOnboardingSurvey } from './survey/defaultSurveySchema'
2726
2827
const router = useRouter()
29-
30-
// Already-signed-in users detoured off '/' can sit on the survey for a while;
31-
// redeem a pending desktop login code without waiting for the survey to end.
32-
void useDesktopLoginRedemption().redeemIfPresent()
3328
const { flags } = useFeatureFlags()
3429
const onboardingSurveyEnabled = computed(() => flags.onboardingSurveyEnabled)
3530

src/platform/cloud/onboarding/UserCheckView.vue

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,11 @@ import {
3232
getSurveyCompletedStatus,
3333
getUserCloudStatus
3434
} from '@/platform/cloud/onboarding/auth'
35-
import { useDesktopLoginRedemption } from '@/platform/cloud/onboarding/composables/useDesktopLoginRedemption'
3635
3736
import CloudLoginViewSkeleton from './skeletons/CloudLoginViewSkeleton.vue'
3837
import CloudSurveyViewSkeleton from './skeletons/CloudSurveyViewSkeleton.vue'
3938
4039
const router = useRouter()
41-
42-
// Already-signed-in users detoured off '/' land here before GraphView mounts;
43-
// redeem a pending desktop login code without waiting for that detour to end.
44-
void useDesktopLoginRedemption().redeemIfPresent()
4540
const { wrapWithErrorHandlingAsync } = useErrorHandling()
4641
const { flags } = useFeatureFlags()
4742
const onboardingSurveyEnabled = computed(

0 commit comments

Comments
 (0)