@brandwave/react 0.1.3 → 0.3.1
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.ts +40 -10
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/testing.d.ts +1 -0
- package/dist/testing.js +2 -0
- package/dist/testing.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider/BrandwaveProvider.tsx","../src/demo-mode-mutation-guard.ts","../src/hooks/useBrandwaveClient.ts","../src/activities/keys.ts","../src/activities/useActivity.ts","../src/activities/useListActivities.ts","../src/activities/useCountActivities.ts","../src/activities/useActivityStats.ts","../src/activities/useListActivityCreators.ts","../src/activities/useCountActivityCreators.ts","../src/activities/useMetricConfidence.ts","../src/activities/useActivityMetrics.ts","../src/activities/useActivityMetricsHistory.ts","../src/activities/useListSparklines.ts","../src/activities/useCreateActivity.ts","../src/activities/useUpdateActivity.ts","../src/activities/useDeleteActivity.ts","../src/activities/useLinkActivityCreator.ts","../src/activities/useUnlinkActivityCreator.ts","../src/activities/useConnectActivityContentLink.ts","../src/activities/useDisconnectActivityContentLink.ts","../src/activities/useCreateActivityCost.ts","../src/costs/keys.ts","../src/activities/useUpdateActivityCost.ts","../src/activities/useDeleteActivityCost.ts","../src/activity-log/keys.ts","../src/activity-log/useActivityLog.ts","../src/billing/keys.ts","../src/billing/useCreateBillingCheckoutSession.ts","../src/billing/useCreateBillingPortalSession.ts","../src/billing/useSyncBillingCheckoutSession.ts","../src/campaigns/keys.ts","../src/campaigns/useCampaign.ts","../src/campaigns/useListCampaigns.ts","../src/campaigns/useCampaignStats.ts","../src/campaigns/useCreateCampaign.ts","../src/campaigns/useUpdateCampaign.ts","../src/campaigns/useDeleteCampaign.ts","../src/campaigns/useLinkCampaignActivity.ts","../src/campaigns/useUnlinkCampaignActivity.ts","../src/campaigns/useCampaignMetrics.ts","../src/campaigns/useCampaignMetricsHistory.ts","../src/creators/keys.ts","../src/creators/useCreator.ts","../src/creators/useListCreators.ts","../src/creators/useCreatorStats.ts","../src/creators/useCreateCreator.ts","../src/creators/useUpdateCreator.ts","../src/creators/useDeleteCreator.ts","../src/creators/useConnectCreatorSocialAccount.ts","../src/creators/useDisconnectCreatorSocialAccount.ts","../src/creators/useCreatorMetrics.ts","../src/creators/useCreatorMetricsHistory.ts","../src/conversions/keys.ts","../src/conversions/useConversion.ts","../src/conversions/useListConversions.ts","../src/conversions/useCreateConversion.ts","../src/conversions/useUpdateConversion.ts","../src/conversions/useDeleteConversion.ts","../src/conversionSources/keys.ts","../src/conversionSources/useConversionSource.ts","../src/conversionSources/useListConversionSources.ts","../src/conversionSources/useCreateConversionSource.ts","../src/conversionSources/useUpdateConversionSource.ts","../src/conversionSources/useDeleteConversionSource.ts","../src/costs/useListCosts.ts","../src/costs/useCountCosts.ts","../src/costs/useListCostTypes.ts","../src/google-analytics/keys.ts","../src/google-analytics/useConnectionStatus.ts","../src/google-analytics/useListProperties.ts","../src/google-analytics/useConnect.ts","../src/google-analytics/useDisconnect.ts","../src/google-analytics/useSelectProperty.ts","../src/insights/useListOrganizationInsights.ts","../src/insights/keys.ts","../src/insights/useDismissInsight.ts","../src/notes/keys.ts","../src/notes/useNote.ts","../src/notes/useListNotes.ts","../src/notes/useCreateNote.ts","../src/notes/useUpdateNote.ts","../src/notes/useDeleteNote.ts","../src/organizations/keys.ts","../src/organizations/useGetOrganization.ts","../src/organizations/useListOrganizations.ts","../src/organizations/useListOrganizationUsers.ts","../src/organizations/useCreateOrganization.ts","../src/organizations/useCompleteOrganicSignup.ts","../src/organizations/useUpdateOrganization.ts","../src/organizations/useDeleteOrganization.ts","../src/organizations/useAddOrganizationUser.ts","../src/organizations/useUpdateOrganizationUserRole.ts","../src/organizations/useRemoveOrganizationUser.ts","../src/organizations/useAcceptOrganizationInvite.ts","../src/organizations/useDeclineOrganizationInvite.ts","../src/organizations/useProcessInviteSignup.ts","../src/organizations/useInviteOrganizationUser.ts","../src/organizations/useOrganizationMetrics.ts","../src/organizations/useOrganizationMetricsHistory.ts","../src/personal-access-tokens/keys.ts","../src/personal-access-tokens/useListPersonalAccessTokens.ts","../src/personal-access-tokens/useCreatePersonalAccessToken.ts","../src/personal-access-tokens/useRevokePersonalAccessToken.ts","../src/personal-access-tokens/useRotatePersonalAccessToken.ts","../src/users/keys.ts","../src/users/useUser.ts","../src/users/useListUsers.ts","../src/users/useUserSettings.ts","../src/users/useCreateUser.ts","../src/users/useUpdateUser.ts","../src/users/useChangeEmail.ts","../src/users/useRequestDeletion.ts","../src/users/useConfirmDeletion.ts","../src/users/useUpdateUserSettings.ts","../src/users/useDeleteUser.ts","../src/users/useRequestAvatarUpload.ts","../src/users/useUploadAvatar.ts","../src/index.ts"],"sourcesContent":["import React, { createContext, useMemo } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { createBrandwave } from '@brandwave/ts';\n\ntype BrandwaveClient = ReturnType<typeof createBrandwave>;\n\ntype BrandwaveContextValue = {\n client: BrandwaveClient;\n};\n\nconst BrandwaveContext = createContext<BrandwaveContextValue | undefined>(undefined);\n\ntype BrandwaveProviderProps = {\n children: React.ReactNode;\n /** Access token for API authentication (required) */\n accessToken: string;\n /** Optional custom API URL (defaults to production) */\n baseUrl?: string;\n /** Optional existing QueryClient - if not provided, one will be created internally */\n queryClient?: QueryClient;\n};\n\n/**\n * Provider component for Brandwave React SDK.\n *\n * Provides the Brandwave client and optionally wraps with QueryClientProvider.\n *\n * @example\n * ```tsx\n * // With existing QueryClient (recommended for apps already using TanStack Query)\n * <QueryClientProvider client={queryClient}>\n * <BrandwaveProvider accessToken={token} queryClient={queryClient}>\n * <App />\n * </BrandwaveProvider>\n * </QueryClientProvider>\n *\n * // Without existing QueryClient (creates one internally)\n * <BrandwaveProvider accessToken={token}>\n * <App />\n * </BrandwaveProvider>\n * ```\n */\nconst BrandwaveProvider = ({\n children,\n accessToken,\n baseUrl,\n queryClient: externalQueryClient,\n}: BrandwaveProviderProps) => {\n const client = useMemo(\n () => createBrandwave({ accessToken, baseUrl }),\n [accessToken, baseUrl]\n );\n\n const internalQueryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60, // 1 minute\n gcTime: 1000 * 60 * 5, // 5 minutes\n },\n },\n }),\n []\n );\n\n const queryClient = externalQueryClient ?? internalQueryClient;\n const contextValue = useMemo(() => ({ client }), [client]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <BrandwaveContext.Provider value={contextValue}>{children}</BrandwaveContext.Provider>\n </QueryClientProvider>\n );\n};\n\nexport { BrandwaveProvider, BrandwaveContext };\nexport type { BrandwaveProviderProps, BrandwaveContextValue, BrandwaveClient };\n","type DemoModeMutationScope = 'user' | 'invite' | 'billing';\n\ntype DemoModeMutationGuard = {\n allowInDemoMode: boolean;\n scope: DemoModeMutationScope;\n};\n\nconst DEMO_MODE_MUTATION_GUARD_META_KEY = 'brandwaveDemoModeGuard';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nconst withDemoModeMutationGuardMeta = (\n meta: Record<string, unknown> | undefined,\n guard: DemoModeMutationGuard\n): Record<string, unknown> => ({\n ...(meta ?? {}),\n [DEMO_MODE_MUTATION_GUARD_META_KEY]: guard,\n});\n\nconst allowDemoModeUserMutation = (\n meta?: Record<string, unknown>\n): Record<string, unknown> =>\n withDemoModeMutationGuardMeta(meta, { allowInDemoMode: true, scope: 'user' });\n\nconst allowDemoModeInviteMutation = (\n meta?: Record<string, unknown>\n): Record<string, unknown> =>\n withDemoModeMutationGuardMeta(meta, { allowInDemoMode: true, scope: 'invite' });\n\nconst allowDemoModeBillingMutation = (\n meta?: Record<string, unknown>\n): Record<string, unknown> =>\n withDemoModeMutationGuardMeta(meta, { allowInDemoMode: true, scope: 'billing' });\n\nconst getDemoModeMutationGuard = (meta: unknown): DemoModeMutationGuard | null => {\n if (!isRecord(meta)) return null;\n\n const rawGuard = meta[DEMO_MODE_MUTATION_GUARD_META_KEY];\n if (!isRecord(rawGuard) || typeof rawGuard.allowInDemoMode !== 'boolean') {\n return null;\n }\n\n const scope = rawGuard.scope;\n if (scope !== 'user' && scope !== 'invite' && scope !== 'billing') {\n return null;\n }\n\n return {\n allowInDemoMode: rawGuard.allowInDemoMode,\n scope,\n };\n};\n\nexport {\n DEMO_MODE_MUTATION_GUARD_META_KEY,\n allowDemoModeBillingMutation,\n allowDemoModeInviteMutation,\n allowDemoModeUserMutation,\n getDemoModeMutationGuard,\n};\nexport type { DemoModeMutationGuard, DemoModeMutationScope };\n","import { useContext } from 'react';\nimport { BrandwaveContext } from '../provider/BrandwaveProvider';\nimport type { BrandwaveClient } from '../provider/BrandwaveProvider';\n\n/**\n * Internal hook to access the Brandwave client from context.\n *\n * @throws Error if used outside of BrandwaveProvider\n * @returns The Brandwave client instance\n */\nconst useBrandwaveClient = (): BrandwaveClient => {\n const context = useContext(BrandwaveContext);\n\n if (!context) {\n throw new Error('useBrandwaveClient must be used within a BrandwaveProvider');\n }\n\n return context.client;\n};\n\nexport { useBrandwaveClient };\n","/**\n * Query key factory for activities following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type {\n ActivityParams,\n ActivityStatsParams,\n CountActivitiesParams,\n CountActivityCreatorsParams,\n GetActivityMetricsHistoryParams,\n GetActivityMetricsParams,\n GetMetricConfidenceParams,\n ListActivitiesParams,\n ListActivityCreatorsParams,\n ListSparklinesParams,\n} from '@brandwave/ts';\n\nconst activityKeys = {\n all: ['brandwave', 'activities'] as const,\n lists: () => [...activityKeys.all, 'list'] as const,\n list: (params: ListActivitiesParams) => [...activityKeys.lists(), params] as const,\n details: () => [...activityKeys.all, 'detail'] as const,\n detail: (id: ActivityParams['id']) => [...activityKeys.details(), id] as const,\n counts: () => [...activityKeys.all, 'count'] as const,\n count: (params: CountActivitiesParams) => [...activityKeys.counts(), params] as const,\n stats: () => [...activityKeys.all, 'stats'] as const,\n stat: (params: ActivityStatsParams) => [...activityKeys.stats(), params] as const,\n creatorsLists: () => [...activityKeys.all, 'creators', 'list'] as const,\n creatorsList: (params: ListActivityCreatorsParams) =>\n [...activityKeys.creatorsLists(), params] as const,\n creatorsCounts: () => [...activityKeys.all, 'creators', 'count'] as const,\n creatorsCount: (params: CountActivityCreatorsParams) =>\n [...activityKeys.creatorsCounts(), params] as const,\n metricsConfidenceDetails: () => [...activityKeys.all, 'metrics', 'confidence'] as const,\n metricsConfidenceDetail: (params: GetMetricConfidenceParams) =>\n [...activityKeys.metricsConfidenceDetails(), params] as const,\n sparklinesLists: () => [...activityKeys.all, 'sparklines', 'list'] as const,\n sparklinesList: (params: ListSparklinesParams) =>\n [...activityKeys.sparklinesLists(), params] as const,\n metricsDetails: () => [...activityKeys.all, 'metrics', 'detail'] as const,\n metricsDetail: (activityId: GetActivityMetricsParams['activityId']) =>\n [...activityKeys.metricsDetails(), activityId] as const,\n metricsHistoryDetails: () => [...activityKeys.all, 'metrics', 'history', 'detail'] as const,\n metricsHistoryDetail: (params: GetActivityMetricsHistoryParams) =>\n [...activityKeys.metricsHistoryDetails(), params] as const,\n};\n\nexport { activityKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { Activity, ActivityParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useActivity}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseActivityOptions = Omit<\n UseQueryOptions<Activity, Error, Activity, ReturnType<typeof activityKeys.detail>>,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a single activity by ID. */\nconst useActivity = (params: ActivityParams, options?: UseActivityOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.activities({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useActivity };\nexport type { UseActivityOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ActivityListResult, ListActivitiesParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListActivities}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListActivitiesOptions = Omit<\n UseQueryOptions<\n ActivityListResult,\n Error,\n ActivityListResult,\n ReturnType<typeof activityKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of activities. */\nconst useListActivities = (params: ListActivitiesParams, options?: UseListActivitiesOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.list(params),\n queryFn: async () => client.activities.list(params),\n });\n};\n\nexport { useListActivities };\nexport type { UseListActivitiesOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CountActivitiesParams, CountResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCountActivities}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCountActivitiesOptions = Omit<\n UseQueryOptions<\n CountResult,\n Error,\n CountResult,\n ReturnType<typeof activityKeys.count>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches the count of activities matching the given filters. */\nconst useCountActivities = (params: CountActivitiesParams, options?: UseCountActivitiesOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.count(params),\n queryFn: async () => client.activities.count(params),\n });\n};\n\nexport { useCountActivities };\nexport type { UseCountActivitiesOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ActivityStats, ActivityStatsParams, ItemResult } from '@brandwave/ts';\n\ntype UseActivityStatsOptions = Omit<\n UseQueryOptions<\n ItemResult<ActivityStats>,\n Error,\n ItemResult<ActivityStats>,\n ReturnType<typeof activityKeys.stat>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches aggregate statistics for activities matching the given filters. */\nconst useActivityStats = (params: ActivityStatsParams, options?: UseActivityStatsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.stat(params),\n queryFn: async () => client.activities.stats(params),\n });\n};\n\nexport { useActivityStats };\nexport type { UseActivityStatsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ActivityCreatorInList, ListActivityCreatorsParams, ListResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListActivityCreators}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListActivityCreatorsOptions = Omit<\n UseQueryOptions<\n ListResult<ActivityCreatorInList>,\n Error,\n ListResult<ActivityCreatorInList>,\n ReturnType<typeof activityKeys.creatorsList>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of creators linked to an activity. */\nconst useListActivityCreators = (\n params: ListActivityCreatorsParams,\n options?: UseListActivityCreatorsOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.creatorsList(params),\n queryFn: async () => client.activities.creators.list(params),\n });\n};\n\nexport { useListActivityCreators };\nexport type { UseListActivityCreatorsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CountActivityCreatorsParams, CountResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCountActivityCreators}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCountActivityCreatorsOptions = Omit<\n UseQueryOptions<\n CountResult,\n Error,\n CountResult,\n ReturnType<typeof activityKeys.creatorsCount>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches the count of creators linked to an activity. */\nconst useCountActivityCreators = (\n params: CountActivityCreatorsParams,\n options?: UseCountActivityCreatorsOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.creatorsCount(params),\n queryFn: async () => client.activities.creators.count(params),\n });\n};\n\nexport { useCountActivityCreators };\nexport type { UseCountActivityCreatorsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { GetMetricConfidenceParams, ItemResult, MetricConfidence } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useMetricConfidence}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseMetricConfidenceOptions = Omit<\n UseQueryOptions<\n ItemResult<MetricConfidence>,\n Error,\n ItemResult<MetricConfidence>,\n ReturnType<typeof activityKeys.metricsConfidenceDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches metric confidence scores for an activity. */\nconst useMetricConfidence = (\n params: GetMetricConfidenceParams,\n options?: UseMetricConfidenceOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.metricsConfidenceDetail(params),\n queryFn: async () => client.activities.metrics.confidence(params),\n });\n};\n\nexport { useMetricConfidence };\nexport type { UseMetricConfidenceOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ActivityMetrics, GetActivityMetricsParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useActivityMetrics}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseActivityMetricsOptions = Omit<\n UseQueryOptions<\n ActivityMetrics,\n Error,\n ActivityMetrics,\n ReturnType<typeof activityKeys.metricsDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches calculated metrics for an activity (CPM, CPE, total cost).\n * All calculations are performed server-side.\n */\nconst useActivityMetrics = (\n params: GetActivityMetricsParams,\n options?: UseActivityMetricsOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.metricsDetail(params.activityId),\n queryFn: async () => {\n const { data } = await client.activities.metrics.get(params);\n return data;\n },\n });\n};\n\nexport { useActivityMetrics };\nexport type { UseActivityMetricsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n GetActivityMetricsHistoryParams,\n ListResult,\n MetricsHistoryEntry,\n} from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useActivityMetricsHistory}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseActivityMetricsHistoryOptions = Omit<\n UseQueryOptions<\n ListResult<MetricsHistoryEntry>,\n Error,\n ListResult<MetricsHistoryEntry>,\n ReturnType<typeof activityKeys.metricsHistoryDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches metrics history for an activity with calculated CPM and CPE for each entry.\n * All calculations are performed server-side.\n */\nconst useActivityMetricsHistory = (\n params: GetActivityMetricsHistoryParams,\n options?: UseActivityMetricsHistoryOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.metricsHistoryDetail(params),\n queryFn: async () => {\n return client.activities.metrics.history(params);\n },\n });\n};\n\nexport { useActivityMetricsHistory };\nexport type { UseActivityMetricsHistoryOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ActivitySparklineEntry, ListResult, ListSparklinesParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListSparklines}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListSparklinesOptions = Omit<\n UseQueryOptions<\n ListResult<ActivitySparklineEntry>,\n Error,\n ListResult<ActivitySparklineEntry>,\n ReturnType<typeof activityKeys.sparklinesList>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches sparkline chart data for activities. */\nconst useListSparklines = (params: ListSparklinesParams, options?: UseListSparklinesOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.sparklinesList(params),\n queryFn: async () => client.activities.sparklines.list(params),\n });\n};\n\nexport { useListSparklines };\nexport type { UseListSparklinesOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { ActivityCreateResult, CreateActivityParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateActivity}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateActivityOptions = Omit<\n UseMutationOptions<ActivityCreateResult, Error, CreateActivityParams>,\n 'mutationFn'\n>;\n\n/** Creates a new activity. Invalidates activity queries on success. */\nconst useCreateActivity = (options?: UseCreateActivityOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.activities.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: activityKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateActivity };\n\nexport type { UseCreateActivityOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { ActivityUpdateResult, UpdateActivityParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateActivity}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateActivityOptions = Omit<\n UseMutationOptions<ActivityUpdateResult, Error, UpdateActivityParams>,\n 'mutationFn'\n>;\n\n/** Updates an existing activity. Invalidates activity queries on success. */\nconst useUpdateActivity = (options?: UseUpdateActivityOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.activities.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n queryClient.invalidateQueries({ queryKey: activityKeys.detail(params.id) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateActivity };\n\nexport type { UseUpdateActivityOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { DeleteActivityParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteActivity}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteActivityOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteActivityParams>,\n 'mutationFn'\n>;\n\n/** Deletes an activity. Invalidates activity queries on success. */\nconst useDeleteActivity = (options?: UseDeleteActivityOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: activityKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteActivity };\n\nexport type { UseDeleteActivityOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { ItemResult, LinkCreatorParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useLinkActivityCreator}.\n * `mutationFn` is managed by the hook.\n */\ntype UseLinkActivityCreatorOptions = Omit<\n UseMutationOptions<ItemResult<{ id: string }>, Error, LinkCreatorParams>,\n 'mutationFn'\n>;\n\n/** Links a creator to an activity. Invalidates activity queries on success. */\nconst useLinkActivityCreator = (options?: UseLinkActivityCreatorOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.creators.link(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: activityKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useLinkActivityCreator };\n\nexport type { UseLinkActivityCreatorOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { SuccessResult, UnlinkCreatorParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUnlinkActivityCreator}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUnlinkActivityCreatorOptions = Omit<\n UseMutationOptions<SuccessResult, Error, UnlinkCreatorParams>,\n 'mutationFn'\n>;\n\n/** Unlinks a creator from an activity. Invalidates activity queries on success. */\nconst useUnlinkActivityCreator = (options?: UseUnlinkActivityCreatorOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.creators.unlink(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: activityKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUnlinkActivityCreator };\n\nexport type { UseUnlinkActivityCreatorOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { ConnectContentLinkParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseConnectActivityContentLinkOptions = Omit<\n UseMutationOptions<SuccessResult, Error, ConnectContentLinkParams>,\n 'mutationFn'\n>;\n\nconst useConnectActivityContentLink = (\n options?: UseConnectActivityContentLinkOptions,\n) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.contentLink.connect(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: activityKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useConnectActivityContentLink };\nexport type { UseConnectActivityContentLinkOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { DisconnectContentLinkParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseDisconnectActivityContentLinkOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DisconnectContentLinkParams>,\n 'mutationFn'\n>;\n\nconst useDisconnectActivityContentLink = (\n options?: UseDisconnectActivityContentLinkOptions,\n) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.contentLink.disconnect(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: activityKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDisconnectActivityContentLink };\nexport type { UseDisconnectActivityContentLinkOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { costKeys } from '../costs/keys';\nimport { activityKeys } from './keys';\nimport type { CreateActivityCostParams, ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateActivityCost}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateActivityCostOptions = Omit<\n UseMutationOptions<ItemResult<{ id: string }>, Error, CreateActivityCostParams>,\n 'mutationFn'\n>;\n\n/** Creates a cost entry on an activity. Invalidates activity queries on success. */\nconst useCreateActivityCost = (options?: UseCreateActivityCostOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.costs.create(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n queryClient.invalidateQueries({ queryKey: costKeys.all }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateActivityCost };\n\nexport type { UseCreateActivityCostOptions };\n","/**\n * Query key factory for costs following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type { CountCostsParams, ListCostTypesParams, ListCostsParams } from '@brandwave/ts';\n\nconst costKeys = {\n all: ['brandwave', 'costs'] as const,\n lists: () => [...costKeys.all, 'list'] as const,\n list: (params: ListCostsParams) => [...costKeys.lists(), params] as const,\n counts: () => [...costKeys.all, 'count'] as const,\n count: (params: CountCostsParams) => [...costKeys.counts(), params] as const,\n typesLists: () => [...costKeys.all, 'types', 'list'] as const,\n typesList: (params: ListCostTypesParams) => [...costKeys.typesLists(), params] as const,\n};\n\nexport { costKeys };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { costKeys } from '../costs/keys';\nimport { activityKeys } from './keys';\nimport type { ItemResult, UpdateActivityCostParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateActivityCost}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateActivityCostOptions = Omit<\n UseMutationOptions<ItemResult<{ id: string }>, Error, UpdateActivityCostParams>,\n 'mutationFn'\n>;\n\n/** Updates a cost entry on an activity. Invalidates activity queries on success. */\nconst useUpdateActivityCost = (options?: UseUpdateActivityCostOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.costs.update(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n queryClient.invalidateQueries({ queryKey: costKeys.all }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateActivityCost };\n\nexport type { UseUpdateActivityCostOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { costKeys } from '../costs/keys';\nimport { activityKeys } from './keys';\nimport type { DeleteActivityCostParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteActivityCost}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteActivityCostOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteActivityCostParams>,\n 'mutationFn'\n>;\n\n/** Deletes a cost entry from an activity. Invalidates activity queries on success. */\nconst useDeleteActivityCost = (options?: UseDeleteActivityCostOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.costs.delete(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n queryClient.invalidateQueries({ queryKey: costKeys.all }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteActivityCost };\n\nexport type { UseDeleteActivityCostOptions };\n","import type {\n\tActivityLogParams,\n\tListActivityLogParams,\n\tSearchActivityLogParams,\n} from '@brandwave/ts';\n\n/**\n * Query key factory for activity log following TKDodo best practices.\n * All keys namespaced with 'brandwave' prefix to avoid collisions.\n */\nconst activityLogKeys = {\n\tall: ['brandwave', 'activity-log'] as const,\n\tlists: () => [...activityLogKeys.all, 'list'] as const,\n\tlist: (params: ListActivityLogParams) => [...activityLogKeys.lists(), params] as const,\n\tsearches: () => [...activityLogKeys.all, 'search'] as const,\n\tsearch: (params: SearchActivityLogParams) => [...activityLogKeys.searches(), params] as const,\n\tdetails: () => [...activityLogKeys.all, 'detail'] as const,\n\tdetail: (id: ActivityLogParams['id']) => [...activityLogKeys.details(), id] as const,\n};\n\nexport { activityLogKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityLogKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n\tActivityLogEntry,\n\tActivityLogEntryInList,\n\tActivityLogParams,\n\tActivityLogSearchResult,\n\tListActivityLogParams,\n\tListResult,\n\tSearchActivityLogParams,\n} from '@brandwave/ts';\n\n// =============================================================================\n// Use Activity Log Entry (Single)\n// =============================================================================\n\n/**\n * TanStack Query options for {@link useActivityLogEntry}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseActivityLogEntryOptions = Omit<\n\tUseQueryOptions<\n\t\tActivityLogEntry,\n\t\tError,\n\t\tActivityLogEntry,\n\t\tReturnType<typeof activityLogKeys.detail>\n\t>,\n\t'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetch a single activity log entry by ID.\n */\nconst useActivityLogEntry = (params: ActivityLogParams, options?: UseActivityLogEntryOptions) => {\n\tconst client = useBrandwaveClient();\n\n\treturn useQuery({\n\t\t...options,\n\t\tqueryKey: activityLogKeys.detail(params.id),\n\t\tqueryFn: async () => {\n\t\t\tconst { data } = await client.activityLog({ id: params.id });\n\t\t\treturn data;\n\t\t},\n\t\tenabled: options?.enabled !== false && Boolean(params.id),\n\t});\n}\n\nexport type { UseActivityLogEntryOptions };\n\n// =============================================================================\n// Use List Activity Log\n// =============================================================================\n\n/**\n * TanStack Query options for {@link useListActivityLog}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListActivityLogOptions = Omit<\n\tUseQueryOptions<\n\t\tListResult<ActivityLogEntryInList>,\n\t\tError,\n\t\tListResult<ActivityLogEntryInList>,\n\t\tReturnType<typeof activityLogKeys.list>\n\t>,\n\t'queryKey' | 'queryFn'\n>;\n\n/**\n * List activity log entries with filtering, sorting, and pagination.\n */\nconst useListActivityLog = (params: ListActivityLogParams, options?: UseListActivityLogOptions) => {\n\tconst client = useBrandwaveClient();\n\n\treturn useQuery({\n\t\t...options,\n\t\tqueryKey: activityLogKeys.list(params),\n\t\tqueryFn: () => client.activityLog.list(params),\n\t\tenabled: options?.enabled !== false && Boolean(params.organizationId),\n\t});\n}\n\nexport type { UseListActivityLogOptions };\n\n// =============================================================================\n// Use Search Activity Log\n// =============================================================================\n\n/**\n * TanStack Query options for {@link useSearchActivityLog}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseSearchActivityLogOptions = Omit<\n\tUseQueryOptions<\n\t\tListResult<ActivityLogSearchResult>,\n\t\tError,\n\t\tListResult<ActivityLogSearchResult>,\n\t\tReturnType<typeof activityLogKeys.search>\n\t>,\n\t'queryKey' | 'queryFn'\n>;\n\n/**\n * Full-text search across activity log entries.\n */\nconst useSearchActivityLog = (\n\tparams: SearchActivityLogParams,\n\toptions?: UseSearchActivityLogOptions,\n) => {\n\tconst client = useBrandwaveClient();\n\n\treturn useQuery({\n\t\t...options,\n\t\tqueryKey: activityLogKeys.search(params),\n\t\tqueryFn: () => client.activityLog.search(params),\n\t\tenabled:\n\t\t\toptions?.enabled !== false &&\n\t\t\tBoolean(params.organizationId) &&\n\t\t\tBoolean(params.query?.trim()),\n\t});\n}\n\nexport type { UseSearchActivityLogOptions };\n\nexport { useActivityLogEntry, useListActivityLog, useSearchActivityLog };\n","const billingKeys = {\n all: ['brandwave', 'billing'] as const,\n};\n\nexport { billingKeys };\n","import { useMutation } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeBillingMutation } from '../demo-mode-mutation-guard';\nimport type {\n BillingCheckoutSessionResult,\n CreateBillingCheckoutSessionParams,\n} from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseCreateBillingCheckoutSessionOptions = Omit<\n UseMutationOptions<BillingCheckoutSessionResult, Error, CreateBillingCheckoutSessionParams>,\n 'mutationFn'\n>;\n\nconst useCreateBillingCheckoutSession = (\n options?: UseCreateBillingCheckoutSessionOptions\n) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeBillingMutation(options?.meta),\n mutationFn: async (params) => {\n const { data } = await client.billing.createCheckoutSession(params);\n return data;\n },\n });\n};\n\nexport { useCreateBillingCheckoutSession };\nexport type { UseCreateBillingCheckoutSessionOptions };\n","import { useMutation } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport type {\n BillingPortalSessionResult,\n CreateBillingPortalSessionParams,\n} from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseCreateBillingPortalSessionOptions = Omit<\n UseMutationOptions<BillingPortalSessionResult, Error, CreateBillingPortalSessionParams>,\n 'mutationFn'\n>;\n\nconst useCreateBillingPortalSession = (\n options?: UseCreateBillingPortalSessionOptions\n) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.billing.createPortalSession(params);\n return data;\n },\n });\n};\n\nexport { useCreateBillingPortalSession };\nexport type { UseCreateBillingPortalSessionOptions };\n","import { useMutation } from '@tanstack/react-query';\nimport { allowDemoModeBillingMutation } from '../demo-mode-mutation-guard';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport type {\n BillingCheckoutSessionSyncResult,\n SyncBillingCheckoutSessionParams,\n} from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseSyncBillingCheckoutSessionOptions = Omit<\n UseMutationOptions<\n BillingCheckoutSessionSyncResult,\n Error,\n SyncBillingCheckoutSessionParams\n >,\n 'mutationFn'\n>;\n\nconst useSyncBillingCheckoutSession = (\n options?: UseSyncBillingCheckoutSessionOptions\n) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeBillingMutation(options?.meta),\n mutationFn: async (params) => {\n const { data } = await client.billing.syncCheckoutSession(params);\n return data;\n },\n });\n};\n\nexport { useSyncBillingCheckoutSession };\nexport type { UseSyncBillingCheckoutSessionOptions };\n","/**\n * Query key factory for campaigns following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type {\n CampaignParams,\n CampaignStatsParams,\n GetCampaignMetricsHistoryParams,\n GetCampaignMetricsParams,\n ListCampaignsParams,\n} from '@brandwave/ts';\n\nconst campaignKeys = {\n all: ['brandwave', 'campaigns'] as const,\n lists: () => [...campaignKeys.all, 'list'] as const,\n list: (params: ListCampaignsParams) => [...campaignKeys.lists(), params] as const,\n details: () => [...campaignKeys.all, 'detail'] as const,\n detail: (id: CampaignParams['id']) => [...campaignKeys.details(), id] as const,\n stats: () => [...campaignKeys.all, 'stats'] as const,\n stat: (params: CampaignStatsParams) => [...campaignKeys.stats(), params] as const,\n metricsDetails: () => [...campaignKeys.all, 'metrics', 'detail'] as const,\n metricsDetail: (campaignId: GetCampaignMetricsParams['campaignId']) =>\n [...campaignKeys.metricsDetails(), campaignId] as const,\n metricsHistoryDetails: () =>\n [...campaignKeys.all, 'metrics', 'history', 'detail'] as const,\n metricsHistoryDetail: (params: GetCampaignMetricsHistoryParams) =>\n [...campaignKeys.metricsHistoryDetails(), params] as const,\n};\n\nexport { campaignKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { Campaign, CampaignParams } from '@brandwave/ts';\nimport type { UseQueryOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Query options for {@link useCampaign}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCampaignOptions = Omit<\n UseQueryOptions<Campaign, Error, Campaign, ReturnType<typeof campaignKeys.detail>>,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Hook to fetch a single campaign by ID.\n *\n * @example\n * ```tsx\n * const { data, isLoading, error } = useCampaign({ id: 'abc-123' });\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return <div>{data.name}</div>;\n * ```\n */\nconst useCampaign = (params: CampaignParams, options?: UseCampaignOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: campaignKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.campaigns({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useCampaign };\nexport type { UseCampaignOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CampaignListResult, ListCampaignsParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListCampaigns}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListCampaignsOptions = Omit<\n UseQueryOptions<\n CampaignListResult,\n Error,\n CampaignListResult,\n ReturnType<typeof campaignKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of campaigns. */\nconst useListCampaigns = (params: ListCampaignsParams, options?: UseListCampaignsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: campaignKeys.list(params),\n queryFn: async () => client.campaigns.list(params),\n });\n};\n\nexport { useListCampaigns };\nexport type { UseListCampaignsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CampaignStats, CampaignStatsParams, ItemResult } from '@brandwave/ts';\n\ntype UseCampaignStatsOptions = Omit<\n UseQueryOptions<\n ItemResult<CampaignStats>,\n Error,\n ItemResult<CampaignStats>,\n ReturnType<typeof campaignKeys.stat>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches aggregate statistics for campaigns matching the given filters. */\nconst useCampaignStats = (params: CampaignStatsParams, options?: UseCampaignStatsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: campaignKeys.stat(params),\n queryFn: async () => client.campaigns.stats(params),\n });\n};\n\nexport { useCampaignStats };\nexport type { UseCampaignStatsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { CampaignCreateResult, CreateCampaignParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateCampaign}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateCampaignOptions = Omit<\n UseMutationOptions<CampaignCreateResult, Error, CreateCampaignParams>,\n 'mutationFn'\n>;\n\n/**\n * Hook to create a new campaign.\n *\n * Automatically invalidates campaign queries on success.\n *\n * @example\n * ```tsx\n * const { mutate, isPending } = useCreateCampaign();\n *\n * const handleCreate = () => {\n * mutate(\n * { organizationId: 'org-123', name: 'My Campaign' },\n * { onSuccess: (campaign) => console.log('Created:', campaign.id) }\n * );\n * };\n *\n * return (\n * <button onClick={handleCreate} disabled={isPending}>\n * {isPending ? 'Creating...' : 'Create Campaign'}\n * </button>\n * );\n * ```\n */\nconst useCreateCampaign = (options?: UseCreateCampaignOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.campaigns.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: campaignKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateCampaign };\n\nexport type { UseCreateCampaignOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { CampaignUpdateResult, UpdateCampaignParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateCampaign}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateCampaignOptions = Omit<\n UseMutationOptions<CampaignUpdateResult, Error, UpdateCampaignParams>,\n 'mutationFn'\n>;\n\n/** Updates an existing campaign. Invalidates campaign queries on success. */\nconst useUpdateCampaign = (options?: UseUpdateCampaignOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.campaigns.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: campaignKeys.all }),\n queryClient.invalidateQueries({ queryKey: campaignKeys.detail(params.id) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateCampaign };\nexport type { UseUpdateCampaignOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { DeleteCampaignParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteCampaign}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteCampaignOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteCampaignParams>,\n 'mutationFn'\n>;\n\n/** Deletes a campaign. Invalidates campaign queries on success. */\nconst useDeleteCampaign = (options?: UseDeleteCampaignOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.campaigns.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: campaignKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteCampaign };\nexport type { UseDeleteCampaignOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from '../activities/keys';\nimport { campaignKeys } from './keys';\nimport type { ItemResult, LinkActivityParams, LinkActivityResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useLinkCampaignActivity}.\n * `mutationFn` is managed by the hook.\n */\ntype UseLinkCampaignActivityOptions = Omit<\n UseMutationOptions<ItemResult<LinkActivityResult>, Error, LinkActivityParams>,\n 'mutationFn'\n>;\n\n/** Links an activity to a campaign. Invalidates campaign and activity queries on success. */\nconst useLinkCampaignActivity = (options?: UseLinkCampaignActivityOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.campaigns.activities.link(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: campaignKeys.all }),\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useLinkCampaignActivity };\n\nexport type { UseLinkCampaignActivityOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from '../activities/keys';\nimport { campaignKeys } from './keys';\nimport type { SuccessResult, UnlinkActivityByIdsParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUnlinkCampaignActivity}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUnlinkCampaignActivityOptions = Omit<\n UseMutationOptions<SuccessResult, Error, UnlinkActivityByIdsParams>,\n 'mutationFn'\n>;\n\n/**\n * Unlinks an activity from a campaign by logical IDs.\n * Invalidates campaign and activity queries on success.\n */\nconst useUnlinkCampaignActivity = (options?: UseUnlinkCampaignActivityOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.campaigns.activities.unlink(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: campaignKeys.all }),\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUnlinkCampaignActivity };\n\nexport type { UseUnlinkCampaignActivityOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CampaignMetrics, GetCampaignMetricsParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCampaignMetrics}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCampaignMetricsOptions = Omit<\n UseQueryOptions<\n CampaignMetrics,\n Error,\n CampaignMetrics,\n ReturnType<typeof campaignKeys.metricsDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches calculated metrics for a campaign (CPM, CPE, CPA, total cost).\n * All calculations are performed server-side.\n */\nconst useCampaignMetrics = (\n params: GetCampaignMetricsParams,\n options?: UseCampaignMetricsOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: campaignKeys.metricsDetail(params.campaignId),\n queryFn: async () => {\n const { data } = await client.campaigns.metrics.get(params);\n return data;\n },\n });\n};\n\nexport { useCampaignMetrics };\nexport type { UseCampaignMetricsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n GetCampaignMetricsHistoryParams,\n ListResult,\n MetricsHistoryEntry,\n} from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCampaignMetricsHistory}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCampaignMetricsHistoryOptions = Omit<\n UseQueryOptions<\n ListResult<MetricsHistoryEntry>,\n Error,\n ListResult<MetricsHistoryEntry>,\n ReturnType<typeof campaignKeys.metricsHistoryDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches metrics history for a campaign with CPM, CPE, and CPA for each date.\n * All calculations are performed server-side.\n */\nconst useCampaignMetricsHistory = (\n params: GetCampaignMetricsHistoryParams,\n options?: UseCampaignMetricsHistoryOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: campaignKeys.metricsHistoryDetail(params),\n queryFn: async () => {\n return client.campaigns.metrics.history(params);\n },\n });\n};\n\nexport { useCampaignMetricsHistory };\nexport type { UseCampaignMetricsHistoryOptions };\n","/**\n * Query key factory for creators following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type {\n CreatorParams,\n CreatorStatsParams,\n GetCreatorMetricsHistoryParams,\n GetCreatorMetricsParams,\n ListCreatorsParams,\n} from '@brandwave/ts';\n\nconst creatorKeys = {\n all: ['brandwave', 'creators'] as const,\n lists: () => [...creatorKeys.all, 'list'] as const,\n list: (params: ListCreatorsParams) => [...creatorKeys.lists(), params] as const,\n details: () => [...creatorKeys.all, 'detail'] as const,\n detail: (id: CreatorParams['id']) => [...creatorKeys.details(), id] as const,\n stats: () => [...creatorKeys.all, 'stats'] as const,\n stat: (params: CreatorStatsParams) => [...creatorKeys.stats(), params] as const,\n metricsDetails: () => [...creatorKeys.all, 'metrics', 'detail'] as const,\n metricsDetail: (creatorId: GetCreatorMetricsParams['creatorId']) =>\n [...creatorKeys.metricsDetails(), creatorId] as const,\n metricsHistoryDetails: () =>\n [...creatorKeys.all, 'metrics', 'history', 'detail'] as const,\n metricsHistoryDetail: (params: GetCreatorMetricsHistoryParams) =>\n [...creatorKeys.metricsHistoryDetails(), params] as const,\n};\n\nexport { creatorKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { Creator, CreatorParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCreator}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCreatorOptions = Omit<\n UseQueryOptions<Creator, Error, Creator, ReturnType<typeof creatorKeys.detail>>,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a single creator by ID. */\nconst useCreator = (params: CreatorParams, options?: UseCreatorOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: creatorKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.creators({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useCreator };\nexport type { UseCreatorOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CreatorListResult, ListCreatorsParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListCreators}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListCreatorsOptions = Omit<\n UseQueryOptions<\n CreatorListResult,\n Error,\n CreatorListResult,\n ReturnType<typeof creatorKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of creators. */\nconst useListCreators = (\n params: ListCreatorsParams,\n options?: UseListCreatorsOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: creatorKeys.list(params),\n queryFn: async () => client.creators.list(params),\n });\n};\n\nexport { useListCreators };\nexport type { UseListCreatorsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CreatorStats, CreatorStatsParams, ItemResult } from '@brandwave/ts';\n\ntype UseCreatorStatsOptions = Omit<\n UseQueryOptions<\n ItemResult<CreatorStats>,\n Error,\n ItemResult<CreatorStats>,\n ReturnType<typeof creatorKeys.stat>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches aggregate statistics for creators matching the given filters. */\nconst useCreatorStats = (params: CreatorStatsParams, options?: UseCreatorStatsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: creatorKeys.stat(params),\n queryFn: async () => client.creators.stats(params),\n });\n};\n\nexport { useCreatorStats };\nexport type { UseCreatorStatsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { CreateCreatorParams, CreatorCreateResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateCreator}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateCreatorOptions = Omit<\n UseMutationOptions<CreatorCreateResult, Error, CreateCreatorParams>,\n 'mutationFn'\n>;\n\n/** Creates a new creator. Invalidates creator queries on success. */\nconst useCreateCreator = (options?: UseCreateCreatorOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.creators.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: creatorKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateCreator };\n\nexport type { UseCreateCreatorOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { CreatorUpdateResult, UpdateCreatorParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateCreator}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateCreatorOptions = Omit<\n UseMutationOptions<CreatorUpdateResult, Error, UpdateCreatorParams>,\n 'mutationFn'\n>;\n\n/** Updates an existing creator. Invalidates creator queries on success. */\nconst useUpdateCreator = (options?: UseUpdateCreatorOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.creators.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: creatorKeys.all }),\n queryClient.invalidateQueries({ queryKey: creatorKeys.detail(params.id) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateCreator };\n\nexport type { UseUpdateCreatorOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { DeleteCreatorParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteCreator}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteCreatorOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteCreatorParams>,\n 'mutationFn'\n>;\n\n/** Deletes a creator. Invalidates creator queries on success. */\nconst useDeleteCreator = (options?: UseDeleteCreatorOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.creators.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: creatorKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteCreator };\n\nexport type { UseDeleteCreatorOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { ConnectSocialAccountParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useConnectCreatorSocialAccount}.\n * `mutationFn` is managed by the hook.\n */\ntype UseConnectCreatorSocialAccountOptions = Omit<\n UseMutationOptions<SuccessResult, Error, ConnectSocialAccountParams>,\n 'mutationFn'\n>;\n\n/**\n * Connects a new social media account to a creator via profile URL.\n * Creates the account record, links it, and triggers a data refresh.\n * Invalidates creator queries on success.\n */\nconst useConnectCreatorSocialAccount = (\n options?: UseConnectCreatorSocialAccountOptions,\n) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.creators.socialAccounts.connect(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: creatorKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useConnectCreatorSocialAccount };\nexport type { UseConnectCreatorSocialAccountOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { DisconnectSocialAccountParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDisconnectCreatorSocialAccount}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDisconnectCreatorSocialAccountOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DisconnectSocialAccountParams>,\n 'mutationFn'\n>;\n\n/**\n * Disconnects a social media account from a creator.\n * Invalidates creator queries on success.\n */\nconst useDisconnectCreatorSocialAccount = (\n options?: UseDisconnectCreatorSocialAccountOptions\n) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params: DisconnectSocialAccountParams) =>\n client.creators.socialAccounts.disconnect(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: creatorKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDisconnectCreatorSocialAccount };\n\nexport type { UseDisconnectCreatorSocialAccountOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CreatorMetrics, GetCreatorMetricsParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCreatorMetrics}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCreatorMetricsOptions = Omit<\n UseQueryOptions<\n CreatorMetrics,\n Error,\n CreatorMetrics,\n ReturnType<typeof creatorKeys.metricsDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches calculated metrics for a creator (CPM, CPE, CPA, total cost).\n * All calculations are performed server-side.\n */\nconst useCreatorMetrics = (\n params: GetCreatorMetricsParams,\n options?: UseCreatorMetricsOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: creatorKeys.metricsDetail(params.creatorId),\n queryFn: async () => {\n const { data } = await client.creators.metrics.get(params);\n return data;\n },\n });\n};\n\nexport { useCreatorMetrics };\nexport type { UseCreatorMetricsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n GetCreatorMetricsHistoryParams,\n ListResult,\n MetricsHistoryEntry,\n} from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCreatorMetricsHistory}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCreatorMetricsHistoryOptions = Omit<\n UseQueryOptions<\n ListResult<MetricsHistoryEntry>,\n Error,\n ListResult<MetricsHistoryEntry>,\n ReturnType<typeof creatorKeys.metricsHistoryDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches metrics history for a creator with CPM, CPE, and CPA for each date.\n * All calculations are performed server-side.\n */\nconst useCreatorMetricsHistory = (\n params: GetCreatorMetricsHistoryParams,\n options?: UseCreatorMetricsHistoryOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: creatorKeys.metricsHistoryDetail(params),\n queryFn: async () => {\n return client.creators.metrics.history(params);\n },\n });\n};\n\nexport { useCreatorMetricsHistory };\nexport type { UseCreatorMetricsHistoryOptions };\n","/**\n * Query key factory for conversions following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type { ListConversionsParams } from '@brandwave/ts';\n\nconst conversionKeys = {\n all: ['brandwave', 'conversions'] as const,\n lists: () => [...conversionKeys.all, 'list'] as const,\n list: (params: ListConversionsParams) => [...conversionKeys.lists(), params] as const,\n details: () => [...conversionKeys.all, 'detail'] as const,\n detail: (id: string) => [...conversionKeys.details(), id] as const,\n};\n\nexport { conversionKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionKeys } from './keys';\nimport type { Conversion, ConversionParams } from '@brandwave/ts';\nimport type { UseQueryOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Query options for {@link useConversion}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseConversionOptions = Omit<\n UseQueryOptions<Conversion, Error, Conversion, ReturnType<typeof conversionKeys.detail>>,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Hook to fetch a single conversion by ID.\n *\n * @example\n * ```tsx\n * const { data, isLoading, error } = useConversion({ id: 'conv-123' });\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return <div>Converted at: {data.convertedAt}</div>;\n * ```\n */\nconst useConversion = (params: ConversionParams, options?: UseConversionOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: conversionKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.conversions({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useConversion };\nexport type { UseConversionOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ConversionInList, ListConversionsParams, ListResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListConversions}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListConversionsOptions = Omit<\n UseQueryOptions<\n ListResult<ConversionInList>,\n Error,\n ListResult<ConversionInList>,\n ReturnType<typeof conversionKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of conversions. */\nconst useListConversions = (\n params: ListConversionsParams,\n options?: UseListConversionsOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: conversionKeys.list(params),\n queryFn: async () => client.conversions.list(params),\n });\n};\n\nexport { useListConversions };\nexport type { UseListConversionsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionKeys } from './keys';\nimport type { ConversionCreateResult, CreateConversionParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateConversion}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateConversionOptions = Omit<\n UseMutationOptions<ConversionCreateResult, Error, CreateConversionParams>,\n 'mutationFn'\n>;\n\n/**\n * Hook to create a new conversion record.\n *\n * Automatically invalidates conversion queries on success.\n *\n * @example\n * ```tsx\n * const { mutate, isPending } = useCreateConversion();\n *\n * const handleCreate = () => {\n * mutate(\n * { organizationId: 'org-123', sourceId: 'src-456', convertedAt: '2025-06-15T14:30:00Z' },\n * { onSuccess: (conversion) => console.log('Created:', conversion.id) }\n * );\n * };\n * ```\n */\nconst useCreateConversion = (options?: UseCreateConversionOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.conversions.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: conversionKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateConversion };\n\nexport type { UseCreateConversionOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionKeys } from './keys';\nimport type { ConversionUpdateResult, UpdateConversionParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateConversion}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateConversionOptions = Omit<\n UseMutationOptions<ConversionUpdateResult, Error, UpdateConversionParams>,\n 'mutationFn'\n>;\n\n/** Updates an existing conversion record. Invalidates conversion queries on success. */\nconst useUpdateConversion = (options?: UseUpdateConversionOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.conversions.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: conversionKeys.all }),\n queryClient.invalidateQueries({ queryKey: conversionKeys.detail(params.id) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateConversion };\n\nexport type { UseUpdateConversionOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionKeys } from './keys';\nimport type { DeleteConversionParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteConversion}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteConversionOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteConversionParams>,\n 'mutationFn'\n>;\n\n/** Deletes a conversion record. Invalidates conversion queries on success. */\nconst useDeleteConversion = (options?: UseDeleteConversionOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.conversions.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: conversionKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteConversion };\n\nexport type { UseDeleteConversionOptions };\n","/**\n * Query key factory for conversion sources following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type { ListConversionSourcesParams } from '@brandwave/ts';\n\nconst conversionSourceKeys = {\n all: ['brandwave', 'conversionSources'] as const,\n lists: () => [...conversionSourceKeys.all, 'list'] as const,\n list: (params: ListConversionSourcesParams) =>\n [...conversionSourceKeys.lists(), params] as const,\n details: () => [...conversionSourceKeys.all, 'detail'] as const,\n detail: (id: string) => [...conversionSourceKeys.details(), id] as const,\n};\n\nexport { conversionSourceKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionSourceKeys } from './keys';\nimport type { ConversionSource, ConversionSourceParams } from '@brandwave/ts';\nimport type { UseQueryOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Query options for {@link useConversionSource}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseConversionSourceOptions = Omit<\n UseQueryOptions<\n ConversionSource,\n Error,\n ConversionSource,\n ReturnType<typeof conversionSourceKeys.detail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Hook to fetch a single conversion source by ID.\n *\n * @example\n * ```tsx\n * const { data, isLoading, error } = useConversionSource({ id: 'src-123' });\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return <div>{data.name} ({data.type})</div>;\n * ```\n */\nconst useConversionSource = (\n params: ConversionSourceParams,\n options?: UseConversionSourceOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: conversionSourceKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.conversionSources({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useConversionSource };\nexport type { UseConversionSourceOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionSourceKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ConversionSourceInList, ListConversionSourcesParams, ListResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListConversionSources}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListConversionSourcesOptions = Omit<\n UseQueryOptions<\n ListResult<ConversionSourceInList>,\n Error,\n ListResult<ConversionSourceInList>,\n ReturnType<typeof conversionSourceKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of conversion sources. */\nconst useListConversionSources = (\n params: ListConversionSourcesParams,\n options?: UseListConversionSourcesOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: conversionSourceKeys.list(params),\n queryFn: async () => client.conversionSources.list(params),\n });\n};\n\nexport { useListConversionSources };\nexport type { UseListConversionSourcesOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionSourceKeys } from './keys';\nimport type { ConversionSourceCreateResult, CreateConversionSourceParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateConversionSource}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateConversionSourceOptions = Omit<\n UseMutationOptions<ConversionSourceCreateResult, Error, CreateConversionSourceParams>,\n 'mutationFn'\n>;\n\n/**\n * Hook to create a new conversion source.\n *\n * Automatically invalidates conversion source queries on success.\n *\n * @example\n * ```tsx\n * const { mutate, isPending } = useCreateConversionSource();\n *\n * const handleCreate = () => {\n * mutate(\n * {\n * organizationId: 'org-123',\n * name: 'Summer Promo',\n * type: 'promo_code',\n * category: 'organic_social',\n * },\n * { onSuccess: (source) => console.log('Created:', source.id) }\n * );\n * };\n * ```\n */\nconst useCreateConversionSource = (options?: UseCreateConversionSourceOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.conversionSources.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: conversionSourceKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateConversionSource };\n\nexport type { UseCreateConversionSourceOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionSourceKeys } from './keys';\nimport type { ConversionSourceUpdateResult, UpdateConversionSourceParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateConversionSource}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateConversionSourceOptions = Omit<\n UseMutationOptions<ConversionSourceUpdateResult, Error, UpdateConversionSourceParams>,\n 'mutationFn'\n>;\n\n/** Updates an existing conversion source. Invalidates conversion source queries on success. */\nconst useUpdateConversionSource = (options?: UseUpdateConversionSourceOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.conversionSources.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: conversionSourceKeys.all }),\n queryClient.invalidateQueries({ queryKey: conversionSourceKeys.detail(params.id) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateConversionSource };\n\nexport type { UseUpdateConversionSourceOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionSourceKeys } from './keys';\nimport type { DeleteConversionSourceParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteConversionSource}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteConversionSourceOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteConversionSourceParams>,\n 'mutationFn'\n>;\n\n/** Deletes a conversion source. Invalidates conversion source queries on success. */\nconst useDeleteConversionSource = (options?: UseDeleteConversionSourceOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.conversionSources.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: conversionSourceKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteConversionSource };\n\nexport type { UseDeleteConversionSourceOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { costKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CostInList, ListCostsParams, ListResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListCosts}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListCostsOptions = Omit<\n UseQueryOptions<\n ListResult<CostInList>,\n Error,\n ListResult<CostInList>,\n ReturnType<typeof costKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of costs for an activity. */\nconst useListCosts = (params: ListCostsParams, options?: UseListCostsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: costKeys.list(params),\n queryFn: async () => client.costs.list(params),\n });\n};\n\nexport { useListCosts };\nexport type { UseListCostsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { costKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CountCostsParams, CountResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCountCosts}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCountCostsOptions = Omit<\n UseQueryOptions<CountResult, Error, CountResult, ReturnType<typeof costKeys.count>>,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches the count of costs matching the given filters. */\nconst useCountCosts = (params: CountCostsParams, options?: UseCountCostsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: costKeys.count(params),\n queryFn: async () => client.costs.count(params),\n });\n};\n\nexport { useCountCosts };\nexport type { UseCountCostsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { costKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListCostTypesParams, ListResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListCostTypes}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListCostTypesOptions = Omit<\n UseQueryOptions<\n ListResult<string>,\n Error,\n ListResult<string>,\n ReturnType<typeof costKeys.typesList>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches the list of available cost types. */\nconst useListCostTypes = (params: ListCostTypesParams, options?: UseListCostTypesOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: costKeys.typesList(params),\n queryFn: async () => client.costs.types.list(params),\n });\n};\n\nexport { useListCostTypes };\nexport type { UseListCostTypesOptions };\n","/**\n * Query key factory for Google Analytics following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nconst googleAnalyticsKeys = {\n all: ['brandwave', 'googleAnalytics'] as const,\n connectionStatus: (organizationId: string) =>\n [...googleAnalyticsKeys.all, 'connectionStatus', organizationId] as const,\n properties: (organizationId: string) =>\n [...googleAnalyticsKeys.all, 'properties', organizationId] as const,\n};\n\nexport { googleAnalyticsKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { googleAnalyticsKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n GetGoogleAnalyticsConnectionStatusParams,\n GetGoogleAnalyticsConnectionStatusResponse,\n} from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useGoogleAnalyticsConnectionStatus}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseGoogleAnalyticsConnectionStatusOptions = Omit<\n UseQueryOptions<\n GetGoogleAnalyticsConnectionStatusResponse,\n Error,\n GetGoogleAnalyticsConnectionStatusResponse,\n ReturnType<typeof googleAnalyticsKeys.connectionStatus>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches the Google Analytics connection status for an organization.\n * Returns whether GA is connected, the property ID/name, and last sync time.\n */\nconst useGoogleAnalyticsConnectionStatus = (\n params: GetGoogleAnalyticsConnectionStatusParams,\n options?: UseGoogleAnalyticsConnectionStatusOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: googleAnalyticsKeys.connectionStatus(params.organizationId),\n queryFn: async () => {\n // client.google is the getConnectionStatus function\n const { data } = await client.google(params);\n return data;\n },\n });\n};\n\nexport { useGoogleAnalyticsConnectionStatus };\nexport type { UseGoogleAnalyticsConnectionStatusOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { googleAnalyticsKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n ListGoogleAnalyticsPropertiesParams,\n ListGoogleAnalyticsPropertiesResponse,\n} from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListGoogleAnalyticsProperties}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListGoogleAnalyticsPropertiesOptions = Omit<\n UseQueryOptions<\n ListGoogleAnalyticsPropertiesResponse,\n Error,\n ListGoogleAnalyticsPropertiesResponse,\n ReturnType<typeof googleAnalyticsKeys.properties>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Lists available GA4 properties for the connected Google account.\n */\nconst useListGoogleAnalyticsProperties = (\n params: ListGoogleAnalyticsPropertiesParams,\n options?: UseListGoogleAnalyticsPropertiesOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: googleAnalyticsKeys.properties(params.organizationId),\n queryFn: async () => {\n const { data } = await client.google.listProperties(params);\n return data;\n },\n });\n};\n\nexport { useListGoogleAnalyticsProperties };\nexport type { UseListGoogleAnalyticsPropertiesOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { googleAnalyticsKeys } from './keys';\nimport type { ConnectGoogleAnalyticsParams, ConnectGoogleAnalyticsResponse } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useConnectGoogleAnalytics}.\n * `mutationFn` is managed by the hook.\n */\ntype UseConnectGoogleAnalyticsOptions = Omit<\n UseMutationOptions<ConnectGoogleAnalyticsResponse, Error, ConnectGoogleAnalyticsParams>,\n 'mutationFn'\n>;\n\n/** Initiates OAuth flow to connect Google Analytics. Returns the OAuth URL to redirect to. */\nconst useConnectGoogleAnalytics = (options?: UseConnectGoogleAnalyticsOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.google.connect(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: googleAnalyticsKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useConnectGoogleAnalytics };\n\nexport type { UseConnectGoogleAnalyticsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { googleAnalyticsKeys } from './keys';\nimport type { DisconnectGoogleAnalyticsParams, DisconnectGoogleAnalyticsResponse } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDisconnectGoogleAnalytics}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDisconnectGoogleAnalyticsOptions = Omit<\n UseMutationOptions<DisconnectGoogleAnalyticsResponse, Error, DisconnectGoogleAnalyticsParams>,\n 'mutationFn'\n>;\n\n/**\n * Disconnects Google Analytics from the organization.\n * Invalidates connection queries on success.\n */\nconst useDisconnectGoogleAnalytics = (options?: UseDisconnectGoogleAnalyticsOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.google.disconnect(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: googleAnalyticsKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDisconnectGoogleAnalytics };\n\nexport type { UseDisconnectGoogleAnalyticsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { googleAnalyticsKeys } from './keys';\nimport type {\n SelectGoogleAnalyticsPropertyParams,\n SelectGoogleAnalyticsPropertyResponse,\n} from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useSelectGoogleAnalyticsProperty}.\n * `mutationFn` is managed by the hook.\n */\ntype UseSelectGoogleAnalyticsPropertyOptions = Omit<\n UseMutationOptions<\n SelectGoogleAnalyticsPropertyResponse,\n Error,\n SelectGoogleAnalyticsPropertyParams\n >,\n 'mutationFn'\n>;\n\n/** Persists the user's selected GA4 property for an organization. */\nconst useSelectGoogleAnalyticsProperty = (options?: UseSelectGoogleAnalyticsPropertyOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.google.selectProperty(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: googleAnalyticsKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useSelectGoogleAnalyticsProperty };\n\nexport type { UseSelectGoogleAnalyticsPropertyOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { insightKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListOrganizationInsightsParams, OrganizationInsight } from '@brandwave/ts';\n\ntype UseListOrganizationInsightsOptions = Omit<\n UseQueryOptions<\n Array<OrganizationInsight>,\n Error,\n Array<OrganizationInsight>,\n ReturnType<typeof insightKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\nconst useListOrganizationInsights = (\n params: ListOrganizationInsightsParams,\n options?: UseListOrganizationInsightsOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: insightKeys.list(params),\n queryFn: async () => {\n const result = await client.insights.list(params);\n return result.items ?? [];\n },\n });\n};\n\nexport { useListOrganizationInsights };\n","import type { ListOrganizationInsightsParams } from '@brandwave/ts';\n\nconst insightKeys = {\n all: ['insights'] as const,\n list: (params: ListOrganizationInsightsParams) =>\n [...insightKeys.all, 'list', params.organizationId] as const,\n};\n\nexport { insightKeys };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { insightKeys } from './keys';\nimport type { DismissInsightParams, ItemResult, OrganizationInsight } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDismissInsight}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDismissInsightOptions = Omit<\n UseMutationOptions<ItemResult<OrganizationInsight>, Error, DismissInsightParams>,\n 'mutationFn'\n>;\n\n/**\n * Dismiss an insight so it disappears from the dashboard.\n * Invalidates insight queries on success so the list reflects the dismissal.\n */\nconst useDismissInsight = (options?: UseDismissInsightOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params: DismissInsightParams) => client.insights.dismiss(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: insightKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDismissInsight };\n","/**\n * Query key factory for notes following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type { ListNotesParams, NoteParams } from '@brandwave/ts';\n\nconst noteKeys = {\n all: ['brandwave', 'notes'] as const,\n lists: () => [...noteKeys.all, 'list'] as const,\n list: (params: ListNotesParams) => [...noteKeys.lists(), params] as const,\n details: () => [...noteKeys.all, 'detail'] as const,\n detail: (id: NoteParams['id']) => [...noteKeys.details(), id] as const,\n};\n\nexport { noteKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { noteKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { Note, NoteParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useNote}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseNoteOptions = Omit<\n UseQueryOptions<Note, Error, Note, ReturnType<typeof noteKeys.detail>>,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a single note by ID. */\nconst useNote = (params: NoteParams, options?: UseNoteOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: noteKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.notes({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useNote };\nexport type { UseNoteOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { noteKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListNotesParams, ListResult, NoteInList } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListNotes}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListNotesOptions = Omit<\n UseQueryOptions<\n ListResult<NoteInList>,\n Error,\n ListResult<NoteInList>,\n ReturnType<typeof noteKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of notes for an activity or creator. */\nconst useListNotes = (params: ListNotesParams, options?: UseListNotesOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: noteKeys.list(params),\n queryFn: async () => client.notes.list(params),\n });\n};\n\nexport { useListNotes };\nexport type { UseListNotesOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { noteKeys } from './keys';\nimport type { CreateNoteParams, ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateNote}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateNoteOptions = Omit<\n UseMutationOptions<ItemResult<{ id: string }>, Error, CreateNoteParams>,\n 'mutationFn'\n>;\n\n/** Creates a note on any entity. Invalidates note queries on success. */\nconst useCreateNote = (options?: UseCreateNoteOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params: CreateNoteParams) => client.notes.create(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: noteKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateNote };\n\nexport type { UseCreateNoteOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { noteKeys } from './keys';\nimport type { ItemResult, UpdateNoteParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateNote}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateNoteOptions = Omit<\n UseMutationOptions<ItemResult<{ id: string }>, Error, UpdateNoteParams>,\n 'mutationFn'\n>;\n\n/** Updates a note's content. Invalidates note queries on success. */\nconst useUpdateNote = (options?: UseUpdateNoteOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params: UpdateNoteParams) => client.notes.update(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: noteKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateNote };\n\nexport type { UseUpdateNoteOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { noteKeys } from './keys';\nimport type { DeleteNoteParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteNote}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteNoteOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteNoteParams>,\n 'mutationFn'\n>;\n\n/** Deletes a note. Invalidates note queries on success. */\nconst useDeleteNote = (options?: UseDeleteNoteOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params: DeleteNoteParams) => client.notes.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: noteKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteNote };\n\nexport type { UseDeleteNoteOptions };\n","/**\n * Query key factory for organizations following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type {\n GetOrganizationMetricsHistoryParams,\n GetOrganizationMetricsParams,\n ListOrganizationUsersParams,\n ListOrganizationsParams,\n} from '@brandwave/ts';\n\nconst organizationKeys = {\n all: ['brandwave', 'organizations'] as const,\n details: () => [...organizationKeys.all, 'detail'] as const,\n detail: (id: string) => [...organizationKeys.details(), id] as const,\n lists: () => [...organizationKeys.all, 'list'] as const,\n list: (params: ListOrganizationsParams) => [...organizationKeys.lists(), params] as const,\n usersLists: () => [...organizationKeys.all, 'users', 'list'] as const,\n usersList: (params: ListOrganizationUsersParams) =>\n [...organizationKeys.usersLists(), params] as const,\n metricsDetails: () => [...organizationKeys.all, 'metrics', 'detail'] as const,\n metricsDetail: (organizationId: GetOrganizationMetricsParams['organizationId']) =>\n [...organizationKeys.metricsDetails(), organizationId] as const,\n metricsHistoryDetails: () =>\n [...organizationKeys.all, 'metrics', 'history', 'detail'] as const,\n metricsHistoryDetail: (params: GetOrganizationMetricsHistoryParams) =>\n [...organizationKeys.metricsHistoryDetails(), params] as const,\n};\n\nexport { organizationKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { GetOrganizationParams, ItemResult } from '@brandwave/ts';\n\ntype UseGetOrganizationOptions = Omit<\n UseQueryOptions<\n ItemResult<Record<string, unknown>>,\n Error,\n ItemResult<Record<string, unknown>>,\n ReturnType<typeof organizationKeys.detail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\nconst useGetOrganization = (\n params: GetOrganizationParams,\n options?: UseGetOrganizationOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: organizationKeys.detail(params.id),\n queryFn: async () => client.organizations.get(params),\n });\n};\n\nexport { useGetOrganization };\nexport type { UseGetOrganizationOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListOrganizationsParams, ListResult, OrganizationInList } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListOrganizations}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListOrganizationsOptions = Omit<\n UseQueryOptions<\n ListResult<OrganizationInList>,\n Error,\n ListResult<OrganizationInList>,\n ReturnType<typeof organizationKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of organizations the user belongs to. */\nconst useListOrganizations = (\n params: ListOrganizationsParams,\n options?: UseListOrganizationsOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: organizationKeys.list(params),\n queryFn: async () => client.organizations.list(params),\n });\n};\n\nexport { useListOrganizations };\nexport type { UseListOrganizationsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListOrganizationUsersParams, ListResult, OrganizationUserInList } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListOrganizationUsers}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListOrganizationUsersOptions = Omit<\n UseQueryOptions<\n ListResult<OrganizationUserInList>,\n Error,\n ListResult<OrganizationUserInList>,\n ReturnType<typeof organizationKeys.usersList>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of users in an organization. */\nconst useListOrganizationUsers = (\n params: ListOrganizationUsersParams,\n options?: UseListOrganizationUsersOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: organizationKeys.usersList(params),\n queryFn: async () => client.organizations.users.list(params),\n });\n};\n\nexport { useListOrganizationUsers };\nexport type { UseListOrganizationUsersOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { CreateOrganizationParams, OrganizationCreateResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateOrganization}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateOrganizationOptions = Omit<\n UseMutationOptions<OrganizationCreateResult, Error, Omit<CreateOrganizationParams, 'userId'>>,\n 'mutationFn'\n>;\n\n/** Creates a new organization. Invalidates organization queries on success. */\nconst useCreateOrganization = (options?: UseCreateOrganizationOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.organizations.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateOrganization };\n\nexport type { UseCreateOrganizationOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { CompleteOrganicSignupParams, CompleteOrganicSignupResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseCompleteOrganicSignupOptions = Omit<\n UseMutationOptions<CompleteOrganicSignupResult, Error, Omit<CompleteOrganicSignupParams, 'userId'>>,\n 'mutationFn'\n>;\n\nconst useCompleteOrganicSignup = (options?: UseCompleteOrganicSignupOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.organizations.completeOrganicSignup(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCompleteOrganicSignup };\nexport type { UseCompleteOrganicSignupOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { OrganizationUpdateResult, UpdateOrganizationParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateOrganization}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateOrganizationOptions = Omit<\n UseMutationOptions<OrganizationUpdateResult, Error, UpdateOrganizationParams>,\n 'mutationFn'\n>;\n\n/** Updates an organization. Invalidates organization queries on success. */\nconst useUpdateOrganization = (options?: UseUpdateOrganizationOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.organizations.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateOrganization };\n\nexport type { UseUpdateOrganizationOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { DeleteOrganizationParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteOrganization}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteOrganizationOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteOrganizationParams>,\n 'mutationFn'\n>;\n\n/** Deletes an organization. Invalidates organization queries on success. */\nconst useDeleteOrganization = (options?: UseDeleteOrganizationOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.organizations.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteOrganization };\n\nexport type { UseDeleteOrganizationOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { AddUserParams, ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useAddOrganizationUser}.\n * `mutationFn` is managed by the hook.\n */\ntype UseAddOrganizationUserOptions = Omit<\n UseMutationOptions<ItemResult<unknown>, Error, AddUserParams>,\n 'mutationFn'\n>;\n\n/** Adds a user to an organization. Invalidates organization queries on success. */\nconst useAddOrganizationUser = (options?: UseAddOrganizationUserOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.organizations.users.add(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useAddOrganizationUser };\n\nexport type { UseAddOrganizationUserOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { ItemResult, OrganizationUserRoleUpdateResult, UpdateUserRoleParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateOrganizationUserRole}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateOrganizationUserRoleOptions = Omit<\n UseMutationOptions<ItemResult<OrganizationUserRoleUpdateResult>, Error, UpdateUserRoleParams>,\n 'mutationFn'\n>;\n\n/** Updates a user's role within an organization. Invalidates organization queries on success. */\nconst useUpdateOrganizationUserRole = (options?: UseUpdateOrganizationUserRoleOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.organizations.users.updateRole(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateOrganizationUserRole };\n\nexport type { UseUpdateOrganizationUserRoleOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { RemoveUserParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useRemoveOrganizationUser}.\n * `mutationFn` is managed by the hook.\n */\ntype UseRemoveOrganizationUserOptions = Omit<\n UseMutationOptions<SuccessResult, Error, RemoveUserParams>,\n 'mutationFn'\n>;\n\n/** Removes a user from an organization. Invalidates organization queries on success. */\nconst useRemoveOrganizationUser = (options?: UseRemoveOrganizationUserOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.organizations.users.remove(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useRemoveOrganizationUser };\n\nexport type { UseRemoveOrganizationUserOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeInviteMutation } from '../demo-mode-mutation-guard';\nimport { organizationKeys } from './keys';\nimport type { AcceptInviteParams, ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype AcceptInviteMutationParams = Omit<AcceptInviteParams, 'userId'>;\n\n/**\n * TanStack Mutation options for {@link useAcceptOrganizationInvite}.\n * `mutationFn` is managed by the hook.\n */\ntype UseAcceptOrganizationInviteOptions = Omit<\n UseMutationOptions<ItemResult<unknown>, Error, AcceptInviteMutationParams>,\n 'mutationFn'\n>;\n\n/** Accepts an organization invite. Invalidates organization queries on success. */\nconst useAcceptOrganizationInvite = (options?: UseAcceptOrganizationInviteOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeInviteMutation(options?.meta),\n mutationFn: async (params) => client.organizations.users.acceptInvite(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useAcceptOrganizationInvite };\n\nexport type { UseAcceptOrganizationInviteOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeInviteMutation } from '../demo-mode-mutation-guard';\nimport { organizationKeys } from './keys';\nimport type { DeclineInviteParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseDeclineOrganizationInviteOptions = Omit<\n UseMutationOptions<SuccessResult, Error, Omit<DeclineInviteParams, 'userId'>>,\n 'mutationFn'\n>;\n\n/** Declines an organization invite. Invalidates organization queries on success. */\nconst useDeclineOrganizationInvite = (options?: UseDeclineOrganizationInviteOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeInviteMutation(options?.meta),\n mutationFn: async (params) => client.organizations.users.declineInvite(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeclineOrganizationInvite };\nexport type { UseDeclineOrganizationInviteOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype ProcessInviteSignupResult = ItemResult<{\n processed: boolean;\n organizationId?: string;\n role?: string;\n}>;\n\ntype UseProcessInviteSignupOptions = Omit<\n UseMutationOptions<ProcessInviteSignupResult, Error, void>,\n 'mutationFn'\n>;\n\n/** Processes invite signup metadata for a newly signed-up user. */\nconst useProcessInviteSignup = (options?: UseProcessInviteSignupOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async () => client.organizations.users.processInviteSignup(),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useProcessInviteSignup };\nexport type { UseProcessInviteSignupOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { InviteUserParams, ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useInviteOrganizationUser}.\n * `mutationFn` is managed by the hook.\n */\ntype UseInviteOrganizationUserOptions = Omit<\n UseMutationOptions<ItemResult<unknown>, Error, InviteUserParams>,\n 'mutationFn'\n>;\n\n/** Invites a user to an organization by email. Invalidates organization queries on success. */\nconst useInviteOrganizationUser = (options?: UseInviteOrganizationUserOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.organizations.users.invite(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useInviteOrganizationUser };\n\nexport type { UseInviteOrganizationUserOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { GetOrganizationMetricsParams, OrganizationMetrics } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useOrganizationMetrics}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseOrganizationMetricsOptions = Omit<\n UseQueryOptions<\n OrganizationMetrics,\n Error,\n OrganizationMetrics,\n ReturnType<typeof organizationKeys.metricsDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches calculated metrics for an organization (CPM, CPE, CPA, total cost).\n * All calculations are performed server-side.\n */\nconst useOrganizationMetrics = (\n params: GetOrganizationMetricsParams,\n options?: UseOrganizationMetricsOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: organizationKeys.metricsDetail(params.organizationId),\n queryFn: async () => {\n const { data } = await client.organizations.metrics.get(params);\n return data;\n },\n });\n};\n\nexport { useOrganizationMetrics };\nexport type { UseOrganizationMetricsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n GetOrganizationMetricsHistoryParams,\n ListResult,\n MetricsHistoryEntry,\n} from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useOrganizationMetricsHistory}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseOrganizationMetricsHistoryOptions = Omit<\n UseQueryOptions<\n ListResult<MetricsHistoryEntry>,\n Error,\n ListResult<MetricsHistoryEntry>,\n ReturnType<typeof organizationKeys.metricsHistoryDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches metrics history for an organization with CPM, CPE, and CPA for each date.\n * All calculations are performed server-side.\n */\nconst useOrganizationMetricsHistory = (\n params: GetOrganizationMetricsHistoryParams,\n options?: UseOrganizationMetricsHistoryOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: organizationKeys.metricsHistoryDetail(params),\n queryFn: async () => {\n return client.organizations.metrics.history(params);\n },\n });\n};\n\nexport { useOrganizationMetricsHistory };\nexport type { UseOrganizationMetricsHistoryOptions };\n","const personalAccessTokenKeys = {\n all: ['brandwave', 'personal-access-tokens'] as const,\n lists: () => [...personalAccessTokenKeys.all, 'list'] as const,\n list: () => [...personalAccessTokenKeys.lists()] as const,\n};\n\nexport { personalAccessTokenKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { personalAccessTokenKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListResult, PersonalAccessTokenInList } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListPersonalAccessTokens}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListPersonalAccessTokensOptions = Omit<\n UseQueryOptions<\n ListResult<PersonalAccessTokenInList>,\n Error,\n ListResult<PersonalAccessTokenInList>,\n ReturnType<typeof personalAccessTokenKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches all Personal Access Tokens for the authenticated user. */\nconst useListPersonalAccessTokens = (options?: UseListPersonalAccessTokensOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: personalAccessTokenKeys.list(),\n queryFn: async () => client.personalAccessTokens.list(),\n });\n};\n\nexport { useListPersonalAccessTokens };\nexport type { UseListPersonalAccessTokensOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { personalAccessTokenKeys } from './keys';\nimport type {\n CreatePersonalAccessTokenParams,\n PersonalAccessTokenCreateResult,\n} from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreatePersonalAccessToken}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreatePersonalAccessTokenOptions = Omit<\n UseMutationOptions<\n PersonalAccessTokenCreateResult,\n Error,\n CreatePersonalAccessTokenParams\n >,\n 'mutationFn'\n>;\n\n/**\n * Creates a new Personal Access Token.\n * IMPORTANT: The plaintext token is only returned once in the response.\n * Invalidates PAT queries on success.\n */\nconst useCreatePersonalAccessToken = (options?: UseCreatePersonalAccessTokenOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.personalAccessTokens.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: personalAccessTokenKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreatePersonalAccessToken };\nexport type { UseCreatePersonalAccessTokenOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { personalAccessTokenKeys } from './keys';\nimport type { RevokePersonalAccessTokenParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useRevokePersonalAccessToken}.\n * `mutationFn` is managed by the hook.\n */\ntype UseRevokePersonalAccessTokenOptions = Omit<\n UseMutationOptions<SuccessResult, Error, RevokePersonalAccessTokenParams>,\n 'mutationFn'\n>;\n\n/** Revokes a Personal Access Token. Invalidates PAT queries on success. */\nconst useRevokePersonalAccessToken = (options?: UseRevokePersonalAccessTokenOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.personalAccessTokens.revoke(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: personalAccessTokenKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useRevokePersonalAccessToken };\nexport type { UseRevokePersonalAccessTokenOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { personalAccessTokenKeys } from './keys';\nimport type {\n PersonalAccessTokenRotateResult,\n RotatePersonalAccessTokenParams,\n} from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useRotatePersonalAccessToken}.\n * `mutationFn` is managed by the hook.\n */\ntype UseRotatePersonalAccessTokenOptions = Omit<\n UseMutationOptions<\n PersonalAccessTokenRotateResult,\n Error,\n RotatePersonalAccessTokenParams\n >,\n 'mutationFn'\n>;\n\n/**\n * Rotates a Personal Access Token (creates new, revokes old).\n * IMPORTANT: The new plaintext token is only returned once in the response.\n * Invalidates PAT queries on success.\n */\nconst useRotatePersonalAccessToken = (options?: UseRotatePersonalAccessTokenOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.personalAccessTokens.rotate(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: personalAccessTokenKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useRotatePersonalAccessToken };\nexport type { UseRotatePersonalAccessTokenOptions };\n","/**\n * Query key factory for users following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type { ListUsersParams, UserParams, UserSettingsParams } from '@brandwave/ts';\n\nconst userKeys = {\n all: ['brandwave', 'users'] as const,\n lists: () => [...userKeys.all, 'list'] as const,\n list: (params: ListUsersParams) => [...userKeys.lists(), params] as const,\n details: () => [...userKeys.all, 'detail'] as const,\n detail: (id: UserParams['id']) => [...userKeys.details(), id] as const,\n settingsDetails: () => [...userKeys.all, 'settings'] as const,\n settingsDetail: (params: UserSettingsParams) => [...userKeys.settingsDetails(), params] as const,\n};\n\nexport { userKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { userKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { User, UserParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useUser}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseUserOptions = Omit<\n UseQueryOptions<User, Error, User, ReturnType<typeof userKeys.detail>>,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a single user by ID. */\nconst useUser = (params: UserParams, options?: UseUserOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: userKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.users({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useUser };\nexport type { UseUserOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { userKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListResult, ListUsersParams, UserInList } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListUsers}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListUsersOptions = Omit<\n UseQueryOptions<\n ListResult<UserInList>,\n Error,\n ListResult<UserInList>,\n ReturnType<typeof userKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of users in an organization. */\nconst useListUsers = (params: ListUsersParams, options?: UseListUsersOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: userKeys.list(params),\n queryFn: async () => client.users.list(params),\n });\n};\n\nexport { useListUsers };\nexport type { UseListUsersOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { userKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { UserSettings, UserSettingsParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useUserSettings}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseUserSettingsOptions = Omit<\n UseQueryOptions<\n UserSettings | null,\n Error,\n UserSettings | null,\n ReturnType<typeof userKeys.settingsDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches settings for a user by their ID. */\nconst useUserSettings = (params: UserSettingsParams, options?: UseUserSettingsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: userKeys.settingsDetail(params),\n queryFn: async () => {\n const { data } = await client.users.settings(params);\n return data;\n },\n });\n};\n\nexport { useUserSettings };\nexport type { UseUserSettingsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { userKeys } from './keys';\nimport type { CreateUserParams, UserCreateResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateUser}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateUserOptions = Omit<\n UseMutationOptions<UserCreateResult, Error, CreateUserParams>,\n 'mutationFn'\n>;\n\n/** Creates a new user. Invalidates user queries on success. */\nconst useCreateUser = (options?: UseCreateUserOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.users.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: userKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateUser };\n\nexport type { UseCreateUserOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport { userKeys } from './keys';\nimport type { UpdateUserParams, UserUpdateResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateUser}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateUserOptions = Omit<\n UseMutationOptions<UserUpdateResult, Error, UpdateUserParams>,\n 'mutationFn'\n>;\n\n/** Updates an existing user. Invalidates user queries on success. */\nconst useUpdateUser = (options?: UseUpdateUserOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => {\n const { data } = await client.users.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: userKeys.all }),\n queryClient.invalidateQueries({ queryKey: userKeys.detail(params.userId) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateUser };\n\nexport type { UseUpdateUserOptions };\n","import { useMutation } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport type { ChangeEmailParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype ChangeEmailResult = { userId: string; newEmail: string };\n\ntype UseChangeEmailOptions = Omit<\n UseMutationOptions<ChangeEmailResult, Error, ChangeEmailParams>,\n 'mutationFn'\n>;\n\nconst useChangeEmail = (options?: UseChangeEmailOptions) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => {\n const { data } = await client.users.changeEmail(params);\n return data;\n },\n });\n};\n\nexport { useChangeEmail };\nexport type { UseChangeEmailOptions };\n","import { useMutation } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport type { RequestDeletionParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseRequestDeletionOptions = Omit<\n UseMutationOptions<SuccessResult, Error, RequestDeletionParams>,\n 'mutationFn'\n>;\n\nconst useRequestDeletion = (options?: UseRequestDeletionOptions) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => client.users.requestDeletion(params),\n });\n};\n\nexport { useRequestDeletion };\nexport type { UseRequestDeletionOptions };\n","import { useMutation } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport type { ConfirmDeletionParams, ConfirmDeletionResult, ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseConfirmDeletionOptions = Omit<\n UseMutationOptions<ItemResult<ConfirmDeletionResult>, Error, ConfirmDeletionParams>,\n 'mutationFn'\n>;\n\nconst useConfirmDeletion = (options?: UseConfirmDeletionOptions) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => client.users.confirmDeletion(params),\n });\n};\n\nexport { useConfirmDeletion };\nexport type { UseConfirmDeletionOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport { userKeys } from './keys';\nimport type { ItemResult, UpdateUserSettingsParams, UserSettings } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateUserSettings}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateUserSettingsOptions = Omit<\n UseMutationOptions<ItemResult<UserSettings>, Error, UpdateUserSettingsParams>,\n 'mutationFn'\n>;\n\n/** Updates user settings. Invalidates user and settings queries on success. */\nconst useUpdateUserSettings = (options?: UseUpdateUserSettingsOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => client.users.settings.update(params),\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({\n queryKey: userKeys.settingsDetail({ userId: params.userId }),\n }),\n queryClient.invalidateQueries({ queryKey: userKeys.all }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateUserSettings };\n\nexport type { UseUpdateUserSettingsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport { userKeys } from './keys';\nimport type { DeleteUserParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteUser}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteUserOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteUserParams>,\n 'mutationFn'\n>;\n\n/** Deletes a user account. Invalidates user queries on success. */\nconst useDeleteUser = (options?: UseDeleteUserOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => client.users.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: userKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteUser };\n\nexport type { UseDeleteUserOptions };\n","import { useMutation } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport type { RequestAvatarUploadParams } from '@brandwave/database/queries/users/schemas';\nimport type { AvatarUploadResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseRequestAvatarUploadOptions = Omit<\n UseMutationOptions<AvatarUploadResult, Error, RequestAvatarUploadParams>,\n 'mutationFn'\n>;\n\n/** Requests a presigned URL for uploading a user avatar image. */\nconst useRequestAvatarUpload = (options?: UseRequestAvatarUploadOptions) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => {\n const { data } = await client.users.requestAvatarUpload(params);\n return data;\n },\n });\n};\n\nexport { useRequestAvatarUpload };\nexport type { UseRequestAvatarUploadOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport { userKeys } from './keys';\nimport type { UserUpdateResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UploadAvatarParams = {\n userId: string;\n file: Blob | File;\n};\n\ntype UseUploadAvatarOptions = Omit<\n UseMutationOptions<UserUpdateResult, Error, UploadAvatarParams>,\n 'mutationFn'\n>;\n\n/** Uploads a user avatar (requests presigned URL, uploads file, updates user). */\nconst useUploadAvatar = (options?: UseUploadAvatarOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => {\n const { data } = await client.users.uploadAvatar(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: userKeys.all }),\n queryClient.invalidateQueries({ queryKey: userKeys.detail(params.userId) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUploadAvatar };\nexport type { UseUploadAvatarOptions };\n","// =============================================================================\n// Provider\n// =============================================================================\nexport { BrandwaveProvider } from './provider/BrandwaveProvider';\nexport type {\n BrandwaveProviderProps,\n BrandwaveContextValue,\n BrandwaveClient,\n} from './provider/BrandwaveProvider';\nexport * from './demo-mode-mutation-guard';\n\n// =============================================================================\n// Internal Hooks (for building custom hooks)\n// =============================================================================\nexport { useBrandwaveClient } from './hooks/useBrandwaveClient';\n\n// =============================================================================\n// Resource Hooks\n// =============================================================================\nexport * from './activities';\nexport * from './activity-log';\nexport * from './billing';\nexport * from './campaigns';\nexport * from './creators';\nexport * from './conversions';\nexport * from './conversionSources';\nexport * from './costs';\nexport * from './google-analytics';\nexport * from './insights';\nexport * from './notes';\nexport * from './organizations';\nexport * from './personal-access-tokens';\nexport * from './users';\n\n// =============================================================================\n// Re-export SDK types so consumers can import everything from @brandwave/react\n// =============================================================================\nexport * from '@brandwave/ts';\n"],"mappings":"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","names":["createContext","useMemo","QueryClient","QueryClientProvider","createBrandwave","jsx","BrandwaveContext","BrandwaveProvider","children","accessToken","baseUrl","externalQueryClient","client","internalQueryClient","queryClient","contextValue","DEMO_MODE_MUTATION_GUARD_META_KEY","isRecord","value","withDemoModeMutationGuardMeta","meta","guard","allowDemoModeUserMutation","allowDemoModeInviteMutation","allowDemoModeBillingMutation","getDemoModeMutationGuard","rawGuard","scope","useContext","useBrandwaveClient","context","useContext","BrandwaveContext","activityKeys","params","id","activityId","useQuery","useActivity","params","options","client","useBrandwaveClient","useQuery","activityKeys","data","useQuery","useListActivities","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useCountActivities","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useActivityStats","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useListActivityCreators","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useCountActivityCreators","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useMetricConfidence","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useActivityMetrics","params","options","client","useBrandwaveClient","useQuery","activityKeys","data","useQuery","useActivityMetricsHistory","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useListSparklines","params","options","client","useBrandwaveClient","useQuery","activityKeys","useMutation","useQueryClient","useCreateActivity","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","activityKeys","useMutation","useQueryClient","useUpdateActivity","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","activityKeys","useMutation","useQueryClient","useDeleteActivity","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","useMutation","useQueryClient","useLinkActivityCreator","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","useMutation","useQueryClient","useUnlinkActivityCreator","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","useMutation","useQueryClient","useConnectActivityContentLink","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","useMutation","useQueryClient","useDisconnectActivityContentLink","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","useMutation","useQueryClient","costKeys","params","useCreateActivityCost","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","costKeys","useMutation","useQueryClient","useUpdateActivityCost","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","costKeys","useMutation","useQueryClient","useDeleteActivityCost","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","costKeys","activityLogKeys","params","id","useQuery","useActivityLogEntry","params","options","client","useBrandwaveClient","useQuery","activityLogKeys","data","useListActivityLog","useSearchActivityLog","billingKeys","useMutation","useCreateBillingCheckoutSession","options","client","useBrandwaveClient","useMutation","allowDemoModeBillingMutation","params","data","useMutation","useCreateBillingPortalSession","options","client","useBrandwaveClient","useMutation","params","data","useMutation","useSyncBillingCheckoutSession","options","client","useBrandwaveClient","useMutation","allowDemoModeBillingMutation","params","data","campaignKeys","params","id","campaignId","useQuery","useCampaign","params","options","client","useBrandwaveClient","useQuery","campaignKeys","data","useQuery","useListCampaigns","params","options","client","useBrandwaveClient","useQuery","campaignKeys","useQuery","useCampaignStats","params","options","client","useBrandwaveClient","useQuery","campaignKeys","useMutation","useQueryClient","useCreateCampaign","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","campaignKeys","useMutation","useQueryClient","useUpdateCampaign","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","campaignKeys","useMutation","useQueryClient","useDeleteCampaign","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","campaignKeys","useMutation","useQueryClient","useLinkCampaignActivity","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","campaignKeys","activityKeys","useMutation","useQueryClient","useUnlinkCampaignActivity","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","campaignKeys","activityKeys","useQuery","useCampaignMetrics","params","options","client","useBrandwaveClient","useQuery","campaignKeys","data","useQuery","useCampaignMetricsHistory","params","options","client","useBrandwaveClient","useQuery","campaignKeys","creatorKeys","params","id","creatorId","useQuery","useCreator","params","options","client","useBrandwaveClient","useQuery","creatorKeys","data","useQuery","useListCreators","params","options","client","useBrandwaveClient","useQuery","creatorKeys","useQuery","useCreatorStats","params","options","client","useBrandwaveClient","useQuery","creatorKeys","useMutation","useQueryClient","useCreateCreator","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","creatorKeys","useMutation","useQueryClient","useUpdateCreator","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","creatorKeys","useMutation","useQueryClient","useDeleteCreator","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","creatorKeys","useMutation","useQueryClient","useConnectCreatorSocialAccount","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","creatorKeys","useMutation","useQueryClient","useDisconnectCreatorSocialAccount","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","creatorKeys","useQuery","useCreatorMetrics","params","options","client","useBrandwaveClient","useQuery","creatorKeys","data","useQuery","useCreatorMetricsHistory","params","options","client","useBrandwaveClient","useQuery","creatorKeys","conversionKeys","params","id","useQuery","useConversion","params","options","client","useBrandwaveClient","useQuery","conversionKeys","data","useQuery","useListConversions","params","options","client","useBrandwaveClient","useQuery","conversionKeys","useMutation","useQueryClient","useCreateConversion","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","conversionKeys","useMutation","useQueryClient","useUpdateConversion","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","conversionKeys","useMutation","useQueryClient","useDeleteConversion","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","conversionKeys","conversionSourceKeys","params","id","useQuery","useConversionSource","params","options","client","useBrandwaveClient","useQuery","conversionSourceKeys","data","useQuery","useListConversionSources","params","options","client","useBrandwaveClient","useQuery","conversionSourceKeys","useMutation","useQueryClient","useCreateConversionSource","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","conversionSourceKeys","useMutation","useQueryClient","useUpdateConversionSource","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","conversionSourceKeys","useMutation","useQueryClient","useDeleteConversionSource","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","conversionSourceKeys","useQuery","useListCosts","params","options","client","useBrandwaveClient","useQuery","costKeys","useQuery","useCountCosts","params","options","client","useBrandwaveClient","useQuery","costKeys","useQuery","useListCostTypes","params","options","client","useBrandwaveClient","useQuery","costKeys","googleAnalyticsKeys","organizationId","useQuery","useGoogleAnalyticsConnectionStatus","params","options","client","useBrandwaveClient","useQuery","googleAnalyticsKeys","data","useQuery","useListGoogleAnalyticsProperties","params","options","client","useBrandwaveClient","useQuery","googleAnalyticsKeys","data","useMutation","useQueryClient","useConnectGoogleAnalytics","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","googleAnalyticsKeys","useMutation","useQueryClient","useDisconnectGoogleAnalytics","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","googleAnalyticsKeys","useMutation","useQueryClient","useSelectGoogleAnalyticsProperty","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","googleAnalyticsKeys","useQuery","insightKeys","params","useListOrganizationInsights","params","options","client","useBrandwaveClient","useQuery","insightKeys","useMutation","useQueryClient","useDismissInsight","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","insightKeys","noteKeys","params","id","useQuery","useNote","params","options","client","useBrandwaveClient","useQuery","noteKeys","data","useQuery","useListNotes","params","options","client","useBrandwaveClient","useQuery","noteKeys","useMutation","useQueryClient","useCreateNote","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","noteKeys","useMutation","useQueryClient","useUpdateNote","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","noteKeys","useMutation","useQueryClient","useDeleteNote","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","noteKeys","organizationKeys","id","params","organizationId","useQuery","useGetOrganization","params","options","client","useBrandwaveClient","useQuery","organizationKeys","useQuery","useListOrganizations","params","options","client","useBrandwaveClient","useQuery","organizationKeys","useQuery","useListOrganizationUsers","params","options","client","useBrandwaveClient","useQuery","organizationKeys","useMutation","useQueryClient","useCreateOrganization","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","organizationKeys","useMutation","useQueryClient","useCompleteOrganicSignup","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","organizationKeys","useMutation","useQueryClient","useUpdateOrganization","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","organizationKeys","useMutation","useQueryClient","useDeleteOrganization","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","organizationKeys","useMutation","useQueryClient","useAddOrganizationUser","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","organizationKeys","useMutation","useQueryClient","useUpdateOrganizationUserRole","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","organizationKeys","useMutation","useQueryClient","useRemoveOrganizationUser","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","organizationKeys","useMutation","useQueryClient","useAcceptOrganizationInvite","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","allowDemoModeInviteMutation","params","props","organizationKeys","useMutation","useQueryClient","useDeclineOrganizationInvite","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","allowDemoModeInviteMutation","params","props","organizationKeys","useMutation","useQueryClient","useProcessInviteSignup","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","props","organizationKeys","useMutation","useQueryClient","useInviteOrganizationUser","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","organizationKeys","useQuery","useOrganizationMetrics","params","options","client","useBrandwaveClient","useQuery","organizationKeys","data","useQuery","useOrganizationMetricsHistory","params","options","client","useBrandwaveClient","useQuery","organizationKeys","personalAccessTokenKeys","useQuery","useListPersonalAccessTokens","options","client","useBrandwaveClient","useQuery","personalAccessTokenKeys","useMutation","useQueryClient","useCreatePersonalAccessToken","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","personalAccessTokenKeys","useMutation","useQueryClient","useRevokePersonalAccessToken","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","personalAccessTokenKeys","useMutation","useQueryClient","useRotatePersonalAccessToken","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","personalAccessTokenKeys","userKeys","params","id","useQuery","useUser","params","options","client","useBrandwaveClient","useQuery","userKeys","data","useQuery","useListUsers","params","options","client","useBrandwaveClient","useQuery","userKeys","useQuery","useUserSettings","params","options","client","useBrandwaveClient","useQuery","userKeys","data","useMutation","useQueryClient","useCreateUser","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","userKeys","useMutation","useQueryClient","useUpdateUser","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","allowDemoModeUserMutation","params","data","props","userKeys","useMutation","useChangeEmail","options","client","useBrandwaveClient","useMutation","allowDemoModeUserMutation","params","data","useMutation","useRequestDeletion","options","client","useBrandwaveClient","useMutation","allowDemoModeUserMutation","params","useMutation","useConfirmDeletion","options","client","useBrandwaveClient","useMutation","allowDemoModeUserMutation","params","useMutation","useQueryClient","useUpdateUserSettings","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","allowDemoModeUserMutation","params","props","userKeys","useMutation","useQueryClient","useDeleteUser","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","allowDemoModeUserMutation","params","props","userKeys","useMutation","useRequestAvatarUpload","options","client","useBrandwaveClient","useMutation","allowDemoModeUserMutation","params","data","useMutation","useQueryClient","useUploadAvatar","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","allowDemoModeUserMutation","params","data","props","userKeys"]}
|
|
1
|
+
{"version":3,"sources":["../src/provider/BrandwaveProvider.tsx","../src/demo-mode-mutation-guard.ts","../src/hooks/useBrandwaveClient.ts","../src/activities/keys.ts","../src/activities/useActivity.ts","../src/activities/useListActivities.ts","../src/activities/useCountActivities.ts","../src/activities/useActivityStats.ts","../src/activities/useListActivityCreators.ts","../src/activities/useCountActivityCreators.ts","../src/activities/useMetricConfidence.ts","../src/activities/useActivityMetrics.ts","../src/activities/useActivityMetricsHistory.ts","../src/activities/useListSparklines.ts","../src/activities/useCreateActivity.ts","../src/billing/keys.ts","../src/activities/useUpdateActivity.ts","../src/activities/useDeleteActivity.ts","../src/activities/useLinkActivityCreator.ts","../src/activities/useUnlinkActivityCreator.ts","../src/activities/useConnectActivityContentLink.ts","../src/activities/useDisconnectActivityContentLink.ts","../src/activities/useCreateActivityCost.ts","../src/costs/keys.ts","../src/activities/useUpdateActivityCost.ts","../src/activities/useDeleteActivityCost.ts","../src/activity-log/keys.ts","../src/activity-log/useActivityLog.ts","../src/billing/useCreateBillingCheckoutSession.ts","../src/billing/useCreateBillingPortalSession.ts","../src/billing/usePlanUsage.ts","../src/billing/useSyncBillingCheckoutSession.ts","../src/campaigns/keys.ts","../src/campaigns/useCampaign.ts","../src/campaigns/useListCampaigns.ts","../src/campaigns/useCampaignStats.ts","../src/campaigns/useCreateCampaign.ts","../src/campaigns/useUpdateCampaign.ts","../src/campaigns/useDeleteCampaign.ts","../src/campaigns/useLinkCampaignActivity.ts","../src/campaigns/useUnlinkCampaignActivity.ts","../src/campaigns/useCampaignMetrics.ts","../src/campaigns/useCampaignMetricsHistory.ts","../src/creators/keys.ts","../src/creators/useCreator.ts","../src/creators/useListCreators.ts","../src/creators/useCreatorStats.ts","../src/creators/useCreateCreator.ts","../src/creators/useUpdateCreator.ts","../src/creators/useDeleteCreator.ts","../src/creators/useConnectCreatorSocialAccount.ts","../src/creators/useDisconnectCreatorSocialAccount.ts","../src/creators/useCreatorMetrics.ts","../src/creators/useCreatorMetricsHistory.ts","../src/conversions/keys.ts","../src/conversions/useConversion.ts","../src/conversions/useListConversions.ts","../src/conversions/useCreateConversion.ts","../src/conversions/useUpdateConversion.ts","../src/conversions/useDeleteConversion.ts","../src/conversionSources/keys.ts","../src/conversionSources/useConversionSource.ts","../src/conversionSources/useListConversionSources.ts","../src/conversionSources/useCreateConversionSource.ts","../src/conversionSources/useUpdateConversionSource.ts","../src/conversionSources/useDeleteConversionSource.ts","../src/costs/useListCosts.ts","../src/costs/useCountCosts.ts","../src/costs/useListCostTypes.ts","../src/google-analytics/keys.ts","../src/google-analytics/useConnectionStatus.ts","../src/google-analytics/useListProperties.ts","../src/google-analytics/useConnect.ts","../src/google-analytics/useDisconnect.ts","../src/google-analytics/useSelectProperty.ts","../src/insights/useListOrganizationInsights.ts","../src/insights/keys.ts","../src/insights/useDismissInsight.ts","../src/notes/keys.ts","../src/notes/useNote.ts","../src/notes/useListNotes.ts","../src/notes/useCreateNote.ts","../src/notes/useUpdateNote.ts","../src/notes/useDeleteNote.ts","../src/organizations/keys.ts","../src/organizations/useGetOrganization.ts","../src/organizations/useListOrganizations.ts","../src/organizations/useListOrganizationUsers.ts","../src/organizations/useCreateOrganization.ts","../src/organizations/useCompleteOrganicSignup.ts","../src/organizations/useUpdateOrganization.ts","../src/organizations/useDeleteOrganization.ts","../src/organizations/useAddOrganizationUser.ts","../src/organizations/useUpdateOrganizationUserRole.ts","../src/organizations/useRemoveOrganizationUser.ts","../src/organizations/useAcceptOrganizationInvite.ts","../src/organizations/useDeclineOrganizationInvite.ts","../src/organizations/useProcessInviteSignup.ts","../src/organizations/useInviteOrganizationUser.ts","../src/organizations/useOrganizationMetrics.ts","../src/organizations/useOrganizationMetricsHistory.ts","../src/personal-access-tokens/keys.ts","../src/personal-access-tokens/useListPersonalAccessTokens.ts","../src/personal-access-tokens/useCreatePersonalAccessToken.ts","../src/personal-access-tokens/useRevokePersonalAccessToken.ts","../src/personal-access-tokens/useRotatePersonalAccessToken.ts","../src/users/keys.ts","../src/users/useUser.ts","../src/users/useListUsers.ts","../src/users/useUserSettings.ts","../src/users/useCreateUser.ts","../src/users/useUpdateUser.ts","../src/users/useChangeEmail.ts","../src/users/useRequestDeletion.ts","../src/users/useConfirmDeletion.ts","../src/users/useUpdateUserSettings.ts","../src/users/useDeleteUser.ts","../src/users/useRequestAvatarUpload.ts","../src/users/useUploadAvatar.ts","../src/index.ts"],"sourcesContent":["import React, { createContext, useMemo } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { createBrandwave } from '@brandwave/ts';\n\ntype BrandwaveClient = ReturnType<typeof createBrandwave>;\n\ntype BrandwaveContextValue = {\n client: BrandwaveClient;\n};\n\nconst BrandwaveContext = createContext<BrandwaveContextValue | undefined>(undefined);\n\ntype BrandwaveProviderProps = {\n children: React.ReactNode;\n /** Access token for API authentication (required) */\n accessToken: string;\n /** Optional custom API URL (defaults to production) */\n baseUrl?: string;\n /** Optional existing QueryClient - if not provided, one will be created internally */\n queryClient?: QueryClient;\n};\n\n/**\n * Provider component for Brandwave React SDK.\n *\n * Provides the Brandwave client and optionally wraps with QueryClientProvider.\n *\n * @example\n * ```tsx\n * // With existing QueryClient (recommended for apps already using TanStack Query)\n * <QueryClientProvider client={queryClient}>\n * <BrandwaveProvider accessToken={token} queryClient={queryClient}>\n * <App />\n * </BrandwaveProvider>\n * </QueryClientProvider>\n *\n * // Without existing QueryClient (creates one internally)\n * <BrandwaveProvider accessToken={token}>\n * <App />\n * </BrandwaveProvider>\n * ```\n */\nconst BrandwaveProvider = ({\n children,\n accessToken,\n baseUrl,\n queryClient: externalQueryClient,\n}: BrandwaveProviderProps) => {\n const client = useMemo(\n () => createBrandwave({ accessToken, baseUrl }),\n [accessToken, baseUrl]\n );\n\n const internalQueryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60, // 1 minute\n gcTime: 1000 * 60 * 5, // 5 minutes\n },\n },\n }),\n []\n );\n\n const queryClient = externalQueryClient ?? internalQueryClient;\n const contextValue = useMemo(() => ({ client }), [client]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <BrandwaveContext.Provider value={contextValue}>{children}</BrandwaveContext.Provider>\n </QueryClientProvider>\n );\n};\n\nexport { BrandwaveProvider, BrandwaveContext };\nexport type { BrandwaveProviderProps, BrandwaveContextValue, BrandwaveClient };\n","type DemoModeMutationScope = 'user' | 'invite' | 'billing';\n\ntype DemoModeMutationGuard = {\n allowInDemoMode: boolean;\n scope: DemoModeMutationScope;\n};\n\nconst DEMO_MODE_MUTATION_GUARD_META_KEY = 'brandwaveDemoModeGuard';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nconst withDemoModeMutationGuardMeta = (\n meta: Record<string, unknown> | undefined,\n guard: DemoModeMutationGuard\n): Record<string, unknown> => ({\n ...(meta ?? {}),\n [DEMO_MODE_MUTATION_GUARD_META_KEY]: guard,\n});\n\nconst allowDemoModeUserMutation = (\n meta?: Record<string, unknown>\n): Record<string, unknown> =>\n withDemoModeMutationGuardMeta(meta, { allowInDemoMode: true, scope: 'user' });\n\nconst allowDemoModeInviteMutation = (\n meta?: Record<string, unknown>\n): Record<string, unknown> =>\n withDemoModeMutationGuardMeta(meta, { allowInDemoMode: true, scope: 'invite' });\n\nconst allowDemoModeBillingMutation = (\n meta?: Record<string, unknown>\n): Record<string, unknown> =>\n withDemoModeMutationGuardMeta(meta, { allowInDemoMode: true, scope: 'billing' });\n\nconst getDemoModeMutationGuard = (meta: unknown): DemoModeMutationGuard | null => {\n if (!isRecord(meta)) return null;\n\n const rawGuard = meta[DEMO_MODE_MUTATION_GUARD_META_KEY];\n if (!isRecord(rawGuard) || typeof rawGuard.allowInDemoMode !== 'boolean') {\n return null;\n }\n\n const scope = rawGuard.scope;\n if (scope !== 'user' && scope !== 'invite' && scope !== 'billing') {\n return null;\n }\n\n return {\n allowInDemoMode: rawGuard.allowInDemoMode,\n scope,\n };\n};\n\nexport {\n DEMO_MODE_MUTATION_GUARD_META_KEY,\n allowDemoModeBillingMutation,\n allowDemoModeInviteMutation,\n allowDemoModeUserMutation,\n getDemoModeMutationGuard,\n};\nexport type { DemoModeMutationGuard, DemoModeMutationScope };\n","import { useContext } from 'react';\nimport { BrandwaveContext } from '../provider/BrandwaveProvider';\nimport type { BrandwaveClient } from '../provider/BrandwaveProvider';\n\n/**\n * Internal hook to access the Brandwave client from context.\n *\n * @throws Error if used outside of BrandwaveProvider\n * @returns The Brandwave client instance\n */\nconst useBrandwaveClient = (): BrandwaveClient => {\n const context = useContext(BrandwaveContext);\n\n if (!context) {\n throw new Error('useBrandwaveClient must be used within a BrandwaveProvider');\n }\n\n return context.client;\n};\n\nexport { useBrandwaveClient };\n","/**\n * Query key factory for activities following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type {\n ActivityParams,\n ActivityStatsParams,\n CountActivitiesParams,\n CountActivityCreatorsParams,\n GetActivityMetricsHistoryParams,\n GetActivityMetricsParams,\n GetMetricConfidenceParams,\n ListActivitiesParams,\n ListActivityCreatorsParams,\n ListSparklinesParams,\n} from '@brandwave/ts';\n\nconst activityKeys = {\n all: ['brandwave', 'activities'] as const,\n lists: () => [...activityKeys.all, 'list'] as const,\n list: (params: ListActivitiesParams) => [...activityKeys.lists(), params] as const,\n details: () => [...activityKeys.all, 'detail'] as const,\n detail: (id: ActivityParams['id']) => [...activityKeys.details(), id] as const,\n counts: () => [...activityKeys.all, 'count'] as const,\n count: (params: CountActivitiesParams) => [...activityKeys.counts(), params] as const,\n stats: () => [...activityKeys.all, 'stats'] as const,\n stat: (params: ActivityStatsParams) => [...activityKeys.stats(), params] as const,\n creatorsLists: () => [...activityKeys.all, 'creators', 'list'] as const,\n creatorsList: (params: ListActivityCreatorsParams) =>\n [...activityKeys.creatorsLists(), params] as const,\n creatorsCounts: () => [...activityKeys.all, 'creators', 'count'] as const,\n creatorsCount: (params: CountActivityCreatorsParams) =>\n [...activityKeys.creatorsCounts(), params] as const,\n metricsConfidenceDetails: () => [...activityKeys.all, 'metrics', 'confidence'] as const,\n metricsConfidenceDetail: (params: GetMetricConfidenceParams) =>\n [...activityKeys.metricsConfidenceDetails(), params] as const,\n sparklinesLists: () => [...activityKeys.all, 'sparklines', 'list'] as const,\n sparklinesList: (params: ListSparklinesParams) =>\n [...activityKeys.sparklinesLists(), params] as const,\n metricsDetails: () => [...activityKeys.all, 'metrics', 'detail'] as const,\n metricsDetail: (activityId: GetActivityMetricsParams['activityId']) =>\n [...activityKeys.metricsDetails(), activityId] as const,\n metricsHistoryDetails: () => [...activityKeys.all, 'metrics', 'history', 'detail'] as const,\n metricsHistoryDetail: (params: GetActivityMetricsHistoryParams) =>\n [...activityKeys.metricsHistoryDetails(), params] as const,\n};\n\nexport { activityKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { Activity, ActivityParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useActivity}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseActivityOptions = Omit<\n UseQueryOptions<Activity, Error, Activity, ReturnType<typeof activityKeys.detail>>,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a single activity by ID. */\nconst useActivity = (params: ActivityParams, options?: UseActivityOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.activities({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useActivity };\nexport type { UseActivityOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ActivityListResult, ListActivitiesParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListActivities}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListActivitiesOptions = Omit<\n UseQueryOptions<\n ActivityListResult,\n Error,\n ActivityListResult,\n ReturnType<typeof activityKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of activities. */\nconst useListActivities = (params: ListActivitiesParams, options?: UseListActivitiesOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.list(params),\n queryFn: async () => client.activities.list(params),\n });\n};\n\nexport { useListActivities };\nexport type { UseListActivitiesOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CountActivitiesParams, CountResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCountActivities}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCountActivitiesOptions = Omit<\n UseQueryOptions<\n CountResult,\n Error,\n CountResult,\n ReturnType<typeof activityKeys.count>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches the count of activities matching the given filters. */\nconst useCountActivities = (params: CountActivitiesParams, options?: UseCountActivitiesOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.count(params),\n queryFn: async () => client.activities.count(params),\n });\n};\n\nexport { useCountActivities };\nexport type { UseCountActivitiesOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ActivityStats, ActivityStatsParams, ItemResult } from '@brandwave/ts';\n\ntype UseActivityStatsOptions = Omit<\n UseQueryOptions<\n ItemResult<ActivityStats>,\n Error,\n ItemResult<ActivityStats>,\n ReturnType<typeof activityKeys.stat>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches aggregate statistics for activities matching the given filters. */\nconst useActivityStats = (params: ActivityStatsParams, options?: UseActivityStatsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.stat(params),\n queryFn: async () => client.activities.stats(params),\n });\n};\n\nexport { useActivityStats };\nexport type { UseActivityStatsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ActivityCreatorInList, ListActivityCreatorsParams, ListResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListActivityCreators}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListActivityCreatorsOptions = Omit<\n UseQueryOptions<\n ListResult<ActivityCreatorInList>,\n Error,\n ListResult<ActivityCreatorInList>,\n ReturnType<typeof activityKeys.creatorsList>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of creators linked to an activity. */\nconst useListActivityCreators = (\n params: ListActivityCreatorsParams,\n options?: UseListActivityCreatorsOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.creatorsList(params),\n queryFn: async () => client.activities.creators.list(params),\n });\n};\n\nexport { useListActivityCreators };\nexport type { UseListActivityCreatorsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CountActivityCreatorsParams, CountResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCountActivityCreators}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCountActivityCreatorsOptions = Omit<\n UseQueryOptions<\n CountResult,\n Error,\n CountResult,\n ReturnType<typeof activityKeys.creatorsCount>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches the count of creators linked to an activity. */\nconst useCountActivityCreators = (\n params: CountActivityCreatorsParams,\n options?: UseCountActivityCreatorsOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.creatorsCount(params),\n queryFn: async () => client.activities.creators.count(params),\n });\n};\n\nexport { useCountActivityCreators };\nexport type { UseCountActivityCreatorsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { GetMetricConfidenceParams, ItemResult, MetricConfidence } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useMetricConfidence}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseMetricConfidenceOptions = Omit<\n UseQueryOptions<\n ItemResult<MetricConfidence>,\n Error,\n ItemResult<MetricConfidence>,\n ReturnType<typeof activityKeys.metricsConfidenceDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches metric confidence scores for an activity. */\nconst useMetricConfidence = (\n params: GetMetricConfidenceParams,\n options?: UseMetricConfidenceOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.metricsConfidenceDetail(params),\n queryFn: async () => client.activities.metrics.confidence(params),\n });\n};\n\nexport { useMetricConfidence };\nexport type { UseMetricConfidenceOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ActivityMetrics, GetActivityMetricsParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useActivityMetrics}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseActivityMetricsOptions = Omit<\n UseQueryOptions<\n ActivityMetrics,\n Error,\n ActivityMetrics,\n ReturnType<typeof activityKeys.metricsDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches calculated metrics for an activity (CPM, CPE, total cost).\n * All calculations are performed server-side.\n */\nconst useActivityMetrics = (\n params: GetActivityMetricsParams,\n options?: UseActivityMetricsOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.metricsDetail(params.activityId),\n queryFn: async () => {\n const { data } = await client.activities.metrics.get(params);\n return data;\n },\n });\n};\n\nexport { useActivityMetrics };\nexport type { UseActivityMetricsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n GetActivityMetricsHistoryParams,\n ListResult,\n MetricsHistoryEntry,\n} from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useActivityMetricsHistory}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseActivityMetricsHistoryOptions = Omit<\n UseQueryOptions<\n ListResult<MetricsHistoryEntry>,\n Error,\n ListResult<MetricsHistoryEntry>,\n ReturnType<typeof activityKeys.metricsHistoryDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches metrics history for an activity with calculated CPM and CPE for each entry.\n * All calculations are performed server-side.\n */\nconst useActivityMetricsHistory = (\n params: GetActivityMetricsHistoryParams,\n options?: UseActivityMetricsHistoryOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.metricsHistoryDetail(params),\n queryFn: async () => {\n return client.activities.metrics.history(params);\n },\n });\n};\n\nexport { useActivityMetricsHistory };\nexport type { UseActivityMetricsHistoryOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ActivitySparklineEntry, ListResult, ListSparklinesParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListSparklines}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListSparklinesOptions = Omit<\n UseQueryOptions<\n ListResult<ActivitySparklineEntry>,\n Error,\n ListResult<ActivitySparklineEntry>,\n ReturnType<typeof activityKeys.sparklinesList>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches sparkline chart data for activities. */\nconst useListSparklines = (params: ListSparklinesParams, options?: UseListSparklinesOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: activityKeys.sparklinesList(params),\n queryFn: async () => client.activities.sparklines.list(params),\n });\n};\n\nexport { useListSparklines };\nexport type { UseListSparklinesOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { billingKeys } from '../billing/keys';\nimport { activityKeys } from './keys';\nimport type { ActivityCreateResult, CreateActivityParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateActivity}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateActivityOptions = Omit<\n UseMutationOptions<ActivityCreateResult, Error, CreateActivityParams>,\n 'mutationFn'\n>;\n\n/** Creates a new activity. Invalidates activity and plan-usage queries on success. */\nconst useCreateActivity = (options?: UseCreateActivityOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.activities.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n queryClient.invalidateQueries({ queryKey: billingKeys.planUsages() }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateActivity };\n\nexport type { UseCreateActivityOptions };\n","import type { GetPlanUsageParams } from '@brandwave/ts';\n\nconst billingKeys = {\n all: ['brandwave', 'billing'] as const,\n planUsages: () => [...billingKeys.all, 'plan-usage'] as const,\n planUsage: (params: GetPlanUsageParams) => [...billingKeys.planUsages(), params] as const,\n};\n\nexport { billingKeys };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { ActivityUpdateResult, UpdateActivityParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateActivity}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateActivityOptions = Omit<\n UseMutationOptions<ActivityUpdateResult, Error, UpdateActivityParams>,\n 'mutationFn'\n>;\n\n/** Updates an existing activity. Invalidates activity queries on success. */\nconst useUpdateActivity = (options?: UseUpdateActivityOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.activities.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n queryClient.invalidateQueries({ queryKey: activityKeys.detail(params.id) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateActivity };\n\nexport type { UseUpdateActivityOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { billingKeys } from '../billing/keys';\nimport { activityKeys } from './keys';\nimport type { DeleteActivityParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteActivity}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteActivityOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteActivityParams>,\n 'mutationFn'\n>;\n\n/** Deletes an activity. Invalidates activity and plan-usage queries on success. */\nconst useDeleteActivity = (options?: UseDeleteActivityOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.delete(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n queryClient.invalidateQueries({ queryKey: billingKeys.planUsages() }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteActivity };\n\nexport type { UseDeleteActivityOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { ItemResult, LinkCreatorParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useLinkActivityCreator}.\n * `mutationFn` is managed by the hook.\n */\ntype UseLinkActivityCreatorOptions = Omit<\n UseMutationOptions<ItemResult<{ id: string }>, Error, LinkCreatorParams>,\n 'mutationFn'\n>;\n\n/** Links a creator to an activity. Invalidates activity queries on success. */\nconst useLinkActivityCreator = (options?: UseLinkActivityCreatorOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.creators.link(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: activityKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useLinkActivityCreator };\n\nexport type { UseLinkActivityCreatorOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { SuccessResult, UnlinkCreatorParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUnlinkActivityCreator}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUnlinkActivityCreatorOptions = Omit<\n UseMutationOptions<SuccessResult, Error, UnlinkCreatorParams>,\n 'mutationFn'\n>;\n\n/** Unlinks a creator from an activity. Invalidates activity queries on success. */\nconst useUnlinkActivityCreator = (options?: UseUnlinkActivityCreatorOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.creators.unlink(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: activityKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUnlinkActivityCreator };\n\nexport type { UseUnlinkActivityCreatorOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { ConnectContentLinkParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseConnectActivityContentLinkOptions = Omit<\n UseMutationOptions<SuccessResult, Error, ConnectContentLinkParams>,\n 'mutationFn'\n>;\n\nconst useConnectActivityContentLink = (\n options?: UseConnectActivityContentLinkOptions,\n) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.contentLink.connect(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: activityKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useConnectActivityContentLink };\nexport type { UseConnectActivityContentLinkOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from './keys';\nimport type { DisconnectContentLinkParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseDisconnectActivityContentLinkOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DisconnectContentLinkParams>,\n 'mutationFn'\n>;\n\nconst useDisconnectActivityContentLink = (\n options?: UseDisconnectActivityContentLinkOptions,\n) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.contentLink.disconnect(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: activityKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDisconnectActivityContentLink };\nexport type { UseDisconnectActivityContentLinkOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { costKeys } from '../costs/keys';\nimport { activityKeys } from './keys';\nimport type { CreateActivityCostParams, ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateActivityCost}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateActivityCostOptions = Omit<\n UseMutationOptions<ItemResult<{ id: string }>, Error, CreateActivityCostParams>,\n 'mutationFn'\n>;\n\n/** Creates a cost entry on an activity. Invalidates activity queries on success. */\nconst useCreateActivityCost = (options?: UseCreateActivityCostOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.costs.create(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n queryClient.invalidateQueries({ queryKey: costKeys.all }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateActivityCost };\n\nexport type { UseCreateActivityCostOptions };\n","/**\n * Query key factory for costs following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type { CountCostsParams, ListCostTypesParams, ListCostsParams } from '@brandwave/ts';\n\nconst costKeys = {\n all: ['brandwave', 'costs'] as const,\n lists: () => [...costKeys.all, 'list'] as const,\n list: (params: ListCostsParams) => [...costKeys.lists(), params] as const,\n counts: () => [...costKeys.all, 'count'] as const,\n count: (params: CountCostsParams) => [...costKeys.counts(), params] as const,\n typesLists: () => [...costKeys.all, 'types', 'list'] as const,\n typesList: (params: ListCostTypesParams) => [...costKeys.typesLists(), params] as const,\n};\n\nexport { costKeys };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { costKeys } from '../costs/keys';\nimport { activityKeys } from './keys';\nimport type { ItemResult, UpdateActivityCostParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateActivityCost}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateActivityCostOptions = Omit<\n UseMutationOptions<ItemResult<{ id: string }>, Error, UpdateActivityCostParams>,\n 'mutationFn'\n>;\n\n/** Updates a cost entry on an activity. Invalidates activity queries on success. */\nconst useUpdateActivityCost = (options?: UseUpdateActivityCostOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.costs.update(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n queryClient.invalidateQueries({ queryKey: costKeys.all }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateActivityCost };\n\nexport type { UseUpdateActivityCostOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { costKeys } from '../costs/keys';\nimport { activityKeys } from './keys';\nimport type { DeleteActivityCostParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteActivityCost}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteActivityCostOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteActivityCostParams>,\n 'mutationFn'\n>;\n\n/** Deletes a cost entry from an activity. Invalidates activity queries on success. */\nconst useDeleteActivityCost = (options?: UseDeleteActivityCostOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.activities.costs.delete(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n queryClient.invalidateQueries({ queryKey: costKeys.all }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteActivityCost };\n\nexport type { UseDeleteActivityCostOptions };\n","import type {\n\tActivityLogParams,\n\tListActivityLogParams,\n\tSearchActivityLogParams,\n} from '@brandwave/ts';\n\n/**\n * Query key factory for activity log following TKDodo best practices.\n * All keys namespaced with 'brandwave' prefix to avoid collisions.\n */\nconst activityLogKeys = {\n\tall: ['brandwave', 'activity-log'] as const,\n\tlists: () => [...activityLogKeys.all, 'list'] as const,\n\tlist: (params: ListActivityLogParams) => [...activityLogKeys.lists(), params] as const,\n\tsearches: () => [...activityLogKeys.all, 'search'] as const,\n\tsearch: (params: SearchActivityLogParams) => [...activityLogKeys.searches(), params] as const,\n\tdetails: () => [...activityLogKeys.all, 'detail'] as const,\n\tdetail: (id: ActivityLogParams['id']) => [...activityLogKeys.details(), id] as const,\n};\n\nexport { activityLogKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityLogKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n\tActivityLogEntry,\n\tActivityLogEntryInList,\n\tActivityLogParams,\n\tActivityLogSearchResult,\n\tListActivityLogParams,\n\tListResult,\n\tSearchActivityLogParams,\n} from '@brandwave/ts';\n\n// =============================================================================\n// Use Activity Log Entry (Single)\n// =============================================================================\n\n/**\n * TanStack Query options for {@link useActivityLogEntry}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseActivityLogEntryOptions = Omit<\n\tUseQueryOptions<\n\t\tActivityLogEntry,\n\t\tError,\n\t\tActivityLogEntry,\n\t\tReturnType<typeof activityLogKeys.detail>\n\t>,\n\t'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetch a single activity log entry by ID.\n */\nconst useActivityLogEntry = (params: ActivityLogParams, options?: UseActivityLogEntryOptions) => {\n\tconst client = useBrandwaveClient();\n\n\treturn useQuery({\n\t\t...options,\n\t\tqueryKey: activityLogKeys.detail(params.id),\n\t\tqueryFn: async () => {\n\t\t\tconst { data } = await client.activityLog({ id: params.id });\n\t\t\treturn data;\n\t\t},\n\t\tenabled: options?.enabled !== false && Boolean(params.id),\n\t});\n}\n\nexport type { UseActivityLogEntryOptions };\n\n// =============================================================================\n// Use List Activity Log\n// =============================================================================\n\n/**\n * TanStack Query options for {@link useListActivityLog}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListActivityLogOptions = Omit<\n\tUseQueryOptions<\n\t\tListResult<ActivityLogEntryInList>,\n\t\tError,\n\t\tListResult<ActivityLogEntryInList>,\n\t\tReturnType<typeof activityLogKeys.list>\n\t>,\n\t'queryKey' | 'queryFn'\n>;\n\n/**\n * List activity log entries with filtering, sorting, and pagination.\n */\nconst useListActivityLog = (params: ListActivityLogParams, options?: UseListActivityLogOptions) => {\n\tconst client = useBrandwaveClient();\n\n\treturn useQuery({\n\t\t...options,\n\t\tqueryKey: activityLogKeys.list(params),\n\t\tqueryFn: () => client.activityLog.list(params),\n\t\tenabled: options?.enabled !== false && Boolean(params.organizationId),\n\t});\n}\n\nexport type { UseListActivityLogOptions };\n\n// =============================================================================\n// Use Search Activity Log\n// =============================================================================\n\n/**\n * TanStack Query options for {@link useSearchActivityLog}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseSearchActivityLogOptions = Omit<\n\tUseQueryOptions<\n\t\tListResult<ActivityLogSearchResult>,\n\t\tError,\n\t\tListResult<ActivityLogSearchResult>,\n\t\tReturnType<typeof activityLogKeys.search>\n\t>,\n\t'queryKey' | 'queryFn'\n>;\n\n/**\n * Full-text search across activity log entries.\n */\nconst useSearchActivityLog = (\n\tparams: SearchActivityLogParams,\n\toptions?: UseSearchActivityLogOptions,\n) => {\n\tconst client = useBrandwaveClient();\n\n\treturn useQuery({\n\t\t...options,\n\t\tqueryKey: activityLogKeys.search(params),\n\t\tqueryFn: () => client.activityLog.search(params),\n\t\tenabled:\n\t\t\toptions?.enabled !== false &&\n\t\t\tBoolean(params.organizationId) &&\n\t\t\tBoolean(params.query?.trim()),\n\t});\n}\n\nexport type { UseSearchActivityLogOptions };\n\nexport { useActivityLogEntry, useListActivityLog, useSearchActivityLog };\n","import { useMutation } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeBillingMutation } from '../demo-mode-mutation-guard';\nimport type {\n BillingCheckoutSessionResult,\n CreateBillingCheckoutSessionParams,\n} from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseCreateBillingCheckoutSessionOptions = Omit<\n UseMutationOptions<BillingCheckoutSessionResult, Error, CreateBillingCheckoutSessionParams>,\n 'mutationFn'\n>;\n\nconst useCreateBillingCheckoutSession = (\n options?: UseCreateBillingCheckoutSessionOptions\n) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeBillingMutation(options?.meta),\n mutationFn: async (params) => {\n const { data } = await client.billing.createCheckoutSession(params);\n return data;\n },\n });\n};\n\nexport { useCreateBillingCheckoutSession };\nexport type { UseCreateBillingCheckoutSessionOptions };\n","import { useMutation } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport type {\n BillingPortalSessionResult,\n CreateBillingPortalSessionParams,\n} from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseCreateBillingPortalSessionOptions = Omit<\n UseMutationOptions<BillingPortalSessionResult, Error, CreateBillingPortalSessionParams>,\n 'mutationFn'\n>;\n\nconst useCreateBillingPortalSession = (\n options?: UseCreateBillingPortalSessionOptions\n) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.billing.createPortalSession(params);\n return data;\n },\n });\n};\n\nexport { useCreateBillingPortalSession };\nexport type { UseCreateBillingPortalSessionOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { billingKeys } from './keys';\nimport type { GetPlanUsageParams, ItemResult, PlanUsageResult } from '@brandwave/ts';\nimport type { UseQueryOptions } from '@tanstack/react-query';\n\ntype UsePlanUsageOptions = Omit<\n UseQueryOptions<\n ItemResult<PlanUsageResult>,\n Error,\n ItemResult<PlanUsageResult>,\n ReturnType<typeof billingKeys.planUsage>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches current plan usage and enforced limits for an organization. */\nconst usePlanUsage = (params: GetPlanUsageParams, options?: UsePlanUsageOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: billingKeys.planUsage(params),\n queryFn: async () => client.billing.planUsage(params),\n });\n};\n\nexport { usePlanUsage };\nexport type { UsePlanUsageOptions };\n","import { useMutation } from '@tanstack/react-query';\nimport { allowDemoModeBillingMutation } from '../demo-mode-mutation-guard';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport type {\n BillingCheckoutSessionSyncResult,\n SyncBillingCheckoutSessionParams,\n} from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseSyncBillingCheckoutSessionOptions = Omit<\n UseMutationOptions<\n BillingCheckoutSessionSyncResult,\n Error,\n SyncBillingCheckoutSessionParams\n >,\n 'mutationFn'\n>;\n\nconst useSyncBillingCheckoutSession = (\n options?: UseSyncBillingCheckoutSessionOptions\n) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeBillingMutation(options?.meta),\n mutationFn: async (params) => {\n const { data } = await client.billing.syncCheckoutSession(params);\n return data;\n },\n });\n};\n\nexport { useSyncBillingCheckoutSession };\nexport type { UseSyncBillingCheckoutSessionOptions };\n","/**\n * Query key factory for campaigns following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type {\n CampaignParams,\n CampaignStatsParams,\n GetCampaignMetricsHistoryParams,\n GetCampaignMetricsParams,\n ListCampaignsParams,\n} from '@brandwave/ts';\n\nconst campaignKeys = {\n all: ['brandwave', 'campaigns'] as const,\n lists: () => [...campaignKeys.all, 'list'] as const,\n list: (params: ListCampaignsParams) => [...campaignKeys.lists(), params] as const,\n details: () => [...campaignKeys.all, 'detail'] as const,\n detail: (id: CampaignParams['id']) => [...campaignKeys.details(), id] as const,\n stats: () => [...campaignKeys.all, 'stats'] as const,\n stat: (params: CampaignStatsParams) => [...campaignKeys.stats(), params] as const,\n metricsDetails: () => [...campaignKeys.all, 'metrics', 'detail'] as const,\n metricsDetail: (campaignId: GetCampaignMetricsParams['campaignId']) =>\n [...campaignKeys.metricsDetails(), campaignId] as const,\n metricsHistoryDetails: () =>\n [...campaignKeys.all, 'metrics', 'history', 'detail'] as const,\n metricsHistoryDetail: (params: GetCampaignMetricsHistoryParams) =>\n [...campaignKeys.metricsHistoryDetails(), params] as const,\n};\n\nexport { campaignKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { Campaign, CampaignParams } from '@brandwave/ts';\nimport type { UseQueryOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Query options for {@link useCampaign}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCampaignOptions = Omit<\n UseQueryOptions<Campaign, Error, Campaign, ReturnType<typeof campaignKeys.detail>>,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Hook to fetch a single campaign by ID.\n *\n * @example\n * ```tsx\n * const { data, isLoading, error } = useCampaign({ id: 'abc-123' });\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return <div>{data.name}</div>;\n * ```\n */\nconst useCampaign = (params: CampaignParams, options?: UseCampaignOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: campaignKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.campaigns({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useCampaign };\nexport type { UseCampaignOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CampaignListResult, ListCampaignsParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListCampaigns}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListCampaignsOptions = Omit<\n UseQueryOptions<\n CampaignListResult,\n Error,\n CampaignListResult,\n ReturnType<typeof campaignKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of campaigns. */\nconst useListCampaigns = (params: ListCampaignsParams, options?: UseListCampaignsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: campaignKeys.list(params),\n queryFn: async () => client.campaigns.list(params),\n });\n};\n\nexport { useListCampaigns };\nexport type { UseListCampaignsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CampaignStats, CampaignStatsParams, ItemResult } from '@brandwave/ts';\n\ntype UseCampaignStatsOptions = Omit<\n UseQueryOptions<\n ItemResult<CampaignStats>,\n Error,\n ItemResult<CampaignStats>,\n ReturnType<typeof campaignKeys.stat>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches aggregate statistics for campaigns matching the given filters. */\nconst useCampaignStats = (params: CampaignStatsParams, options?: UseCampaignStatsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: campaignKeys.stat(params),\n queryFn: async () => client.campaigns.stats(params),\n });\n};\n\nexport { useCampaignStats };\nexport type { UseCampaignStatsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { billingKeys } from '../billing/keys';\nimport { campaignKeys } from './keys';\nimport type { CampaignCreateResult, CreateCampaignParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateCampaign}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateCampaignOptions = Omit<\n UseMutationOptions<CampaignCreateResult, Error, CreateCampaignParams>,\n 'mutationFn'\n>;\n\n/**\n * Hook to create a new campaign.\n *\n * Automatically invalidates campaign and plan-usage queries on success.\n *\n * @example\n * ```tsx\n * const { mutate, isPending } = useCreateCampaign();\n *\n * const handleCreate = () => {\n * mutate(\n * { organizationId: 'org-123', name: 'My Campaign' },\n * { onSuccess: (campaign) => console.log('Created:', campaign.id) }\n * );\n * };\n *\n * return (\n * <button onClick={handleCreate} disabled={isPending}>\n * {isPending ? 'Creating...' : 'Create Campaign'}\n * </button>\n * );\n * ```\n */\nconst useCreateCampaign = (options?: UseCreateCampaignOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.campaigns.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: campaignKeys.all }),\n queryClient.invalidateQueries({ queryKey: billingKeys.planUsages() }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateCampaign };\n\nexport type { UseCreateCampaignOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { CampaignUpdateResult, UpdateCampaignParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateCampaign}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateCampaignOptions = Omit<\n UseMutationOptions<CampaignUpdateResult, Error, UpdateCampaignParams>,\n 'mutationFn'\n>;\n\n/** Updates an existing campaign. Invalidates campaign queries on success. */\nconst useUpdateCampaign = (options?: UseUpdateCampaignOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.campaigns.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: campaignKeys.all }),\n queryClient.invalidateQueries({ queryKey: campaignKeys.detail(params.id) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateCampaign };\nexport type { UseUpdateCampaignOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { billingKeys } from '../billing/keys';\nimport { campaignKeys } from './keys';\nimport type { DeleteCampaignParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteCampaign}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteCampaignOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteCampaignParams>,\n 'mutationFn'\n>;\n\n/** Deletes a campaign. Invalidates campaign and plan-usage queries on success. */\nconst useDeleteCampaign = (options?: UseDeleteCampaignOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.campaigns.delete(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: campaignKeys.all }),\n queryClient.invalidateQueries({ queryKey: billingKeys.planUsages() }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteCampaign };\nexport type { UseDeleteCampaignOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from '../activities/keys';\nimport { campaignKeys } from './keys';\nimport type { ItemResult, LinkActivityParams, LinkActivityResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useLinkCampaignActivity}.\n * `mutationFn` is managed by the hook.\n */\ntype UseLinkCampaignActivityOptions = Omit<\n UseMutationOptions<ItemResult<LinkActivityResult>, Error, LinkActivityParams>,\n 'mutationFn'\n>;\n\n/** Links an activity to a campaign. Invalidates campaign and activity queries on success. */\nconst useLinkCampaignActivity = (options?: UseLinkCampaignActivityOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.campaigns.activities.link(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: campaignKeys.all }),\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useLinkCampaignActivity };\n\nexport type { UseLinkCampaignActivityOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { activityKeys } from '../activities/keys';\nimport { campaignKeys } from './keys';\nimport type { SuccessResult, UnlinkActivityByIdsParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUnlinkCampaignActivity}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUnlinkCampaignActivityOptions = Omit<\n UseMutationOptions<SuccessResult, Error, UnlinkActivityByIdsParams>,\n 'mutationFn'\n>;\n\n/**\n * Unlinks an activity from a campaign by logical IDs.\n * Invalidates campaign and activity queries on success.\n */\nconst useUnlinkCampaignActivity = (options?: UseUnlinkCampaignActivityOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.campaigns.activities.unlink(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: campaignKeys.all }),\n queryClient.invalidateQueries({ queryKey: activityKeys.all }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUnlinkCampaignActivity };\n\nexport type { UseUnlinkCampaignActivityOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CampaignMetrics, GetCampaignMetricsParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCampaignMetrics}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCampaignMetricsOptions = Omit<\n UseQueryOptions<\n CampaignMetrics,\n Error,\n CampaignMetrics,\n ReturnType<typeof campaignKeys.metricsDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches calculated metrics for a campaign (CPM, CPE, CPA, total cost).\n * All calculations are performed server-side.\n */\nconst useCampaignMetrics = (\n params: GetCampaignMetricsParams,\n options?: UseCampaignMetricsOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: campaignKeys.metricsDetail(params.campaignId),\n queryFn: async () => {\n const { data } = await client.campaigns.metrics.get(params);\n return data;\n },\n });\n};\n\nexport { useCampaignMetrics };\nexport type { UseCampaignMetricsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { campaignKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n GetCampaignMetricsHistoryParams,\n ListResult,\n MetricsHistoryEntry,\n} from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCampaignMetricsHistory}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCampaignMetricsHistoryOptions = Omit<\n UseQueryOptions<\n ListResult<MetricsHistoryEntry>,\n Error,\n ListResult<MetricsHistoryEntry>,\n ReturnType<typeof campaignKeys.metricsHistoryDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches metrics history for a campaign with CPM, CPE, and CPA for each date.\n * All calculations are performed server-side.\n */\nconst useCampaignMetricsHistory = (\n params: GetCampaignMetricsHistoryParams,\n options?: UseCampaignMetricsHistoryOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: campaignKeys.metricsHistoryDetail(params),\n queryFn: async () => {\n return client.campaigns.metrics.history(params);\n },\n });\n};\n\nexport { useCampaignMetricsHistory };\nexport type { UseCampaignMetricsHistoryOptions };\n","/**\n * Query key factory for creators following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type {\n CreatorParams,\n CreatorStatsParams,\n GetCreatorMetricsHistoryParams,\n GetCreatorMetricsParams,\n ListCreatorsParams,\n} from '@brandwave/ts';\n\nconst creatorKeys = {\n all: ['brandwave', 'creators'] as const,\n lists: () => [...creatorKeys.all, 'list'] as const,\n list: (params: ListCreatorsParams) => [...creatorKeys.lists(), params] as const,\n details: () => [...creatorKeys.all, 'detail'] as const,\n detail: (id: CreatorParams['id']) => [...creatorKeys.details(), id] as const,\n stats: () => [...creatorKeys.all, 'stats'] as const,\n stat: (params: CreatorStatsParams) => [...creatorKeys.stats(), params] as const,\n metricsDetails: () => [...creatorKeys.all, 'metrics', 'detail'] as const,\n metricsDetail: (creatorId: GetCreatorMetricsParams['creatorId']) =>\n [...creatorKeys.metricsDetails(), creatorId] as const,\n metricsHistoryDetails: () =>\n [...creatorKeys.all, 'metrics', 'history', 'detail'] as const,\n metricsHistoryDetail: (params: GetCreatorMetricsHistoryParams) =>\n [...creatorKeys.metricsHistoryDetails(), params] as const,\n};\n\nexport { creatorKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { Creator, CreatorParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCreator}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCreatorOptions = Omit<\n UseQueryOptions<Creator, Error, Creator, ReturnType<typeof creatorKeys.detail>>,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a single creator by ID. */\nconst useCreator = (params: CreatorParams, options?: UseCreatorOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: creatorKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.creators({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useCreator };\nexport type { UseCreatorOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CreatorListResult, ListCreatorsParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListCreators}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListCreatorsOptions = Omit<\n UseQueryOptions<\n CreatorListResult,\n Error,\n CreatorListResult,\n ReturnType<typeof creatorKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of creators. */\nconst useListCreators = (\n params: ListCreatorsParams,\n options?: UseListCreatorsOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: creatorKeys.list(params),\n queryFn: async () => client.creators.list(params),\n });\n};\n\nexport { useListCreators };\nexport type { UseListCreatorsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CreatorStats, CreatorStatsParams, ItemResult } from '@brandwave/ts';\n\ntype UseCreatorStatsOptions = Omit<\n UseQueryOptions<\n ItemResult<CreatorStats>,\n Error,\n ItemResult<CreatorStats>,\n ReturnType<typeof creatorKeys.stat>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches aggregate statistics for creators matching the given filters. */\nconst useCreatorStats = (params: CreatorStatsParams, options?: UseCreatorStatsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: creatorKeys.stat(params),\n queryFn: async () => client.creators.stats(params),\n });\n};\n\nexport { useCreatorStats };\nexport type { UseCreatorStatsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { billingKeys } from '../billing/keys';\nimport { creatorKeys } from './keys';\nimport type { CreateCreatorParams, CreatorCreateResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateCreator}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateCreatorOptions = Omit<\n UseMutationOptions<CreatorCreateResult, Error, CreateCreatorParams>,\n 'mutationFn'\n>;\n\n/** Creates a new creator. Invalidates creator and plan-usage queries on success. */\nconst useCreateCreator = (options?: UseCreateCreatorOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.creators.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: creatorKeys.all }),\n queryClient.invalidateQueries({ queryKey: billingKeys.planUsages() }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateCreator };\n\nexport type { UseCreateCreatorOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { CreatorUpdateResult, UpdateCreatorParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateCreator}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateCreatorOptions = Omit<\n UseMutationOptions<CreatorUpdateResult, Error, UpdateCreatorParams>,\n 'mutationFn'\n>;\n\n/** Updates an existing creator. Invalidates creator queries on success. */\nconst useUpdateCreator = (options?: UseUpdateCreatorOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.creators.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: creatorKeys.all }),\n queryClient.invalidateQueries({ queryKey: creatorKeys.detail(params.id) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateCreator };\n\nexport type { UseUpdateCreatorOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { billingKeys } from '../billing/keys';\nimport { creatorKeys } from './keys';\nimport type { DeleteCreatorParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteCreator}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteCreatorOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteCreatorParams>,\n 'mutationFn'\n>;\n\n/** Deletes a creator. Invalidates creator and plan-usage queries on success. */\nconst useDeleteCreator = (options?: UseDeleteCreatorOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.creators.delete(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: creatorKeys.all }),\n queryClient.invalidateQueries({ queryKey: billingKeys.planUsages() }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteCreator };\n\nexport type { UseDeleteCreatorOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { billingKeys } from '../billing/keys';\nimport { creatorKeys } from './keys';\nimport type { ConnectSocialAccountParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useConnectCreatorSocialAccount}.\n * `mutationFn` is managed by the hook.\n */\ntype UseConnectCreatorSocialAccountOptions = Omit<\n UseMutationOptions<SuccessResult, Error, ConnectSocialAccountParams>,\n 'mutationFn'\n>;\n\n/**\n * Connects a new social media account to a creator via profile URL.\n * Creates the account record, links it, and triggers a data refresh.\n * Invalidates creator and plan-usage queries on success.\n */\nconst useConnectCreatorSocialAccount = (\n options?: UseConnectCreatorSocialAccountOptions,\n) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.creators.socialAccounts.connect(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: creatorKeys.all }),\n queryClient.invalidateQueries({ queryKey: billingKeys.planUsages() }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useConnectCreatorSocialAccount };\nexport type { UseConnectCreatorSocialAccountOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { billingKeys } from '../billing/keys';\nimport { creatorKeys } from './keys';\nimport type { DisconnectSocialAccountParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDisconnectCreatorSocialAccount}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDisconnectCreatorSocialAccountOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DisconnectSocialAccountParams>,\n 'mutationFn'\n>;\n\n/**\n * Disconnects a social media account from a creator.\n * Invalidates creator and plan-usage queries on success.\n */\nconst useDisconnectCreatorSocialAccount = (\n options?: UseDisconnectCreatorSocialAccountOptions\n) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params: DisconnectSocialAccountParams) =>\n client.creators.socialAccounts.disconnect(params),\n onSuccess: async (...props) => {\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: creatorKeys.all }),\n queryClient.invalidateQueries({ queryKey: billingKeys.planUsages() }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDisconnectCreatorSocialAccount };\n\nexport type { UseDisconnectCreatorSocialAccountOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CreatorMetrics, GetCreatorMetricsParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCreatorMetrics}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCreatorMetricsOptions = Omit<\n UseQueryOptions<\n CreatorMetrics,\n Error,\n CreatorMetrics,\n ReturnType<typeof creatorKeys.metricsDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches calculated metrics for a creator (CPM, CPE, CPA, total cost).\n * All calculations are performed server-side.\n */\nconst useCreatorMetrics = (\n params: GetCreatorMetricsParams,\n options?: UseCreatorMetricsOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: creatorKeys.metricsDetail(params.creatorId),\n queryFn: async () => {\n const { data } = await client.creators.metrics.get(params);\n return data;\n },\n });\n};\n\nexport { useCreatorMetrics };\nexport type { UseCreatorMetricsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { creatorKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n GetCreatorMetricsHistoryParams,\n ListResult,\n MetricsHistoryEntry,\n} from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCreatorMetricsHistory}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCreatorMetricsHistoryOptions = Omit<\n UseQueryOptions<\n ListResult<MetricsHistoryEntry>,\n Error,\n ListResult<MetricsHistoryEntry>,\n ReturnType<typeof creatorKeys.metricsHistoryDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches metrics history for a creator with CPM, CPE, and CPA for each date.\n * All calculations are performed server-side.\n */\nconst useCreatorMetricsHistory = (\n params: GetCreatorMetricsHistoryParams,\n options?: UseCreatorMetricsHistoryOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: creatorKeys.metricsHistoryDetail(params),\n queryFn: async () => {\n return client.creators.metrics.history(params);\n },\n });\n};\n\nexport { useCreatorMetricsHistory };\nexport type { UseCreatorMetricsHistoryOptions };\n","/**\n * Query key factory for conversions following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type { ListConversionsParams } from '@brandwave/ts';\n\nconst conversionKeys = {\n all: ['brandwave', 'conversions'] as const,\n lists: () => [...conversionKeys.all, 'list'] as const,\n list: (params: ListConversionsParams) => [...conversionKeys.lists(), params] as const,\n details: () => [...conversionKeys.all, 'detail'] as const,\n detail: (id: string) => [...conversionKeys.details(), id] as const,\n};\n\nexport { conversionKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionKeys } from './keys';\nimport type { Conversion, ConversionParams } from '@brandwave/ts';\nimport type { UseQueryOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Query options for {@link useConversion}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseConversionOptions = Omit<\n UseQueryOptions<Conversion, Error, Conversion, ReturnType<typeof conversionKeys.detail>>,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Hook to fetch a single conversion by ID.\n *\n * @example\n * ```tsx\n * const { data, isLoading, error } = useConversion({ id: 'conv-123' });\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return <div>Converted at: {data.convertedAt}</div>;\n * ```\n */\nconst useConversion = (params: ConversionParams, options?: UseConversionOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: conversionKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.conversions({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useConversion };\nexport type { UseConversionOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ConversionInList, ListConversionsParams, ListResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListConversions}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListConversionsOptions = Omit<\n UseQueryOptions<\n ListResult<ConversionInList>,\n Error,\n ListResult<ConversionInList>,\n ReturnType<typeof conversionKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of conversions. */\nconst useListConversions = (\n params: ListConversionsParams,\n options?: UseListConversionsOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: conversionKeys.list(params),\n queryFn: async () => client.conversions.list(params),\n });\n};\n\nexport { useListConversions };\nexport type { UseListConversionsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionKeys } from './keys';\nimport type { ConversionCreateResult, CreateConversionParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateConversion}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateConversionOptions = Omit<\n UseMutationOptions<ConversionCreateResult, Error, CreateConversionParams>,\n 'mutationFn'\n>;\n\n/**\n * Hook to create a new conversion record.\n *\n * Automatically invalidates conversion queries on success.\n *\n * @example\n * ```tsx\n * const { mutate, isPending } = useCreateConversion();\n *\n * const handleCreate = () => {\n * mutate(\n * { organizationId: 'org-123', sourceId: 'src-456', convertedAt: '2025-06-15T14:30:00Z' },\n * { onSuccess: (conversion) => console.log('Created:', conversion.id) }\n * );\n * };\n * ```\n */\nconst useCreateConversion = (options?: UseCreateConversionOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.conversions.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: conversionKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateConversion };\n\nexport type { UseCreateConversionOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionKeys } from './keys';\nimport type { ConversionUpdateResult, UpdateConversionParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateConversion}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateConversionOptions = Omit<\n UseMutationOptions<ConversionUpdateResult, Error, UpdateConversionParams>,\n 'mutationFn'\n>;\n\n/** Updates an existing conversion record. Invalidates conversion queries on success. */\nconst useUpdateConversion = (options?: UseUpdateConversionOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.conversions.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: conversionKeys.all }),\n queryClient.invalidateQueries({ queryKey: conversionKeys.detail(params.id) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateConversion };\n\nexport type { UseUpdateConversionOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionKeys } from './keys';\nimport type { DeleteConversionParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteConversion}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteConversionOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteConversionParams>,\n 'mutationFn'\n>;\n\n/** Deletes a conversion record. Invalidates conversion queries on success. */\nconst useDeleteConversion = (options?: UseDeleteConversionOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.conversions.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: conversionKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteConversion };\n\nexport type { UseDeleteConversionOptions };\n","/**\n * Query key factory for conversion sources following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type { ListConversionSourcesParams } from '@brandwave/ts';\n\nconst conversionSourceKeys = {\n all: ['brandwave', 'conversionSources'] as const,\n lists: () => [...conversionSourceKeys.all, 'list'] as const,\n list: (params: ListConversionSourcesParams) =>\n [...conversionSourceKeys.lists(), params] as const,\n details: () => [...conversionSourceKeys.all, 'detail'] as const,\n detail: (id: string) => [...conversionSourceKeys.details(), id] as const,\n};\n\nexport { conversionSourceKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionSourceKeys } from './keys';\nimport type { ConversionSource, ConversionSourceParams } from '@brandwave/ts';\nimport type { UseQueryOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Query options for {@link useConversionSource}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseConversionSourceOptions = Omit<\n UseQueryOptions<\n ConversionSource,\n Error,\n ConversionSource,\n ReturnType<typeof conversionSourceKeys.detail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Hook to fetch a single conversion source by ID.\n *\n * @example\n * ```tsx\n * const { data, isLoading, error } = useConversionSource({ id: 'src-123' });\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return <div>{data.name} ({data.type})</div>;\n * ```\n */\nconst useConversionSource = (\n params: ConversionSourceParams,\n options?: UseConversionSourceOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: conversionSourceKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.conversionSources({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useConversionSource };\nexport type { UseConversionSourceOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionSourceKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ConversionSourceInList, ListConversionSourcesParams, ListResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListConversionSources}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListConversionSourcesOptions = Omit<\n UseQueryOptions<\n ListResult<ConversionSourceInList>,\n Error,\n ListResult<ConversionSourceInList>,\n ReturnType<typeof conversionSourceKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of conversion sources. */\nconst useListConversionSources = (\n params: ListConversionSourcesParams,\n options?: UseListConversionSourcesOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: conversionSourceKeys.list(params),\n queryFn: async () => client.conversionSources.list(params),\n });\n};\n\nexport { useListConversionSources };\nexport type { UseListConversionSourcesOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionSourceKeys } from './keys';\nimport type { ConversionSourceCreateResult, CreateConversionSourceParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateConversionSource}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateConversionSourceOptions = Omit<\n UseMutationOptions<ConversionSourceCreateResult, Error, CreateConversionSourceParams>,\n 'mutationFn'\n>;\n\n/**\n * Hook to create a new conversion source.\n *\n * Automatically invalidates conversion source queries on success.\n *\n * @example\n * ```tsx\n * const { mutate, isPending } = useCreateConversionSource();\n *\n * const handleCreate = () => {\n * mutate(\n * {\n * organizationId: 'org-123',\n * name: 'Summer Promo',\n * type: 'promo_code',\n * category: 'organic_social',\n * },\n * { onSuccess: (source) => console.log('Created:', source.id) }\n * );\n * };\n * ```\n */\nconst useCreateConversionSource = (options?: UseCreateConversionSourceOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.conversionSources.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: conversionSourceKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateConversionSource };\n\nexport type { UseCreateConversionSourceOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionSourceKeys } from './keys';\nimport type { ConversionSourceUpdateResult, UpdateConversionSourceParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateConversionSource}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateConversionSourceOptions = Omit<\n UseMutationOptions<ConversionSourceUpdateResult, Error, UpdateConversionSourceParams>,\n 'mutationFn'\n>;\n\n/** Updates an existing conversion source. Invalidates conversion source queries on success. */\nconst useUpdateConversionSource = (options?: UseUpdateConversionSourceOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.conversionSources.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: conversionSourceKeys.all }),\n queryClient.invalidateQueries({ queryKey: conversionSourceKeys.detail(params.id) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateConversionSource };\n\nexport type { UseUpdateConversionSourceOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { conversionSourceKeys } from './keys';\nimport type { DeleteConversionSourceParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteConversionSource}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteConversionSourceOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteConversionSourceParams>,\n 'mutationFn'\n>;\n\n/** Deletes a conversion source. Invalidates conversion source queries on success. */\nconst useDeleteConversionSource = (options?: UseDeleteConversionSourceOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.conversionSources.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: conversionSourceKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteConversionSource };\n\nexport type { UseDeleteConversionSourceOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { costKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CostInList, ListCostsParams, ListResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListCosts}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListCostsOptions = Omit<\n UseQueryOptions<\n ListResult<CostInList>,\n Error,\n ListResult<CostInList>,\n ReturnType<typeof costKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of costs for an activity. */\nconst useListCosts = (params: ListCostsParams, options?: UseListCostsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: costKeys.list(params),\n queryFn: async () => client.costs.list(params),\n });\n};\n\nexport { useListCosts };\nexport type { UseListCostsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { costKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CountCostsParams, CountResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useCountCosts}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseCountCostsOptions = Omit<\n UseQueryOptions<CountResult, Error, CountResult, ReturnType<typeof costKeys.count>>,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches the count of costs matching the given filters. */\nconst useCountCosts = (params: CountCostsParams, options?: UseCountCostsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: costKeys.count(params),\n queryFn: async () => client.costs.count(params),\n });\n};\n\nexport { useCountCosts };\nexport type { UseCountCostsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { costKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListCostTypesParams, ListResult } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListCostTypes}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListCostTypesOptions = Omit<\n UseQueryOptions<\n ListResult<string>,\n Error,\n ListResult<string>,\n ReturnType<typeof costKeys.typesList>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches the list of available cost types. */\nconst useListCostTypes = (params: ListCostTypesParams, options?: UseListCostTypesOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: costKeys.typesList(params),\n queryFn: async () => client.costs.types.list(params),\n });\n};\n\nexport { useListCostTypes };\nexport type { UseListCostTypesOptions };\n","/**\n * Query key factory for Google Analytics following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nconst googleAnalyticsKeys = {\n all: ['brandwave', 'googleAnalytics'] as const,\n connectionStatus: (organizationId: string) =>\n [...googleAnalyticsKeys.all, 'connectionStatus', organizationId] as const,\n properties: (organizationId: string) =>\n [...googleAnalyticsKeys.all, 'properties', organizationId] as const,\n};\n\nexport { googleAnalyticsKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { googleAnalyticsKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n GetGoogleAnalyticsConnectionStatusParams,\n GetGoogleAnalyticsConnectionStatusResponse,\n} from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useGoogleAnalyticsConnectionStatus}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseGoogleAnalyticsConnectionStatusOptions = Omit<\n UseQueryOptions<\n GetGoogleAnalyticsConnectionStatusResponse,\n Error,\n GetGoogleAnalyticsConnectionStatusResponse,\n ReturnType<typeof googleAnalyticsKeys.connectionStatus>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches the Google Analytics connection status for an organization.\n * Returns whether GA is connected, the property ID/name, and last sync time.\n */\nconst useGoogleAnalyticsConnectionStatus = (\n params: GetGoogleAnalyticsConnectionStatusParams,\n options?: UseGoogleAnalyticsConnectionStatusOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: googleAnalyticsKeys.connectionStatus(params.organizationId),\n queryFn: async () => {\n // client.google is the getConnectionStatus function\n const { data } = await client.google(params);\n return data;\n },\n });\n};\n\nexport { useGoogleAnalyticsConnectionStatus };\nexport type { UseGoogleAnalyticsConnectionStatusOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { googleAnalyticsKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n ListGoogleAnalyticsPropertiesParams,\n ListGoogleAnalyticsPropertiesResponse,\n} from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListGoogleAnalyticsProperties}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListGoogleAnalyticsPropertiesOptions = Omit<\n UseQueryOptions<\n ListGoogleAnalyticsPropertiesResponse,\n Error,\n ListGoogleAnalyticsPropertiesResponse,\n ReturnType<typeof googleAnalyticsKeys.properties>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Lists available GA4 properties for the connected Google account.\n */\nconst useListGoogleAnalyticsProperties = (\n params: ListGoogleAnalyticsPropertiesParams,\n options?: UseListGoogleAnalyticsPropertiesOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: googleAnalyticsKeys.properties(params.organizationId),\n queryFn: async () => {\n const { data } = await client.google.listProperties(params);\n return data;\n },\n });\n};\n\nexport { useListGoogleAnalyticsProperties };\nexport type { UseListGoogleAnalyticsPropertiesOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { googleAnalyticsKeys } from './keys';\nimport type { ConnectGoogleAnalyticsParams, ConnectGoogleAnalyticsResponse } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useConnectGoogleAnalytics}.\n * `mutationFn` is managed by the hook.\n */\ntype UseConnectGoogleAnalyticsOptions = Omit<\n UseMutationOptions<ConnectGoogleAnalyticsResponse, Error, ConnectGoogleAnalyticsParams>,\n 'mutationFn'\n>;\n\n/** Initiates OAuth flow to connect Google Analytics. Returns the OAuth URL to redirect to. */\nconst useConnectGoogleAnalytics = (options?: UseConnectGoogleAnalyticsOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.google.connect(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: googleAnalyticsKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useConnectGoogleAnalytics };\n\nexport type { UseConnectGoogleAnalyticsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { googleAnalyticsKeys } from './keys';\nimport type { DisconnectGoogleAnalyticsParams, DisconnectGoogleAnalyticsResponse } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDisconnectGoogleAnalytics}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDisconnectGoogleAnalyticsOptions = Omit<\n UseMutationOptions<DisconnectGoogleAnalyticsResponse, Error, DisconnectGoogleAnalyticsParams>,\n 'mutationFn'\n>;\n\n/**\n * Disconnects Google Analytics from the organization.\n * Invalidates connection queries on success.\n */\nconst useDisconnectGoogleAnalytics = (options?: UseDisconnectGoogleAnalyticsOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.google.disconnect(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: googleAnalyticsKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDisconnectGoogleAnalytics };\n\nexport type { UseDisconnectGoogleAnalyticsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { googleAnalyticsKeys } from './keys';\nimport type {\n SelectGoogleAnalyticsPropertyParams,\n SelectGoogleAnalyticsPropertyResponse,\n} from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useSelectGoogleAnalyticsProperty}.\n * `mutationFn` is managed by the hook.\n */\ntype UseSelectGoogleAnalyticsPropertyOptions = Omit<\n UseMutationOptions<\n SelectGoogleAnalyticsPropertyResponse,\n Error,\n SelectGoogleAnalyticsPropertyParams\n >,\n 'mutationFn'\n>;\n\n/** Persists the user's selected GA4 property for an organization. */\nconst useSelectGoogleAnalyticsProperty = (options?: UseSelectGoogleAnalyticsPropertyOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.google.selectProperty(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: googleAnalyticsKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useSelectGoogleAnalyticsProperty };\n\nexport type { UseSelectGoogleAnalyticsPropertyOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { insightKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListOrganizationInsightsParams, OrganizationInsight } from '@brandwave/ts';\n\ntype UseListOrganizationInsightsOptions = Omit<\n UseQueryOptions<\n Array<OrganizationInsight>,\n Error,\n Array<OrganizationInsight>,\n ReturnType<typeof insightKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\nconst useListOrganizationInsights = (\n params: ListOrganizationInsightsParams,\n options?: UseListOrganizationInsightsOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: insightKeys.list(params),\n queryFn: async () => {\n const result = await client.insights.list(params);\n return result.items ?? [];\n },\n });\n};\n\nexport { useListOrganizationInsights };\n","import type { ListOrganizationInsightsParams } from '@brandwave/ts';\n\nconst insightKeys = {\n all: ['insights'] as const,\n list: (params: ListOrganizationInsightsParams) =>\n [...insightKeys.all, 'list', params.organizationId] as const,\n};\n\nexport { insightKeys };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { insightKeys } from './keys';\nimport type { DismissInsightParams, ItemResult, OrganizationInsight } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDismissInsight}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDismissInsightOptions = Omit<\n UseMutationOptions<ItemResult<OrganizationInsight>, Error, DismissInsightParams>,\n 'mutationFn'\n>;\n\n/**\n * Dismiss an insight so it disappears from the dashboard.\n * Invalidates insight queries on success so the list reflects the dismissal.\n */\nconst useDismissInsight = (options?: UseDismissInsightOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params: DismissInsightParams) => client.insights.dismiss(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: insightKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDismissInsight };\n","/**\n * Query key factory for notes following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type { ListNotesParams, NoteParams } from '@brandwave/ts';\n\nconst noteKeys = {\n all: ['brandwave', 'notes'] as const,\n lists: () => [...noteKeys.all, 'list'] as const,\n list: (params: ListNotesParams) => [...noteKeys.lists(), params] as const,\n details: () => [...noteKeys.all, 'detail'] as const,\n detail: (id: NoteParams['id']) => [...noteKeys.details(), id] as const,\n};\n\nexport { noteKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { noteKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { Note, NoteParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useNote}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseNoteOptions = Omit<\n UseQueryOptions<Note, Error, Note, ReturnType<typeof noteKeys.detail>>,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a single note by ID. */\nconst useNote = (params: NoteParams, options?: UseNoteOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: noteKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.notes({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useNote };\nexport type { UseNoteOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { noteKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListNotesParams, ListResult, NoteInList } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListNotes}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListNotesOptions = Omit<\n UseQueryOptions<\n ListResult<NoteInList>,\n Error,\n ListResult<NoteInList>,\n ReturnType<typeof noteKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of notes for an activity or creator. */\nconst useListNotes = (params: ListNotesParams, options?: UseListNotesOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: noteKeys.list(params),\n queryFn: async () => client.notes.list(params),\n });\n};\n\nexport { useListNotes };\nexport type { UseListNotesOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { noteKeys } from './keys';\nimport type { CreateNoteParams, ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateNote}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateNoteOptions = Omit<\n UseMutationOptions<ItemResult<{ id: string }>, Error, CreateNoteParams>,\n 'mutationFn'\n>;\n\n/** Creates a note on any entity. Invalidates note queries on success. */\nconst useCreateNote = (options?: UseCreateNoteOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params: CreateNoteParams) => client.notes.create(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: noteKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateNote };\n\nexport type { UseCreateNoteOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { noteKeys } from './keys';\nimport type { ItemResult, UpdateNoteParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateNote}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateNoteOptions = Omit<\n UseMutationOptions<ItemResult<{ id: string }>, Error, UpdateNoteParams>,\n 'mutationFn'\n>;\n\n/** Updates a note's content. Invalidates note queries on success. */\nconst useUpdateNote = (options?: UseUpdateNoteOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params: UpdateNoteParams) => client.notes.update(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: noteKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateNote };\n\nexport type { UseUpdateNoteOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { noteKeys } from './keys';\nimport type { DeleteNoteParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteNote}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteNoteOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteNoteParams>,\n 'mutationFn'\n>;\n\n/** Deletes a note. Invalidates note queries on success. */\nconst useDeleteNote = (options?: UseDeleteNoteOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params: DeleteNoteParams) => client.notes.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: noteKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteNote };\n\nexport type { UseDeleteNoteOptions };\n","/**\n * Query key factory for organizations following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type {\n GetOrganizationMetricsHistoryParams,\n GetOrganizationMetricsParams,\n ListOrganizationUsersParams,\n ListOrganizationsParams,\n} from '@brandwave/ts';\n\nconst organizationKeys = {\n all: ['brandwave', 'organizations'] as const,\n details: () => [...organizationKeys.all, 'detail'] as const,\n detail: (id: string) => [...organizationKeys.details(), id] as const,\n lists: () => [...organizationKeys.all, 'list'] as const,\n list: (params: ListOrganizationsParams) => [...organizationKeys.lists(), params] as const,\n usersLists: () => [...organizationKeys.all, 'users', 'list'] as const,\n usersList: (params: ListOrganizationUsersParams) =>\n [...organizationKeys.usersLists(), params] as const,\n metricsDetails: () => [...organizationKeys.all, 'metrics', 'detail'] as const,\n metricsDetail: (organizationId: GetOrganizationMetricsParams['organizationId']) =>\n [...organizationKeys.metricsDetails(), organizationId] as const,\n metricsHistoryDetails: () =>\n [...organizationKeys.all, 'metrics', 'history', 'detail'] as const,\n metricsHistoryDetail: (params: GetOrganizationMetricsHistoryParams) =>\n [...organizationKeys.metricsHistoryDetails(), params] as const,\n};\n\nexport { organizationKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { GetOrganizationParams, ItemResult } from '@brandwave/ts';\n\ntype UseGetOrganizationOptions = Omit<\n UseQueryOptions<\n ItemResult<Record<string, unknown>>,\n Error,\n ItemResult<Record<string, unknown>>,\n ReturnType<typeof organizationKeys.detail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\nconst useGetOrganization = (\n params: GetOrganizationParams,\n options?: UseGetOrganizationOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: organizationKeys.detail(params.id),\n queryFn: async () => client.organizations.get(params),\n });\n};\n\nexport { useGetOrganization };\nexport type { UseGetOrganizationOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListOrganizationsParams, ListResult, OrganizationInList } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListOrganizations}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListOrganizationsOptions = Omit<\n UseQueryOptions<\n ListResult<OrganizationInList>,\n Error,\n ListResult<OrganizationInList>,\n ReturnType<typeof organizationKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of organizations the user belongs to. */\nconst useListOrganizations = (\n params: ListOrganizationsParams,\n options?: UseListOrganizationsOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: organizationKeys.list(params),\n queryFn: async () => client.organizations.list(params),\n });\n};\n\nexport { useListOrganizations };\nexport type { UseListOrganizationsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListOrganizationUsersParams, ListResult, OrganizationUserInList } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListOrganizationUsers}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListOrganizationUsersOptions = Omit<\n UseQueryOptions<\n ListResult<OrganizationUserInList>,\n Error,\n ListResult<OrganizationUserInList>,\n ReturnType<typeof organizationKeys.usersList>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of users in an organization. */\nconst useListOrganizationUsers = (\n params: ListOrganizationUsersParams,\n options?: UseListOrganizationUsersOptions\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: organizationKeys.usersList(params),\n queryFn: async () => client.organizations.users.list(params),\n });\n};\n\nexport { useListOrganizationUsers };\nexport type { UseListOrganizationUsersOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { CreateOrganizationParams, OrganizationCreateResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateOrganization}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateOrganizationOptions = Omit<\n UseMutationOptions<OrganizationCreateResult, Error, Omit<CreateOrganizationParams, 'userId'>>,\n 'mutationFn'\n>;\n\n/** Creates a new organization. Invalidates organization queries on success. */\nconst useCreateOrganization = (options?: UseCreateOrganizationOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.organizations.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateOrganization };\n\nexport type { UseCreateOrganizationOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { CompleteOrganicSignupParams, CompleteOrganicSignupResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseCompleteOrganicSignupOptions = Omit<\n UseMutationOptions<CompleteOrganicSignupResult, Error, Omit<CompleteOrganicSignupParams, 'userId'>>,\n 'mutationFn'\n>;\n\nconst useCompleteOrganicSignup = (options?: UseCompleteOrganicSignupOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.organizations.completeOrganicSignup(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCompleteOrganicSignup };\nexport type { UseCompleteOrganicSignupOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { OrganizationUpdateResult, UpdateOrganizationParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateOrganization}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateOrganizationOptions = Omit<\n UseMutationOptions<OrganizationUpdateResult, Error, UpdateOrganizationParams>,\n 'mutationFn'\n>;\n\n/** Updates an organization. Invalidates organization queries on success. */\nconst useUpdateOrganization = (options?: UseUpdateOrganizationOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.organizations.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateOrganization };\n\nexport type { UseUpdateOrganizationOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { DeleteOrganizationParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteOrganization}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteOrganizationOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteOrganizationParams>,\n 'mutationFn'\n>;\n\n/** Deletes an organization. Invalidates organization queries on success. */\nconst useDeleteOrganization = (options?: UseDeleteOrganizationOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.organizations.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteOrganization };\n\nexport type { UseDeleteOrganizationOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { AddUserParams, ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useAddOrganizationUser}.\n * `mutationFn` is managed by the hook.\n */\ntype UseAddOrganizationUserOptions = Omit<\n UseMutationOptions<ItemResult<unknown>, Error, AddUserParams>,\n 'mutationFn'\n>;\n\n/** Adds a user to an organization. Invalidates organization queries on success. */\nconst useAddOrganizationUser = (options?: UseAddOrganizationUserOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.organizations.users.add(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useAddOrganizationUser };\n\nexport type { UseAddOrganizationUserOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { ItemResult, OrganizationUserRoleUpdateResult, UpdateUserRoleParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateOrganizationUserRole}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateOrganizationUserRoleOptions = Omit<\n UseMutationOptions<ItemResult<OrganizationUserRoleUpdateResult>, Error, UpdateUserRoleParams>,\n 'mutationFn'\n>;\n\n/** Updates a user's role within an organization. Invalidates organization queries on success. */\nconst useUpdateOrganizationUserRole = (options?: UseUpdateOrganizationUserRoleOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.organizations.users.updateRole(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateOrganizationUserRole };\n\nexport type { UseUpdateOrganizationUserRoleOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { RemoveUserParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useRemoveOrganizationUser}.\n * `mutationFn` is managed by the hook.\n */\ntype UseRemoveOrganizationUserOptions = Omit<\n UseMutationOptions<SuccessResult, Error, RemoveUserParams>,\n 'mutationFn'\n>;\n\n/** Removes a user from an organization. Invalidates organization queries on success. */\nconst useRemoveOrganizationUser = (options?: UseRemoveOrganizationUserOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.organizations.users.remove(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useRemoveOrganizationUser };\n\nexport type { UseRemoveOrganizationUserOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeInviteMutation } from '../demo-mode-mutation-guard';\nimport { organizationKeys } from './keys';\nimport type { AcceptInviteParams, ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype AcceptInviteMutationParams = Omit<AcceptInviteParams, 'userId'>;\n\n/**\n * TanStack Mutation options for {@link useAcceptOrganizationInvite}.\n * `mutationFn` is managed by the hook.\n */\ntype UseAcceptOrganizationInviteOptions = Omit<\n UseMutationOptions<ItemResult<unknown>, Error, AcceptInviteMutationParams>,\n 'mutationFn'\n>;\n\n/** Accepts an organization invite. Invalidates organization queries on success. */\nconst useAcceptOrganizationInvite = (options?: UseAcceptOrganizationInviteOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeInviteMutation(options?.meta),\n mutationFn: async (params) => client.organizations.users.acceptInvite(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useAcceptOrganizationInvite };\n\nexport type { UseAcceptOrganizationInviteOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeInviteMutation } from '../demo-mode-mutation-guard';\nimport { organizationKeys } from './keys';\nimport type { DeclineInviteParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseDeclineOrganizationInviteOptions = Omit<\n UseMutationOptions<SuccessResult, Error, Omit<DeclineInviteParams, 'userId'>>,\n 'mutationFn'\n>;\n\n/** Declines an organization invite. Invalidates organization queries on success. */\nconst useDeclineOrganizationInvite = (options?: UseDeclineOrganizationInviteOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeInviteMutation(options?.meta),\n mutationFn: async (params) => client.organizations.users.declineInvite(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeclineOrganizationInvite };\nexport type { UseDeclineOrganizationInviteOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype ProcessInviteSignupResult = ItemResult<{\n processed: boolean;\n organizationId?: string;\n role?: string;\n}>;\n\ntype UseProcessInviteSignupOptions = Omit<\n UseMutationOptions<ProcessInviteSignupResult, Error, void>,\n 'mutationFn'\n>;\n\n/** Processes invite signup metadata for a newly signed-up user. */\nconst useProcessInviteSignup = (options?: UseProcessInviteSignupOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async () => client.organizations.users.processInviteSignup(),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useProcessInviteSignup };\nexport type { UseProcessInviteSignupOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { InviteUserParams, ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useInviteOrganizationUser}.\n * `mutationFn` is managed by the hook.\n */\ntype UseInviteOrganizationUserOptions = Omit<\n UseMutationOptions<ItemResult<unknown>, Error, InviteUserParams>,\n 'mutationFn'\n>;\n\n/** Invites a user to an organization by email. Invalidates organization queries on success. */\nconst useInviteOrganizationUser = (options?: UseInviteOrganizationUserOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.organizations.users.invite(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: organizationKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useInviteOrganizationUser };\n\nexport type { UseInviteOrganizationUserOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { GetOrganizationMetricsParams, OrganizationMetrics } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useOrganizationMetrics}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseOrganizationMetricsOptions = Omit<\n UseQueryOptions<\n OrganizationMetrics,\n Error,\n OrganizationMetrics,\n ReturnType<typeof organizationKeys.metricsDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches calculated metrics for an organization (CPM, CPE, CPA, total cost).\n * All calculations are performed server-side.\n */\nconst useOrganizationMetrics = (\n params: GetOrganizationMetricsParams,\n options?: UseOrganizationMetricsOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: organizationKeys.metricsDetail(params.organizationId),\n queryFn: async () => {\n const { data } = await client.organizations.metrics.get(params);\n return data;\n },\n });\n};\n\nexport { useOrganizationMetrics };\nexport type { UseOrganizationMetricsOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { organizationKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type {\n GetOrganizationMetricsHistoryParams,\n ListResult,\n MetricsHistoryEntry,\n} from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useOrganizationMetricsHistory}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseOrganizationMetricsHistoryOptions = Omit<\n UseQueryOptions<\n ListResult<MetricsHistoryEntry>,\n Error,\n ListResult<MetricsHistoryEntry>,\n ReturnType<typeof organizationKeys.metricsHistoryDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/**\n * Fetches metrics history for an organization with CPM, CPE, and CPA for each date.\n * All calculations are performed server-side.\n */\nconst useOrganizationMetricsHistory = (\n params: GetOrganizationMetricsHistoryParams,\n options?: UseOrganizationMetricsHistoryOptions,\n) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: organizationKeys.metricsHistoryDetail(params),\n queryFn: async () => {\n return client.organizations.metrics.history(params);\n },\n });\n};\n\nexport { useOrganizationMetricsHistory };\nexport type { UseOrganizationMetricsHistoryOptions };\n","const personalAccessTokenKeys = {\n all: ['brandwave', 'personal-access-tokens'] as const,\n lists: () => [...personalAccessTokenKeys.all, 'list'] as const,\n list: () => [...personalAccessTokenKeys.lists()] as const,\n};\n\nexport { personalAccessTokenKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { personalAccessTokenKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListResult, PersonalAccessTokenInList } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListPersonalAccessTokens}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListPersonalAccessTokensOptions = Omit<\n UseQueryOptions<\n ListResult<PersonalAccessTokenInList>,\n Error,\n ListResult<PersonalAccessTokenInList>,\n ReturnType<typeof personalAccessTokenKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches all Personal Access Tokens for the authenticated user. */\nconst useListPersonalAccessTokens = (options?: UseListPersonalAccessTokensOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: personalAccessTokenKeys.list(),\n queryFn: async () => client.personalAccessTokens.list(),\n });\n};\n\nexport { useListPersonalAccessTokens };\nexport type { UseListPersonalAccessTokensOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { personalAccessTokenKeys } from './keys';\nimport type {\n CreatePersonalAccessTokenParams,\n PersonalAccessTokenCreateResult,\n} from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreatePersonalAccessToken}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreatePersonalAccessTokenOptions = Omit<\n UseMutationOptions<\n PersonalAccessTokenCreateResult,\n Error,\n CreatePersonalAccessTokenParams\n >,\n 'mutationFn'\n>;\n\n/**\n * Creates a new Personal Access Token.\n * IMPORTANT: The plaintext token is only returned once in the response.\n * Invalidates PAT queries on success.\n */\nconst useCreatePersonalAccessToken = (options?: UseCreatePersonalAccessTokenOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.personalAccessTokens.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: personalAccessTokenKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreatePersonalAccessToken };\nexport type { UseCreatePersonalAccessTokenOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { personalAccessTokenKeys } from './keys';\nimport type { RevokePersonalAccessTokenParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useRevokePersonalAccessToken}.\n * `mutationFn` is managed by the hook.\n */\ntype UseRevokePersonalAccessTokenOptions = Omit<\n UseMutationOptions<SuccessResult, Error, RevokePersonalAccessTokenParams>,\n 'mutationFn'\n>;\n\n/** Revokes a Personal Access Token. Invalidates PAT queries on success. */\nconst useRevokePersonalAccessToken = (options?: UseRevokePersonalAccessTokenOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => client.personalAccessTokens.revoke(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: personalAccessTokenKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useRevokePersonalAccessToken };\nexport type { UseRevokePersonalAccessTokenOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { personalAccessTokenKeys } from './keys';\nimport type {\n PersonalAccessTokenRotateResult,\n RotatePersonalAccessTokenParams,\n} from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useRotatePersonalAccessToken}.\n * `mutationFn` is managed by the hook.\n */\ntype UseRotatePersonalAccessTokenOptions = Omit<\n UseMutationOptions<\n PersonalAccessTokenRotateResult,\n Error,\n RotatePersonalAccessTokenParams\n >,\n 'mutationFn'\n>;\n\n/**\n * Rotates a Personal Access Token (creates new, revokes old).\n * IMPORTANT: The new plaintext token is only returned once in the response.\n * Invalidates PAT queries on success.\n */\nconst useRotatePersonalAccessToken = (options?: UseRotatePersonalAccessTokenOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.personalAccessTokens.rotate(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: personalAccessTokenKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useRotatePersonalAccessToken };\nexport type { UseRotatePersonalAccessTokenOptions };\n","/**\n * Query key factory for users following TKDodo best practices.\n *\n * All keys are namespaced with 'brandwave' prefix to avoid collisions\n * with consumer's own query keys.\n *\n * @see https://tkdodo.eu/blog/effective-react-query-keys\n */\n\nimport type { ListUsersParams, UserParams, UserSettingsParams } from '@brandwave/ts';\n\nconst userKeys = {\n all: ['brandwave', 'users'] as const,\n lists: () => [...userKeys.all, 'list'] as const,\n list: (params: ListUsersParams) => [...userKeys.lists(), params] as const,\n details: () => [...userKeys.all, 'detail'] as const,\n detail: (id: UserParams['id']) => [...userKeys.details(), id] as const,\n settingsDetails: () => [...userKeys.all, 'settings'] as const,\n settingsDetail: (params: UserSettingsParams) => [...userKeys.settingsDetails(), params] as const,\n};\n\nexport { userKeys };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { userKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { User, UserParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useUser}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseUserOptions = Omit<\n UseQueryOptions<User, Error, User, ReturnType<typeof userKeys.detail>>,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a single user by ID. */\nconst useUser = (params: UserParams, options?: UseUserOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: userKeys.detail(params.id),\n queryFn: async () => {\n const { data } = await client.users({ id: params.id });\n return data;\n },\n });\n};\n\nexport { useUser };\nexport type { UseUserOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { userKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { ListResult, ListUsersParams, UserInList } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useListUsers}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseListUsersOptions = Omit<\n UseQueryOptions<\n ListResult<UserInList>,\n Error,\n ListResult<UserInList>,\n ReturnType<typeof userKeys.list>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches a paginated list of users in an organization. */\nconst useListUsers = (params: ListUsersParams, options?: UseListUsersOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: userKeys.list(params),\n queryFn: async () => client.users.list(params),\n });\n};\n\nexport { useListUsers };\nexport type { UseListUsersOptions };\n","import { useQuery } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { userKeys } from './keys';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { UserSettings, UserSettingsParams } from '@brandwave/ts';\n\n/**\n * TanStack Query options for {@link useUserSettings}.\n * `queryKey` and `queryFn` are managed by the hook.\n */\ntype UseUserSettingsOptions = Omit<\n UseQueryOptions<\n UserSettings | null,\n Error,\n UserSettings | null,\n ReturnType<typeof userKeys.settingsDetail>\n >,\n 'queryKey' | 'queryFn'\n>;\n\n/** Fetches settings for a user by their ID. */\nconst useUserSettings = (params: UserSettingsParams, options?: UseUserSettingsOptions) => {\n const client = useBrandwaveClient();\n\n return useQuery({\n ...options,\n queryKey: userKeys.settingsDetail(params),\n queryFn: async () => {\n const { data } = await client.users.settings(params);\n return data;\n },\n });\n};\n\nexport { useUserSettings };\nexport type { UseUserSettingsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { userKeys } from './keys';\nimport type { CreateUserParams, UserCreateResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useCreateUser}.\n * `mutationFn` is managed by the hook.\n */\ntype UseCreateUserOptions = Omit<\n UseMutationOptions<UserCreateResult, Error, CreateUserParams>,\n 'mutationFn'\n>;\n\n/** Creates a new user. Invalidates user queries on success. */\nconst useCreateUser = (options?: UseCreateUserOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n mutationFn: async (params) => {\n const { data } = await client.users.create(params);\n return data;\n },\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: userKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useCreateUser };\n\nexport type { UseCreateUserOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport { userKeys } from './keys';\nimport type { UpdateUserParams, UserUpdateResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateUser}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateUserOptions = Omit<\n UseMutationOptions<UserUpdateResult, Error, UpdateUserParams>,\n 'mutationFn'\n>;\n\n/** Updates an existing user. Invalidates user queries on success. */\nconst useUpdateUser = (options?: UseUpdateUserOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => {\n const { data } = await client.users.update(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: userKeys.all }),\n queryClient.invalidateQueries({ queryKey: userKeys.detail(params.userId) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateUser };\n\nexport type { UseUpdateUserOptions };\n","import { useMutation } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport type { ChangeEmailParams } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype ChangeEmailResult = { userId: string; newEmail: string };\n\ntype UseChangeEmailOptions = Omit<\n UseMutationOptions<ChangeEmailResult, Error, ChangeEmailParams>,\n 'mutationFn'\n>;\n\nconst useChangeEmail = (options?: UseChangeEmailOptions) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => {\n const { data } = await client.users.changeEmail(params);\n return data;\n },\n });\n};\n\nexport { useChangeEmail };\nexport type { UseChangeEmailOptions };\n","import { useMutation } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport type { RequestDeletionParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseRequestDeletionOptions = Omit<\n UseMutationOptions<SuccessResult, Error, RequestDeletionParams>,\n 'mutationFn'\n>;\n\nconst useRequestDeletion = (options?: UseRequestDeletionOptions) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => client.users.requestDeletion(params),\n });\n};\n\nexport { useRequestDeletion };\nexport type { UseRequestDeletionOptions };\n","import { useMutation } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport type { ConfirmDeletionParams, ConfirmDeletionResult, ItemResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseConfirmDeletionOptions = Omit<\n UseMutationOptions<ItemResult<ConfirmDeletionResult>, Error, ConfirmDeletionParams>,\n 'mutationFn'\n>;\n\nconst useConfirmDeletion = (options?: UseConfirmDeletionOptions) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => client.users.confirmDeletion(params),\n });\n};\n\nexport { useConfirmDeletion };\nexport type { UseConfirmDeletionOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport { userKeys } from './keys';\nimport type { ItemResult, UpdateUserSettingsParams, UserSettings } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useUpdateUserSettings}.\n * `mutationFn` is managed by the hook.\n */\ntype UseUpdateUserSettingsOptions = Omit<\n UseMutationOptions<ItemResult<UserSettings>, Error, UpdateUserSettingsParams>,\n 'mutationFn'\n>;\n\n/** Updates user settings. Invalidates user and settings queries on success. */\nconst useUpdateUserSettings = (options?: UseUpdateUserSettingsOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => client.users.settings.update(params),\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({\n queryKey: userKeys.settingsDetail({ userId: params.userId }),\n }),\n queryClient.invalidateQueries({ queryKey: userKeys.all }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUpdateUserSettings };\n\nexport type { UseUpdateUserSettingsOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport { userKeys } from './keys';\nimport type { DeleteUserParams, SuccessResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\n/**\n * TanStack Mutation options for {@link useDeleteUser}.\n * `mutationFn` is managed by the hook.\n */\ntype UseDeleteUserOptions = Omit<\n UseMutationOptions<SuccessResult, Error, DeleteUserParams>,\n 'mutationFn'\n>;\n\n/** Deletes a user account. Invalidates user queries on success. */\nconst useDeleteUser = (options?: UseDeleteUserOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => client.users.delete(params),\n onSuccess: async (...props) => {\n await queryClient.invalidateQueries({ queryKey: userKeys.all });\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useDeleteUser };\n\nexport type { UseDeleteUserOptions };\n","import { useMutation } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport type { RequestAvatarUploadParams } from '@brandwave/database/queries/users/schemas';\nimport type { AvatarUploadResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UseRequestAvatarUploadOptions = Omit<\n UseMutationOptions<AvatarUploadResult, Error, RequestAvatarUploadParams>,\n 'mutationFn'\n>;\n\n/** Requests a presigned URL for uploading a user avatar image. */\nconst useRequestAvatarUpload = (options?: UseRequestAvatarUploadOptions) => {\n const client = useBrandwaveClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => {\n const { data } = await client.users.requestAvatarUpload(params);\n return data;\n },\n });\n};\n\nexport { useRequestAvatarUpload };\nexport type { UseRequestAvatarUploadOptions };\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useBrandwaveClient } from '../hooks/useBrandwaveClient';\nimport { allowDemoModeUserMutation } from '../demo-mode-mutation-guard';\nimport { userKeys } from './keys';\nimport type { UserUpdateResult } from '@brandwave/ts';\nimport type { UseMutationOptions } from '@tanstack/react-query';\n\ntype UploadAvatarParams = {\n userId: string;\n file: Blob | File;\n};\n\ntype UseUploadAvatarOptions = Omit<\n UseMutationOptions<UserUpdateResult, Error, UploadAvatarParams>,\n 'mutationFn'\n>;\n\n/** Uploads a user avatar (requests presigned URL, uploads file, updates user). */\nconst useUploadAvatar = (options?: UseUploadAvatarOptions) => {\n const client = useBrandwaveClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n ...options,\n meta: allowDemoModeUserMutation(options?.meta),\n mutationFn: async (params) => {\n const { data } = await client.users.uploadAvatar(params);\n return data;\n },\n onSuccess: async (...props) => {\n const [, params] = props;\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: userKeys.all }),\n queryClient.invalidateQueries({ queryKey: userKeys.detail(params.userId) }),\n ]);\n options?.onSuccess?.(...props);\n },\n });\n};\n\nexport { useUploadAvatar };\nexport type { UseUploadAvatarOptions };\n","// =============================================================================\n// Provider\n// =============================================================================\nexport { BrandwaveProvider } from './provider/BrandwaveProvider';\nexport type {\n BrandwaveProviderProps,\n BrandwaveContextValue,\n BrandwaveClient,\n} from './provider/BrandwaveProvider';\nexport * from './demo-mode-mutation-guard';\n\n// =============================================================================\n// Internal Hooks (for building custom hooks)\n// =============================================================================\nexport { useBrandwaveClient } from './hooks/useBrandwaveClient';\n\n// =============================================================================\n// Resource Hooks\n// =============================================================================\nexport * from './activities';\nexport * from './activity-log';\nexport * from './billing';\nexport * from './campaigns';\nexport * from './creators';\nexport * from './conversions';\nexport * from './conversionSources';\nexport * from './costs';\nexport * from './google-analytics';\nexport * from './insights';\nexport * from './notes';\nexport * from './organizations';\nexport * from './personal-access-tokens';\nexport * from './users';\n\n// =============================================================================\n// Re-export SDK types so consumers can import everything from @brandwave/react\n// =============================================================================\nexport * from '@brandwave/ts';\n"],"mappings":"AAAA,OAAgB,iBAAAA,EAAe,WAAAC,MAAe,QAC9C,OAAS,eAAAC,EAAa,uBAAAC,MAA2B,wBACjD,OAAS,mBAAAC,MAAuB,gBAqE1B,cAAAC,MAAA,oBA7DN,IAAMC,EAAmBN,EAAiD,MAAS,EAgC7EO,EAAoB,CAAC,CACzB,SAAAC,EACA,YAAAC,EACA,QAAAC,EACA,YAAaC,CACf,IAA8B,CAC5B,IAAMC,EAASX,EACb,IAAMG,EAAgB,CAAE,YAAAK,EAAa,QAAAC,CAAQ,CAAC,EAC9C,CAACD,EAAaC,CAAO,CACvB,EAEMG,EAAsBZ,EAC1B,IACE,IAAIC,EAAY,CACd,eAAgB,CACd,QAAS,CACP,UAAW,IAAO,GAClB,OAAQ,IAAO,GAAK,CACtB,CACF,CACF,CAAC,EACH,CAAC,CACH,EAEMY,EAAcH,GAAuBE,EACrCE,EAAed,EAAQ,KAAO,CAAE,OAAAW,CAAO,GAAI,CAACA,CAAM,CAAC,EAEzD,OACEP,EAACF,EAAA,CAAoB,OAAQW,EAC3B,SAAAT,EAACC,EAAiB,SAAjB,CAA0B,MAAOS,EAAe,SAAAP,EAAS,EAC5D,CAEJ,ECnEA,IAAMQ,EAAoC,yBAEpCC,EAAYC,GAChB,OAAOA,GAAU,UAAYA,IAAU,KAEnCC,EAAgC,CACpCC,EACAC,KAC6B,CAC7B,GAAID,GAAQ,CAAC,EACb,CAACJ,CAAiC,EAAGK,CACvC,GAEMC,EACJF,GAEAD,EAA8BC,EAAM,CAAE,gBAAiB,GAAM,MAAO,MAAO,CAAC,EAExEG,EACJH,GAEAD,EAA8BC,EAAM,CAAE,gBAAiB,GAAM,MAAO,QAAS,CAAC,EAE1EI,EACJJ,GAEAD,EAA8BC,EAAM,CAAE,gBAAiB,GAAM,MAAO,SAAU,CAAC,EAE3EK,GAA4BL,GAAgD,CAChF,GAAI,CAACH,EAASG,CAAI,EAAG,OAAO,KAE5B,IAAMM,EAAWN,EAAKJ,CAAiC,EACvD,GAAI,CAACC,EAASS,CAAQ,GAAK,OAAOA,EAAS,iBAAoB,UAC7D,OAAO,KAGT,IAAMC,EAAQD,EAAS,MACvB,OAAIC,IAAU,QAAUA,IAAU,UAAYA,IAAU,UAC/C,KAGF,CACL,gBAAiBD,EAAS,gBAC1B,MAAAC,CACF,CACF,ECpDA,OAAS,cAAAC,MAAkB,QAU3B,IAAMC,EAAqB,IAAuB,CAChD,IAAMC,EAAUC,EAAWC,CAAgB,EAE3C,GAAI,CAACF,EACH,MAAM,IAAI,MAAM,4DAA4D,EAG9E,OAAOA,EAAQ,MACjB,ECIA,IAAMG,EAAe,CACnB,IAAK,CAAC,YAAa,YAAY,EAC/B,MAAO,IAAM,CAAC,GAAGA,EAAa,IAAK,MAAM,EACzC,KAAOC,GAAiC,CAAC,GAAGD,EAAa,MAAM,EAAGC,CAAM,EACxE,QAAS,IAAM,CAAC,GAAGD,EAAa,IAAK,QAAQ,EAC7C,OAASE,GAA6B,CAAC,GAAGF,EAAa,QAAQ,EAAGE,CAAE,EACpE,OAAQ,IAAM,CAAC,GAAGF,EAAa,IAAK,OAAO,EAC3C,MAAQC,GAAkC,CAAC,GAAGD,EAAa,OAAO,EAAGC,CAAM,EAC3E,MAAO,IAAM,CAAC,GAAGD,EAAa,IAAK,OAAO,EAC1C,KAAOC,GAAgC,CAAC,GAAGD,EAAa,MAAM,EAAGC,CAAM,EACvE,cAAe,IAAM,CAAC,GAAGD,EAAa,IAAK,WAAY,MAAM,EAC7D,aAAeC,GACb,CAAC,GAAGD,EAAa,cAAc,EAAGC,CAAM,EAC1C,eAAgB,IAAM,CAAC,GAAGD,EAAa,IAAK,WAAY,OAAO,EAC/D,cAAgBC,GACd,CAAC,GAAGD,EAAa,eAAe,EAAGC,CAAM,EAC3C,yBAA0B,IAAM,CAAC,GAAGD,EAAa,IAAK,UAAW,YAAY,EAC7E,wBAA0BC,GACxB,CAAC,GAAGD,EAAa,yBAAyB,EAAGC,CAAM,EACrD,gBAAiB,IAAM,CAAC,GAAGD,EAAa,IAAK,aAAc,MAAM,EACjE,eAAiBC,GACf,CAAC,GAAGD,EAAa,gBAAgB,EAAGC,CAAM,EAC5C,eAAgB,IAAM,CAAC,GAAGD,EAAa,IAAK,UAAW,QAAQ,EAC/D,cAAgBG,GACd,CAAC,GAAGH,EAAa,eAAe,EAAGG,CAAU,EAC/C,sBAAuB,IAAM,CAAC,GAAGH,EAAa,IAAK,UAAW,UAAW,QAAQ,EACjF,qBAAuBC,GACrB,CAAC,GAAGD,EAAa,sBAAsB,EAAGC,CAAM,CACpD,EClDA,OAAS,YAAAG,MAAgB,wBAgBzB,IAAMC,EAAc,CAACC,EAAwBC,IAAiC,CAC5E,IAAMC,EAASC,EAAmB,EAElC,OAAOC,EAAS,CACd,GAAGH,EACH,SAAUI,EAAa,OAAOL,EAAO,EAAE,EACvC,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,WAAW,CAAE,GAAIF,EAAO,EAAG,CAAC,EAC1D,OAAOM,CACT,CACF,CAAC,CACH,EC3BA,OAAS,YAAAC,MAAgB,wBAqBzB,IAAMC,EAAoB,CAACC,EAA8BC,IAAuC,CAC9F,IAAMC,EAASC,EAAmB,EAElC,OAAOC,EAAS,CACd,GAAGH,EACH,SAAUI,EAAa,KAAKL,CAAM,EAClC,QAAS,SAAYE,EAAO,WAAW,KAAKF,CAAM,CACpD,CAAC,CACH,EC7BA,OAAS,YAAAM,MAAgB,wBAqBzB,IAAMC,EAAqB,CAACC,EAA+BC,IAAwC,CACjG,IAAMC,EAASC,EAAmB,EAElC,OAAOC,EAAS,CACd,GAAGH,EACH,SAAUI,EAAa,MAAML,CAAM,EACnC,QAAS,SAAYE,EAAO,WAAW,MAAMF,CAAM,CACrD,CAAC,CACH,EC7BA,OAAS,YAAAM,MAAgB,wBAiBzB,IAAMC,EAAmB,CAACC,EAA6BC,IAAsC,CAC3F,IAAMC,EAASC,EAAmB,EAElC,OAAOC,EAAS,CACd,GAAGH,EACH,SAAUI,EAAa,KAAKL,CAAM,EAClC,QAAS,SAAYE,EAAO,WAAW,MAAMF,CAAM,CACrD,CAAC,CACH,ECzBA,OAAS,YAAAM,MAAgB,wBAqBzB,IAAMC,EAA0B,CAC9BC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,EAAS,CACd,GAAGH,EACH,SAAUI,EAAa,aAAaL,CAAM,EAC1C,QAAS,SAAYE,EAAO,WAAW,SAAS,KAAKF,CAAM,CAC7D,CAAC,CACH,EChCA,OAAS,YAAAM,MAAgB,wBAqBzB,IAAMC,EAA2B,CAC/BC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,EAAS,CACd,GAAGH,EACH,SAAUI,EAAa,cAAcL,CAAM,EAC3C,QAAS,SAAYE,EAAO,WAAW,SAAS,MAAMF,CAAM,CAC9D,CAAC,CACH,EChCA,OAAS,YAAAM,MAAgB,wBAqBzB,IAAMC,EAAsB,CAC1BC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,EAAS,CACd,GAAGH,EACH,SAAUI,EAAa,wBAAwBL,CAAM,EACrD,QAAS,SAAYE,EAAO,WAAW,QAAQ,WAAWF,CAAM,CAClE,CAAC,CACH,EChCA,OAAS,YAAAM,MAAgB,wBAwBzB,IAAMC,GAAqB,CACzBC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,EAAS,CACd,GAAGH,EACH,SAAUI,EAAa,cAAcL,EAAO,UAAU,EACtD,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,WAAW,QAAQ,IAAIF,CAAM,EAC3D,OAAOM,CACT,CACF,CAAC,CACH,ECtCA,OAAS,YAAAC,OAAgB,wBA4BzB,IAAMC,GAA4B,CAChCC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAa,qBAAqBL,CAAM,EAClD,QAAS,SACAE,EAAO,WAAW,QAAQ,QAAQF,CAAM,CAEnD,CAAC,CACH,ECzCA,OAAS,YAAAM,OAAgB,wBAqBzB,IAAMC,GAAoB,CAACC,EAA8BC,IAAuC,CAC9F,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAa,eAAeL,CAAM,EAC5C,QAAS,SAAYE,EAAO,WAAW,WAAW,KAAKF,CAAM,CAC/D,CAAC,CACH,EC7BA,OAAS,eAAAM,GAAa,kBAAAC,OAAsB,wBCE5C,IAAMC,EAAc,CAClB,IAAK,CAAC,YAAa,SAAS,EAC5B,WAAY,IAAM,CAAC,GAAGA,EAAY,IAAK,YAAY,EACnD,UAAYC,GAA+B,CAAC,GAAGD,EAAY,WAAW,EAAGC,CAAM,CACjF,EDWA,IAAMC,GAAqBC,GAAuC,CAChE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,WAAW,OAAOK,CAAM,EACtD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBL,EAAY,kBAAkB,CAAE,SAAUM,EAAa,GAAI,CAAC,EAC5DN,EAAY,kBAAkB,CAAE,SAAUO,EAAY,WAAW,CAAE,CAAC,CACtE,CAAC,EACDV,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EEnCA,OAAS,eAAAG,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAqBC,GAAuC,CAChE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,WAAW,OAAOK,CAAM,EACtD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,GAAM,CAAC,CAAEF,CAAM,EAAIE,EACnB,MAAM,QAAQ,IAAI,CAChBL,EAAY,kBAAkB,CAAE,SAAUM,EAAa,GAAI,CAAC,EAC5DN,EAAY,kBAAkB,CAAE,SAAUM,EAAa,OAAOH,EAAO,EAAE,CAAE,CAAC,CAC5E,CAAC,EACDN,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,ECnCA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAiB5C,IAAMC,GAAqBC,GAAuC,CAChE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,WAAW,OAAOK,CAAM,EAC7D,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBJ,EAAY,kBAAkB,CAAE,SAAUK,EAAa,GAAI,CAAC,EAC5DL,EAAY,kBAAkB,CAAE,SAAUM,EAAY,WAAW,CAAE,CAAC,CACtE,CAAC,EACDT,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EChCA,OAAS,eAAAG,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAA0BC,GAA4C,CAC1E,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,WAAW,SAAS,KAAKK,CAAM,EACpE,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAa,GAAI,CAAC,EAClER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EC5BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAA4BC,GAA8C,CAC9E,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,WAAW,SAAS,OAAOK,CAAM,EACtE,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAa,GAAI,CAAC,EAClER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EC5BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAW5C,IAAMC,GACJC,GACG,CACH,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,WAAW,YAAY,QAAQK,CAAM,EAC1E,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAa,GAAI,CAAC,EAClER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,ECzBA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAW5C,IAAMC,GACJC,GACG,CACH,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,WAAW,YAAY,WAAWK,CAAM,EAC7E,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAa,GAAI,CAAC,EAClER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,ECzBA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBCW5C,IAAMC,EAAW,CACf,IAAK,CAAC,YAAa,OAAO,EAC1B,MAAO,IAAM,CAAC,GAAGA,EAAS,IAAK,MAAM,EACrC,KAAOC,GAA4B,CAAC,GAAGD,EAAS,MAAM,EAAGC,CAAM,EAC/D,OAAQ,IAAM,CAAC,GAAGD,EAAS,IAAK,OAAO,EACvC,MAAQC,GAA6B,CAAC,GAAGD,EAAS,OAAO,EAAGC,CAAM,EAClE,WAAY,IAAM,CAAC,GAAGD,EAAS,IAAK,QAAS,MAAM,EACnD,UAAYC,GAAgC,CAAC,GAAGD,EAAS,WAAW,EAAGC,CAAM,CAC/E,EDFA,IAAMC,GAAyBC,GAA2C,CACxE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,WAAW,MAAM,OAAOK,CAAM,EACnE,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBJ,EAAY,kBAAkB,CAAE,SAAUK,EAAa,GAAI,CAAC,EAC5DL,EAAY,kBAAkB,CAAE,SAAUM,EAAS,GAAI,CAAC,CAC1D,CAAC,EACDT,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EEhCA,OAAS,eAAAG,GAAa,kBAAAC,OAAsB,wBAiB5C,IAAMC,GAAyBC,GAA2C,CACxE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,WAAW,MAAM,OAAOK,CAAM,EACnE,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBJ,EAAY,kBAAkB,CAAE,SAAUK,EAAa,GAAI,CAAC,EAC5DL,EAAY,kBAAkB,CAAE,SAAUM,EAAS,GAAI,CAAC,CAC1D,CAAC,EACDT,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EChCA,OAAS,eAAAG,GAAa,kBAAAC,OAAsB,wBAiB5C,IAAMC,GAAyBC,GAA2C,CACxE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,WAAW,MAAM,OAAOK,CAAM,EACnE,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBJ,EAAY,kBAAkB,CAAE,SAAUK,EAAa,GAAI,CAAC,EAC5DL,EAAY,kBAAkB,CAAE,SAAUM,EAAS,GAAI,CAAC,CAC1D,CAAC,EACDT,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,ECtBA,IAAMG,EAAkB,CACvB,IAAK,CAAC,YAAa,cAAc,EACjC,MAAO,IAAM,CAAC,GAAGA,EAAgB,IAAK,MAAM,EAC5C,KAAOC,GAAkC,CAAC,GAAGD,EAAgB,MAAM,EAAGC,CAAM,EAC5E,SAAU,IAAM,CAAC,GAAGD,EAAgB,IAAK,QAAQ,EACjD,OAASC,GAAoC,CAAC,GAAGD,EAAgB,SAAS,EAAGC,CAAM,EACnF,QAAS,IAAM,CAAC,GAAGD,EAAgB,IAAK,QAAQ,EAChD,OAASE,GAAgC,CAAC,GAAGF,EAAgB,QAAQ,EAAGE,CAAE,CAC3E,EClBA,OAAS,YAAAC,MAAgB,wBAmCzB,IAAMC,GAAsB,CAACC,EAA2BC,IAAyC,CAChG,IAAMC,EAASC,EAAmB,EAElC,OAAOC,EAAS,CACf,GAAGH,EACH,SAAUI,EAAgB,OAAOL,EAAO,EAAE,EAC1C,QAAS,SAAY,CACpB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,YAAY,CAAE,GAAIF,EAAO,EAAG,CAAC,EAC3D,OAAOM,CACR,EACA,QAASL,GAAS,UAAY,IAAS,EAAQD,EAAO,EACvD,CAAC,CACF,EAyBMO,GAAqB,CAACP,EAA+BC,IAAwC,CAClG,IAAMC,EAASC,EAAmB,EAElC,OAAOC,EAAS,CACf,GAAGH,EACH,SAAUI,EAAgB,KAAKL,CAAM,EACrC,QAAS,IAAME,EAAO,YAAY,KAAKF,CAAM,EAC7C,QAASC,GAAS,UAAY,IAAS,EAAQD,EAAO,cACvD,CAAC,CACF,EAyBMQ,GAAuB,CAC5BR,EACAC,IACI,CACJ,IAAMC,EAASC,EAAmB,EAElC,OAAOC,EAAS,CACf,GAAGH,EACH,SAAUI,EAAgB,OAAOL,CAAM,EACvC,QAAS,IAAME,EAAO,YAAY,OAAOF,CAAM,EAC/C,QACCC,GAAS,UAAY,IACrB,EAAQD,EAAO,gBACf,EAAQA,EAAO,OAAO,KAAK,CAC7B,CAAC,CACF,ECzHA,OAAS,eAAAS,OAAmB,wBAc5B,IAAMC,GACJC,GACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAY,CACjB,GAAGH,EACH,KAAMI,EAA6BJ,GAAS,IAAI,EAChD,WAAY,MAAOK,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAML,EAAO,QAAQ,sBAAsBI,CAAM,EAClE,OAAOC,CACT,CACF,CAAC,CACH,EC3BA,OAAS,eAAAC,OAAmB,wBAa5B,IAAMC,GACJC,GACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAY,CACjB,GAAGH,EACH,WAAY,MAAOI,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMJ,EAAO,QAAQ,oBAAoBG,CAAM,EAChE,OAAOC,CACT,CACF,CAAC,CACH,ECzBA,OAAS,YAAAC,OAAgB,wBAiBzB,IAAMC,GAAe,CAACC,EAA4BC,IAAkC,CAClF,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAY,UAAUL,CAAM,EACtC,QAAS,SAAYE,EAAO,QAAQ,UAAUF,CAAM,CACtD,CAAC,CACH,ECzBA,OAAS,eAAAM,OAAmB,wBAkB5B,IAAMC,GACJC,GACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAY,CACjB,GAAGH,EACH,KAAMI,EAA6BJ,GAAS,IAAI,EAChD,WAAY,MAAOK,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAML,EAAO,QAAQ,oBAAoBI,CAAM,EAChE,OAAOC,CACT,CACF,CAAC,CACH,ECdA,IAAMC,EAAe,CACnB,IAAK,CAAC,YAAa,WAAW,EAC9B,MAAO,IAAM,CAAC,GAAGA,EAAa,IAAK,MAAM,EACzC,KAAOC,GAAgC,CAAC,GAAGD,EAAa,MAAM,EAAGC,CAAM,EACvE,QAAS,IAAM,CAAC,GAAGD,EAAa,IAAK,QAAQ,EAC7C,OAASE,GAA6B,CAAC,GAAGF,EAAa,QAAQ,EAAGE,CAAE,EACpE,MAAO,IAAM,CAAC,GAAGF,EAAa,IAAK,OAAO,EAC1C,KAAOC,GAAgC,CAAC,GAAGD,EAAa,MAAM,EAAGC,CAAM,EACvE,eAAgB,IAAM,CAAC,GAAGD,EAAa,IAAK,UAAW,QAAQ,EAC/D,cAAgBG,GACd,CAAC,GAAGH,EAAa,eAAe,EAAGG,CAAU,EAC/C,sBAAuB,IACrB,CAAC,GAAGH,EAAa,IAAK,UAAW,UAAW,QAAQ,EACtD,qBAAuBC,GACrB,CAAC,GAAGD,EAAa,sBAAsB,EAAGC,CAAM,CACpD,EChCA,OAAS,YAAAG,OAAgB,wBA4BzB,IAAMC,GAAc,CAACC,EAAwBC,IAAiC,CAC5E,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAa,OAAOL,EAAO,EAAE,EACvC,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,UAAU,CAAE,GAAIF,EAAO,EAAG,CAAC,EACzD,OAAOM,CACT,CACF,CAAC,CACH,ECvCA,OAAS,YAAAC,OAAgB,wBAqBzB,IAAMC,GAAmB,CAACC,EAA6BC,IAAsC,CAC3F,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAa,KAAKL,CAAM,EAClC,QAAS,SAAYE,EAAO,UAAU,KAAKF,CAAM,CACnD,CAAC,CACH,EC7BA,OAAS,YAAAM,OAAgB,wBAiBzB,IAAMC,GAAmB,CAACC,EAA6BC,IAAsC,CAC3F,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAa,KAAKL,CAAM,EAClC,QAAS,SAAYE,EAAO,UAAU,MAAMF,CAAM,CACpD,CAAC,CACH,ECzBA,OAAS,eAAAM,GAAa,kBAAAC,OAAsB,wBAuC5C,IAAMC,GAAqBC,GAAuC,CAChE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,UAAU,OAAOK,CAAM,EACrD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBL,EAAY,kBAAkB,CAAE,SAAUM,EAAa,GAAI,CAAC,EAC5DN,EAAY,kBAAkB,CAAE,SAAUO,EAAY,WAAW,CAAE,CAAC,CACtE,CAAC,EACDV,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,ECzDA,OAAS,eAAAG,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAqBC,GAAuC,CAChE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,UAAU,OAAOK,CAAM,EACrD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,GAAM,CAAC,CAAEF,CAAM,EAAIE,EACnB,MAAM,QAAQ,IAAI,CAChBL,EAAY,kBAAkB,CAAE,SAAUM,EAAa,GAAI,CAAC,EAC5DN,EAAY,kBAAkB,CAAE,SAAUM,EAAa,OAAOH,EAAO,EAAE,CAAE,CAAC,CAC5E,CAAC,EACDN,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,ECnCA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAiB5C,IAAMC,GAAqBC,GAAuC,CAChE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,UAAU,OAAOK,CAAM,EAC5D,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBJ,EAAY,kBAAkB,CAAE,SAAUK,EAAa,GAAI,CAAC,EAC5DL,EAAY,kBAAkB,CAAE,SAAUM,EAAY,WAAW,CAAE,CAAC,CACtE,CAAC,EACDT,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EChCA,OAAS,eAAAG,GAAa,kBAAAC,OAAsB,wBAiB5C,IAAMC,GAA2BC,GAA6C,CAC5E,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,UAAU,WAAW,KAAKK,CAAM,EACrE,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBJ,EAAY,kBAAkB,CAAE,SAAUK,EAAa,GAAI,CAAC,EAC5DL,EAAY,kBAAkB,CAAE,SAAUM,EAAa,GAAI,CAAC,CAC9D,CAAC,EACDT,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EChCA,OAAS,eAAAG,GAAa,kBAAAC,OAAsB,wBAoB5C,IAAMC,GAA6BC,GAA+C,CAChF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,UAAU,WAAW,OAAOK,CAAM,EACvE,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBJ,EAAY,kBAAkB,CAAE,SAAUK,EAAa,GAAI,CAAC,EAC5DL,EAAY,kBAAkB,CAAE,SAAUM,EAAa,GAAI,CAAC,CAC9D,CAAC,EACDT,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,ECnCA,OAAS,YAAAG,OAAgB,wBAwBzB,IAAMC,GAAqB,CACzBC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAa,cAAcL,EAAO,UAAU,EACtD,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,UAAU,QAAQ,IAAIF,CAAM,EAC1D,OAAOM,CACT,CACF,CAAC,CACH,ECtCA,OAAS,YAAAC,OAAgB,wBA4BzB,IAAMC,GAA4B,CAChCC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAa,qBAAqBL,CAAM,EAClD,QAAS,SACAE,EAAO,UAAU,QAAQ,QAAQF,CAAM,CAElD,CAAC,CACH,ECxBA,IAAMM,EAAc,CAClB,IAAK,CAAC,YAAa,UAAU,EAC7B,MAAO,IAAM,CAAC,GAAGA,EAAY,IAAK,MAAM,EACxC,KAAOC,GAA+B,CAAC,GAAGD,EAAY,MAAM,EAAGC,CAAM,EACrE,QAAS,IAAM,CAAC,GAAGD,EAAY,IAAK,QAAQ,EAC5C,OAASE,GAA4B,CAAC,GAAGF,EAAY,QAAQ,EAAGE,CAAE,EAClE,MAAO,IAAM,CAAC,GAAGF,EAAY,IAAK,OAAO,EACzC,KAAOC,GAA+B,CAAC,GAAGD,EAAY,MAAM,EAAGC,CAAM,EACrE,eAAgB,IAAM,CAAC,GAAGD,EAAY,IAAK,UAAW,QAAQ,EAC9D,cAAgBG,GACd,CAAC,GAAGH,EAAY,eAAe,EAAGG,CAAS,EAC7C,sBAAuB,IACrB,CAAC,GAAGH,EAAY,IAAK,UAAW,UAAW,QAAQ,EACrD,qBAAuBC,GACrB,CAAC,GAAGD,EAAY,sBAAsB,EAAGC,CAAM,CACnD,EChCA,OAAS,YAAAG,OAAgB,wBAgBzB,IAAMC,GAAa,CAACC,EAAuBC,IAAgC,CACzE,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAY,OAAOL,EAAO,EAAE,EACtC,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,SAAS,CAAE,GAAIF,EAAO,EAAG,CAAC,EACxD,OAAOM,CACT,CACF,CAAC,CACH,EC3BA,OAAS,YAAAC,OAAgB,wBAqBzB,IAAMC,GAAkB,CACtBC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAY,KAAKL,CAAM,EACjC,QAAS,SAAYE,EAAO,SAAS,KAAKF,CAAM,CAClD,CAAC,CACH,EChCA,OAAS,YAAAM,OAAgB,wBAiBzB,IAAMC,GAAkB,CAACC,EAA4BC,IAAqC,CACxF,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAY,KAAKL,CAAM,EACjC,QAAS,SAAYE,EAAO,SAAS,MAAMF,CAAM,CACnD,CAAC,CACH,ECzBA,OAAS,eAAAM,GAAa,kBAAAC,OAAsB,wBAiB5C,IAAMC,GAAoBC,GAAsC,CAC9D,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,SAAS,OAAOK,CAAM,EACpD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBL,EAAY,kBAAkB,CAAE,SAAUM,EAAY,GAAI,CAAC,EAC3DN,EAAY,kBAAkB,CAAE,SAAUO,EAAY,WAAW,CAAE,CAAC,CACtE,CAAC,EACDV,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,ECnCA,OAAS,eAAAG,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAoBC,GAAsC,CAC9D,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,SAAS,OAAOK,CAAM,EACpD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,GAAM,CAAC,CAAEF,CAAM,EAAIE,EACnB,MAAM,QAAQ,IAAI,CAChBL,EAAY,kBAAkB,CAAE,SAAUM,EAAY,GAAI,CAAC,EAC3DN,EAAY,kBAAkB,CAAE,SAAUM,EAAY,OAAOH,EAAO,EAAE,CAAE,CAAC,CAC3E,CAAC,EACDN,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,ECnCA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAiB5C,IAAMC,GAAoBC,GAAsC,CAC9D,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,SAAS,OAAOK,CAAM,EAC3D,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBJ,EAAY,kBAAkB,CAAE,SAAUK,EAAY,GAAI,CAAC,EAC3DL,EAAY,kBAAkB,CAAE,SAAUM,EAAY,WAAW,CAAE,CAAC,CACtE,CAAC,EACDT,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EChCA,OAAS,eAAAG,GAAa,kBAAAC,OAAsB,wBAqB5C,IAAMC,GACJC,GACG,CACH,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,SAAS,eAAe,QAAQK,CAAM,EAC3E,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBJ,EAAY,kBAAkB,CAAE,SAAUK,EAAY,GAAI,CAAC,EAC3DL,EAAY,kBAAkB,CAAE,SAAUM,EAAY,WAAW,CAAE,CAAC,CACtE,CAAC,EACDT,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,ECtCA,OAAS,eAAAG,GAAa,kBAAAC,OAAsB,wBAoB5C,IAAMC,GACJC,GACG,CACH,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GACjBL,EAAO,SAAS,eAAe,WAAWK,CAAM,EAClD,UAAW,SAAUC,IAAU,CAC7B,MAAM,QAAQ,IAAI,CAChBJ,EAAY,kBAAkB,CAAE,SAAUK,EAAY,GAAI,CAAC,EAC3DL,EAAY,kBAAkB,CAAE,SAAUM,EAAY,WAAW,CAAE,CAAC,CACtE,CAAC,EACDT,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,ECtCA,OAAS,YAAAG,OAAgB,wBAwBzB,IAAMC,GAAoB,CACxBC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAY,cAAcL,EAAO,SAAS,EACpD,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,SAAS,QAAQ,IAAIF,CAAM,EACzD,OAAOM,CACT,CACF,CAAC,CACH,ECtCA,OAAS,YAAAC,OAAgB,wBA4BzB,IAAMC,GAA2B,CAC/BC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAY,qBAAqBL,CAAM,EACjD,QAAS,SACAE,EAAO,SAAS,QAAQ,QAAQF,CAAM,CAEjD,CAAC,CACH,EC9BA,IAAMM,EAAiB,CACrB,IAAK,CAAC,YAAa,aAAa,EAChC,MAAO,IAAM,CAAC,GAAGA,EAAe,IAAK,MAAM,EAC3C,KAAOC,GAAkC,CAAC,GAAGD,EAAe,MAAM,EAAGC,CAAM,EAC3E,QAAS,IAAM,CAAC,GAAGD,EAAe,IAAK,QAAQ,EAC/C,OAASE,GAAe,CAAC,GAAGF,EAAe,QAAQ,EAAGE,CAAE,CAC1D,ECjBA,OAAS,YAAAC,OAAgB,wBA4BzB,IAAMC,GAAgB,CAACC,EAA0BC,IAAmC,CAClF,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAe,OAAOL,EAAO,EAAE,EACzC,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,YAAY,CAAE,GAAIF,EAAO,EAAG,CAAC,EAC3D,OAAOM,CACT,CACF,CAAC,CACH,ECvCA,OAAS,YAAAC,OAAgB,wBAqBzB,IAAMC,GAAqB,CACzBC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAe,KAAKL,CAAM,EACpC,QAAS,SAAYE,EAAO,YAAY,KAAKF,CAAM,CACrD,CAAC,CACH,EChCA,OAAS,eAAAM,GAAa,kBAAAC,OAAsB,wBAgC5C,IAAMC,GAAuBC,GAAyC,CACpE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,YAAY,OAAOK,CAAM,EACvD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAe,GAAI,CAAC,EACpET,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EC/CA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAuBC,GAAyC,CACpE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,YAAY,OAAOK,CAAM,EACvD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,GAAM,CAAC,CAAEF,CAAM,EAAIE,EACnB,MAAM,QAAQ,IAAI,CAChBL,EAAY,kBAAkB,CAAE,SAAUM,EAAe,GAAI,CAAC,EAC9DN,EAAY,kBAAkB,CAAE,SAAUM,EAAe,OAAOH,EAAO,EAAE,CAAE,CAAC,CAC9E,CAAC,EACDN,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,ECnCA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAuBC,GAAyC,CACpE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,YAAY,OAAOK,CAAM,EAC9D,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAe,GAAI,CAAC,EACpER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,ECjBA,IAAME,EAAuB,CAC3B,IAAK,CAAC,YAAa,mBAAmB,EACtC,MAAO,IAAM,CAAC,GAAGA,EAAqB,IAAK,MAAM,EACjD,KAAOC,GACL,CAAC,GAAGD,EAAqB,MAAM,EAAGC,CAAM,EAC1C,QAAS,IAAM,CAAC,GAAGD,EAAqB,IAAK,QAAQ,EACrD,OAASE,GAAe,CAAC,GAAGF,EAAqB,QAAQ,EAAGE,CAAE,CAChE,EClBA,OAAS,YAAAC,OAAgB,wBAiCzB,IAAMC,GAAsB,CAC1BC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAqB,OAAOL,EAAO,EAAE,EAC/C,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,kBAAkB,CAAE,GAAIF,EAAO,EAAG,CAAC,EACjE,OAAOM,CACT,CACF,CAAC,CACH,EC/CA,OAAS,YAAAC,OAAgB,wBAqBzB,IAAMC,GAA2B,CAC/BC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAqB,KAAKL,CAAM,EAC1C,QAAS,SAAYE,EAAO,kBAAkB,KAAKF,CAAM,CAC3D,CAAC,CACH,EChCA,OAAS,eAAAM,GAAa,kBAAAC,OAAsB,wBAqC5C,IAAMC,GAA6BC,GAA+C,CAChF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,kBAAkB,OAAOK,CAAM,EAC7D,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAqB,GAAI,CAAC,EAC1ET,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,ECpDA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAA6BC,GAA+C,CAChF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,kBAAkB,OAAOK,CAAM,EAC7D,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,GAAM,CAAC,CAAEF,CAAM,EAAIE,EACnB,MAAM,QAAQ,IAAI,CAChBL,EAAY,kBAAkB,CAAE,SAAUM,EAAqB,GAAI,CAAC,EACpEN,EAAY,kBAAkB,CAAE,SAAUM,EAAqB,OAAOH,EAAO,EAAE,CAAE,CAAC,CACpF,CAAC,EACDN,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,ECnCA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAA6BC,GAA+C,CAChF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,kBAAkB,OAAOK,CAAM,EACpE,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAqB,GAAI,CAAC,EAC1ER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EC5BA,OAAS,YAAAE,OAAgB,wBAqBzB,IAAMC,GAAe,CAACC,EAAyBC,IAAkC,CAC/E,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAS,KAAKL,CAAM,EAC9B,QAAS,SAAYE,EAAO,MAAM,KAAKF,CAAM,CAC/C,CAAC,CACH,EC7BA,OAAS,YAAAM,OAAgB,wBAgBzB,IAAMC,GAAgB,CAACC,EAA0BC,IAAmC,CAClF,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAS,MAAML,CAAM,EAC/B,QAAS,SAAYE,EAAO,MAAM,MAAMF,CAAM,CAChD,CAAC,CACH,ECxBA,OAAS,YAAAM,OAAgB,wBAqBzB,IAAMC,GAAmB,CAACC,EAA6BC,IAAsC,CAC3F,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAS,UAAUL,CAAM,EACnC,QAAS,SAAYE,EAAO,MAAM,MAAM,KAAKF,CAAM,CACrD,CAAC,CACH,ECpBA,IAAMM,EAAsB,CAC1B,IAAK,CAAC,YAAa,iBAAiB,EACpC,iBAAmBC,GACjB,CAAC,GAAGD,EAAoB,IAAK,mBAAoBC,CAAc,EACjE,WAAaA,GACX,CAAC,GAAGD,EAAoB,IAAK,aAAcC,CAAc,CAC7D,ECfA,OAAS,YAAAC,OAAgB,wBA2BzB,IAAMC,GAAqC,CACzCC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAoB,iBAAiBL,EAAO,cAAc,EACpE,QAAS,SAAY,CAEnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,OAAOF,CAAM,EAC3C,OAAOM,CACT,CACF,CAAC,CACH,EC1CA,OAAS,YAAAC,OAAgB,wBA0BzB,IAAMC,GAAmC,CACvCC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAoB,WAAWL,EAAO,cAAc,EAC9D,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,OAAO,eAAeF,CAAM,EAC1D,OAAOM,CACT,CACF,CAAC,CACH,ECxCA,OAAS,eAAAC,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAA6BC,GAA+C,CAChF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,OAAO,QAAQK,CAAM,EACnD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAoB,GAAI,CAAC,EACzET,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EC/BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAmB5C,IAAMC,GAAgCC,GAAkD,CACtF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,OAAO,WAAWK,CAAM,EACtD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAoB,GAAI,CAAC,EACzET,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EClCA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAuB5C,IAAMC,GAAoCC,GAAsD,CAC9F,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,OAAO,eAAeK,CAAM,EAC1D,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAoB,GAAI,CAAC,EACzET,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,ECtCA,OAAS,YAAAE,OAAgB,wBCEzB,IAAMC,EAAc,CAClB,IAAK,CAAC,UAAU,EAChB,KAAOC,GACL,CAAC,GAAGD,EAAY,IAAK,OAAQC,EAAO,cAAc,CACtD,EDUA,IAAMC,GAA8B,CAClCC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAY,KAAKL,CAAM,EACjC,QAAS,UACQ,MAAME,EAAO,SAAS,KAAKF,CAAM,GAClC,OAAS,CAAC,CAE5B,CAAC,CACH,EE9BA,OAAS,eAAAM,GAAa,kBAAAC,OAAsB,wBAmB5C,IAAMC,GAAqBC,GAAuC,CAChE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAiCL,EAAO,SAAS,QAAQK,CAAM,EAClF,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAY,GAAI,CAAC,EACjER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,ECpBA,IAAME,EAAW,CACf,IAAK,CAAC,YAAa,OAAO,EAC1B,MAAO,IAAM,CAAC,GAAGA,EAAS,IAAK,MAAM,EACrC,KAAOC,GAA4B,CAAC,GAAGD,EAAS,MAAM,EAAGC,CAAM,EAC/D,QAAS,IAAM,CAAC,GAAGD,EAAS,IAAK,QAAQ,EACzC,OAASE,GAAyB,CAAC,GAAGF,EAAS,QAAQ,EAAGE,CAAE,CAC9D,ECjBA,OAAS,YAAAC,OAAgB,wBAgBzB,IAAMC,GAAU,CAACC,EAAoBC,IAA6B,CAChE,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAS,OAAOL,EAAO,EAAE,EACnC,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,MAAM,CAAE,GAAIF,EAAO,EAAG,CAAC,EACrD,OAAOM,CACT,CACF,CAAC,CACH,EC3BA,OAAS,YAAAC,OAAgB,wBAqBzB,IAAMC,GAAe,CAACC,EAAyBC,IAAkC,CAC/E,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAS,KAAKL,CAAM,EAC9B,QAAS,SAAYE,EAAO,MAAM,KAAKF,CAAM,CAC/C,CAAC,CACH,EC7BA,OAAS,eAAAM,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAiBC,GAAmC,CACxD,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAA6BL,EAAO,MAAM,OAAOK,CAAM,EAC1E,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAS,GAAI,CAAC,EAC9DR,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EC5BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAiBC,GAAmC,CACxD,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAA6BL,EAAO,MAAM,OAAOK,CAAM,EAC1E,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAS,GAAI,CAAC,EAC9DR,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EC5BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAiBC,GAAmC,CACxD,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAA6BL,EAAO,MAAM,OAAOK,CAAM,EAC1E,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAS,GAAI,CAAC,EAC9DR,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,ECZA,IAAME,EAAmB,CACvB,IAAK,CAAC,YAAa,eAAe,EAClC,QAAS,IAAM,CAAC,GAAGA,EAAiB,IAAK,QAAQ,EACjD,OAASC,GAAe,CAAC,GAAGD,EAAiB,QAAQ,EAAGC,CAAE,EAC1D,MAAO,IAAM,CAAC,GAAGD,EAAiB,IAAK,MAAM,EAC7C,KAAOE,GAAoC,CAAC,GAAGF,EAAiB,MAAM,EAAGE,CAAM,EAC/E,WAAY,IAAM,CAAC,GAAGF,EAAiB,IAAK,QAAS,MAAM,EAC3D,UAAYE,GACV,CAAC,GAAGF,EAAiB,WAAW,EAAGE,CAAM,EAC3C,eAAgB,IAAM,CAAC,GAAGF,EAAiB,IAAK,UAAW,QAAQ,EACnE,cAAgBG,GACd,CAAC,GAAGH,EAAiB,eAAe,EAAGG,CAAc,EACvD,sBAAuB,IACrB,CAAC,GAAGH,EAAiB,IAAK,UAAW,UAAW,QAAQ,EAC1D,qBAAuBE,GACrB,CAAC,GAAGF,EAAiB,sBAAsB,EAAGE,CAAM,CACxD,EChCA,OAAS,YAAAE,OAAgB,wBAgBzB,IAAMC,GAAqB,CACzBC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAiB,OAAOL,EAAO,EAAE,EAC3C,QAAS,SAAYE,EAAO,cAAc,IAAIF,CAAM,CACtD,CAAC,CACH,EC3BA,OAAS,YAAAM,OAAgB,wBAqBzB,IAAMC,GAAuB,CAC3BC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAiB,KAAKL,CAAM,EACtC,QAAS,SAAYE,EAAO,cAAc,KAAKF,CAAM,CACvD,CAAC,CACH,EChCA,OAAS,YAAAM,OAAgB,wBAqBzB,IAAMC,GAA2B,CAC/BC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAiB,UAAUL,CAAM,EAC3C,QAAS,SAAYE,EAAO,cAAc,MAAM,KAAKF,CAAM,CAC7D,CAAC,CACH,EChCA,OAAS,eAAAM,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAyBC,GAA2C,CACxE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,cAAc,OAAOK,CAAM,EACzD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAiB,GAAI,CAAC,EACtET,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EC/BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAW5C,IAAMC,GAA4BC,GAA8C,CAC9E,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,cAAc,sBAAsBK,CAAM,EACxE,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAiB,GAAI,CAAC,EACtET,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EC1BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAyBC,GAA2C,CACxE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,cAAc,OAAOK,CAAM,EACzD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAiB,GAAI,CAAC,EACtET,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EC/BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAyBC,GAA2C,CACxE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,cAAc,OAAOK,CAAM,EAChE,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAiB,GAAI,CAAC,EACtER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EC5BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAA0BC,GAA4C,CAC1E,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,cAAc,MAAM,IAAIK,CAAM,EACnE,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAiB,GAAI,CAAC,EACtER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EC5BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAiCC,GAAmD,CACxF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,cAAc,MAAM,WAAWK,CAAM,EAC1E,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAiB,GAAI,CAAC,EACtER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EC5BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAA6BC,GAA+C,CAChF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,cAAc,MAAM,OAAOK,CAAM,EACtE,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAiB,GAAI,CAAC,EACtER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EC5BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAmB5C,IAAMC,GAA+BC,GAAiD,CACpF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,KAAMM,EAA4BN,GAAS,IAAI,EAC/C,WAAY,MAAOO,GAAWN,EAAO,cAAc,MAAM,aAAaM,CAAM,EAC5E,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAiB,GAAI,CAAC,EACtET,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EChCA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAa5C,IAAMC,GAAgCC,GAAkD,CACtF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,KAAMM,EAA4BN,GAAS,IAAI,EAC/C,WAAY,MAAOO,GAAWN,EAAO,cAAc,MAAM,cAAcM,CAAM,EAC7E,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAiB,GAAI,CAAC,EACtET,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EC1BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAkB5C,IAAMC,GAA0BC,GAA4C,CAC1E,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,SAAYC,EAAO,cAAc,MAAM,oBAAoB,EACvE,UAAW,SAAUK,IAAU,CAC7B,MAAMH,EAAY,kBAAkB,CAAE,SAAUI,EAAiB,GAAI,CAAC,EACtEP,GAAS,YAAY,GAAGM,CAAK,CAC/B,CACF,CAAC,CACH,EC9BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAA6BC,GAA+C,CAChF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,cAAc,MAAM,OAAOK,CAAM,EACtE,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAiB,GAAI,CAAC,EACtER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EC5BA,OAAS,YAAAE,OAAgB,wBAwBzB,IAAMC,GAAyB,CAC7BC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAiB,cAAcL,EAAO,cAAc,EAC9D,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,cAAc,QAAQ,IAAIF,CAAM,EAC9D,OAAOM,CACT,CACF,CAAC,CACH,ECtCA,OAAS,YAAAC,OAAgB,wBA4BzB,IAAMC,GAAgC,CACpCC,EACAC,IACG,CACH,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAiB,qBAAqBL,CAAM,EACtD,QAAS,SACAE,EAAO,cAAc,QAAQ,QAAQF,CAAM,CAEtD,CAAC,CACH,ECzCA,IAAMM,EAA0B,CAC9B,IAAK,CAAC,YAAa,wBAAwB,EAC3C,MAAO,IAAM,CAAC,GAAGA,EAAwB,IAAK,MAAM,EACpD,KAAM,IAAM,CAAC,GAAGA,EAAwB,MAAM,CAAC,CACjD,ECJA,OAAS,YAAAC,OAAgB,wBAqBzB,IAAMC,GAA+BC,GAAiD,CACpF,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAwB,KAAK,EACvC,QAAS,SAAYH,EAAO,qBAAqB,KAAK,CACxD,CAAC,CACH,EC7BA,OAAS,eAAAI,GAAa,kBAAAC,OAAsB,wBA2B5C,IAAMC,GAAgCC,GAAkD,CACtF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,qBAAqB,OAAOK,CAAM,EAChE,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAwB,GAAI,CAAC,EAC7ET,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EC1CA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAgCC,GAAkD,CACtF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAWL,EAAO,qBAAqB,OAAOK,CAAM,EACvE,UAAW,SAAUC,IAAU,CAC7B,MAAMJ,EAAY,kBAAkB,CAAE,SAAUK,EAAwB,GAAI,CAAC,EAC7ER,GAAS,YAAY,GAAGO,CAAK,CAC/B,CACF,CAAC,CACH,EC5BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBA2B5C,IAAMC,GAAgCC,GAAkD,CACtF,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,qBAAqB,OAAOK,CAAM,EAChE,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAwB,GAAI,CAAC,EAC7ET,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EC/BA,IAAME,EAAW,CACf,IAAK,CAAC,YAAa,OAAO,EAC1B,MAAO,IAAM,CAAC,GAAGA,EAAS,IAAK,MAAM,EACrC,KAAOC,GAA4B,CAAC,GAAGD,EAAS,MAAM,EAAGC,CAAM,EAC/D,QAAS,IAAM,CAAC,GAAGD,EAAS,IAAK,QAAQ,EACzC,OAASE,GAAyB,CAAC,GAAGF,EAAS,QAAQ,EAAGE,CAAE,EAC5D,gBAAiB,IAAM,CAAC,GAAGF,EAAS,IAAK,UAAU,EACnD,eAAiBC,GAA+B,CAAC,GAAGD,EAAS,gBAAgB,EAAGC,CAAM,CACxF,ECnBA,OAAS,YAAAE,OAAgB,wBAgBzB,IAAMC,GAAU,CAACC,EAAoBC,IAA6B,CAChE,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAS,OAAOL,EAAO,EAAE,EACnC,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,MAAM,CAAE,GAAIF,EAAO,EAAG,CAAC,EACrD,OAAOM,CACT,CACF,CAAC,CACH,EC3BA,OAAS,YAAAC,OAAgB,wBAqBzB,IAAMC,GAAe,CAACC,EAAyBC,IAAkC,CAC/E,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAS,KAAKL,CAAM,EAC9B,QAAS,SAAYE,EAAO,MAAM,KAAKF,CAAM,CAC/C,CAAC,CACH,EC7BA,OAAS,YAAAM,OAAgB,wBAqBzB,IAAMC,GAAkB,CAACC,EAA4BC,IAAqC,CACxF,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAS,CACd,GAAGH,EACH,SAAUI,EAAS,eAAeL,CAAM,EACxC,QAAS,SAAY,CACnB,GAAM,CAAE,KAAAM,CAAK,EAAI,MAAMJ,EAAO,MAAM,SAASF,CAAM,EACnD,OAAOM,CACT,CACF,CAAC,CACH,EChCA,OAAS,eAAAC,GAAa,kBAAAC,OAAsB,wBAgB5C,IAAMC,GAAiBC,GAAmC,CACxD,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,WAAY,MAAOM,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMN,EAAO,MAAM,OAAOK,CAAM,EACjD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAS,GAAI,CAAC,EAC9DT,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EC/BA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAiB5C,IAAMC,GAAiBC,GAAmC,CACxD,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,KAAMM,EAA0BN,GAAS,IAAI,EAC7C,WAAY,MAAOO,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMP,EAAO,MAAM,OAAOM,CAAM,EACjD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,GAAM,CAAC,CAAEF,CAAM,EAAIE,EACnB,MAAM,QAAQ,IAAI,CAChBN,EAAY,kBAAkB,CAAE,SAAUO,EAAS,GAAI,CAAC,EACxDP,EAAY,kBAAkB,CAAE,SAAUO,EAAS,OAAOH,EAAO,MAAM,CAAE,CAAC,CAC5E,CAAC,EACDP,GAAS,YAAY,GAAGS,CAAK,CAC/B,CACF,CAAC,CACH,ECrCA,OAAS,eAAAE,OAAmB,wBAa5B,IAAMC,GAAkBC,GAAoC,CAC1D,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAY,CACjB,GAAGH,EACH,KAAMI,EAA0BJ,GAAS,IAAI,EAC7C,WAAY,MAAOK,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAML,EAAO,MAAM,YAAYI,CAAM,EACtD,OAAOC,CACT,CACF,CAAC,CACH,ECxBA,OAAS,eAAAC,OAAmB,wBAW5B,IAAMC,GAAsBC,GAAwC,CAClE,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAY,CACjB,GAAGH,EACH,KAAMI,EAA0BJ,GAAS,IAAI,EAC7C,WAAY,MAAOK,GAAWJ,EAAO,MAAM,gBAAgBI,CAAM,CACnE,CAAC,CACH,ECnBA,OAAS,eAAAC,OAAmB,wBAW5B,IAAMC,GAAsBC,GAAwC,CAClE,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAY,CACjB,GAAGH,EACH,KAAMI,EAA0BJ,GAAS,IAAI,EAC7C,WAAY,MAAOK,GAAWJ,EAAO,MAAM,gBAAgBI,CAAM,CACnE,CAAC,CACH,ECnBA,OAAS,eAAAC,GAAa,kBAAAC,OAAsB,wBAiB5C,IAAMC,GAAyBC,GAA2C,CACxE,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,KAAMM,EAA0BN,GAAS,IAAI,EAC7C,WAAY,MAAOO,GAAWN,EAAO,MAAM,SAAS,OAAOM,CAAM,EACjE,UAAW,SAAUC,IAAU,CAC7B,GAAM,CAAC,CAAED,CAAM,EAAIC,EACnB,MAAM,QAAQ,IAAI,CAChBL,EAAY,kBAAkB,CAC5B,SAAUM,EAAS,eAAe,CAAE,OAAQF,EAAO,MAAO,CAAC,CAC7D,CAAC,EACDJ,EAAY,kBAAkB,CAAE,SAAUM,EAAS,GAAI,CAAC,CAC1D,CAAC,EACDT,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,ECpCA,OAAS,eAAAE,GAAa,kBAAAC,OAAsB,wBAiB5C,IAAMC,GAAiBC,GAAmC,CACxD,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,KAAMM,EAA0BN,GAAS,IAAI,EAC7C,WAAY,MAAOO,GAAWN,EAAO,MAAM,OAAOM,CAAM,EACxD,UAAW,SAAUC,IAAU,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUM,EAAS,GAAI,CAAC,EAC9DT,GAAS,YAAY,GAAGQ,CAAK,CAC/B,CACF,CAAC,CACH,EC9BA,OAAS,eAAAE,OAAmB,wBAa5B,IAAMC,GAA0BC,GAA4C,CAC1E,IAAMC,EAASC,EAAmB,EAElC,OAAOC,GAAY,CACjB,GAAGH,EACH,KAAMI,EAA0BJ,GAAS,IAAI,EAC7C,WAAY,MAAOK,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAML,EAAO,MAAM,oBAAoBI,CAAM,EAC9D,OAAOC,CACT,CACF,CAAC,CACH,ECxBA,OAAS,eAAAC,GAAa,kBAAAC,OAAsB,wBAkB5C,IAAMC,GAAmBC,GAAqC,CAC5D,IAAMC,EAASC,EAAmB,EAC5BC,EAAcC,GAAe,EAEnC,OAAOC,GAAY,CACjB,GAAGL,EACH,KAAMM,EAA0BN,GAAS,IAAI,EAC7C,WAAY,MAAOO,GAAW,CAC5B,GAAM,CAAE,KAAAC,CAAK,EAAI,MAAMP,EAAO,MAAM,aAAaM,CAAM,EACvD,OAAOC,CACT,EACA,UAAW,SAAUC,IAAU,CAC7B,GAAM,CAAC,CAAEF,CAAM,EAAIE,EACnB,MAAM,QAAQ,IAAI,CAChBN,EAAY,kBAAkB,CAAE,SAAUO,EAAS,GAAI,CAAC,EACxDP,EAAY,kBAAkB,CAAE,SAAUO,EAAS,OAAOH,EAAO,MAAM,CAAE,CAAC,CAC5E,CAAC,EACDP,GAAS,YAAY,GAAGS,CAAK,CAC/B,CACF,CAAC,CACH,ECDA,WAAc","names":["createContext","useMemo","QueryClient","QueryClientProvider","createBrandwave","jsx","BrandwaveContext","BrandwaveProvider","children","accessToken","baseUrl","externalQueryClient","client","internalQueryClient","queryClient","contextValue","DEMO_MODE_MUTATION_GUARD_META_KEY","isRecord","value","withDemoModeMutationGuardMeta","meta","guard","allowDemoModeUserMutation","allowDemoModeInviteMutation","allowDemoModeBillingMutation","getDemoModeMutationGuard","rawGuard","scope","useContext","useBrandwaveClient","context","useContext","BrandwaveContext","activityKeys","params","id","activityId","useQuery","useActivity","params","options","client","useBrandwaveClient","useQuery","activityKeys","data","useQuery","useListActivities","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useCountActivities","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useActivityStats","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useListActivityCreators","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useCountActivityCreators","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useMetricConfidence","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useActivityMetrics","params","options","client","useBrandwaveClient","useQuery","activityKeys","data","useQuery","useActivityMetricsHistory","params","options","client","useBrandwaveClient","useQuery","activityKeys","useQuery","useListSparklines","params","options","client","useBrandwaveClient","useQuery","activityKeys","useMutation","useQueryClient","billingKeys","params","useCreateActivity","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","activityKeys","billingKeys","useMutation","useQueryClient","useUpdateActivity","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","activityKeys","useMutation","useQueryClient","useDeleteActivity","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","billingKeys","useMutation","useQueryClient","useLinkActivityCreator","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","useMutation","useQueryClient","useUnlinkActivityCreator","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","useMutation","useQueryClient","useConnectActivityContentLink","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","useMutation","useQueryClient","useDisconnectActivityContentLink","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","useMutation","useQueryClient","costKeys","params","useCreateActivityCost","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","costKeys","useMutation","useQueryClient","useUpdateActivityCost","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","costKeys","useMutation","useQueryClient","useDeleteActivityCost","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","activityKeys","costKeys","activityLogKeys","params","id","useQuery","useActivityLogEntry","params","options","client","useBrandwaveClient","useQuery","activityLogKeys","data","useListActivityLog","useSearchActivityLog","useMutation","useCreateBillingCheckoutSession","options","client","useBrandwaveClient","useMutation","allowDemoModeBillingMutation","params","data","useMutation","useCreateBillingPortalSession","options","client","useBrandwaveClient","useMutation","params","data","useQuery","usePlanUsage","params","options","client","useBrandwaveClient","useQuery","billingKeys","useMutation","useSyncBillingCheckoutSession","options","client","useBrandwaveClient","useMutation","allowDemoModeBillingMutation","params","data","campaignKeys","params","id","campaignId","useQuery","useCampaign","params","options","client","useBrandwaveClient","useQuery","campaignKeys","data","useQuery","useListCampaigns","params","options","client","useBrandwaveClient","useQuery","campaignKeys","useQuery","useCampaignStats","params","options","client","useBrandwaveClient","useQuery","campaignKeys","useMutation","useQueryClient","useCreateCampaign","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","campaignKeys","billingKeys","useMutation","useQueryClient","useUpdateCampaign","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","campaignKeys","useMutation","useQueryClient","useDeleteCampaign","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","campaignKeys","billingKeys","useMutation","useQueryClient","useLinkCampaignActivity","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","campaignKeys","activityKeys","useMutation","useQueryClient","useUnlinkCampaignActivity","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","campaignKeys","activityKeys","useQuery","useCampaignMetrics","params","options","client","useBrandwaveClient","useQuery","campaignKeys","data","useQuery","useCampaignMetricsHistory","params","options","client","useBrandwaveClient","useQuery","campaignKeys","creatorKeys","params","id","creatorId","useQuery","useCreator","params","options","client","useBrandwaveClient","useQuery","creatorKeys","data","useQuery","useListCreators","params","options","client","useBrandwaveClient","useQuery","creatorKeys","useQuery","useCreatorStats","params","options","client","useBrandwaveClient","useQuery","creatorKeys","useMutation","useQueryClient","useCreateCreator","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","creatorKeys","billingKeys","useMutation","useQueryClient","useUpdateCreator","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","creatorKeys","useMutation","useQueryClient","useDeleteCreator","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","creatorKeys","billingKeys","useMutation","useQueryClient","useConnectCreatorSocialAccount","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","creatorKeys","billingKeys","useMutation","useQueryClient","useDisconnectCreatorSocialAccount","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","creatorKeys","billingKeys","useQuery","useCreatorMetrics","params","options","client","useBrandwaveClient","useQuery","creatorKeys","data","useQuery","useCreatorMetricsHistory","params","options","client","useBrandwaveClient","useQuery","creatorKeys","conversionKeys","params","id","useQuery","useConversion","params","options","client","useBrandwaveClient","useQuery","conversionKeys","data","useQuery","useListConversions","params","options","client","useBrandwaveClient","useQuery","conversionKeys","useMutation","useQueryClient","useCreateConversion","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","conversionKeys","useMutation","useQueryClient","useUpdateConversion","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","conversionKeys","useMutation","useQueryClient","useDeleteConversion","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","conversionKeys","conversionSourceKeys","params","id","useQuery","useConversionSource","params","options","client","useBrandwaveClient","useQuery","conversionSourceKeys","data","useQuery","useListConversionSources","params","options","client","useBrandwaveClient","useQuery","conversionSourceKeys","useMutation","useQueryClient","useCreateConversionSource","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","conversionSourceKeys","useMutation","useQueryClient","useUpdateConversionSource","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","conversionSourceKeys","useMutation","useQueryClient","useDeleteConversionSource","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","conversionSourceKeys","useQuery","useListCosts","params","options","client","useBrandwaveClient","useQuery","costKeys","useQuery","useCountCosts","params","options","client","useBrandwaveClient","useQuery","costKeys","useQuery","useListCostTypes","params","options","client","useBrandwaveClient","useQuery","costKeys","googleAnalyticsKeys","organizationId","useQuery","useGoogleAnalyticsConnectionStatus","params","options","client","useBrandwaveClient","useQuery","googleAnalyticsKeys","data","useQuery","useListGoogleAnalyticsProperties","params","options","client","useBrandwaveClient","useQuery","googleAnalyticsKeys","data","useMutation","useQueryClient","useConnectGoogleAnalytics","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","googleAnalyticsKeys","useMutation","useQueryClient","useDisconnectGoogleAnalytics","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","googleAnalyticsKeys","useMutation","useQueryClient","useSelectGoogleAnalyticsProperty","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","googleAnalyticsKeys","useQuery","insightKeys","params","useListOrganizationInsights","params","options","client","useBrandwaveClient","useQuery","insightKeys","useMutation","useQueryClient","useDismissInsight","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","insightKeys","noteKeys","params","id","useQuery","useNote","params","options","client","useBrandwaveClient","useQuery","noteKeys","data","useQuery","useListNotes","params","options","client","useBrandwaveClient","useQuery","noteKeys","useMutation","useQueryClient","useCreateNote","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","noteKeys","useMutation","useQueryClient","useUpdateNote","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","noteKeys","useMutation","useQueryClient","useDeleteNote","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","noteKeys","organizationKeys","id","params","organizationId","useQuery","useGetOrganization","params","options","client","useBrandwaveClient","useQuery","organizationKeys","useQuery","useListOrganizations","params","options","client","useBrandwaveClient","useQuery","organizationKeys","useQuery","useListOrganizationUsers","params","options","client","useBrandwaveClient","useQuery","organizationKeys","useMutation","useQueryClient","useCreateOrganization","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","organizationKeys","useMutation","useQueryClient","useCompleteOrganicSignup","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","organizationKeys","useMutation","useQueryClient","useUpdateOrganization","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","organizationKeys","useMutation","useQueryClient","useDeleteOrganization","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","organizationKeys","useMutation","useQueryClient","useAddOrganizationUser","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","organizationKeys","useMutation","useQueryClient","useUpdateOrganizationUserRole","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","organizationKeys","useMutation","useQueryClient","useRemoveOrganizationUser","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","organizationKeys","useMutation","useQueryClient","useAcceptOrganizationInvite","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","allowDemoModeInviteMutation","params","props","organizationKeys","useMutation","useQueryClient","useDeclineOrganizationInvite","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","allowDemoModeInviteMutation","params","props","organizationKeys","useMutation","useQueryClient","useProcessInviteSignup","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","props","organizationKeys","useMutation","useQueryClient","useInviteOrganizationUser","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","organizationKeys","useQuery","useOrganizationMetrics","params","options","client","useBrandwaveClient","useQuery","organizationKeys","data","useQuery","useOrganizationMetricsHistory","params","options","client","useBrandwaveClient","useQuery","organizationKeys","personalAccessTokenKeys","useQuery","useListPersonalAccessTokens","options","client","useBrandwaveClient","useQuery","personalAccessTokenKeys","useMutation","useQueryClient","useCreatePersonalAccessToken","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","personalAccessTokenKeys","useMutation","useQueryClient","useRevokePersonalAccessToken","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","props","personalAccessTokenKeys","useMutation","useQueryClient","useRotatePersonalAccessToken","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","personalAccessTokenKeys","userKeys","params","id","useQuery","useUser","params","options","client","useBrandwaveClient","useQuery","userKeys","data","useQuery","useListUsers","params","options","client","useBrandwaveClient","useQuery","userKeys","useQuery","useUserSettings","params","options","client","useBrandwaveClient","useQuery","userKeys","data","useMutation","useQueryClient","useCreateUser","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","params","data","props","userKeys","useMutation","useQueryClient","useUpdateUser","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","allowDemoModeUserMutation","params","data","props","userKeys","useMutation","useChangeEmail","options","client","useBrandwaveClient","useMutation","allowDemoModeUserMutation","params","data","useMutation","useRequestDeletion","options","client","useBrandwaveClient","useMutation","allowDemoModeUserMutation","params","useMutation","useConfirmDeletion","options","client","useBrandwaveClient","useMutation","allowDemoModeUserMutation","params","useMutation","useQueryClient","useUpdateUserSettings","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","allowDemoModeUserMutation","params","props","userKeys","useMutation","useQueryClient","useDeleteUser","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","allowDemoModeUserMutation","params","props","userKeys","useMutation","useRequestAvatarUpload","options","client","useBrandwaveClient","useMutation","allowDemoModeUserMutation","params","data","useMutation","useQueryClient","useUploadAvatar","options","client","useBrandwaveClient","queryClient","useQueryClient","useMutation","allowDemoModeUserMutation","params","data","props","userKeys"]}
|