@growflowstudio/growflowbooking-admin-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +518 -0
- package/dist/index.d.ts +518 -0
- package/dist/index.js +729 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +652 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/api/client.ts","../src/hooks/context.ts","../src/hooks/useDialogState.ts","../src/hooks/useTenants.ts","../src/hooks/useCustomers.ts","../src/hooks/useSubscriptionPlans.ts","../src/hooks/useBillingPlans.ts","../src/hooks/useBillingSubscriptions.ts","../src/hooks/useSettings.ts","../src/utils/formatters.ts","../src/utils/status.ts","../src/utils/validators.ts"],"sourcesContent":["// Types\nexport type {\n JsonValue,\n JsonObject,\n JsonArray,\n PaginatedResponse,\n Fetcher,\n FetcherOptions,\n} from './types/common';\n\nexport type {\n TenantPlan,\n AdminTenant,\n AdminTenantDetail,\n TenantLimits,\n AdminTenantCreate,\n AdminTenantUpdate,\n AdminTenantLimitsUpdate,\n} from './types/tenant';\n\nexport type {\n CustomerWithTenant,\n AdminCustomerCreate,\n AdminCustomerUpdate,\n} from './types/customer';\n\nexport type {\n PlanPricingModel,\n PlanFeature,\n SubscriptionPlan,\n SubscriptionPlanList,\n SubscriptionPlanCreate,\n SubscriptionPlanUpdate,\n} from './types/subscription-plan';\n\nexport type {\n BillingPlan,\n BillingPlanList,\n CreateBillingPlanRequest,\n UpdateBillingPlanRequest,\n BillingSubscriptionStatus,\n BillingSubscription,\n BillingSubscriptionList,\n CreateBillingSubscriptionRequest,\n} from './types/billing';\n\nexport type {\n BillingSettings,\n UpdateBillingSettingsRequest,\n BillingTestResult,\n} from './types/settings';\n\n// API Client\nexport { BookingAdminApiClient, createBookingAdminClient } from './api/client';\nexport type { BookingAdminApiClientOptions } from './api/client';\n\n// React Hooks\nexport { BookingAdminClientContext, useBookingAdminClient } from './hooks/context';\nexport { useDialogState } from './hooks/useDialogState';\nexport { useAdminTenants, useAdminTenant, useCreateTenant, useUpdateTenant, useDeleteTenant, useUpdateTenantPlan, useUpdateTenantStatus, useTenantLimits, useUpdateTenantLimits } from './hooks/useTenants';\nexport { useAdminCustomers, useCreateCustomer, useUpdateCustomer, useDeleteCustomer } from './hooks/useCustomers';\nexport { useSubscriptionPlans, useSubscriptionPlan, useCreateSubscriptionPlan, useUpdateSubscriptionPlan, useDeleteSubscriptionPlan } from './hooks/useSubscriptionPlans';\nexport { useBillingPlans, useCreateBillingPlan, useUpdateBillingPlan, useDeleteBillingPlan, useSyncBillingPlanToStripe } from './hooks/useBillingPlans';\nexport { useBillingSubscriptions, useBillingSubscription, useCreateBillingSubscription, useCancelBillingSubscription, useChangeBillingSubscriptionPlan } from './hooks/useBillingSubscriptions';\nexport { useBillingSettings, useUpdateBillingSettings, useTestBillingConnection } from './hooks/useSettings';\n\n// Utilities\nexport {\n formatCurrency,\n formatCurrencyFromCents,\n formatPrice,\n formatDate,\n formatTimestamp,\n truncateId,\n} from './utils/formatters';\n\nexport {\n tenantStatusColors,\n tenantStatusLabels,\n tenantPlanColors,\n tenantPlanLabels,\n billingSubscriptionStatusColors,\n billingSubscriptionStatusLabels,\n} from './utils/status';\n\nexport {\n validateSlug,\n validateRequired,\n validateEmail,\n} from './utils/validators';\n","import type { Fetcher, FetcherOptions } from '../types/common';\nimport type { PaginatedResponse } from '../types/common';\nimport type { AdminTenant, AdminTenantDetail, TenantLimits, AdminTenantCreate, AdminTenantUpdate, AdminTenantLimitsUpdate, TenantPlan } from '../types/tenant';\nimport type { CustomerWithTenant, AdminCustomerCreate, AdminCustomerUpdate } from '../types/customer';\nimport type { SubscriptionPlan, SubscriptionPlanList, SubscriptionPlanCreate, SubscriptionPlanUpdate } from '../types/subscription-plan';\nimport type { BillingPlan, BillingPlanList, CreateBillingPlanRequest, UpdateBillingPlanRequest, BillingSubscription, BillingSubscriptionList, CreateBillingSubscriptionRequest } from '../types/billing';\nimport type { BillingSettings, UpdateBillingSettingsRequest, BillingTestResult } from '../types/settings';\n\nexport interface BookingAdminApiClientOptions {\n basePath: string;\n fetcher: Fetcher;\n}\n\n/**\n * Booking Admin API client.\n * Provides typed methods for all booking admin endpoints.\n * Uses a fetcher function provided by the host application (handles auth headers, base URL, etc.).\n */\nexport class BookingAdminApiClient {\n private basePath: string;\n private fetcher: Fetcher;\n\n constructor(options: BookingAdminApiClientOptions) {\n this.basePath = options.basePath;\n this.fetcher = options.fetcher;\n }\n\n private async request<T>(path: string, options?: FetcherOptions): Promise<T> {\n return this.fetcher(`${this.basePath}${path}`, options) as Promise<T>;\n }\n\n // =========================================================================\n // Tenants\n // =========================================================================\n\n async getTenants(params?: {\n search?: string;\n plan?: TenantPlan;\n is_active?: boolean;\n page?: number;\n page_size?: number;\n }): Promise<PaginatedResponse<AdminTenant>> {\n return this.request('/admin/tenants', { params: params as Record<string, string | number | boolean | undefined> });\n }\n\n async getTenant(id: string): Promise<AdminTenantDetail> {\n return this.request(`/admin/tenants/${id}`);\n }\n\n async createTenant(data: AdminTenantCreate): Promise<AdminTenant> {\n return this.request('/admin/tenants', { method: 'POST', body: data });\n }\n\n async updateTenant(id: string, data: AdminTenantUpdate): Promise<AdminTenantDetail> {\n return this.request(`/admin/tenants/${id}`, { method: 'PATCH', body: data });\n }\n\n async deleteTenant(id: string): Promise<void> {\n return this.request(`/admin/tenants/${id}`, { method: 'DELETE' });\n }\n\n async updateTenantPlan(id: string, plan: TenantPlan): Promise<AdminTenant> {\n return this.request(`/admin/tenants/${id}/plan`, { method: 'PATCH', body: { plan } });\n }\n\n async updateTenantStatus(id: string, isActive: boolean): Promise<AdminTenant> {\n return this.request(`/admin/tenants/${id}/status`, { method: 'PATCH', body: { is_active: isActive } });\n }\n\n async getTenantLimits(id: string): Promise<TenantLimits> {\n return this.request(`/admin/tenants/${id}/limits`);\n }\n\n async updateTenantLimits(id: string, limits: AdminTenantLimitsUpdate): Promise<TenantLimits> {\n return this.request(`/admin/tenants/${id}/limits`, { method: 'PATCH', body: limits });\n }\n\n // =========================================================================\n // Customers\n // =========================================================================\n\n async getCustomers(params?: {\n search?: string;\n tenant_id?: string;\n is_active?: boolean;\n page?: number;\n page_size?: number;\n }): Promise<PaginatedResponse<CustomerWithTenant>> {\n return this.request('/admin/customers', { params: params as Record<string, string | number | boolean | undefined> });\n }\n\n async createCustomer(data: AdminCustomerCreate): Promise<CustomerWithTenant> {\n return this.request('/admin/customers', { method: 'POST', body: data });\n }\n\n async updateCustomer(id: string, data: AdminCustomerUpdate): Promise<CustomerWithTenant> {\n return this.request(`/admin/customers/${id}`, { method: 'PATCH', body: data });\n }\n\n async deleteCustomer(id: string): Promise<void> {\n return this.request(`/admin/customers/${id}`, { method: 'DELETE' });\n }\n\n // =========================================================================\n // Subscription Plans (local DB)\n // =========================================================================\n\n async getSubscriptionPlans(includeInactive?: boolean): Promise<SubscriptionPlanList> {\n return this.request('/admin/subscription-plans', {\n params: includeInactive !== undefined ? { include_inactive: includeInactive } : undefined,\n });\n }\n\n async getSubscriptionPlan(id: string): Promise<SubscriptionPlan> {\n return this.request(`/admin/subscription-plans/${id}`);\n }\n\n async createSubscriptionPlan(data: SubscriptionPlanCreate): Promise<SubscriptionPlan> {\n return this.request('/admin/subscription-plans', { method: 'POST', body: data });\n }\n\n async updateSubscriptionPlan(id: string, data: SubscriptionPlanUpdate): Promise<SubscriptionPlan> {\n return this.request(`/admin/subscription-plans/${id}`, { method: 'PATCH', body: data });\n }\n\n async deleteSubscriptionPlan(id: string): Promise<void> {\n return this.request(`/admin/subscription-plans/${id}`, { method: 'DELETE' });\n }\n\n // =========================================================================\n // Billing Plans (GrowFlow Billing proxy)\n // =========================================================================\n\n async getBillingPlans(isActive?: boolean): Promise<BillingPlanList> {\n return this.request('/admin/billing/plans', {\n params: isActive !== undefined ? { is_active: isActive } : undefined,\n });\n }\n\n async createBillingPlan(data: CreateBillingPlanRequest): Promise<BillingPlan> {\n return this.request('/admin/billing/plans', { method: 'POST', body: data });\n }\n\n async updateBillingPlan(id: string, data: UpdateBillingPlanRequest): Promise<BillingPlan> {\n return this.request(`/admin/billing/plans/${id}`, { method: 'PATCH', body: data });\n }\n\n async deleteBillingPlan(id: string): Promise<void> {\n return this.request(`/admin/billing/plans/${id}`, { method: 'DELETE' });\n }\n\n async syncBillingPlanToStripe(id: string): Promise<BillingPlan> {\n return this.request(`/admin/billing/plans/${id}/sync-stripe`, { method: 'POST' });\n }\n\n // =========================================================================\n // Billing Subscriptions (GrowFlow Billing proxy)\n // =========================================================================\n\n async getBillingSubscriptions(params?: {\n status?: string;\n search?: string;\n limit?: number;\n offset?: number;\n }): Promise<BillingSubscriptionList> {\n return this.request('/admin/billing/subscriptions', { params: params as Record<string, string | number | boolean | undefined> });\n }\n\n async getBillingSubscription(id: string): Promise<BillingSubscription> {\n return this.request(`/admin/billing/subscriptions/${id}`);\n }\n\n async createBillingSubscription(data: CreateBillingSubscriptionRequest): Promise<BillingSubscription> {\n return this.request('/admin/billing/subscriptions', { method: 'POST', body: data });\n }\n\n async cancelBillingSubscription(id: string, atPeriodEnd: boolean = true): Promise<BillingSubscription> {\n return this.request(`/admin/billing/subscriptions/${id}/cancel`, {\n method: 'POST',\n body: { at_period_end: atPeriodEnd },\n });\n }\n\n async changeBillingSubscriptionPlan(id: string, newPlanSlug: string): Promise<BillingSubscription> {\n return this.request(`/admin/billing/subscriptions/${id}/change-plan`, {\n method: 'POST',\n body: { new_plan_slug: newPlanSlug },\n });\n }\n\n // =========================================================================\n // Settings\n // =========================================================================\n\n async getBillingSettings(): Promise<BillingSettings> {\n return this.request('/admin/settings/billing');\n }\n\n async updateBillingSettings(data: UpdateBillingSettingsRequest): Promise<BillingSettings> {\n return this.request('/admin/settings/billing', { method: 'PUT', body: data });\n }\n\n async testBillingConnection(): Promise<BillingTestResult> {\n return this.request('/admin/settings/billing/test', { method: 'POST' });\n }\n}\n\n/** Factory function for creating a BookingAdminApiClient */\nexport function createBookingAdminClient(options: BookingAdminApiClientOptions): BookingAdminApiClient {\n return new BookingAdminApiClient(options);\n}\n","import { createContext, useContext } from 'react';\nimport type { BookingAdminApiClient } from '../api/client';\n\nexport const BookingAdminClientContext = createContext<BookingAdminApiClient | null>(null);\n\nexport function useBookingAdminClient(): BookingAdminApiClient {\n const client = useContext(BookingAdminClientContext);\n if (!client) {\n throw new Error(\n 'useBookingAdminClient must be used within a BookingAdminProvider. ' +\n 'Wrap your component tree with <BookingAdminProvider config={{...}}>.'\n );\n }\n return client;\n}\n","import { useState, useCallback } from 'react';\n\n/**\n * Generic hook for managing dialog state with optional associated data.\n */\nexport function useDialogState<T = undefined>() {\n const [isOpen, setIsOpen] = useState(false);\n const [data, setData] = useState<T | undefined>(undefined);\n\n const open = useCallback((initialData?: T) => {\n setData(initialData);\n setIsOpen(true);\n }, []);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setTimeout(() => setData(undefined), 150);\n }, []);\n\n const toggle = useCallback(() => {\n if (isOpen) {\n close();\n } else {\n open();\n }\n }, [isOpen, open, close]);\n\n return {\n isOpen,\n data,\n open,\n close,\n toggle,\n setData,\n };\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBookingAdminClient } from './context';\nimport type { AdminTenantCreate, AdminTenantUpdate, AdminTenantLimitsUpdate, TenantPlan } from '../types/tenant';\n\nconst TENANTS_KEY = 'booking-admin-tenants';\n\nexport function useAdminTenants(params?: {\n search?: string;\n plan?: TenantPlan;\n is_active?: boolean;\n page?: number;\n page_size?: number;\n}) {\n const client = useBookingAdminClient();\n return useQuery({\n queryKey: [TENANTS_KEY, params],\n queryFn: () => client.getTenants(params),\n });\n}\n\nexport function useAdminTenant(id: string) {\n const client = useBookingAdminClient();\n return useQuery({\n queryKey: [TENANTS_KEY, id],\n queryFn: () => client.getTenant(id),\n enabled: !!id,\n });\n}\n\nexport function useCreateTenant() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (data: AdminTenantCreate) => client.createTenant(data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [TENANTS_KEY] });\n },\n });\n}\n\nexport function useUpdateTenant() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data }: { id: string; data: AdminTenantUpdate }) =>\n client.updateTenant(id, data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [TENANTS_KEY] });\n },\n });\n}\n\nexport function useDeleteTenant() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) => client.deleteTenant(id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [TENANTS_KEY] });\n },\n });\n}\n\nexport function useUpdateTenantPlan() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, plan }: { id: string; plan: TenantPlan }) =>\n client.updateTenantPlan(id, plan),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [TENANTS_KEY] });\n },\n });\n}\n\nexport function useUpdateTenantStatus() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, isActive }: { id: string; isActive: boolean }) =>\n client.updateTenantStatus(id, isActive),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [TENANTS_KEY] });\n },\n });\n}\n\nexport function useTenantLimits(id: string) {\n const client = useBookingAdminClient();\n return useQuery({\n queryKey: [TENANTS_KEY, id, 'limits'],\n queryFn: () => client.getTenantLimits(id),\n enabled: !!id,\n });\n}\n\nexport function useUpdateTenantLimits() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, limits }: { id: string; limits: AdminTenantLimitsUpdate }) =>\n client.updateTenantLimits(id, limits),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({ queryKey: [TENANTS_KEY, variables.id, 'limits'] });\n queryClient.invalidateQueries({ queryKey: [TENANTS_KEY] });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBookingAdminClient } from './context';\nimport type { AdminCustomerCreate, AdminCustomerUpdate } from '../types/customer';\n\nconst CUSTOMERS_KEY = 'booking-admin-customers';\n\nexport function useAdminCustomers(params?: {\n search?: string;\n tenant_id?: string;\n is_active?: boolean;\n page?: number;\n page_size?: number;\n}) {\n const client = useBookingAdminClient();\n return useQuery({\n queryKey: [CUSTOMERS_KEY, params],\n queryFn: () => client.getCustomers(params),\n });\n}\n\nexport function useCreateCustomer() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (data: AdminCustomerCreate) => client.createCustomer(data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [CUSTOMERS_KEY] });\n },\n });\n}\n\nexport function useUpdateCustomer() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data }: { id: string; data: AdminCustomerUpdate }) =>\n client.updateCustomer(id, data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [CUSTOMERS_KEY] });\n },\n });\n}\n\nexport function useDeleteCustomer() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) => client.deleteCustomer(id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [CUSTOMERS_KEY] });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBookingAdminClient } from './context';\nimport type { SubscriptionPlanCreate, SubscriptionPlanUpdate } from '../types/subscription-plan';\n\nconst SUBSCRIPTION_PLANS_KEY = 'booking-admin-subscription-plans';\n\nexport function useSubscriptionPlans(includeInactive?: boolean) {\n const client = useBookingAdminClient();\n return useQuery({\n queryKey: [SUBSCRIPTION_PLANS_KEY, includeInactive],\n queryFn: () => client.getSubscriptionPlans(includeInactive),\n });\n}\n\nexport function useSubscriptionPlan(id: string) {\n const client = useBookingAdminClient();\n return useQuery({\n queryKey: [SUBSCRIPTION_PLANS_KEY, id],\n queryFn: () => client.getSubscriptionPlan(id),\n enabled: !!id,\n });\n}\n\nexport function useCreateSubscriptionPlan() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (data: SubscriptionPlanCreate) => client.createSubscriptionPlan(data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [SUBSCRIPTION_PLANS_KEY] });\n },\n });\n}\n\nexport function useUpdateSubscriptionPlan() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data }: { id: string; data: SubscriptionPlanUpdate }) =>\n client.updateSubscriptionPlan(id, data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [SUBSCRIPTION_PLANS_KEY] });\n },\n });\n}\n\nexport function useDeleteSubscriptionPlan() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) => client.deleteSubscriptionPlan(id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [SUBSCRIPTION_PLANS_KEY] });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBookingAdminClient } from './context';\nimport type { CreateBillingPlanRequest, UpdateBillingPlanRequest } from '../types/billing';\n\nconst BILLING_PLANS_KEY = 'booking-admin-billing-plans';\n\nexport function useBillingPlans(isActive?: boolean) {\n const client = useBookingAdminClient();\n return useQuery({\n queryKey: [BILLING_PLANS_KEY, isActive],\n queryFn: () => client.getBillingPlans(isActive),\n });\n}\n\nexport function useCreateBillingPlan() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (data: CreateBillingPlanRequest) => client.createBillingPlan(data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [BILLING_PLANS_KEY] });\n },\n });\n}\n\nexport function useUpdateBillingPlan() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, data }: { id: string; data: UpdateBillingPlanRequest }) =>\n client.updateBillingPlan(id, data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [BILLING_PLANS_KEY] });\n },\n });\n}\n\nexport function useDeleteBillingPlan() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) => client.deleteBillingPlan(id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [BILLING_PLANS_KEY] });\n },\n });\n}\n\nexport function useSyncBillingPlanToStripe() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (id: string) => client.syncBillingPlanToStripe(id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [BILLING_PLANS_KEY] });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBookingAdminClient } from './context';\nimport type { CreateBillingSubscriptionRequest } from '../types/billing';\n\nconst BILLING_SUBSCRIPTIONS_KEY = 'booking-admin-billing-subscriptions';\n\nexport function useBillingSubscriptions(params?: {\n status?: string;\n search?: string;\n limit?: number;\n offset?: number;\n}) {\n const client = useBookingAdminClient();\n return useQuery({\n queryKey: [BILLING_SUBSCRIPTIONS_KEY, params],\n queryFn: () => client.getBillingSubscriptions(params),\n });\n}\n\nexport function useBillingSubscription(id: string) {\n const client = useBookingAdminClient();\n return useQuery({\n queryKey: [BILLING_SUBSCRIPTIONS_KEY, id],\n queryFn: () => client.getBillingSubscription(id),\n enabled: !!id,\n });\n}\n\nexport function useCreateBillingSubscription() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (data: CreateBillingSubscriptionRequest) =>\n client.createBillingSubscription(data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [BILLING_SUBSCRIPTIONS_KEY] });\n },\n });\n}\n\nexport function useCancelBillingSubscription() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, atPeriodEnd }: { id: string; atPeriodEnd?: boolean }) =>\n client.cancelBillingSubscription(id, atPeriodEnd),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [BILLING_SUBSCRIPTIONS_KEY] });\n },\n });\n}\n\nexport function useChangeBillingSubscriptionPlan() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, newPlanSlug }: { id: string; newPlanSlug: string }) =>\n client.changeBillingSubscriptionPlan(id, newPlanSlug),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [BILLING_SUBSCRIPTIONS_KEY] });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBookingAdminClient } from './context';\nimport type { UpdateBillingSettingsRequest } from '../types/settings';\n\nconst SETTINGS_KEY = 'booking-admin-billing-settings';\n\nexport function useBillingSettings() {\n const client = useBookingAdminClient();\n return useQuery({\n queryKey: [SETTINGS_KEY],\n queryFn: () => client.getBillingSettings(),\n });\n}\n\nexport function useUpdateBillingSettings() {\n const client = useBookingAdminClient();\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (data: UpdateBillingSettingsRequest) =>\n client.updateBillingSettings(data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [SETTINGS_KEY] });\n },\n });\n}\n\nexport function useTestBillingConnection() {\n const client = useBookingAdminClient();\n return useMutation({\n mutationFn: () => client.testBillingConnection(),\n });\n}\n","/**\n * Format a currency amount using Intl.NumberFormat.\n */\nexport function formatCurrency(amount: number, currency: string = 'EUR', locale: string = 'it-IT'): string {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currency.toUpperCase(),\n }).format(amount);\n}\n\n/**\n * Format amount in cents to currency string.\n */\nexport function formatCurrencyFromCents(amountCents: number, currency: string = 'EUR', locale: string = 'it-IT'): string {\n return formatCurrency(amountCents / 100, currency, locale);\n}\n\n/**\n * Format a price, returning \"Contattaci\" for null values.\n */\nexport function formatPrice(price: number | null, currency: string = 'EUR', locale: string = 'it-IT'): string {\n if (price === null) return 'Contattaci';\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currency.toUpperCase(),\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(price);\n}\n\n/**\n * Format a date string or Date object.\n */\nexport function formatDate(date: Date | string | undefined | null, locale: string = 'it-IT'): string {\n if (!date) return 'N/A';\n const d = typeof date === 'string' ? new Date(date) : date;\n if (isNaN(d.getTime())) return 'N/A';\n return new Intl.DateTimeFormat(locale, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n }).format(d);\n}\n\n/**\n * Format a Unix timestamp (seconds) to date string.\n */\nexport function formatTimestamp(timestamp: number | null, includeTime: boolean = false, locale: string = 'it-IT'): string {\n if (!timestamp) return '-';\n const date = new Date(timestamp * 1000);\n if (includeTime) {\n return date.toLocaleDateString(locale, {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n }\n return date.toLocaleDateString(locale, {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n });\n}\n\n/**\n * Truncate long IDs for display.\n */\nexport function truncateId(id: string, maxLength: number = 20): string {\n if (id.length <= maxLength) return id;\n return `${id.slice(0, 10)}...${id.slice(-6)}`;\n}\n","import type { TenantPlan } from '../types/tenant';\nimport type { BillingSubscriptionStatus } from '../types/billing';\n\n// --- Tenant Status ---\n\nexport const tenantStatusColors: Record<string, string> = {\n active: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',\n inactive: 'bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-400',\n};\n\nexport const tenantStatusLabels: Record<string, string> = {\n active: 'Attivo',\n inactive: 'Inattivo',\n};\n\n// --- Tenant Plan ---\n\nexport const tenantPlanColors: Record<TenantPlan, string> = {\n free: 'bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-400',\n starter: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n professional: 'bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400',\n enterprise: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n};\n\nexport const tenantPlanLabels: Record<TenantPlan, string> = {\n free: 'Free',\n starter: 'Starter',\n professional: 'Professional',\n enterprise: 'Enterprise',\n};\n\n// --- Billing Subscription Status ---\n\nexport const billingSubscriptionStatusColors: Record<BillingSubscriptionStatus, string> = {\n active: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',\n trialing: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400',\n past_due: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',\n canceled: 'bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-400',\n unpaid: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',\n incomplete: 'bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400',\n};\n\nexport const billingSubscriptionStatusLabels: Record<BillingSubscriptionStatus, string> = {\n active: 'Attivo',\n trialing: 'In Prova',\n past_due: 'Scaduto',\n canceled: 'Cancellato',\n unpaid: 'Non Pagato',\n incomplete: 'Incompleto',\n};\n","/**\n * Validate a plan slug format.\n */\nexport function validateSlug(slug: string): string | null {\n if (!slug.trim()) {\n return 'Lo slug è obbligatorio';\n }\n if (!/^[a-z0-9-]+$/.test(slug)) {\n return 'Lo slug può contenere solo lettere minuscole, numeri e trattini';\n }\n return null;\n}\n\n/**\n * Validate required string field.\n */\nexport function validateRequired(value: string, fieldName: string): string | null {\n if (!value.trim()) {\n return `${fieldName} è obbligatorio`;\n }\n return null;\n}\n\n/**\n * Validate email format.\n */\nexport function validateEmail(email: string): string | null {\n if (!email.trim()) {\n return \"L'email è obbligatoria\";\n }\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n return 'Formato email non valido';\n }\n return null;\n}\n"],"mappings":"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","names":["import_react","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query"]}
|