From 775c856bf798f9b4c113e16afeaa8d8dbc69be65 Mon Sep 17 00:00:00 2001 From: bymyself Date: Tue, 16 Sep 2025 15:13:32 -0700 Subject: [PATCH] port user ID expose hook from 6786d8e to cloud --- src/composables/auth/useCurrentUser.ts | 27 +++++++++++++++++++++++++- src/services/extensionService.ts | 8 ++++++++ src/types/authTypes.ts | 4 ++++ src/types/comfy.ts | 7 +++++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/composables/auth/useCurrentUser.ts b/src/composables/auth/useCurrentUser.ts index eb2f73b8c..08c0b8533 100644 --- a/src/composables/auth/useCurrentUser.ts +++ b/src/composables/auth/useCurrentUser.ts @@ -1,8 +1,10 @@ +import { whenever } from '@vueuse/core' import { computed } from 'vue' import { useApiKeyAuthStore } from '@/stores/apiKeyAuthStore' import { useCommandStore } from '@/stores/commandStore' import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore' +import type { AuthUserInfo } from '@/types/authTypes' export const useCurrentUser = () => { const authStore = useFirebaseAuthStore() @@ -15,6 +17,27 @@ export const useCurrentUser = () => { () => !!isApiKeyLogin.value || firebaseUser.value !== null ) + const resolvedUserInfo = computed(() => { + if (isApiKeyLogin.value && apiKeyStore.currentUser) { + return { id: apiKeyStore.currentUser.id } + } + + if (firebaseUser.value) { + return { id: firebaseUser.value.uid } + } + + return null + }) + + const onUserResolved = (callback: (user: AuthUserInfo) => void) => { + if (resolvedUserInfo.value) { + callback(resolvedUserInfo.value) + } + + const stop = whenever(resolvedUserInfo, callback) + return () => stop() + } + const userDisplayName = computed(() => { if (isApiKeyLogin.value) { return apiKeyStore.currentUser?.name @@ -95,7 +118,9 @@ export const useCurrentUser = () => { userPhotoUrl, providerName, providerIcon, + resolvedUserInfo, handleSignOut, - handleSignIn + handleSignIn, + onUserResolved } } diff --git a/src/services/extensionService.ts b/src/services/extensionService.ts index 1fd92b256..a93d2abdd 100644 --- a/src/services/extensionService.ts +++ b/src/services/extensionService.ts @@ -1,3 +1,4 @@ +import { useCurrentUser } from '@/composables/auth/useCurrentUser' import { useErrorHandling } from '@/composables/useErrorHandling' import { api } from '@/scripts/api' import { app } from '@/scripts/app' @@ -72,6 +73,13 @@ export const useExtensionService = () => { } })() } + + if (extension.onAuthUserResolved) { + const { onUserResolved } = useCurrentUser() + onUserResolved((user) => { + void extension.onAuthUserResolved?.(user, app) + }) + } } /** diff --git a/src/types/authTypes.ts b/src/types/authTypes.ts index 07bb43dd6..5f3891bd5 100644 --- a/src/types/authTypes.ts +++ b/src/types/authTypes.ts @@ -7,3 +7,7 @@ export type ApiKeyAuthHeader = { } export type AuthHeader = LoggedInAuthHeader | ApiKeyAuthHeader + +export interface AuthUserInfo { + id: string +} diff --git a/src/types/comfy.ts b/src/types/comfy.ts index 622753357..83fa7c29e 100644 --- a/src/types/comfy.ts +++ b/src/types/comfy.ts @@ -6,6 +6,7 @@ import type { ComfyNodeDef } from '@/schemas/nodeDefSchema' import type { ComfyApp } from '@/scripts/app' import type { ComfyWidgetConstructor } from '@/scripts/widgets' import type { ComfyCommand } from '@/stores/commandStore' +import type { AuthUserInfo } from '@/types/authTypes' import type { BottomPanelExtension } from '@/types/extensionTypes' import type { SettingParams } from '@/types/settingTypes' @@ -166,5 +167,11 @@ export interface ComfyExtension { missingNodeTypes: MissingNodeType[] ): Promise | void + /** + * Fired whenever authentication resolves, providing the user id. + * Extensions can register at any time and will receive the latest value immediately. + */ + onAuthUserResolved?(user: AuthUserInfo, app: ComfyApp): Promise | void + [key: string]: any }