From 94cb6bf294f91a7238c19c26eccfa3d750847344 Mon Sep 17 00:00:00 2001 From: Comfy Org PR Bot Date: Thu, 30 Oct 2025 02:58:15 +0900 Subject: [PATCH] [backport rh-test] refactor subscription composable (#6376) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backport of #6365 to `rh-test` Automatically created by backport workflow. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6376-backport-rh-test-refactor-subscription-composable-29b6d73d365081d7b9d8fc583b914de4) by [Unito](https://www.unito.io) Co-authored-by: Christian Byrne --- .../composables/useSubscription.ts | 87 +++++++++---------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/src/platform/cloud/subscription/composables/useSubscription.ts b/src/platform/cloud/subscription/composables/useSubscription.ts index 061e0bf45..cdffb2c13 100644 --- a/src/platform/cloud/subscription/composables/useSubscription.ts +++ b/src/platform/cloud/subscription/composables/useSubscription.ts @@ -14,11 +14,11 @@ import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore' -interface CloudSubscriptionCheckoutResponse { +type CloudSubscriptionCheckoutResponse = { checkout_url: string } -interface CloudSubscriptionStatusResponse { +type CloudSubscriptionStatusResponse = { is_active: boolean subscription_id: string renewal_date: string | null @@ -27,7 +27,7 @@ interface CloudSubscriptionStatusResponse { const subscriptionStatus = ref(null) -const isActiveSubscription = computed(() => { +const isSubscribedOrIsNotCloud = computed(() => { if (!isCloud || !window.__CONFIG__?.subscription_required) return true return subscriptionStatus.value?.is_active ?? false @@ -36,12 +36,11 @@ const isActiveSubscription = computed(() => { let isWatchSetup = false export function useSubscription() { - const authActions = useFirebaseAuthActions() + const { reportError, accessBillingPortal } = useFirebaseAuthActions() const dialogService = useDialogService() const { getAuthHeader } = useFirebaseAuthStore() const { wrapWithErrorHandlingAsync } = useErrorHandling() - const { reportError } = useFirebaseAuthActions() const { isLoggedIn } = useCurrentUser() @@ -54,7 +53,7 @@ export function useSubscription() { const renewalDate = new Date(subscriptionStatus.value.renewal_date) - return renewalDate.toLocaleDateString('en-US', { + return renewalDate.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' @@ -66,7 +65,7 @@ export function useSubscription() { const endDate = new Date(subscriptionStatus.value.end_date) - return endDate.toLocaleDateString('en-US', { + return endDate.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' @@ -77,9 +76,10 @@ export function useSubscription() { () => `$${MONTHLY_SUBSCRIPTION_PRICE.toFixed(0)}` ) - const fetchStatus = wrapWithErrorHandlingAsync(async () => { - return await fetchSubscriptionStatus() - }, reportError) + const fetchStatus = wrapWithErrorHandlingAsync( + fetchSubscriptionStatus, + reportError + ) const subscribe = wrapWithErrorHandlingAsync(async () => { const response = await initiateSubscriptionCheckout() @@ -104,13 +104,13 @@ export function useSubscription() { } const manageSubscription = async () => { - await authActions.accessBillingPortal() + await accessBillingPortal() } const requireActiveSubscription = async (): Promise => { await fetchSubscriptionStatus() - if (!isActiveSubscription.value) { + if (!isSubscribedOrIsNotCloud.value) { showSubscriptionDialog() } } @@ -124,46 +124,43 @@ export function useSubscription() { } const handleInvoiceHistory = async () => { - await authActions.accessBillingPortal() + await accessBillingPortal() } /** * Fetch the current cloud subscription status for the authenticated user * @returns Subscription status or null if no subscription exists */ - const fetchSubscriptionStatus = - async (): Promise => { - const authHeader = await getAuthHeader() - if (!authHeader) { - throw new FirebaseAuthStoreError( - t('toastMessages.userNotAuthenticated') - ) - } - - const response = await fetch( - `${COMFY_API_BASE_URL}/customers/cloud-subscription-status`, - { - headers: { - ...authHeader, - 'Content-Type': 'application/json' - } - } - ) - - if (!response.ok) { - const errorData = await response.json() - throw new FirebaseAuthStoreError( - t('toastMessages.failedToFetchSubscription', { - error: errorData.message - }) - ) - } - - const statusData = await response.json() - subscriptionStatus.value = statusData - return statusData + async function fetchSubscriptionStatus(): Promise { + const authHeader = await getAuthHeader() + if (!authHeader) { + throw new FirebaseAuthStoreError(t('toastMessages.userNotAuthenticated')) } + const response = await fetch( + `${COMFY_API_BASE_URL}/customers/cloud-subscription-status`, + { + headers: { + ...authHeader, + 'Content-Type': 'application/json' + } + } + ) + + if (!response.ok) { + const errorData = await response.json() + throw new FirebaseAuthStoreError( + t('toastMessages.failedToFetchSubscription', { + error: errorData.message + }) + ) + } + + const statusData = await response.json() + subscriptionStatus.value = statusData + return statusData + } + if (!isWatchSetup) { isWatchSetup = true watch( @@ -213,7 +210,7 @@ export function useSubscription() { return { // State - isActiveSubscription, + isActiveSubscription: isSubscribedOrIsNotCloud, isCancelled, formattedRenewalDate, formattedEndDate,