@fanapps/react-native 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -1
- package/dist/index.d.mts +31 -1
- package/dist/index.d.ts +31 -1
- package/dist/index.js +20 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -216,7 +216,32 @@ useEntries(filters?: EntryFilters, options?) // Paginated<Entry>
|
|
|
216
216
|
useEntry(id, options?) // Entry
|
|
217
217
|
```
|
|
218
218
|
|
|
219
|
-
|
|
219
|
+
Top-level filters: `blueprint`, `collection`, `slug`, `published`, `sort` (e.g. `-published_at`, allowed columns: `published_at`, `order`, `created_at`, `id`), `perPage`, `page`.
|
|
220
|
+
|
|
221
|
+
Nested `filter` (Spatie-style bracket syntax serialized by the SDK):
|
|
222
|
+
|
|
223
|
+
| Key | Type | Notes |
|
|
224
|
+
| ------------------------- | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
|
|
225
|
+
| `filter.blueprint` | `string` | Exact match on blueprint handle. |
|
|
226
|
+
| `filter.collection` | `string` | Exact match on collection. |
|
|
227
|
+
| `filter.slug` | `string` | Exact match on slug. |
|
|
228
|
+
| `filter.field.{handle}` | `string \| number \| boolean` | Exact match on a blueprint field value. Translatable handles match the active locale (with fallback to the default locale). |
|
|
229
|
+
|
|
230
|
+
When `filter.field` is set, the request **must** also include `blueprint` (or `filter.blueprint`) so the API can validate that each handle exists on that blueprint. Unknown handles, missing blueprint, or unknown blueprint return `FanappsError` with `status: 422`.
|
|
231
|
+
|
|
232
|
+
```tsx
|
|
233
|
+
// Filter news entries by a non-translatable `category` field, sorted by publish date desc.
|
|
234
|
+
const { data } = useEntries({
|
|
235
|
+
blueprint: 'news',
|
|
236
|
+
filter: {
|
|
237
|
+
field: { category: 'sports', region: 'eu' },
|
|
238
|
+
},
|
|
239
|
+
sort: '-published_at',
|
|
240
|
+
perPage: 25,
|
|
241
|
+
});
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Resulting request: `GET /api/entries?blueprint=news&filter[field][category]=sports&filter[field][region]=eu&sort=-published_at&perPage=25`.
|
|
220
245
|
|
|
221
246
|
### Mutations: create / update / delete entries
|
|
222
247
|
|
package/dist/index.d.mts
CHANGED
|
@@ -90,11 +90,21 @@ interface PaginationParams {
|
|
|
90
90
|
perPage?: number;
|
|
91
91
|
sort?: string;
|
|
92
92
|
}
|
|
93
|
+
interface EntryFieldFilters {
|
|
94
|
+
[handle: string]: string | number | boolean;
|
|
95
|
+
}
|
|
96
|
+
interface EntryFilterParams {
|
|
97
|
+
blueprint?: string;
|
|
98
|
+
collection?: string;
|
|
99
|
+
slug?: string;
|
|
100
|
+
field?: EntryFieldFilters;
|
|
101
|
+
}
|
|
93
102
|
interface EntryFilters extends PaginationParams {
|
|
94
103
|
blueprint?: string;
|
|
95
104
|
collection?: string;
|
|
96
105
|
slug?: string;
|
|
97
106
|
published?: boolean;
|
|
107
|
+
filter?: EntryFilterParams;
|
|
98
108
|
}
|
|
99
109
|
interface ArticleFilters extends PaginationParams {
|
|
100
110
|
status?: ArticleStatus;
|
|
@@ -261,6 +271,26 @@ interface UseAuthResult {
|
|
|
261
271
|
}
|
|
262
272
|
declare function useAuth(): UseAuthResult;
|
|
263
273
|
|
|
274
|
+
/**
|
|
275
|
+
* Fetch a paginated list of entries.
|
|
276
|
+
*
|
|
277
|
+
* Supports filtering by blueprint field values via `filter.field`. The handle
|
|
278
|
+
* keys must match fields defined on the blueprint passed in `filter.blueprint`
|
|
279
|
+
* (or the top-level `blueprint`); unknown handles return 422 from the API.
|
|
280
|
+
* Translatable fields are matched in the active locale with fallback.
|
|
281
|
+
*
|
|
282
|
+
* @example
|
|
283
|
+
* ```ts
|
|
284
|
+
* // Filter entries by a blueprint field value
|
|
285
|
+
* useEntries({
|
|
286
|
+
* blueprint: 'news',
|
|
287
|
+
* filter: {
|
|
288
|
+
* field: { category: 'sports', region: 'eu' },
|
|
289
|
+
* },
|
|
290
|
+
* sort: '-published_at',
|
|
291
|
+
* });
|
|
292
|
+
* ```
|
|
293
|
+
*/
|
|
264
294
|
declare function useEntries(filters?: EntryFilters, options?: HookOptions): UseQueryResult<Paginated<Entry>>;
|
|
265
295
|
|
|
266
296
|
declare function useEntry(id: string | number | null | undefined, options?: HookOptions): UseQueryResult<Entry>;
|
|
@@ -287,4 +317,4 @@ interface SubmitTriviaResponseInput {
|
|
|
287
317
|
}
|
|
288
318
|
declare function useSubmitTriviaResponse(): UseMutationResult<TriviaResponseResult, FanappsError, SubmitTriviaResponseInput>;
|
|
289
319
|
|
|
290
|
-
export { type Article, type ArticleFilters, type ArticleStatus, type Asset, type AssetUploadFile, type AuthStatus, type AuthUser, type CreateEntryInput, type CreatePushTargetInput, type Entry, type EntryData, type EntryFilters, FanappsAuthError, FanappsClient, type FanappsClientOptions, type FanappsContextValue, FanappsError, FanappsProvider, type FanappsProviderProps, type HookOptions, type Locale, type Paginated, type PaginationLinks, type PaginationMeta, type PaginationParams, type PushTarget, StorageAdapter, type SubmitTriviaResponseInput, type Trivia, type TriviaAnswer, type TriviaResponseResult, type UpdateEntryInput, type UploadAssetInput, type UseAuthResult, useArticle, useArticles, useAuth, useCreateEntry, useDeleteEntry, useEntries, useEntry, useFanapps, useFanappsClient, useSubmitTriviaResponse, useTrivia, useTrivias, useUpdateEntry, useUploadAsset };
|
|
320
|
+
export { type Article, type ArticleFilters, type ArticleStatus, type Asset, type AssetUploadFile, type AuthStatus, type AuthUser, type CreateEntryInput, type CreatePushTargetInput, type Entry, type EntryData, type EntryFieldFilters, type EntryFilterParams, type EntryFilters, FanappsAuthError, FanappsClient, type FanappsClientOptions, type FanappsContextValue, FanappsError, FanappsProvider, type FanappsProviderProps, type HookOptions, type Locale, type Paginated, type PaginationLinks, type PaginationMeta, type PaginationParams, type PushTarget, StorageAdapter, type SubmitTriviaResponseInput, type Trivia, type TriviaAnswer, type TriviaResponseResult, type UpdateEntryInput, type UploadAssetInput, type UseAuthResult, useArticle, useArticles, useAuth, useCreateEntry, useDeleteEntry, useEntries, useEntry, useFanapps, useFanappsClient, useSubmitTriviaResponse, useTrivia, useTrivias, useUpdateEntry, useUploadAsset };
|
package/dist/index.d.ts
CHANGED
|
@@ -90,11 +90,21 @@ interface PaginationParams {
|
|
|
90
90
|
perPage?: number;
|
|
91
91
|
sort?: string;
|
|
92
92
|
}
|
|
93
|
+
interface EntryFieldFilters {
|
|
94
|
+
[handle: string]: string | number | boolean;
|
|
95
|
+
}
|
|
96
|
+
interface EntryFilterParams {
|
|
97
|
+
blueprint?: string;
|
|
98
|
+
collection?: string;
|
|
99
|
+
slug?: string;
|
|
100
|
+
field?: EntryFieldFilters;
|
|
101
|
+
}
|
|
93
102
|
interface EntryFilters extends PaginationParams {
|
|
94
103
|
blueprint?: string;
|
|
95
104
|
collection?: string;
|
|
96
105
|
slug?: string;
|
|
97
106
|
published?: boolean;
|
|
107
|
+
filter?: EntryFilterParams;
|
|
98
108
|
}
|
|
99
109
|
interface ArticleFilters extends PaginationParams {
|
|
100
110
|
status?: ArticleStatus;
|
|
@@ -261,6 +271,26 @@ interface UseAuthResult {
|
|
|
261
271
|
}
|
|
262
272
|
declare function useAuth(): UseAuthResult;
|
|
263
273
|
|
|
274
|
+
/**
|
|
275
|
+
* Fetch a paginated list of entries.
|
|
276
|
+
*
|
|
277
|
+
* Supports filtering by blueprint field values via `filter.field`. The handle
|
|
278
|
+
* keys must match fields defined on the blueprint passed in `filter.blueprint`
|
|
279
|
+
* (or the top-level `blueprint`); unknown handles return 422 from the API.
|
|
280
|
+
* Translatable fields are matched in the active locale with fallback.
|
|
281
|
+
*
|
|
282
|
+
* @example
|
|
283
|
+
* ```ts
|
|
284
|
+
* // Filter entries by a blueprint field value
|
|
285
|
+
* useEntries({
|
|
286
|
+
* blueprint: 'news',
|
|
287
|
+
* filter: {
|
|
288
|
+
* field: { category: 'sports', region: 'eu' },
|
|
289
|
+
* },
|
|
290
|
+
* sort: '-published_at',
|
|
291
|
+
* });
|
|
292
|
+
* ```
|
|
293
|
+
*/
|
|
264
294
|
declare function useEntries(filters?: EntryFilters, options?: HookOptions): UseQueryResult<Paginated<Entry>>;
|
|
265
295
|
|
|
266
296
|
declare function useEntry(id: string | number | null | undefined, options?: HookOptions): UseQueryResult<Entry>;
|
|
@@ -287,4 +317,4 @@ interface SubmitTriviaResponseInput {
|
|
|
287
317
|
}
|
|
288
318
|
declare function useSubmitTriviaResponse(): UseMutationResult<TriviaResponseResult, FanappsError, SubmitTriviaResponseInput>;
|
|
289
319
|
|
|
290
|
-
export { type Article, type ArticleFilters, type ArticleStatus, type Asset, type AssetUploadFile, type AuthStatus, type AuthUser, type CreateEntryInput, type CreatePushTargetInput, type Entry, type EntryData, type EntryFilters, FanappsAuthError, FanappsClient, type FanappsClientOptions, type FanappsContextValue, FanappsError, FanappsProvider, type FanappsProviderProps, type HookOptions, type Locale, type Paginated, type PaginationLinks, type PaginationMeta, type PaginationParams, type PushTarget, StorageAdapter, type SubmitTriviaResponseInput, type Trivia, type TriviaAnswer, type TriviaResponseResult, type UpdateEntryInput, type UploadAssetInput, type UseAuthResult, useArticle, useArticles, useAuth, useCreateEntry, useDeleteEntry, useEntries, useEntry, useFanapps, useFanappsClient, useSubmitTriviaResponse, useTrivia, useTrivias, useUpdateEntry, useUploadAsset };
|
|
320
|
+
export { type Article, type ArticleFilters, type ArticleStatus, type Asset, type AssetUploadFile, type AuthStatus, type AuthUser, type CreateEntryInput, type CreatePushTargetInput, type Entry, type EntryData, type EntryFieldFilters, type EntryFilterParams, type EntryFilters, FanappsAuthError, FanappsClient, type FanappsClientOptions, type FanappsContextValue, FanappsError, FanappsProvider, type FanappsProviderProps, type HookOptions, type Locale, type Paginated, type PaginationLinks, type PaginationMeta, type PaginationParams, type PushTarget, StorageAdapter, type SubmitTriviaResponseInput, type Trivia, type TriviaAnswer, type TriviaResponseResult, type UpdateEntryInput, type UploadAssetInput, type UseAuthResult, useArticle, useArticles, useAuth, useCreateEntry, useDeleteEntry, useEntries, useEntry, useFanapps, useFanappsClient, useSubmitTriviaResponse, useTrivia, useTrivias, useUpdateEntry, useUploadAsset };
|
package/dist/index.js
CHANGED
|
@@ -259,22 +259,28 @@ var FanappsClient = class {
|
|
|
259
259
|
};
|
|
260
260
|
function serializeParams(params) {
|
|
261
261
|
const parts = [];
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
262
|
+
appendParams(parts, params);
|
|
263
|
+
return parts.join("&");
|
|
264
|
+
}
|
|
265
|
+
function appendParams(parts, value, prefix) {
|
|
266
|
+
if (value === void 0 || value === null) return;
|
|
267
|
+
if (Array.isArray(value)) {
|
|
268
|
+
if (!prefix) return;
|
|
269
|
+
for (const item of value) {
|
|
270
|
+
if (item === void 0 || item === null) continue;
|
|
271
|
+
parts.push(`${encodeURIComponent(prefix)}[]=${encodeURIComponent(String(item))}`);
|
|
272
272
|
}
|
|
273
|
-
|
|
274
|
-
`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`
|
|
275
|
-
);
|
|
273
|
+
return;
|
|
276
274
|
}
|
|
277
|
-
|
|
275
|
+
if (typeof value === "object") {
|
|
276
|
+
for (const [key, child] of Object.entries(value)) {
|
|
277
|
+
const nextKey = prefix ? `${prefix}[${key}]` : key;
|
|
278
|
+
appendParams(parts, child, nextKey);
|
|
279
|
+
}
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
if (!prefix) return;
|
|
283
|
+
parts.push(`${encodeURIComponent(prefix)}=${encodeURIComponent(String(value))}`);
|
|
278
284
|
}
|
|
279
285
|
function safeJson(raw) {
|
|
280
286
|
try {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/auth/firebaseApp.ts","../src/auth/authStore.ts","../src/errors.ts","../src/client.ts","../src/context.ts","../src/auth/errors.ts","../src/hooks/useFanappsClient.ts","../src/hooks/useAuth.ts","../src/hooks/useEntries.ts","../src/hooks/useEntry.ts","../src/hooks/useCreateEntry.ts","../src/hooks/useUpdateEntry.ts","../src/hooks/useDeleteEntry.ts","../src/hooks/useUploadAsset.ts","../src/hooks/useArticles.ts","../src/hooks/useArticle.ts","../src/hooks/useTrivias.ts","../src/hooks/useTrivia.ts","../src/hooks/useSubmitTriviaResponse.ts"],"sourcesContent":["export { FanappsProvider, type FanappsProviderProps } from './provider';\nexport { FanappsClient, type FanappsClientOptions } from './client';\nexport { FanappsError } from './errors';\nexport { FanappsAuthError } from './auth/errors';\nexport { useFanapps, type FanappsContextValue } from './context';\nexport type { StorageAdapter } from './storage';\nexport { useFanappsClient } from './hooks/useFanappsClient';\nexport { useAuth, type UseAuthResult } from './hooks/useAuth';\nexport { useEntries } from './hooks/useEntries';\nexport { useEntry } from './hooks/useEntry';\nexport { useCreateEntry } from './hooks/useCreateEntry';\nexport { useUpdateEntry } from './hooks/useUpdateEntry';\nexport { useDeleteEntry } from './hooks/useDeleteEntry';\nexport { useUploadAsset } from './hooks/useUploadAsset';\nexport { useArticles } from './hooks/useArticles';\nexport { useArticle } from './hooks/useArticle';\nexport { useTrivias } from './hooks/useTrivias';\nexport { useTrivia } from './hooks/useTrivia';\nexport {\n useSubmitTriviaResponse,\n type SubmitTriviaResponseInput,\n} from './hooks/useSubmitTriviaResponse';\nexport type {\n Article,\n ArticleFilters,\n ArticleStatus,\n Asset,\n AssetUploadFile,\n AuthStatus,\n AuthUser,\n CreateEntryInput,\n CreatePushTargetInput,\n Entry,\n EntryData,\n EntryFilters,\n HookOptions,\n Locale,\n Paginated,\n PaginationLinks,\n PaginationMeta,\n PaginationParams,\n PushTarget,\n Trivia,\n TriviaAnswer,\n TriviaResponseResult,\n UpdateEntryInput,\n UploadAssetInput,\n} from './types';\n","import { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { useEffect, useMemo, useRef, type ReactNode } from 'react';\nimport { AuthStore } from './auth/authStore';\nimport { FanappsClient } from './client';\nimport { FanappsContext, type FanappsContextValue } from './context';\nimport type { StorageAdapter } from './storage';\nimport type { Locale } from './types';\n\nconst DEFAULT_BASE_URL = 'https://fanapps.app';\n\nexport interface FanappsProviderProps {\n apiKey: string;\n project: string;\n locale?: Locale;\n baseUrl?: string;\n queryClient?: QueryClient;\n storage?: StorageAdapter;\n children: ReactNode;\n}\n\nexport function FanappsProvider({\n apiKey,\n project,\n locale,\n baseUrl = DEFAULT_BASE_URL,\n queryClient,\n storage,\n children,\n}: FanappsProviderProps) {\n const authStoreRef = useRef<AuthStore | null>(null);\n if (!authStoreRef.current) {\n authStoreRef.current = new AuthStore();\n }\n const authStore = authStoreRef.current;\n\n useEffect(() => {\n authStore.start();\n return () => authStore.stop();\n }, [authStore]);\n\n const client = useMemo(\n () =>\n new FanappsClient({\n apiKey,\n project,\n baseUrl,\n getIdToken: () => authStore.getCurrentIdToken(),\n }),\n [apiKey, project, baseUrl, authStore],\n );\n\n const resolvedQueryClient = useMemo(\n () => queryClient ?? new QueryClient(),\n [queryClient],\n );\n\n const value = useMemo<FanappsContextValue>(\n () => ({ client, authStore, storage, locale }),\n [client, authStore, storage, locale],\n );\n\n return (\n <QueryClientProvider client={resolvedQueryClient}>\n <FanappsContext.Provider value={value}>\n {children}\n </FanappsContext.Provider>\n </QueryClientProvider>\n );\n}\n","import authImport, { type FirebaseAuthTypes } from '@react-native-firebase/auth';\n\nlet cached: FirebaseAuthTypes.Module | null = null;\n\nexport function firebaseAuth(): FirebaseAuthTypes.Module {\n if (cached) return cached;\n cached = authImport();\n return cached;\n}\n\nexport function resetFirebaseAuthCache(): void {\n cached = null;\n}\n","import type { FirebaseAuthTypes } from '@react-native-firebase/auth';\nimport { firebaseAuth } from './firebaseApp';\nimport type { AuthStatus, AuthUser } from '../types';\n\nexport type AuthListener = (snapshot: AuthStoreSnapshot) => void;\n\nexport interface AuthStoreSnapshot {\n user: AuthUser | null;\n firebaseUser: FirebaseAuthTypes.User | null;\n status: AuthStatus;\n}\n\nfunction mapUser(fb: FirebaseAuthTypes.User | null): AuthUser | null {\n if (!fb) return null;\n return {\n uid: fb.uid,\n email: fb.email,\n displayName: fb.displayName,\n photoURL: fb.photoURL,\n phoneNumber: fb.phoneNumber,\n isAnonymous: fb.isAnonymous,\n providerId: fb.providerId ?? null,\n };\n}\n\nexport class AuthStore {\n private snapshot: AuthStoreSnapshot = {\n user: null,\n firebaseUser: null,\n status: 'loading',\n };\n\n private listeners = new Set<AuthListener>();\n private unsubscribe: (() => void) | null = null;\n\n start(): void {\n if (this.unsubscribe) return;\n this.unsubscribe = firebaseAuth().onAuthStateChanged((fb) => {\n this.snapshot = {\n user: mapUser(fb),\n firebaseUser: fb,\n status: fb ? 'signed-in' : 'signed-out',\n };\n this.emit();\n });\n }\n\n stop(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n }\n\n subscribe(listener: AuthListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n getSnapshot(): AuthStoreSnapshot {\n return this.snapshot;\n }\n\n async getCurrentIdToken(): Promise<string | null> {\n const user = firebaseAuth().currentUser;\n if (!user) return null;\n return user.getIdToken();\n }\n\n private emit(): void {\n for (const l of this.listeners) l(this.snapshot);\n }\n}\n","export class FanappsError extends Error {\n readonly status: number;\n readonly body: unknown;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = 'FanappsError';\n this.status = status;\n this.body = body;\n }\n}\n","import { FanappsError } from './errors';\nimport type {\n Asset,\n CreateEntryInput,\n CreatePushTargetInput,\n Entry,\n PushTarget,\n UpdateEntryInput,\n UploadAssetInput,\n} from './types';\n\nexport interface FanappsClientOptions {\n apiKey: string;\n project: string;\n baseUrl: string;\n getIdToken?: () => Promise<string | null>;\n}\n\nexport type QueryParams = Record<string, unknown>;\n\nexport class FanappsClient {\n private readonly apiKey: string;\n private readonly project: string;\n private readonly baseUrl: string;\n private readonly getIdToken?: () => Promise<string | null>;\n\n constructor(options: FanappsClientOptions) {\n this.apiKey = options.apiKey;\n this.project = options.project;\n this.baseUrl = options.baseUrl.replace(/\\/$/, '');\n this.getIdToken = options.getIdToken;\n }\n\n get<T>(path: string, params?: QueryParams, signal?: AbortSignal): Promise<T> {\n return this.request<T>('GET', path, { params, signal });\n }\n\n post<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {\n return this.request<T>('POST', path, { body, signal });\n }\n\n patch<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {\n return this.request<T>('PATCH', path, { body, signal });\n }\n\n delete<T>(path: string, signal?: AbortSignal): Promise<T> {\n return this.request<T>('DELETE', path, { signal });\n }\n\n async createPushTarget(input: CreatePushTargetInput): Promise<PushTarget> {\n const response = await this.post<{ data: PushTarget }>(\n '/api/account/targets/push',\n input,\n );\n return response.data;\n }\n\n async updatePushTarget(\n targetId: string,\n identifier: string,\n ): Promise<PushTarget> {\n const response = await this.patch<{ data: PushTarget }>(\n `/api/account/targets/push/${encodeURIComponent(targetId)}`,\n { identifier },\n );\n return response.data;\n }\n\n async deletePushTarget(targetId: string): Promise<void> {\n await this.delete<void>(\n `/api/account/targets/push/${encodeURIComponent(targetId)}`,\n );\n }\n\n async createEntry(input: CreateEntryInput): Promise<Entry> {\n return this.post<Entry>('/api/entries', toEntryBody(input));\n }\n\n async updateEntry({ id, ...rest }: UpdateEntryInput): Promise<Entry> {\n return this.patch<Entry>(\n `/api/entries/${encodeURIComponent(String(id))}`,\n toEntryBody(rest),\n );\n }\n\n async deleteEntry(id: string | number): Promise<void> {\n await this.delete<void>(\n `/api/entries/${encodeURIComponent(String(id))}`,\n );\n }\n\n async uploadAsset(input: UploadAssetInput): Promise<Asset> {\n const form = new FormData();\n form.append('file', input.file as unknown as Blob);\n if (input.altText !== undefined) {\n form.append('alt_text', input.altText);\n }\n const response = await this.requestMultipart<{ data: Asset }>(\n '/api/assets',\n form,\n );\n return response.data;\n }\n\n private async requestMultipart<T>(\n path: string,\n form: FormData,\n signal?: AbortSignal,\n ): Promise<T> {\n const url = this.buildUrl(path);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'X-Tenant': this.project,\n Accept: 'application/json',\n };\n\n if (this.getIdToken) {\n const idToken = await this.getIdToken();\n if (idToken) {\n headers['X-Firebase-Token'] = idToken;\n }\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: form,\n signal,\n });\n\n const raw = await response.text();\n const payload = raw.length > 0 ? safeJson(raw) : null;\n\n if (!response.ok) {\n const message =\n (payload && typeof payload === 'object' && 'message' in payload\n ? String((payload as { message: unknown }).message)\n : null) ?? `Fanapps request failed with status ${response.status}`;\n throw new FanappsError(message, response.status, payload);\n }\n\n return payload as T;\n }\n\n private async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n path: string,\n opts: { params?: QueryParams; body?: unknown; signal?: AbortSignal },\n ): Promise<T> {\n const url = this.buildUrl(path, opts.params);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'X-Tenant': this.project,\n Accept: 'application/json',\n };\n\n if (this.getIdToken) {\n const idToken = await this.getIdToken();\n if (idToken) {\n headers['X-Firebase-Token'] = idToken;\n }\n }\n\n const init: RequestInit = { method, headers, signal: opts.signal };\n\n if (opts.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(opts.body);\n }\n\n const response = await fetch(url, init);\n\n const raw = await response.text();\n const payload = raw.length > 0 ? safeJson(raw) : null;\n\n if (!response.ok) {\n const message =\n (payload && typeof payload === 'object' && 'message' in payload\n ? String((payload as { message: unknown }).message)\n : null) ?? `Fanapps request failed with status ${response.status}`;\n throw new FanappsError(message, response.status, payload);\n }\n\n return payload as T;\n }\n\n private buildUrl(path: string, params?: QueryParams): string {\n const base = path.startsWith('/')\n ? `${this.baseUrl}${path}`\n : `${this.baseUrl}/${path}`;\n if (!params) return base;\n const query = serializeParams(params);\n return query.length > 0 ? `${base}?${query}` : base;\n }\n}\n\nfunction serializeParams(params: QueryParams): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item === undefined || item === null) continue;\n parts.push(\n `${encodeURIComponent(key)}[]=${encodeURIComponent(String(item))}`,\n );\n }\n continue;\n }\n parts.push(\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`,\n );\n }\n return parts.join('&');\n}\n\nfunction safeJson(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nfunction toEntryBody(\n input: Omit<CreateEntryInput, never> | Omit<UpdateEntryInput, 'id'>,\n): Record<string, unknown> {\n const { publishedAt, ...rest } = input as Record<string, unknown> & {\n publishedAt?: string | null;\n };\n const body: Record<string, unknown> = { ...rest };\n if (publishedAt !== undefined) {\n body.published_at = publishedAt;\n }\n return body;\n}\n","import { createContext, useContext } from 'react';\nimport type { AuthStore } from './auth/authStore';\nimport type { FanappsClient } from './client';\nimport type { StorageAdapter } from './storage';\nimport type { Locale } from './types';\n\nexport interface FanappsContextValue {\n client: FanappsClient;\n authStore: AuthStore;\n storage: StorageAdapter | undefined;\n locale?: Locale;\n}\n\nexport const FanappsContext = createContext<FanappsContextValue | null>(null);\n\nexport function useFanapps(): FanappsContextValue {\n const ctx = useContext(FanappsContext);\n if (!ctx) {\n throw new Error(\n '@fanapps/react-native: useFanapps must be used inside <FanappsProvider>.',\n );\n }\n return ctx;\n}\n","export class FanappsAuthError extends Error {\n readonly code: string;\n\n constructor(message: string, code: string) {\n super(message);\n this.name = 'FanappsAuthError';\n this.code = code;\n }\n}\n","import { useFanapps } from '../context';\nimport type { FanappsClient } from '../client';\n\nexport function useFanappsClient(): FanappsClient {\n return useFanapps().client;\n}\n","import { useSyncExternalStore, useCallback } from 'react';\nimport { firebaseAuth } from '../auth/firebaseApp';\nimport { useFanapps } from '../context';\nimport type { AuthStatus, AuthUser } from '../types';\n\nexport interface UseAuthResult {\n user: AuthUser | null;\n status: AuthStatus;\n signInWithEmail(email: string, password: string): Promise<AuthUser>;\n signUpWithEmail(email: string, password: string): Promise<AuthUser>;\n sendPasswordResetEmail(email: string): Promise<void>;\n sendEmailVerification(): Promise<void>;\n signOut(): Promise<void>;\n}\n\nexport function useAuth(): UseAuthResult {\n const { authStore } = useFanapps();\n\n const snapshot = useSyncExternalStore(\n (listener) => authStore.subscribe(listener),\n () => authStore.getSnapshot(),\n () => authStore.getSnapshot(),\n );\n\n const signInWithEmail = useCallback(\n async (email: string, password: string) => {\n const cred = await firebaseAuth().signInWithEmailAndPassword(email, password);\n return authStore.getSnapshot().user ?? mapMinimal(cred.user);\n },\n [authStore],\n );\n\n const signUpWithEmail = useCallback(\n async (email: string, password: string) => {\n const cred = await firebaseAuth().createUserWithEmailAndPassword(email, password);\n return authStore.getSnapshot().user ?? mapMinimal(cred.user);\n },\n [authStore],\n );\n\n const sendPasswordResetEmail = useCallback(async (email: string) => {\n await firebaseAuth().sendPasswordResetEmail(email);\n }, []);\n\n const sendEmailVerification = useCallback(async () => {\n const current = firebaseAuth().currentUser;\n if (!current) throw new Error('No signed-in user to verify.');\n await current.sendEmailVerification();\n }, []);\n\n const signOut = useCallback(async () => {\n await firebaseAuth().signOut();\n }, []);\n\n return {\n user: snapshot.user,\n status: snapshot.status,\n signInWithEmail,\n signUpWithEmail,\n sendPasswordResetEmail,\n sendEmailVerification,\n signOut,\n };\n}\n\ninterface MinimalFirebaseUser {\n uid: string;\n email: string | null;\n displayName: string | null;\n photoURL: string | null;\n phoneNumber: string | null;\n isAnonymous: boolean;\n providerId?: string | null;\n}\n\nfunction mapMinimal(fb: MinimalFirebaseUser): AuthUser {\n return {\n uid: fb.uid,\n email: fb.email,\n displayName: fb.displayName,\n photoURL: fb.photoURL,\n phoneNumber: fb.phoneNumber,\n isAnonymous: fb.isAnonymous,\n providerId: fb.providerId ?? null,\n };\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Entry, EntryFilters, HookOptions, Paginated } from '../types';\n\nexport function useEntries(\n filters: EntryFilters = {},\n options: HookOptions = {},\n): UseQueryResult<Paginated<Entry>> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'entries', { locale, ...filters }],\n queryFn: ({ signal }) =>\n client.get<Paginated<Entry>>('/api/entries', { ...filters, locale }, signal),\n enabled: options.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Entry, HookOptions } from '../types';\n\nexport function useEntry(\n id: string | number | null | undefined,\n options: HookOptions = {},\n): UseQueryResult<Entry> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'entry', id, { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Entry }>(\n `/api/entries/${id}`,\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: (options.enabled ?? true) && id != null && id !== '',\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { CreateEntryInput, Entry } from '../types';\n\nexport function useCreateEntry(): UseMutationResult<\n Entry,\n FanappsError,\n CreateEntryInput\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input) => client.createEntry(input),\n onSuccess: (entry) => {\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'entries'] });\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'entry', entry.id],\n });\n },\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { Entry, UpdateEntryInput } from '../types';\n\nexport function useUpdateEntry(): UseMutationResult<\n Entry,\n FanappsError,\n UpdateEntryInput\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input) => client.updateEntry(input),\n onSuccess: (entry, variables) => {\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'entries'] });\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'entry', variables.id],\n });\n if (entry.id !== variables.id) {\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'entry', entry.id],\n });\n }\n },\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\n\nexport function useDeleteEntry(): UseMutationResult<\n void,\n FanappsError,\n string | number\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id) => client.deleteEntry(id),\n onSuccess: (_result, id) => {\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'entries'] });\n queryClient.removeQueries({ queryKey: ['fanapps', 'entry', id] });\n },\n });\n}\n","import { useMutation, type UseMutationResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { Asset, UploadAssetInput } from '../types';\n\nexport function useUploadAsset(): UseMutationResult<\n Asset,\n FanappsError,\n UploadAssetInput\n> {\n const { client } = useFanapps();\n\n return useMutation({\n mutationFn: (input) => client.uploadAsset(input),\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Article, ArticleFilters, HookOptions, Paginated } from '../types';\n\nexport function useArticles(\n filters: ArticleFilters = {},\n options: HookOptions = {},\n): UseQueryResult<Paginated<Article>> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'articles', { locale, ...filters }],\n queryFn: ({ signal }) =>\n client.get<Paginated<Article>>('/api/articles', { ...filters, locale }, signal),\n enabled: options.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Article, HookOptions } from '../types';\n\nexport function useArticle(\n id: string | number | null | undefined,\n options: HookOptions = {},\n): UseQueryResult<Article> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'article', id, { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Article }>(\n `/api/articles/${id}`,\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: (options.enabled ?? true) && id != null && id !== '',\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { HookOptions, Trivia } from '../types';\n\nexport function useTrivias(\n options: HookOptions = {},\n): UseQueryResult<Trivia[]> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'trivias', { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Trivia[] }>(\n '/api/trivias',\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: options.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { HookOptions, Trivia } from '../types';\n\nexport function useTrivia(\n id: string | number | null | undefined,\n options: HookOptions = {},\n): UseQueryResult<Trivia> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'trivia', id, { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Trivia }>(\n `/api/trivias/${id}`,\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: (options.enabled ?? true) && id != null && id !== '',\n });\n}\n","import { useMutation, useQueryClient, type UseMutationResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { TriviaResponseResult } from '../types';\n\nexport interface SubmitTriviaResponseInput {\n triviaId: string | number;\n answerId: string | number;\n}\n\nexport function useSubmitTriviaResponse(): UseMutationResult<\n TriviaResponseResult,\n FanappsError,\n SubmitTriviaResponseInput\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({ triviaId, answerId }) =>\n client.post<TriviaResponseResult>(`/api/trivias/${triviaId}/respond`, {\n answer_id: answerId,\n }),\n onSuccess: (_result, variables) => {\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'trivia', variables.triviaId],\n });\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'trivias'] });\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,yBAAiD;AACjD,IAAAA,gBAA2D;;;ACD3D,kBAAmD;AAEnD,IAAI,SAA0C;AAEvC,SAAS,eAAyC;AACvD,MAAI,OAAQ,QAAO;AACnB,eAAS,YAAAC,SAAW;AACpB,SAAO;AACT;;;ACIA,SAAS,QAAQ,IAAoD;AACnE,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO;AAAA,IACL,KAAK,GAAG;AAAA,IACR,OAAO,GAAG;AAAA,IACV,aAAa,GAAG;AAAA,IAChB,UAAU,GAAG;AAAA,IACb,aAAa,GAAG;AAAA,IAChB,aAAa,GAAG;AAAA,IAChB,YAAY,GAAG,cAAc;AAAA,EAC/B;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EAAhB;AACL,SAAQ,WAA8B;AAAA,MACpC,MAAM;AAAA,MACN,cAAc;AAAA,MACd,QAAQ;AAAA,IACV;AAEA,SAAQ,YAAY,oBAAI,IAAkB;AAC1C,SAAQ,cAAmC;AAAA;AAAA,EAE3C,QAAc;AACZ,QAAI,KAAK,YAAa;AACtB,SAAK,cAAc,aAAa,EAAE,mBAAmB,CAAC,OAAO;AAC3D,WAAK,WAAW;AAAA,QACd,MAAM,QAAQ,EAAE;AAAA,QAChB,cAAc;AAAA,QACd,QAAQ,KAAK,cAAc;AAAA,MAC7B;AACA,WAAK,KAAK;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAa;AACX,SAAK,cAAc;AACnB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,UAAU,UAAoC;AAC5C,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM;AACX,WAAK,UAAU,OAAO,QAAQ;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,cAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,oBAA4C;AAChD,UAAM,OAAO,aAAa,EAAE;AAC5B,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,OAAa;AACnB,eAAW,KAAK,KAAK,UAAW,GAAE,KAAK,QAAQ;AAAA,EACjD;AACF;;;ACxEO,IAAM,eAAN,cAA2B,MAAM;AAAA,EAItC,YAAY,SAAiB,QAAgB,MAAe;AAC1D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AACF;;;ACUO,IAAM,gBAAN,MAAoB;AAAA,EAMzB,YAAY,SAA+B;AACzC,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ;AACvB,SAAK,UAAU,QAAQ,QAAQ,QAAQ,OAAO,EAAE;AAChD,SAAK,aAAa,QAAQ;AAAA,EAC5B;AAAA,EAEA,IAAO,MAAc,QAAsB,QAAkC;AAC3E,WAAO,KAAK,QAAW,OAAO,MAAM,EAAE,QAAQ,OAAO,CAAC;AAAA,EACxD;AAAA,EAEA,KAAQ,MAAc,MAAgB,QAAkC;AACtE,WAAO,KAAK,QAAW,QAAQ,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EACvD;AAAA,EAEA,MAAS,MAAc,MAAgB,QAAkC;AACvE,WAAO,KAAK,QAAW,SAAS,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EACxD;AAAA,EAEA,OAAU,MAAc,QAAkC;AACxD,WAAO,KAAK,QAAW,UAAU,MAAM,EAAE,OAAO,CAAC;AAAA,EACnD;AAAA,EAEA,MAAM,iBAAiB,OAAmD;AACxE,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,iBACJ,UACA,YACqB;AACrB,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,6BAA6B,mBAAmB,QAAQ,CAAC;AAAA,MACzD,EAAE,WAAW;AAAA,IACf;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,iBAAiB,UAAiC;AACtD,UAAM,KAAK;AAAA,MACT,6BAA6B,mBAAmB,QAAQ,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,OAAyC;AACzD,WAAO,KAAK,KAAY,gBAAgB,YAAY,KAAK,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,YAAY,EAAE,IAAI,GAAG,KAAK,GAAqC;AACnE,WAAO,KAAK;AAAA,MACV,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC9C,YAAY,IAAI;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,IAAoC;AACpD,UAAM,KAAK;AAAA,MACT,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,OAAyC;AACzD,UAAM,OAAO,IAAI,SAAS;AAC1B,SAAK,OAAO,QAAQ,MAAM,IAAuB;AACjD,QAAI,MAAM,YAAY,QAAW;AAC/B,WAAK,OAAO,YAAY,MAAM,OAAO;AAAA,IACvC;AACA,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAc,iBACZ,MACA,MACA,QACY;AACZ,UAAM,MAAM,KAAK,SAAS,IAAI;AAE9B,UAAM,UAAkC;AAAA,MACtC,eAAe,UAAU,KAAK,MAAM;AAAA,MACpC,YAAY,KAAK;AAAA,MACjB,QAAQ;AAAA,IACV;AAEA,QAAI,KAAK,YAAY;AACnB,YAAM,UAAU,MAAM,KAAK,WAAW;AACtC,UAAI,SAAS;AACX,gBAAQ,kBAAkB,IAAI;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAED,UAAM,MAAM,MAAM,SAAS,KAAK;AAChC,UAAM,UAAU,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI;AAEjD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,WACH,WAAW,OAAO,YAAY,YAAY,aAAa,UACpD,OAAQ,QAAiC,OAAO,IAChD,SAAS,sCAAsC,SAAS,MAAM;AACpE,YAAM,IAAI,aAAa,SAAS,SAAS,QAAQ,OAAO;AAAA,IAC1D;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,QACZ,QACA,MACA,MACY;AACZ,UAAM,MAAM,KAAK,SAAS,MAAM,KAAK,MAAM;AAE3C,UAAM,UAAkC;AAAA,MACtC,eAAe,UAAU,KAAK,MAAM;AAAA,MACpC,YAAY,KAAK;AAAA,MACjB,QAAQ;AAAA,IACV;AAEA,QAAI,KAAK,YAAY;AACnB,YAAM,UAAU,MAAM,KAAK,WAAW;AACtC,UAAI,SAAS;AACX,gBAAQ,kBAAkB,IAAI;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,OAAoB,EAAE,QAAQ,SAAS,QAAQ,KAAK,OAAO;AAEjE,QAAI,KAAK,SAAS,QAAW;AAC3B,cAAQ,cAAc,IAAI;AAC1B,WAAK,OAAO,KAAK,UAAU,KAAK,IAAI;AAAA,IACtC;AAEA,UAAM,WAAW,MAAM,MAAM,KAAK,IAAI;AAEtC,UAAM,MAAM,MAAM,SAAS,KAAK;AAChC,UAAM,UAAU,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI;AAEjD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,WACH,WAAW,OAAO,YAAY,YAAY,aAAa,UACpD,OAAQ,QAAiC,OAAO,IAChD,SAAS,sCAAsC,SAAS,MAAM;AACpE,YAAM,IAAI,aAAa,SAAS,SAAS,QAAQ,OAAO;AAAA,IAC1D;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,MAAc,QAA8B;AAC3D,UAAM,OAAO,KAAK,WAAW,GAAG,IAC5B,GAAG,KAAK,OAAO,GAAG,IAAI,KACtB,GAAG,KAAK,OAAO,IAAI,IAAI;AAC3B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,QAAQ,gBAAgB,MAAM;AACpC,WAAO,MAAM,SAAS,IAAI,GAAG,IAAI,IAAI,KAAK,KAAK;AAAA,EACjD;AACF;AAEA,SAAS,gBAAgB,QAA6B;AACpD,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,UAAa,UAAU,KAAM;AAC3C,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAW,QAAQ,OAAO;AACxB,YAAI,SAAS,UAAa,SAAS,KAAM;AACzC,cAAM;AAAA,UACJ,GAAG,mBAAmB,GAAG,CAAC,MAAM,mBAAmB,OAAO,IAAI,CAAC,CAAC;AAAA,QAClE;AAAA,MACF;AACA;AAAA,IACF;AACA,UAAM;AAAA,MACJ,GAAG,mBAAmB,GAAG,CAAC,IAAI,mBAAmB,OAAO,KAAK,CAAC,CAAC;AAAA,IACjE;AAAA,EACF;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,SAAS,KAAsB;AACtC,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YACP,OACyB;AACzB,QAAM,EAAE,aAAa,GAAG,KAAK,IAAI;AAGjC,QAAM,OAAgC,EAAE,GAAG,KAAK;AAChD,MAAI,gBAAgB,QAAW;AAC7B,SAAK,eAAe;AAAA,EACtB;AACA,SAAO;AACT;;;AC7OA,mBAA0C;AAanC,IAAM,qBAAiB,4BAA0C,IAAI;AAErE,SAAS,aAAkC;AAChD,QAAM,UAAM,yBAAW,cAAc;AACrC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ALwCM;AAvDN,IAAM,mBAAmB;AAYlB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,mBAAe,sBAAyB,IAAI;AAClD,MAAI,CAAC,aAAa,SAAS;AACzB,iBAAa,UAAU,IAAI,UAAU;AAAA,EACvC;AACA,QAAM,YAAY,aAAa;AAE/B,+BAAU,MAAM;AACd,cAAU,MAAM;AAChB,WAAO,MAAM,UAAU,KAAK;AAAA,EAC9B,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,aAAS;AAAA,IACb,MACE,IAAI,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,MAAM,UAAU,kBAAkB;AAAA,IAChD,CAAC;AAAA,IACH,CAAC,QAAQ,SAAS,SAAS,SAAS;AAAA,EACtC;AAEA,QAAM,0BAAsB;AAAA,IAC1B,MAAM,eAAe,IAAI,+BAAY;AAAA,IACrC,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,YAAQ;AAAA,IACZ,OAAO,EAAE,QAAQ,WAAW,SAAS,OAAO;AAAA,IAC5C,CAAC,QAAQ,WAAW,SAAS,MAAM;AAAA,EACrC;AAEA,SACE,4CAAC,0CAAoB,QAAQ,qBAC3B,sDAAC,eAAe,UAAf,EAAwB,OACtB,UACH,GACF;AAEJ;;;AMpEO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAG1C,YAAY,SAAiB,MAAc;AACzC,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;;;ACLO,SAAS,mBAAkC;AAChD,SAAO,WAAW,EAAE;AACtB;;;ACLA,IAAAC,gBAAkD;AAe3C,SAAS,UAAyB;AACvC,QAAM,EAAE,UAAU,IAAI,WAAW;AAEjC,QAAM,eAAW;AAAA,IACf,CAAC,aAAa,UAAU,UAAU,QAAQ;AAAA,IAC1C,MAAM,UAAU,YAAY;AAAA,IAC5B,MAAM,UAAU,YAAY;AAAA,EAC9B;AAEA,QAAM,sBAAkB;AAAA,IACtB,OAAO,OAAe,aAAqB;AACzC,YAAM,OAAO,MAAM,aAAa,EAAE,2BAA2B,OAAO,QAAQ;AAC5E,aAAO,UAAU,YAAY,EAAE,QAAQ,WAAW,KAAK,IAAI;AAAA,IAC7D;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,sBAAkB;AAAA,IACtB,OAAO,OAAe,aAAqB;AACzC,YAAM,OAAO,MAAM,aAAa,EAAE,+BAA+B,OAAO,QAAQ;AAChF,aAAO,UAAU,YAAY,EAAE,QAAQ,WAAW,KAAK,IAAI;AAAA,IAC7D;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,6BAAyB,2BAAY,OAAO,UAAkB;AAClE,UAAM,aAAa,EAAE,uBAAuB,KAAK;AAAA,EACnD,GAAG,CAAC,CAAC;AAEL,QAAM,4BAAwB,2BAAY,YAAY;AACpD,UAAM,UAAU,aAAa,EAAE;AAC/B,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,8BAA8B;AAC5D,UAAM,QAAQ,sBAAsB;AAAA,EACtC,GAAG,CAAC,CAAC;AAEL,QAAM,cAAU,2BAAY,YAAY;AACtC,UAAM,aAAa,EAAE,QAAQ;AAAA,EAC/B,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL,MAAM,SAAS;AAAA,IACf,QAAQ,SAAS;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAYA,SAAS,WAAW,IAAmC;AACrD,SAAO;AAAA,IACL,KAAK,GAAG;AAAA,IACR,OAAO,GAAG;AAAA,IACV,aAAa,GAAG;AAAA,IAChB,UAAU,GAAG;AAAA,IACb,aAAa,GAAG;AAAA,IAChB,aAAa,GAAG;AAAA,IAChB,YAAY,GAAG,cAAc;AAAA,EAC/B;AACF;;;ACrFA,IAAAC,sBAA8C;AAIvC,SAAS,WACd,UAAwB,CAAC,GACzB,UAAuB,CAAC,GACU;AAClC,QAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,WAAW;AACtD,QAAM,SAAS,QAAQ,UAAU;AAEjC,aAAO,8BAAS;AAAA,IACd,UAAU,CAAC,WAAW,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAC;AAAA,IACvD,SAAS,CAAC,EAAE,OAAO,MACjB,OAAO,IAAsB,gBAAgB,EAAE,GAAG,SAAS,OAAO,GAAG,MAAM;AAAA,IAC7E,SAAS,QAAQ,WAAW;AAAA,EAC9B,CAAC;AACH;;;ACjBA,IAAAC,sBAA8C;AAIvC,SAAS,SACd,IACA,UAAuB,CAAC,GACD;AACvB,QAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,WAAW;AACtD,QAAM,SAAS,QAAQ,UAAU;AAEjC,aAAO,8BAAS;AAAA,IACd,UAAU,CAAC,WAAW,SAAS,IAAI,EAAE,OAAO,CAAC;AAAA,IAC7C,SAAS,OAAO,EAAE,OAAO,MAAM;AAC7B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,gBAAgB,EAAE;AAAA,QAClB,EAAE,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,UAAU,QAAQ,WAAW,SAAS,MAAM,QAAQ,OAAO;AAAA,EAC7D,CAAC;AACH;;;ACvBA,IAAAC,sBAIO;AAKA,SAAS,iBAId;AACA,QAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,QAAM,kBAAc,oCAAe;AAEnC,aAAO,iCAAY;AAAA,IACjB,YAAY,CAAC,UAAU,OAAO,YAAY,KAAK;AAAA,IAC/C,WAAW,CAAC,UAAU;AACpB,kBAAY,kBAAkB,EAAE,UAAU,CAAC,WAAW,SAAS,EAAE,CAAC;AAClE,kBAAY,kBAAkB;AAAA,QAC5B,UAAU,CAAC,WAAW,SAAS,MAAM,EAAE;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;AC1BA,IAAAC,sBAIO;AAKA,SAAS,iBAId;AACA,QAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,QAAM,kBAAc,oCAAe;AAEnC,aAAO,iCAAY;AAAA,IACjB,YAAY,CAAC,UAAU,OAAO,YAAY,KAAK;AAAA,IAC/C,WAAW,CAAC,OAAO,cAAc;AAC/B,kBAAY,kBAAkB,EAAE,UAAU,CAAC,WAAW,SAAS,EAAE,CAAC;AAClE,kBAAY,kBAAkB;AAAA,QAC5B,UAAU,CAAC,WAAW,SAAS,UAAU,EAAE;AAAA,MAC7C,CAAC;AACD,UAAI,MAAM,OAAO,UAAU,IAAI;AAC7B,oBAAY,kBAAkB;AAAA,UAC5B,UAAU,CAAC,WAAW,SAAS,MAAM,EAAE;AAAA,QACzC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC/BA,IAAAC,sBAIO;AAIA,SAAS,iBAId;AACA,QAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,QAAM,kBAAc,oCAAe;AAEnC,aAAO,iCAAY;AAAA,IACjB,YAAY,CAAC,OAAO,OAAO,YAAY,EAAE;AAAA,IACzC,WAAW,CAAC,SAAS,OAAO;AAC1B,kBAAY,kBAAkB,EAAE,UAAU,CAAC,WAAW,SAAS,EAAE,CAAC;AAClE,kBAAY,cAAc,EAAE,UAAU,CAAC,WAAW,SAAS,EAAE,EAAE,CAAC;AAAA,IAClE;AAAA,EACF,CAAC;AACH;;;ACvBA,IAAAC,sBAAoD;AAK7C,SAAS,iBAId;AACA,QAAM,EAAE,OAAO,IAAI,WAAW;AAE9B,aAAO,iCAAY;AAAA,IACjB,YAAY,CAAC,UAAU,OAAO,YAAY,KAAK;AAAA,EACjD,CAAC;AACH;;;ACfA,IAAAC,sBAA8C;AAIvC,SAAS,YACd,UAA0B,CAAC,GAC3B,UAAuB,CAAC,GACY;AACpC,QAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,WAAW;AACtD,QAAM,SAAS,QAAQ,UAAU;AAEjC,aAAO,8BAAS;AAAA,IACd,UAAU,CAAC,WAAW,YAAY,EAAE,QAAQ,GAAG,QAAQ,CAAC;AAAA,IACxD,SAAS,CAAC,EAAE,OAAO,MACjB,OAAO,IAAwB,iBAAiB,EAAE,GAAG,SAAS,OAAO,GAAG,MAAM;AAAA,IAChF,SAAS,QAAQ,WAAW;AAAA,EAC9B,CAAC;AACH;;;ACjBA,IAAAC,sBAA8C;AAIvC,SAAS,WACd,IACA,UAAuB,CAAC,GACC;AACzB,QAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,WAAW;AACtD,QAAM,SAAS,QAAQ,UAAU;AAEjC,aAAO,8BAAS;AAAA,IACd,UAAU,CAAC,WAAW,WAAW,IAAI,EAAE,OAAO,CAAC;AAAA,IAC/C,SAAS,OAAO,EAAE,OAAO,MAAM;AAC7B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,iBAAiB,EAAE;AAAA,QACnB,EAAE,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,UAAU,QAAQ,WAAW,SAAS,MAAM,QAAQ,OAAO;AAAA,EAC7D,CAAC;AACH;;;ACvBA,IAAAC,uBAA8C;AAIvC,SAAS,WACd,UAAuB,CAAC,GACE;AAC1B,QAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,WAAW;AACtD,QAAM,SAAS,QAAQ,UAAU;AAEjC,aAAO,+BAAS;AAAA,IACd,UAAU,CAAC,WAAW,WAAW,EAAE,OAAO,CAAC;AAAA,IAC3C,SAAS,OAAO,EAAE,OAAO,MAAM;AAC7B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,EAAE,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,SAAS,QAAQ,WAAW;AAAA,EAC9B,CAAC;AACH;;;ACtBA,IAAAC,uBAA8C;AAIvC,SAAS,UACd,IACA,UAAuB,CAAC,GACA;AACxB,QAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,WAAW;AACtD,QAAM,SAAS,QAAQ,UAAU;AAEjC,aAAO,+BAAS;AAAA,IACd,UAAU,CAAC,WAAW,UAAU,IAAI,EAAE,OAAO,CAAC;AAAA,IAC9C,SAAS,OAAO,EAAE,OAAO,MAAM;AAC7B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,gBAAgB,EAAE;AAAA,QAClB,EAAE,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,UAAU,QAAQ,WAAW,SAAS,MAAM,QAAQ,OAAO;AAAA,EAC7D,CAAC;AACH;;;ACvBA,IAAAC,uBAAoE;AAU7D,SAAS,0BAId;AACA,QAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,QAAM,kBAAc,qCAAe;AAEnC,aAAO,kCAAY;AAAA,IACjB,YAAY,CAAC,EAAE,UAAU,SAAS,MAChC,OAAO,KAA2B,gBAAgB,QAAQ,YAAY;AAAA,MACpE,WAAW;AAAA,IACb,CAAC;AAAA,IACH,WAAW,CAAC,SAAS,cAAc;AACjC,kBAAY,kBAAkB;AAAA,QAC5B,UAAU,CAAC,WAAW,UAAU,UAAU,QAAQ;AAAA,MACpD,CAAC;AACD,kBAAY,kBAAkB,EAAE,UAAU,CAAC,WAAW,SAAS,EAAE,CAAC;AAAA,IACpE;AAAA,EACF,CAAC;AACH;","names":["import_react","authImport","import_react","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/auth/firebaseApp.ts","../src/auth/authStore.ts","../src/errors.ts","../src/client.ts","../src/context.ts","../src/auth/errors.ts","../src/hooks/useFanappsClient.ts","../src/hooks/useAuth.ts","../src/hooks/useEntries.ts","../src/hooks/useEntry.ts","../src/hooks/useCreateEntry.ts","../src/hooks/useUpdateEntry.ts","../src/hooks/useDeleteEntry.ts","../src/hooks/useUploadAsset.ts","../src/hooks/useArticles.ts","../src/hooks/useArticle.ts","../src/hooks/useTrivias.ts","../src/hooks/useTrivia.ts","../src/hooks/useSubmitTriviaResponse.ts"],"sourcesContent":["export { FanappsProvider, type FanappsProviderProps } from './provider';\nexport { FanappsClient, type FanappsClientOptions } from './client';\nexport { FanappsError } from './errors';\nexport { FanappsAuthError } from './auth/errors';\nexport { useFanapps, type FanappsContextValue } from './context';\nexport type { StorageAdapter } from './storage';\nexport { useFanappsClient } from './hooks/useFanappsClient';\nexport { useAuth, type UseAuthResult } from './hooks/useAuth';\nexport { useEntries } from './hooks/useEntries';\nexport { useEntry } from './hooks/useEntry';\nexport { useCreateEntry } from './hooks/useCreateEntry';\nexport { useUpdateEntry } from './hooks/useUpdateEntry';\nexport { useDeleteEntry } from './hooks/useDeleteEntry';\nexport { useUploadAsset } from './hooks/useUploadAsset';\nexport { useArticles } from './hooks/useArticles';\nexport { useArticle } from './hooks/useArticle';\nexport { useTrivias } from './hooks/useTrivias';\nexport { useTrivia } from './hooks/useTrivia';\nexport {\n useSubmitTriviaResponse,\n type SubmitTriviaResponseInput,\n} from './hooks/useSubmitTriviaResponse';\nexport type {\n Article,\n ArticleFilters,\n ArticleStatus,\n Asset,\n AssetUploadFile,\n AuthStatus,\n AuthUser,\n CreateEntryInput,\n CreatePushTargetInput,\n Entry,\n EntryData,\n EntryFieldFilters,\n EntryFilterParams,\n EntryFilters,\n HookOptions,\n Locale,\n Paginated,\n PaginationLinks,\n PaginationMeta,\n PaginationParams,\n PushTarget,\n Trivia,\n TriviaAnswer,\n TriviaResponseResult,\n UpdateEntryInput,\n UploadAssetInput,\n} from './types';\n","import { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { useEffect, useMemo, useRef, type ReactNode } from 'react';\nimport { AuthStore } from './auth/authStore';\nimport { FanappsClient } from './client';\nimport { FanappsContext, type FanappsContextValue } from './context';\nimport type { StorageAdapter } from './storage';\nimport type { Locale } from './types';\n\nconst DEFAULT_BASE_URL = 'https://fanapps.app';\n\nexport interface FanappsProviderProps {\n apiKey: string;\n project: string;\n locale?: Locale;\n baseUrl?: string;\n queryClient?: QueryClient;\n storage?: StorageAdapter;\n children: ReactNode;\n}\n\nexport function FanappsProvider({\n apiKey,\n project,\n locale,\n baseUrl = DEFAULT_BASE_URL,\n queryClient,\n storage,\n children,\n}: FanappsProviderProps) {\n const authStoreRef = useRef<AuthStore | null>(null);\n if (!authStoreRef.current) {\n authStoreRef.current = new AuthStore();\n }\n const authStore = authStoreRef.current;\n\n useEffect(() => {\n authStore.start();\n return () => authStore.stop();\n }, [authStore]);\n\n const client = useMemo(\n () =>\n new FanappsClient({\n apiKey,\n project,\n baseUrl,\n getIdToken: () => authStore.getCurrentIdToken(),\n }),\n [apiKey, project, baseUrl, authStore],\n );\n\n const resolvedQueryClient = useMemo(\n () => queryClient ?? new QueryClient(),\n [queryClient],\n );\n\n const value = useMemo<FanappsContextValue>(\n () => ({ client, authStore, storage, locale }),\n [client, authStore, storage, locale],\n );\n\n return (\n <QueryClientProvider client={resolvedQueryClient}>\n <FanappsContext.Provider value={value}>\n {children}\n </FanappsContext.Provider>\n </QueryClientProvider>\n );\n}\n","import authImport, { type FirebaseAuthTypes } from '@react-native-firebase/auth';\n\nlet cached: FirebaseAuthTypes.Module | null = null;\n\nexport function firebaseAuth(): FirebaseAuthTypes.Module {\n if (cached) return cached;\n cached = authImport();\n return cached;\n}\n\nexport function resetFirebaseAuthCache(): void {\n cached = null;\n}\n","import type { FirebaseAuthTypes } from '@react-native-firebase/auth';\nimport { firebaseAuth } from './firebaseApp';\nimport type { AuthStatus, AuthUser } from '../types';\n\nexport type AuthListener = (snapshot: AuthStoreSnapshot) => void;\n\nexport interface AuthStoreSnapshot {\n user: AuthUser | null;\n firebaseUser: FirebaseAuthTypes.User | null;\n status: AuthStatus;\n}\n\nfunction mapUser(fb: FirebaseAuthTypes.User | null): AuthUser | null {\n if (!fb) return null;\n return {\n uid: fb.uid,\n email: fb.email,\n displayName: fb.displayName,\n photoURL: fb.photoURL,\n phoneNumber: fb.phoneNumber,\n isAnonymous: fb.isAnonymous,\n providerId: fb.providerId ?? null,\n };\n}\n\nexport class AuthStore {\n private snapshot: AuthStoreSnapshot = {\n user: null,\n firebaseUser: null,\n status: 'loading',\n };\n\n private listeners = new Set<AuthListener>();\n private unsubscribe: (() => void) | null = null;\n\n start(): void {\n if (this.unsubscribe) return;\n this.unsubscribe = firebaseAuth().onAuthStateChanged((fb) => {\n this.snapshot = {\n user: mapUser(fb),\n firebaseUser: fb,\n status: fb ? 'signed-in' : 'signed-out',\n };\n this.emit();\n });\n }\n\n stop(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n }\n\n subscribe(listener: AuthListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n getSnapshot(): AuthStoreSnapshot {\n return this.snapshot;\n }\n\n async getCurrentIdToken(): Promise<string | null> {\n const user = firebaseAuth().currentUser;\n if (!user) return null;\n return user.getIdToken();\n }\n\n private emit(): void {\n for (const l of this.listeners) l(this.snapshot);\n }\n}\n","export class FanappsError extends Error {\n readonly status: number;\n readonly body: unknown;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = 'FanappsError';\n this.status = status;\n this.body = body;\n }\n}\n","import { FanappsError } from './errors';\nimport type {\n Asset,\n CreateEntryInput,\n CreatePushTargetInput,\n Entry,\n PushTarget,\n UpdateEntryInput,\n UploadAssetInput,\n} from './types';\n\nexport interface FanappsClientOptions {\n apiKey: string;\n project: string;\n baseUrl: string;\n getIdToken?: () => Promise<string | null>;\n}\n\nexport type QueryParams = Record<string, unknown>;\n\nexport class FanappsClient {\n private readonly apiKey: string;\n private readonly project: string;\n private readonly baseUrl: string;\n private readonly getIdToken?: () => Promise<string | null>;\n\n constructor(options: FanappsClientOptions) {\n this.apiKey = options.apiKey;\n this.project = options.project;\n this.baseUrl = options.baseUrl.replace(/\\/$/, '');\n this.getIdToken = options.getIdToken;\n }\n\n get<T>(path: string, params?: QueryParams, signal?: AbortSignal): Promise<T> {\n return this.request<T>('GET', path, { params, signal });\n }\n\n post<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {\n return this.request<T>('POST', path, { body, signal });\n }\n\n patch<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {\n return this.request<T>('PATCH', path, { body, signal });\n }\n\n delete<T>(path: string, signal?: AbortSignal): Promise<T> {\n return this.request<T>('DELETE', path, { signal });\n }\n\n async createPushTarget(input: CreatePushTargetInput): Promise<PushTarget> {\n const response = await this.post<{ data: PushTarget }>(\n '/api/account/targets/push',\n input,\n );\n return response.data;\n }\n\n async updatePushTarget(\n targetId: string,\n identifier: string,\n ): Promise<PushTarget> {\n const response = await this.patch<{ data: PushTarget }>(\n `/api/account/targets/push/${encodeURIComponent(targetId)}`,\n { identifier },\n );\n return response.data;\n }\n\n async deletePushTarget(targetId: string): Promise<void> {\n await this.delete<void>(\n `/api/account/targets/push/${encodeURIComponent(targetId)}`,\n );\n }\n\n async createEntry(input: CreateEntryInput): Promise<Entry> {\n return this.post<Entry>('/api/entries', toEntryBody(input));\n }\n\n async updateEntry({ id, ...rest }: UpdateEntryInput): Promise<Entry> {\n return this.patch<Entry>(\n `/api/entries/${encodeURIComponent(String(id))}`,\n toEntryBody(rest),\n );\n }\n\n async deleteEntry(id: string | number): Promise<void> {\n await this.delete<void>(\n `/api/entries/${encodeURIComponent(String(id))}`,\n );\n }\n\n async uploadAsset(input: UploadAssetInput): Promise<Asset> {\n const form = new FormData();\n form.append('file', input.file as unknown as Blob);\n if (input.altText !== undefined) {\n form.append('alt_text', input.altText);\n }\n const response = await this.requestMultipart<{ data: Asset }>(\n '/api/assets',\n form,\n );\n return response.data;\n }\n\n private async requestMultipart<T>(\n path: string,\n form: FormData,\n signal?: AbortSignal,\n ): Promise<T> {\n const url = this.buildUrl(path);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'X-Tenant': this.project,\n Accept: 'application/json',\n };\n\n if (this.getIdToken) {\n const idToken = await this.getIdToken();\n if (idToken) {\n headers['X-Firebase-Token'] = idToken;\n }\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: form,\n signal,\n });\n\n const raw = await response.text();\n const payload = raw.length > 0 ? safeJson(raw) : null;\n\n if (!response.ok) {\n const message =\n (payload && typeof payload === 'object' && 'message' in payload\n ? String((payload as { message: unknown }).message)\n : null) ?? `Fanapps request failed with status ${response.status}`;\n throw new FanappsError(message, response.status, payload);\n }\n\n return payload as T;\n }\n\n private async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n path: string,\n opts: { params?: QueryParams; body?: unknown; signal?: AbortSignal },\n ): Promise<T> {\n const url = this.buildUrl(path, opts.params);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'X-Tenant': this.project,\n Accept: 'application/json',\n };\n\n if (this.getIdToken) {\n const idToken = await this.getIdToken();\n if (idToken) {\n headers['X-Firebase-Token'] = idToken;\n }\n }\n\n const init: RequestInit = { method, headers, signal: opts.signal };\n\n if (opts.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(opts.body);\n }\n\n const response = await fetch(url, init);\n\n const raw = await response.text();\n const payload = raw.length > 0 ? safeJson(raw) : null;\n\n if (!response.ok) {\n const message =\n (payload && typeof payload === 'object' && 'message' in payload\n ? String((payload as { message: unknown }).message)\n : null) ?? `Fanapps request failed with status ${response.status}`;\n throw new FanappsError(message, response.status, payload);\n }\n\n return payload as T;\n }\n\n private buildUrl(path: string, params?: QueryParams): string {\n const base = path.startsWith('/')\n ? `${this.baseUrl}${path}`\n : `${this.baseUrl}/${path}`;\n if (!params) return base;\n const query = serializeParams(params);\n return query.length > 0 ? `${base}?${query}` : base;\n }\n}\n\nfunction serializeParams(params: QueryParams): string {\n const parts: string[] = [];\n appendParams(parts, params);\n return parts.join('&');\n}\n\nfunction appendParams(parts: string[], value: unknown, prefix?: string): void {\n if (value === undefined || value === null) return;\n\n if (Array.isArray(value)) {\n if (!prefix) return;\n for (const item of value) {\n if (item === undefined || item === null) continue;\n parts.push(`${encodeURIComponent(prefix)}[]=${encodeURIComponent(String(item))}`);\n }\n return;\n }\n\n if (typeof value === 'object') {\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n const nextKey = prefix ? `${prefix}[${key}]` : key;\n appendParams(parts, child, nextKey);\n }\n return;\n }\n\n if (!prefix) return;\n parts.push(`${encodeURIComponent(prefix)}=${encodeURIComponent(String(value))}`);\n}\n\nfunction safeJson(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nfunction toEntryBody(\n input: Omit<CreateEntryInput, never> | Omit<UpdateEntryInput, 'id'>,\n): Record<string, unknown> {\n const { publishedAt, ...rest } = input as Record<string, unknown> & {\n publishedAt?: string | null;\n };\n const body: Record<string, unknown> = { ...rest };\n if (publishedAt !== undefined) {\n body.published_at = publishedAt;\n }\n return body;\n}\n","import { createContext, useContext } from 'react';\nimport type { AuthStore } from './auth/authStore';\nimport type { FanappsClient } from './client';\nimport type { StorageAdapter } from './storage';\nimport type { Locale } from './types';\n\nexport interface FanappsContextValue {\n client: FanappsClient;\n authStore: AuthStore;\n storage: StorageAdapter | undefined;\n locale?: Locale;\n}\n\nexport const FanappsContext = createContext<FanappsContextValue | null>(null);\n\nexport function useFanapps(): FanappsContextValue {\n const ctx = useContext(FanappsContext);\n if (!ctx) {\n throw new Error(\n '@fanapps/react-native: useFanapps must be used inside <FanappsProvider>.',\n );\n }\n return ctx;\n}\n","export class FanappsAuthError extends Error {\n readonly code: string;\n\n constructor(message: string, code: string) {\n super(message);\n this.name = 'FanappsAuthError';\n this.code = code;\n }\n}\n","import { useFanapps } from '../context';\nimport type { FanappsClient } from '../client';\n\nexport function useFanappsClient(): FanappsClient {\n return useFanapps().client;\n}\n","import { useSyncExternalStore, useCallback } from 'react';\nimport { firebaseAuth } from '../auth/firebaseApp';\nimport { useFanapps } from '../context';\nimport type { AuthStatus, AuthUser } from '../types';\n\nexport interface UseAuthResult {\n user: AuthUser | null;\n status: AuthStatus;\n signInWithEmail(email: string, password: string): Promise<AuthUser>;\n signUpWithEmail(email: string, password: string): Promise<AuthUser>;\n sendPasswordResetEmail(email: string): Promise<void>;\n sendEmailVerification(): Promise<void>;\n signOut(): Promise<void>;\n}\n\nexport function useAuth(): UseAuthResult {\n const { authStore } = useFanapps();\n\n const snapshot = useSyncExternalStore(\n (listener) => authStore.subscribe(listener),\n () => authStore.getSnapshot(),\n () => authStore.getSnapshot(),\n );\n\n const signInWithEmail = useCallback(\n async (email: string, password: string) => {\n const cred = await firebaseAuth().signInWithEmailAndPassword(email, password);\n return authStore.getSnapshot().user ?? mapMinimal(cred.user);\n },\n [authStore],\n );\n\n const signUpWithEmail = useCallback(\n async (email: string, password: string) => {\n const cred = await firebaseAuth().createUserWithEmailAndPassword(email, password);\n return authStore.getSnapshot().user ?? mapMinimal(cred.user);\n },\n [authStore],\n );\n\n const sendPasswordResetEmail = useCallback(async (email: string) => {\n await firebaseAuth().sendPasswordResetEmail(email);\n }, []);\n\n const sendEmailVerification = useCallback(async () => {\n const current = firebaseAuth().currentUser;\n if (!current) throw new Error('No signed-in user to verify.');\n await current.sendEmailVerification();\n }, []);\n\n const signOut = useCallback(async () => {\n await firebaseAuth().signOut();\n }, []);\n\n return {\n user: snapshot.user,\n status: snapshot.status,\n signInWithEmail,\n signUpWithEmail,\n sendPasswordResetEmail,\n sendEmailVerification,\n signOut,\n };\n}\n\ninterface MinimalFirebaseUser {\n uid: string;\n email: string | null;\n displayName: string | null;\n photoURL: string | null;\n phoneNumber: string | null;\n isAnonymous: boolean;\n providerId?: string | null;\n}\n\nfunction mapMinimal(fb: MinimalFirebaseUser): AuthUser {\n return {\n uid: fb.uid,\n email: fb.email,\n displayName: fb.displayName,\n photoURL: fb.photoURL,\n phoneNumber: fb.phoneNumber,\n isAnonymous: fb.isAnonymous,\n providerId: fb.providerId ?? null,\n };\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Entry, EntryFilters, HookOptions, Paginated } from '../types';\n\n/**\n * Fetch a paginated list of entries.\n *\n * Supports filtering by blueprint field values via `filter.field`. The handle\n * keys must match fields defined on the blueprint passed in `filter.blueprint`\n * (or the top-level `blueprint`); unknown handles return 422 from the API.\n * Translatable fields are matched in the active locale with fallback.\n *\n * @example\n * ```ts\n * // Filter entries by a blueprint field value\n * useEntries({\n * blueprint: 'news',\n * filter: {\n * field: { category: 'sports', region: 'eu' },\n * },\n * sort: '-published_at',\n * });\n * ```\n */\nexport function useEntries(\n filters: EntryFilters = {},\n options: HookOptions = {},\n): UseQueryResult<Paginated<Entry>> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'entries', { locale, ...filters }],\n queryFn: ({ signal }) =>\n client.get<Paginated<Entry>>('/api/entries', { ...filters, locale }, signal),\n enabled: options.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Entry, HookOptions } from '../types';\n\nexport function useEntry(\n id: string | number | null | undefined,\n options: HookOptions = {},\n): UseQueryResult<Entry> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'entry', id, { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Entry }>(\n `/api/entries/${id}`,\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: (options.enabled ?? true) && id != null && id !== '',\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { CreateEntryInput, Entry } from '../types';\n\nexport function useCreateEntry(): UseMutationResult<\n Entry,\n FanappsError,\n CreateEntryInput\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input) => client.createEntry(input),\n onSuccess: (entry) => {\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'entries'] });\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'entry', entry.id],\n });\n },\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { Entry, UpdateEntryInput } from '../types';\n\nexport function useUpdateEntry(): UseMutationResult<\n Entry,\n FanappsError,\n UpdateEntryInput\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input) => client.updateEntry(input),\n onSuccess: (entry, variables) => {\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'entries'] });\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'entry', variables.id],\n });\n if (entry.id !== variables.id) {\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'entry', entry.id],\n });\n }\n },\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\n\nexport function useDeleteEntry(): UseMutationResult<\n void,\n FanappsError,\n string | number\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id) => client.deleteEntry(id),\n onSuccess: (_result, id) => {\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'entries'] });\n queryClient.removeQueries({ queryKey: ['fanapps', 'entry', id] });\n },\n });\n}\n","import { useMutation, type UseMutationResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { Asset, UploadAssetInput } from '../types';\n\nexport function useUploadAsset(): UseMutationResult<\n Asset,\n FanappsError,\n UploadAssetInput\n> {\n const { client } = useFanapps();\n\n return useMutation({\n mutationFn: (input) => client.uploadAsset(input),\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Article, ArticleFilters, HookOptions, Paginated } from '../types';\n\nexport function useArticles(\n filters: ArticleFilters = {},\n options: HookOptions = {},\n): UseQueryResult<Paginated<Article>> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'articles', { locale, ...filters }],\n queryFn: ({ signal }) =>\n client.get<Paginated<Article>>('/api/articles', { ...filters, locale }, signal),\n enabled: options.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Article, HookOptions } from '../types';\n\nexport function useArticle(\n id: string | number | null | undefined,\n options: HookOptions = {},\n): UseQueryResult<Article> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'article', id, { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Article }>(\n `/api/articles/${id}`,\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: (options.enabled ?? true) && id != null && id !== '',\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { HookOptions, Trivia } from '../types';\n\nexport function useTrivias(\n options: HookOptions = {},\n): UseQueryResult<Trivia[]> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'trivias', { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Trivia[] }>(\n '/api/trivias',\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: options.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { HookOptions, Trivia } from '../types';\n\nexport function useTrivia(\n id: string | number | null | undefined,\n options: HookOptions = {},\n): UseQueryResult<Trivia> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'trivia', id, { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Trivia }>(\n `/api/trivias/${id}`,\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: (options.enabled ?? true) && id != null && id !== '',\n });\n}\n","import { useMutation, useQueryClient, type UseMutationResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { TriviaResponseResult } from '../types';\n\nexport interface SubmitTriviaResponseInput {\n triviaId: string | number;\n answerId: string | number;\n}\n\nexport function useSubmitTriviaResponse(): UseMutationResult<\n TriviaResponseResult,\n FanappsError,\n SubmitTriviaResponseInput\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({ triviaId, answerId }) =>\n client.post<TriviaResponseResult>(`/api/trivias/${triviaId}/respond`, {\n answer_id: answerId,\n }),\n onSuccess: (_result, variables) => {\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'trivia', variables.triviaId],\n });\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'trivias'] });\n },\n });\n}\n"],"mappings":"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","names":["import_react","authImport","import_react","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query","import_react_query"]}
|
package/dist/index.mjs
CHANGED
|
@@ -206,22 +206,28 @@ var FanappsClient = class {
|
|
|
206
206
|
};
|
|
207
207
|
function serializeParams(params) {
|
|
208
208
|
const parts = [];
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
209
|
+
appendParams(parts, params);
|
|
210
|
+
return parts.join("&");
|
|
211
|
+
}
|
|
212
|
+
function appendParams(parts, value, prefix) {
|
|
213
|
+
if (value === void 0 || value === null) return;
|
|
214
|
+
if (Array.isArray(value)) {
|
|
215
|
+
if (!prefix) return;
|
|
216
|
+
for (const item of value) {
|
|
217
|
+
if (item === void 0 || item === null) continue;
|
|
218
|
+
parts.push(`${encodeURIComponent(prefix)}[]=${encodeURIComponent(String(item))}`);
|
|
219
219
|
}
|
|
220
|
-
|
|
221
|
-
`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`
|
|
222
|
-
);
|
|
220
|
+
return;
|
|
223
221
|
}
|
|
224
|
-
|
|
222
|
+
if (typeof value === "object") {
|
|
223
|
+
for (const [key, child] of Object.entries(value)) {
|
|
224
|
+
const nextKey = prefix ? `${prefix}[${key}]` : key;
|
|
225
|
+
appendParams(parts, child, nextKey);
|
|
226
|
+
}
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (!prefix) return;
|
|
230
|
+
parts.push(`${encodeURIComponent(prefix)}=${encodeURIComponent(String(value))}`);
|
|
225
231
|
}
|
|
226
232
|
function safeJson(raw) {
|
|
227
233
|
try {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider.tsx","../src/auth/firebaseApp.ts","../src/auth/authStore.ts","../src/errors.ts","../src/client.ts","../src/context.ts","../src/auth/errors.ts","../src/hooks/useFanappsClient.ts","../src/hooks/useAuth.ts","../src/hooks/useEntries.ts","../src/hooks/useEntry.ts","../src/hooks/useCreateEntry.ts","../src/hooks/useUpdateEntry.ts","../src/hooks/useDeleteEntry.ts","../src/hooks/useUploadAsset.ts","../src/hooks/useArticles.ts","../src/hooks/useArticle.ts","../src/hooks/useTrivias.ts","../src/hooks/useTrivia.ts","../src/hooks/useSubmitTriviaResponse.ts"],"sourcesContent":["import { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { useEffect, useMemo, useRef, type ReactNode } from 'react';\nimport { AuthStore } from './auth/authStore';\nimport { FanappsClient } from './client';\nimport { FanappsContext, type FanappsContextValue } from './context';\nimport type { StorageAdapter } from './storage';\nimport type { Locale } from './types';\n\nconst DEFAULT_BASE_URL = 'https://fanapps.app';\n\nexport interface FanappsProviderProps {\n apiKey: string;\n project: string;\n locale?: Locale;\n baseUrl?: string;\n queryClient?: QueryClient;\n storage?: StorageAdapter;\n children: ReactNode;\n}\n\nexport function FanappsProvider({\n apiKey,\n project,\n locale,\n baseUrl = DEFAULT_BASE_URL,\n queryClient,\n storage,\n children,\n}: FanappsProviderProps) {\n const authStoreRef = useRef<AuthStore | null>(null);\n if (!authStoreRef.current) {\n authStoreRef.current = new AuthStore();\n }\n const authStore = authStoreRef.current;\n\n useEffect(() => {\n authStore.start();\n return () => authStore.stop();\n }, [authStore]);\n\n const client = useMemo(\n () =>\n new FanappsClient({\n apiKey,\n project,\n baseUrl,\n getIdToken: () => authStore.getCurrentIdToken(),\n }),\n [apiKey, project, baseUrl, authStore],\n );\n\n const resolvedQueryClient = useMemo(\n () => queryClient ?? new QueryClient(),\n [queryClient],\n );\n\n const value = useMemo<FanappsContextValue>(\n () => ({ client, authStore, storage, locale }),\n [client, authStore, storage, locale],\n );\n\n return (\n <QueryClientProvider client={resolvedQueryClient}>\n <FanappsContext.Provider value={value}>\n {children}\n </FanappsContext.Provider>\n </QueryClientProvider>\n );\n}\n","import authImport, { type FirebaseAuthTypes } from '@react-native-firebase/auth';\n\nlet cached: FirebaseAuthTypes.Module | null = null;\n\nexport function firebaseAuth(): FirebaseAuthTypes.Module {\n if (cached) return cached;\n cached = authImport();\n return cached;\n}\n\nexport function resetFirebaseAuthCache(): void {\n cached = null;\n}\n","import type { FirebaseAuthTypes } from '@react-native-firebase/auth';\nimport { firebaseAuth } from './firebaseApp';\nimport type { AuthStatus, AuthUser } from '../types';\n\nexport type AuthListener = (snapshot: AuthStoreSnapshot) => void;\n\nexport interface AuthStoreSnapshot {\n user: AuthUser | null;\n firebaseUser: FirebaseAuthTypes.User | null;\n status: AuthStatus;\n}\n\nfunction mapUser(fb: FirebaseAuthTypes.User | null): AuthUser | null {\n if (!fb) return null;\n return {\n uid: fb.uid,\n email: fb.email,\n displayName: fb.displayName,\n photoURL: fb.photoURL,\n phoneNumber: fb.phoneNumber,\n isAnonymous: fb.isAnonymous,\n providerId: fb.providerId ?? null,\n };\n}\n\nexport class AuthStore {\n private snapshot: AuthStoreSnapshot = {\n user: null,\n firebaseUser: null,\n status: 'loading',\n };\n\n private listeners = new Set<AuthListener>();\n private unsubscribe: (() => void) | null = null;\n\n start(): void {\n if (this.unsubscribe) return;\n this.unsubscribe = firebaseAuth().onAuthStateChanged((fb) => {\n this.snapshot = {\n user: mapUser(fb),\n firebaseUser: fb,\n status: fb ? 'signed-in' : 'signed-out',\n };\n this.emit();\n });\n }\n\n stop(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n }\n\n subscribe(listener: AuthListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n getSnapshot(): AuthStoreSnapshot {\n return this.snapshot;\n }\n\n async getCurrentIdToken(): Promise<string | null> {\n const user = firebaseAuth().currentUser;\n if (!user) return null;\n return user.getIdToken();\n }\n\n private emit(): void {\n for (const l of this.listeners) l(this.snapshot);\n }\n}\n","export class FanappsError extends Error {\n readonly status: number;\n readonly body: unknown;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = 'FanappsError';\n this.status = status;\n this.body = body;\n }\n}\n","import { FanappsError } from './errors';\nimport type {\n Asset,\n CreateEntryInput,\n CreatePushTargetInput,\n Entry,\n PushTarget,\n UpdateEntryInput,\n UploadAssetInput,\n} from './types';\n\nexport interface FanappsClientOptions {\n apiKey: string;\n project: string;\n baseUrl: string;\n getIdToken?: () => Promise<string | null>;\n}\n\nexport type QueryParams = Record<string, unknown>;\n\nexport class FanappsClient {\n private readonly apiKey: string;\n private readonly project: string;\n private readonly baseUrl: string;\n private readonly getIdToken?: () => Promise<string | null>;\n\n constructor(options: FanappsClientOptions) {\n this.apiKey = options.apiKey;\n this.project = options.project;\n this.baseUrl = options.baseUrl.replace(/\\/$/, '');\n this.getIdToken = options.getIdToken;\n }\n\n get<T>(path: string, params?: QueryParams, signal?: AbortSignal): Promise<T> {\n return this.request<T>('GET', path, { params, signal });\n }\n\n post<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {\n return this.request<T>('POST', path, { body, signal });\n }\n\n patch<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {\n return this.request<T>('PATCH', path, { body, signal });\n }\n\n delete<T>(path: string, signal?: AbortSignal): Promise<T> {\n return this.request<T>('DELETE', path, { signal });\n }\n\n async createPushTarget(input: CreatePushTargetInput): Promise<PushTarget> {\n const response = await this.post<{ data: PushTarget }>(\n '/api/account/targets/push',\n input,\n );\n return response.data;\n }\n\n async updatePushTarget(\n targetId: string,\n identifier: string,\n ): Promise<PushTarget> {\n const response = await this.patch<{ data: PushTarget }>(\n `/api/account/targets/push/${encodeURIComponent(targetId)}`,\n { identifier },\n );\n return response.data;\n }\n\n async deletePushTarget(targetId: string): Promise<void> {\n await this.delete<void>(\n `/api/account/targets/push/${encodeURIComponent(targetId)}`,\n );\n }\n\n async createEntry(input: CreateEntryInput): Promise<Entry> {\n return this.post<Entry>('/api/entries', toEntryBody(input));\n }\n\n async updateEntry({ id, ...rest }: UpdateEntryInput): Promise<Entry> {\n return this.patch<Entry>(\n `/api/entries/${encodeURIComponent(String(id))}`,\n toEntryBody(rest),\n );\n }\n\n async deleteEntry(id: string | number): Promise<void> {\n await this.delete<void>(\n `/api/entries/${encodeURIComponent(String(id))}`,\n );\n }\n\n async uploadAsset(input: UploadAssetInput): Promise<Asset> {\n const form = new FormData();\n form.append('file', input.file as unknown as Blob);\n if (input.altText !== undefined) {\n form.append('alt_text', input.altText);\n }\n const response = await this.requestMultipart<{ data: Asset }>(\n '/api/assets',\n form,\n );\n return response.data;\n }\n\n private async requestMultipart<T>(\n path: string,\n form: FormData,\n signal?: AbortSignal,\n ): Promise<T> {\n const url = this.buildUrl(path);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'X-Tenant': this.project,\n Accept: 'application/json',\n };\n\n if (this.getIdToken) {\n const idToken = await this.getIdToken();\n if (idToken) {\n headers['X-Firebase-Token'] = idToken;\n }\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: form,\n signal,\n });\n\n const raw = await response.text();\n const payload = raw.length > 0 ? safeJson(raw) : null;\n\n if (!response.ok) {\n const message =\n (payload && typeof payload === 'object' && 'message' in payload\n ? String((payload as { message: unknown }).message)\n : null) ?? `Fanapps request failed with status ${response.status}`;\n throw new FanappsError(message, response.status, payload);\n }\n\n return payload as T;\n }\n\n private async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n path: string,\n opts: { params?: QueryParams; body?: unknown; signal?: AbortSignal },\n ): Promise<T> {\n const url = this.buildUrl(path, opts.params);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'X-Tenant': this.project,\n Accept: 'application/json',\n };\n\n if (this.getIdToken) {\n const idToken = await this.getIdToken();\n if (idToken) {\n headers['X-Firebase-Token'] = idToken;\n }\n }\n\n const init: RequestInit = { method, headers, signal: opts.signal };\n\n if (opts.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(opts.body);\n }\n\n const response = await fetch(url, init);\n\n const raw = await response.text();\n const payload = raw.length > 0 ? safeJson(raw) : null;\n\n if (!response.ok) {\n const message =\n (payload && typeof payload === 'object' && 'message' in payload\n ? String((payload as { message: unknown }).message)\n : null) ?? `Fanapps request failed with status ${response.status}`;\n throw new FanappsError(message, response.status, payload);\n }\n\n return payload as T;\n }\n\n private buildUrl(path: string, params?: QueryParams): string {\n const base = path.startsWith('/')\n ? `${this.baseUrl}${path}`\n : `${this.baseUrl}/${path}`;\n if (!params) return base;\n const query = serializeParams(params);\n return query.length > 0 ? `${base}?${query}` : base;\n }\n}\n\nfunction serializeParams(params: QueryParams): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item === undefined || item === null) continue;\n parts.push(\n `${encodeURIComponent(key)}[]=${encodeURIComponent(String(item))}`,\n );\n }\n continue;\n }\n parts.push(\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`,\n );\n }\n return parts.join('&');\n}\n\nfunction safeJson(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nfunction toEntryBody(\n input: Omit<CreateEntryInput, never> | Omit<UpdateEntryInput, 'id'>,\n): Record<string, unknown> {\n const { publishedAt, ...rest } = input as Record<string, unknown> & {\n publishedAt?: string | null;\n };\n const body: Record<string, unknown> = { ...rest };\n if (publishedAt !== undefined) {\n body.published_at = publishedAt;\n }\n return body;\n}\n","import { createContext, useContext } from 'react';\nimport type { AuthStore } from './auth/authStore';\nimport type { FanappsClient } from './client';\nimport type { StorageAdapter } from './storage';\nimport type { Locale } from './types';\n\nexport interface FanappsContextValue {\n client: FanappsClient;\n authStore: AuthStore;\n storage: StorageAdapter | undefined;\n locale?: Locale;\n}\n\nexport const FanappsContext = createContext<FanappsContextValue | null>(null);\n\nexport function useFanapps(): FanappsContextValue {\n const ctx = useContext(FanappsContext);\n if (!ctx) {\n throw new Error(\n '@fanapps/react-native: useFanapps must be used inside <FanappsProvider>.',\n );\n }\n return ctx;\n}\n","export class FanappsAuthError extends Error {\n readonly code: string;\n\n constructor(message: string, code: string) {\n super(message);\n this.name = 'FanappsAuthError';\n this.code = code;\n }\n}\n","import { useFanapps } from '../context';\nimport type { FanappsClient } from '../client';\n\nexport function useFanappsClient(): FanappsClient {\n return useFanapps().client;\n}\n","import { useSyncExternalStore, useCallback } from 'react';\nimport { firebaseAuth } from '../auth/firebaseApp';\nimport { useFanapps } from '../context';\nimport type { AuthStatus, AuthUser } from '../types';\n\nexport interface UseAuthResult {\n user: AuthUser | null;\n status: AuthStatus;\n signInWithEmail(email: string, password: string): Promise<AuthUser>;\n signUpWithEmail(email: string, password: string): Promise<AuthUser>;\n sendPasswordResetEmail(email: string): Promise<void>;\n sendEmailVerification(): Promise<void>;\n signOut(): Promise<void>;\n}\n\nexport function useAuth(): UseAuthResult {\n const { authStore } = useFanapps();\n\n const snapshot = useSyncExternalStore(\n (listener) => authStore.subscribe(listener),\n () => authStore.getSnapshot(),\n () => authStore.getSnapshot(),\n );\n\n const signInWithEmail = useCallback(\n async (email: string, password: string) => {\n const cred = await firebaseAuth().signInWithEmailAndPassword(email, password);\n return authStore.getSnapshot().user ?? mapMinimal(cred.user);\n },\n [authStore],\n );\n\n const signUpWithEmail = useCallback(\n async (email: string, password: string) => {\n const cred = await firebaseAuth().createUserWithEmailAndPassword(email, password);\n return authStore.getSnapshot().user ?? mapMinimal(cred.user);\n },\n [authStore],\n );\n\n const sendPasswordResetEmail = useCallback(async (email: string) => {\n await firebaseAuth().sendPasswordResetEmail(email);\n }, []);\n\n const sendEmailVerification = useCallback(async () => {\n const current = firebaseAuth().currentUser;\n if (!current) throw new Error('No signed-in user to verify.');\n await current.sendEmailVerification();\n }, []);\n\n const signOut = useCallback(async () => {\n await firebaseAuth().signOut();\n }, []);\n\n return {\n user: snapshot.user,\n status: snapshot.status,\n signInWithEmail,\n signUpWithEmail,\n sendPasswordResetEmail,\n sendEmailVerification,\n signOut,\n };\n}\n\ninterface MinimalFirebaseUser {\n uid: string;\n email: string | null;\n displayName: string | null;\n photoURL: string | null;\n phoneNumber: string | null;\n isAnonymous: boolean;\n providerId?: string | null;\n}\n\nfunction mapMinimal(fb: MinimalFirebaseUser): AuthUser {\n return {\n uid: fb.uid,\n email: fb.email,\n displayName: fb.displayName,\n photoURL: fb.photoURL,\n phoneNumber: fb.phoneNumber,\n isAnonymous: fb.isAnonymous,\n providerId: fb.providerId ?? null,\n };\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Entry, EntryFilters, HookOptions, Paginated } from '../types';\n\nexport function useEntries(\n filters: EntryFilters = {},\n options: HookOptions = {},\n): UseQueryResult<Paginated<Entry>> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'entries', { locale, ...filters }],\n queryFn: ({ signal }) =>\n client.get<Paginated<Entry>>('/api/entries', { ...filters, locale }, signal),\n enabled: options.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Entry, HookOptions } from '../types';\n\nexport function useEntry(\n id: string | number | null | undefined,\n options: HookOptions = {},\n): UseQueryResult<Entry> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'entry', id, { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Entry }>(\n `/api/entries/${id}`,\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: (options.enabled ?? true) && id != null && id !== '',\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { CreateEntryInput, Entry } from '../types';\n\nexport function useCreateEntry(): UseMutationResult<\n Entry,\n FanappsError,\n CreateEntryInput\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input) => client.createEntry(input),\n onSuccess: (entry) => {\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'entries'] });\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'entry', entry.id],\n });\n },\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { Entry, UpdateEntryInput } from '../types';\n\nexport function useUpdateEntry(): UseMutationResult<\n Entry,\n FanappsError,\n UpdateEntryInput\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input) => client.updateEntry(input),\n onSuccess: (entry, variables) => {\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'entries'] });\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'entry', variables.id],\n });\n if (entry.id !== variables.id) {\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'entry', entry.id],\n });\n }\n },\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\n\nexport function useDeleteEntry(): UseMutationResult<\n void,\n FanappsError,\n string | number\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id) => client.deleteEntry(id),\n onSuccess: (_result, id) => {\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'entries'] });\n queryClient.removeQueries({ queryKey: ['fanapps', 'entry', id] });\n },\n });\n}\n","import { useMutation, type UseMutationResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { Asset, UploadAssetInput } from '../types';\n\nexport function useUploadAsset(): UseMutationResult<\n Asset,\n FanappsError,\n UploadAssetInput\n> {\n const { client } = useFanapps();\n\n return useMutation({\n mutationFn: (input) => client.uploadAsset(input),\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Article, ArticleFilters, HookOptions, Paginated } from '../types';\n\nexport function useArticles(\n filters: ArticleFilters = {},\n options: HookOptions = {},\n): UseQueryResult<Paginated<Article>> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'articles', { locale, ...filters }],\n queryFn: ({ signal }) =>\n client.get<Paginated<Article>>('/api/articles', { ...filters, locale }, signal),\n enabled: options.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Article, HookOptions } from '../types';\n\nexport function useArticle(\n id: string | number | null | undefined,\n options: HookOptions = {},\n): UseQueryResult<Article> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'article', id, { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Article }>(\n `/api/articles/${id}`,\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: (options.enabled ?? true) && id != null && id !== '',\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { HookOptions, Trivia } from '../types';\n\nexport function useTrivias(\n options: HookOptions = {},\n): UseQueryResult<Trivia[]> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'trivias', { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Trivia[] }>(\n '/api/trivias',\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: options.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { HookOptions, Trivia } from '../types';\n\nexport function useTrivia(\n id: string | number | null | undefined,\n options: HookOptions = {},\n): UseQueryResult<Trivia> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'trivia', id, { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Trivia }>(\n `/api/trivias/${id}`,\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: (options.enabled ?? true) && id != null && id !== '',\n });\n}\n","import { useMutation, useQueryClient, type UseMutationResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { TriviaResponseResult } from '../types';\n\nexport interface SubmitTriviaResponseInput {\n triviaId: string | number;\n answerId: string | number;\n}\n\nexport function useSubmitTriviaResponse(): UseMutationResult<\n TriviaResponseResult,\n FanappsError,\n SubmitTriviaResponseInput\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({ triviaId, answerId }) =>\n client.post<TriviaResponseResult>(`/api/trivias/${triviaId}/respond`, {\n answer_id: answerId,\n }),\n onSuccess: (_result, variables) => {\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'trivia', variables.triviaId],\n });\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'trivias'] });\n },\n });\n}\n"],"mappings":"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","names":["useQuery","useQuery","useMutation","useQueryClient","useQueryClient","useMutation","useMutation","useQueryClient","useQueryClient","useMutation","useMutation","useMutation","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useMutation","useQueryClient","useQueryClient","useMutation"]}
|
|
1
|
+
{"version":3,"sources":["../src/provider.tsx","../src/auth/firebaseApp.ts","../src/auth/authStore.ts","../src/errors.ts","../src/client.ts","../src/context.ts","../src/auth/errors.ts","../src/hooks/useFanappsClient.ts","../src/hooks/useAuth.ts","../src/hooks/useEntries.ts","../src/hooks/useEntry.ts","../src/hooks/useCreateEntry.ts","../src/hooks/useUpdateEntry.ts","../src/hooks/useDeleteEntry.ts","../src/hooks/useUploadAsset.ts","../src/hooks/useArticles.ts","../src/hooks/useArticle.ts","../src/hooks/useTrivias.ts","../src/hooks/useTrivia.ts","../src/hooks/useSubmitTriviaResponse.ts"],"sourcesContent":["import { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { useEffect, useMemo, useRef, type ReactNode } from 'react';\nimport { AuthStore } from './auth/authStore';\nimport { FanappsClient } from './client';\nimport { FanappsContext, type FanappsContextValue } from './context';\nimport type { StorageAdapter } from './storage';\nimport type { Locale } from './types';\n\nconst DEFAULT_BASE_URL = 'https://fanapps.app';\n\nexport interface FanappsProviderProps {\n apiKey: string;\n project: string;\n locale?: Locale;\n baseUrl?: string;\n queryClient?: QueryClient;\n storage?: StorageAdapter;\n children: ReactNode;\n}\n\nexport function FanappsProvider({\n apiKey,\n project,\n locale,\n baseUrl = DEFAULT_BASE_URL,\n queryClient,\n storage,\n children,\n}: FanappsProviderProps) {\n const authStoreRef = useRef<AuthStore | null>(null);\n if (!authStoreRef.current) {\n authStoreRef.current = new AuthStore();\n }\n const authStore = authStoreRef.current;\n\n useEffect(() => {\n authStore.start();\n return () => authStore.stop();\n }, [authStore]);\n\n const client = useMemo(\n () =>\n new FanappsClient({\n apiKey,\n project,\n baseUrl,\n getIdToken: () => authStore.getCurrentIdToken(),\n }),\n [apiKey, project, baseUrl, authStore],\n );\n\n const resolvedQueryClient = useMemo(\n () => queryClient ?? new QueryClient(),\n [queryClient],\n );\n\n const value = useMemo<FanappsContextValue>(\n () => ({ client, authStore, storage, locale }),\n [client, authStore, storage, locale],\n );\n\n return (\n <QueryClientProvider client={resolvedQueryClient}>\n <FanappsContext.Provider value={value}>\n {children}\n </FanappsContext.Provider>\n </QueryClientProvider>\n );\n}\n","import authImport, { type FirebaseAuthTypes } from '@react-native-firebase/auth';\n\nlet cached: FirebaseAuthTypes.Module | null = null;\n\nexport function firebaseAuth(): FirebaseAuthTypes.Module {\n if (cached) return cached;\n cached = authImport();\n return cached;\n}\n\nexport function resetFirebaseAuthCache(): void {\n cached = null;\n}\n","import type { FirebaseAuthTypes } from '@react-native-firebase/auth';\nimport { firebaseAuth } from './firebaseApp';\nimport type { AuthStatus, AuthUser } from '../types';\n\nexport type AuthListener = (snapshot: AuthStoreSnapshot) => void;\n\nexport interface AuthStoreSnapshot {\n user: AuthUser | null;\n firebaseUser: FirebaseAuthTypes.User | null;\n status: AuthStatus;\n}\n\nfunction mapUser(fb: FirebaseAuthTypes.User | null): AuthUser | null {\n if (!fb) return null;\n return {\n uid: fb.uid,\n email: fb.email,\n displayName: fb.displayName,\n photoURL: fb.photoURL,\n phoneNumber: fb.phoneNumber,\n isAnonymous: fb.isAnonymous,\n providerId: fb.providerId ?? null,\n };\n}\n\nexport class AuthStore {\n private snapshot: AuthStoreSnapshot = {\n user: null,\n firebaseUser: null,\n status: 'loading',\n };\n\n private listeners = new Set<AuthListener>();\n private unsubscribe: (() => void) | null = null;\n\n start(): void {\n if (this.unsubscribe) return;\n this.unsubscribe = firebaseAuth().onAuthStateChanged((fb) => {\n this.snapshot = {\n user: mapUser(fb),\n firebaseUser: fb,\n status: fb ? 'signed-in' : 'signed-out',\n };\n this.emit();\n });\n }\n\n stop(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n }\n\n subscribe(listener: AuthListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n getSnapshot(): AuthStoreSnapshot {\n return this.snapshot;\n }\n\n async getCurrentIdToken(): Promise<string | null> {\n const user = firebaseAuth().currentUser;\n if (!user) return null;\n return user.getIdToken();\n }\n\n private emit(): void {\n for (const l of this.listeners) l(this.snapshot);\n }\n}\n","export class FanappsError extends Error {\n readonly status: number;\n readonly body: unknown;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = 'FanappsError';\n this.status = status;\n this.body = body;\n }\n}\n","import { FanappsError } from './errors';\nimport type {\n Asset,\n CreateEntryInput,\n CreatePushTargetInput,\n Entry,\n PushTarget,\n UpdateEntryInput,\n UploadAssetInput,\n} from './types';\n\nexport interface FanappsClientOptions {\n apiKey: string;\n project: string;\n baseUrl: string;\n getIdToken?: () => Promise<string | null>;\n}\n\nexport type QueryParams = Record<string, unknown>;\n\nexport class FanappsClient {\n private readonly apiKey: string;\n private readonly project: string;\n private readonly baseUrl: string;\n private readonly getIdToken?: () => Promise<string | null>;\n\n constructor(options: FanappsClientOptions) {\n this.apiKey = options.apiKey;\n this.project = options.project;\n this.baseUrl = options.baseUrl.replace(/\\/$/, '');\n this.getIdToken = options.getIdToken;\n }\n\n get<T>(path: string, params?: QueryParams, signal?: AbortSignal): Promise<T> {\n return this.request<T>('GET', path, { params, signal });\n }\n\n post<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {\n return this.request<T>('POST', path, { body, signal });\n }\n\n patch<T>(path: string, body?: unknown, signal?: AbortSignal): Promise<T> {\n return this.request<T>('PATCH', path, { body, signal });\n }\n\n delete<T>(path: string, signal?: AbortSignal): Promise<T> {\n return this.request<T>('DELETE', path, { signal });\n }\n\n async createPushTarget(input: CreatePushTargetInput): Promise<PushTarget> {\n const response = await this.post<{ data: PushTarget }>(\n '/api/account/targets/push',\n input,\n );\n return response.data;\n }\n\n async updatePushTarget(\n targetId: string,\n identifier: string,\n ): Promise<PushTarget> {\n const response = await this.patch<{ data: PushTarget }>(\n `/api/account/targets/push/${encodeURIComponent(targetId)}`,\n { identifier },\n );\n return response.data;\n }\n\n async deletePushTarget(targetId: string): Promise<void> {\n await this.delete<void>(\n `/api/account/targets/push/${encodeURIComponent(targetId)}`,\n );\n }\n\n async createEntry(input: CreateEntryInput): Promise<Entry> {\n return this.post<Entry>('/api/entries', toEntryBody(input));\n }\n\n async updateEntry({ id, ...rest }: UpdateEntryInput): Promise<Entry> {\n return this.patch<Entry>(\n `/api/entries/${encodeURIComponent(String(id))}`,\n toEntryBody(rest),\n );\n }\n\n async deleteEntry(id: string | number): Promise<void> {\n await this.delete<void>(\n `/api/entries/${encodeURIComponent(String(id))}`,\n );\n }\n\n async uploadAsset(input: UploadAssetInput): Promise<Asset> {\n const form = new FormData();\n form.append('file', input.file as unknown as Blob);\n if (input.altText !== undefined) {\n form.append('alt_text', input.altText);\n }\n const response = await this.requestMultipart<{ data: Asset }>(\n '/api/assets',\n form,\n );\n return response.data;\n }\n\n private async requestMultipart<T>(\n path: string,\n form: FormData,\n signal?: AbortSignal,\n ): Promise<T> {\n const url = this.buildUrl(path);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'X-Tenant': this.project,\n Accept: 'application/json',\n };\n\n if (this.getIdToken) {\n const idToken = await this.getIdToken();\n if (idToken) {\n headers['X-Firebase-Token'] = idToken;\n }\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: form,\n signal,\n });\n\n const raw = await response.text();\n const payload = raw.length > 0 ? safeJson(raw) : null;\n\n if (!response.ok) {\n const message =\n (payload && typeof payload === 'object' && 'message' in payload\n ? String((payload as { message: unknown }).message)\n : null) ?? `Fanapps request failed with status ${response.status}`;\n throw new FanappsError(message, response.status, payload);\n }\n\n return payload as T;\n }\n\n private async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n path: string,\n opts: { params?: QueryParams; body?: unknown; signal?: AbortSignal },\n ): Promise<T> {\n const url = this.buildUrl(path, opts.params);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'X-Tenant': this.project,\n Accept: 'application/json',\n };\n\n if (this.getIdToken) {\n const idToken = await this.getIdToken();\n if (idToken) {\n headers['X-Firebase-Token'] = idToken;\n }\n }\n\n const init: RequestInit = { method, headers, signal: opts.signal };\n\n if (opts.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(opts.body);\n }\n\n const response = await fetch(url, init);\n\n const raw = await response.text();\n const payload = raw.length > 0 ? safeJson(raw) : null;\n\n if (!response.ok) {\n const message =\n (payload && typeof payload === 'object' && 'message' in payload\n ? String((payload as { message: unknown }).message)\n : null) ?? `Fanapps request failed with status ${response.status}`;\n throw new FanappsError(message, response.status, payload);\n }\n\n return payload as T;\n }\n\n private buildUrl(path: string, params?: QueryParams): string {\n const base = path.startsWith('/')\n ? `${this.baseUrl}${path}`\n : `${this.baseUrl}/${path}`;\n if (!params) return base;\n const query = serializeParams(params);\n return query.length > 0 ? `${base}?${query}` : base;\n }\n}\n\nfunction serializeParams(params: QueryParams): string {\n const parts: string[] = [];\n appendParams(parts, params);\n return parts.join('&');\n}\n\nfunction appendParams(parts: string[], value: unknown, prefix?: string): void {\n if (value === undefined || value === null) return;\n\n if (Array.isArray(value)) {\n if (!prefix) return;\n for (const item of value) {\n if (item === undefined || item === null) continue;\n parts.push(`${encodeURIComponent(prefix)}[]=${encodeURIComponent(String(item))}`);\n }\n return;\n }\n\n if (typeof value === 'object') {\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n const nextKey = prefix ? `${prefix}[${key}]` : key;\n appendParams(parts, child, nextKey);\n }\n return;\n }\n\n if (!prefix) return;\n parts.push(`${encodeURIComponent(prefix)}=${encodeURIComponent(String(value))}`);\n}\n\nfunction safeJson(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nfunction toEntryBody(\n input: Omit<CreateEntryInput, never> | Omit<UpdateEntryInput, 'id'>,\n): Record<string, unknown> {\n const { publishedAt, ...rest } = input as Record<string, unknown> & {\n publishedAt?: string | null;\n };\n const body: Record<string, unknown> = { ...rest };\n if (publishedAt !== undefined) {\n body.published_at = publishedAt;\n }\n return body;\n}\n","import { createContext, useContext } from 'react';\nimport type { AuthStore } from './auth/authStore';\nimport type { FanappsClient } from './client';\nimport type { StorageAdapter } from './storage';\nimport type { Locale } from './types';\n\nexport interface FanappsContextValue {\n client: FanappsClient;\n authStore: AuthStore;\n storage: StorageAdapter | undefined;\n locale?: Locale;\n}\n\nexport const FanappsContext = createContext<FanappsContextValue | null>(null);\n\nexport function useFanapps(): FanappsContextValue {\n const ctx = useContext(FanappsContext);\n if (!ctx) {\n throw new Error(\n '@fanapps/react-native: useFanapps must be used inside <FanappsProvider>.',\n );\n }\n return ctx;\n}\n","export class FanappsAuthError extends Error {\n readonly code: string;\n\n constructor(message: string, code: string) {\n super(message);\n this.name = 'FanappsAuthError';\n this.code = code;\n }\n}\n","import { useFanapps } from '../context';\nimport type { FanappsClient } from '../client';\n\nexport function useFanappsClient(): FanappsClient {\n return useFanapps().client;\n}\n","import { useSyncExternalStore, useCallback } from 'react';\nimport { firebaseAuth } from '../auth/firebaseApp';\nimport { useFanapps } from '../context';\nimport type { AuthStatus, AuthUser } from '../types';\n\nexport interface UseAuthResult {\n user: AuthUser | null;\n status: AuthStatus;\n signInWithEmail(email: string, password: string): Promise<AuthUser>;\n signUpWithEmail(email: string, password: string): Promise<AuthUser>;\n sendPasswordResetEmail(email: string): Promise<void>;\n sendEmailVerification(): Promise<void>;\n signOut(): Promise<void>;\n}\n\nexport function useAuth(): UseAuthResult {\n const { authStore } = useFanapps();\n\n const snapshot = useSyncExternalStore(\n (listener) => authStore.subscribe(listener),\n () => authStore.getSnapshot(),\n () => authStore.getSnapshot(),\n );\n\n const signInWithEmail = useCallback(\n async (email: string, password: string) => {\n const cred = await firebaseAuth().signInWithEmailAndPassword(email, password);\n return authStore.getSnapshot().user ?? mapMinimal(cred.user);\n },\n [authStore],\n );\n\n const signUpWithEmail = useCallback(\n async (email: string, password: string) => {\n const cred = await firebaseAuth().createUserWithEmailAndPassword(email, password);\n return authStore.getSnapshot().user ?? mapMinimal(cred.user);\n },\n [authStore],\n );\n\n const sendPasswordResetEmail = useCallback(async (email: string) => {\n await firebaseAuth().sendPasswordResetEmail(email);\n }, []);\n\n const sendEmailVerification = useCallback(async () => {\n const current = firebaseAuth().currentUser;\n if (!current) throw new Error('No signed-in user to verify.');\n await current.sendEmailVerification();\n }, []);\n\n const signOut = useCallback(async () => {\n await firebaseAuth().signOut();\n }, []);\n\n return {\n user: snapshot.user,\n status: snapshot.status,\n signInWithEmail,\n signUpWithEmail,\n sendPasswordResetEmail,\n sendEmailVerification,\n signOut,\n };\n}\n\ninterface MinimalFirebaseUser {\n uid: string;\n email: string | null;\n displayName: string | null;\n photoURL: string | null;\n phoneNumber: string | null;\n isAnonymous: boolean;\n providerId?: string | null;\n}\n\nfunction mapMinimal(fb: MinimalFirebaseUser): AuthUser {\n return {\n uid: fb.uid,\n email: fb.email,\n displayName: fb.displayName,\n photoURL: fb.photoURL,\n phoneNumber: fb.phoneNumber,\n isAnonymous: fb.isAnonymous,\n providerId: fb.providerId ?? null,\n };\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Entry, EntryFilters, HookOptions, Paginated } from '../types';\n\n/**\n * Fetch a paginated list of entries.\n *\n * Supports filtering by blueprint field values via `filter.field`. The handle\n * keys must match fields defined on the blueprint passed in `filter.blueprint`\n * (or the top-level `blueprint`); unknown handles return 422 from the API.\n * Translatable fields are matched in the active locale with fallback.\n *\n * @example\n * ```ts\n * // Filter entries by a blueprint field value\n * useEntries({\n * blueprint: 'news',\n * filter: {\n * field: { category: 'sports', region: 'eu' },\n * },\n * sort: '-published_at',\n * });\n * ```\n */\nexport function useEntries(\n filters: EntryFilters = {},\n options: HookOptions = {},\n): UseQueryResult<Paginated<Entry>> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'entries', { locale, ...filters }],\n queryFn: ({ signal }) =>\n client.get<Paginated<Entry>>('/api/entries', { ...filters, locale }, signal),\n enabled: options.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Entry, HookOptions } from '../types';\n\nexport function useEntry(\n id: string | number | null | undefined,\n options: HookOptions = {},\n): UseQueryResult<Entry> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'entry', id, { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Entry }>(\n `/api/entries/${id}`,\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: (options.enabled ?? true) && id != null && id !== '',\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { CreateEntryInput, Entry } from '../types';\n\nexport function useCreateEntry(): UseMutationResult<\n Entry,\n FanappsError,\n CreateEntryInput\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input) => client.createEntry(input),\n onSuccess: (entry) => {\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'entries'] });\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'entry', entry.id],\n });\n },\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { Entry, UpdateEntryInput } from '../types';\n\nexport function useUpdateEntry(): UseMutationResult<\n Entry,\n FanappsError,\n UpdateEntryInput\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input) => client.updateEntry(input),\n onSuccess: (entry, variables) => {\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'entries'] });\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'entry', variables.id],\n });\n if (entry.id !== variables.id) {\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'entry', entry.id],\n });\n }\n },\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\n\nexport function useDeleteEntry(): UseMutationResult<\n void,\n FanappsError,\n string | number\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id) => client.deleteEntry(id),\n onSuccess: (_result, id) => {\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'entries'] });\n queryClient.removeQueries({ queryKey: ['fanapps', 'entry', id] });\n },\n });\n}\n","import { useMutation, type UseMutationResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { Asset, UploadAssetInput } from '../types';\n\nexport function useUploadAsset(): UseMutationResult<\n Asset,\n FanappsError,\n UploadAssetInput\n> {\n const { client } = useFanapps();\n\n return useMutation({\n mutationFn: (input) => client.uploadAsset(input),\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Article, ArticleFilters, HookOptions, Paginated } from '../types';\n\nexport function useArticles(\n filters: ArticleFilters = {},\n options: HookOptions = {},\n): UseQueryResult<Paginated<Article>> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'articles', { locale, ...filters }],\n queryFn: ({ signal }) =>\n client.get<Paginated<Article>>('/api/articles', { ...filters, locale }, signal),\n enabled: options.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { Article, HookOptions } from '../types';\n\nexport function useArticle(\n id: string | number | null | undefined,\n options: HookOptions = {},\n): UseQueryResult<Article> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'article', id, { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Article }>(\n `/api/articles/${id}`,\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: (options.enabled ?? true) && id != null && id !== '',\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { HookOptions, Trivia } from '../types';\n\nexport function useTrivias(\n options: HookOptions = {},\n): UseQueryResult<Trivia[]> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'trivias', { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Trivia[] }>(\n '/api/trivias',\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: options.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { HookOptions, Trivia } from '../types';\n\nexport function useTrivia(\n id: string | number | null | undefined,\n options: HookOptions = {},\n): UseQueryResult<Trivia> {\n const { client, locale: providerLocale } = useFanapps();\n const locale = options.locale ?? providerLocale;\n\n return useQuery({\n queryKey: ['fanapps', 'trivia', id, { locale }],\n queryFn: async ({ signal }) => {\n const response = await client.get<{ data: Trivia }>(\n `/api/trivias/${id}`,\n { locale },\n signal,\n );\n return response.data;\n },\n enabled: (options.enabled ?? true) && id != null && id !== '',\n });\n}\n","import { useMutation, useQueryClient, type UseMutationResult } from '@tanstack/react-query';\nimport { useFanapps } from '../context';\nimport type { FanappsError } from '../errors';\nimport type { TriviaResponseResult } from '../types';\n\nexport interface SubmitTriviaResponseInput {\n triviaId: string | number;\n answerId: string | number;\n}\n\nexport function useSubmitTriviaResponse(): UseMutationResult<\n TriviaResponseResult,\n FanappsError,\n SubmitTriviaResponseInput\n> {\n const { client } = useFanapps();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({ triviaId, answerId }) =>\n client.post<TriviaResponseResult>(`/api/trivias/${triviaId}/respond`, {\n answer_id: answerId,\n }),\n onSuccess: (_result, variables) => {\n queryClient.invalidateQueries({\n queryKey: ['fanapps', 'trivia', variables.triviaId],\n });\n queryClient.invalidateQueries({ queryKey: ['fanapps', 'trivias'] });\n },\n });\n}\n"],"mappings":";AAAA,SAAS,aAAa,2BAA2B;AACjD,SAAS,WAAW,SAAS,cAA8B;;;ACD3D,OAAO,gBAA4C;AAEnD,IAAI,SAA0C;AAEvC,SAAS,eAAyC;AACvD,MAAI,OAAQ,QAAO;AACnB,WAAS,WAAW;AACpB,SAAO;AACT;;;ACIA,SAAS,QAAQ,IAAoD;AACnE,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO;AAAA,IACL,KAAK,GAAG;AAAA,IACR,OAAO,GAAG;AAAA,IACV,aAAa,GAAG;AAAA,IAChB,UAAU,GAAG;AAAA,IACb,aAAa,GAAG;AAAA,IAChB,aAAa,GAAG;AAAA,IAChB,YAAY,GAAG,cAAc;AAAA,EAC/B;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EAAhB;AACL,SAAQ,WAA8B;AAAA,MACpC,MAAM;AAAA,MACN,cAAc;AAAA,MACd,QAAQ;AAAA,IACV;AAEA,SAAQ,YAAY,oBAAI,IAAkB;AAC1C,SAAQ,cAAmC;AAAA;AAAA,EAE3C,QAAc;AACZ,QAAI,KAAK,YAAa;AACtB,SAAK,cAAc,aAAa,EAAE,mBAAmB,CAAC,OAAO;AAC3D,WAAK,WAAW;AAAA,QACd,MAAM,QAAQ,EAAE;AAAA,QAChB,cAAc;AAAA,QACd,QAAQ,KAAK,cAAc;AAAA,MAC7B;AACA,WAAK,KAAK;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAa;AACX,SAAK,cAAc;AACnB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,UAAU,UAAoC;AAC5C,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM;AACX,WAAK,UAAU,OAAO,QAAQ;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,cAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,oBAA4C;AAChD,UAAM,OAAO,aAAa,EAAE;AAC5B,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,OAAa;AACnB,eAAW,KAAK,KAAK,UAAW,GAAE,KAAK,QAAQ;AAAA,EACjD;AACF;;;ACxEO,IAAM,eAAN,cAA2B,MAAM;AAAA,EAItC,YAAY,SAAiB,QAAgB,MAAe;AAC1D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AACF;;;ACUO,IAAM,gBAAN,MAAoB;AAAA,EAMzB,YAAY,SAA+B;AACzC,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ;AACvB,SAAK,UAAU,QAAQ,QAAQ,QAAQ,OAAO,EAAE;AAChD,SAAK,aAAa,QAAQ;AAAA,EAC5B;AAAA,EAEA,IAAO,MAAc,QAAsB,QAAkC;AAC3E,WAAO,KAAK,QAAW,OAAO,MAAM,EAAE,QAAQ,OAAO,CAAC;AAAA,EACxD;AAAA,EAEA,KAAQ,MAAc,MAAgB,QAAkC;AACtE,WAAO,KAAK,QAAW,QAAQ,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EACvD;AAAA,EAEA,MAAS,MAAc,MAAgB,QAAkC;AACvE,WAAO,KAAK,QAAW,SAAS,MAAM,EAAE,MAAM,OAAO,CAAC;AAAA,EACxD;AAAA,EAEA,OAAU,MAAc,QAAkC;AACxD,WAAO,KAAK,QAAW,UAAU,MAAM,EAAE,OAAO,CAAC;AAAA,EACnD;AAAA,EAEA,MAAM,iBAAiB,OAAmD;AACxE,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,iBACJ,UACA,YACqB;AACrB,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,6BAA6B,mBAAmB,QAAQ,CAAC;AAAA,MACzD,EAAE,WAAW;AAAA,IACf;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,iBAAiB,UAAiC;AACtD,UAAM,KAAK;AAAA,MACT,6BAA6B,mBAAmB,QAAQ,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,OAAyC;AACzD,WAAO,KAAK,KAAY,gBAAgB,YAAY,KAAK,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,YAAY,EAAE,IAAI,GAAG,KAAK,GAAqC;AACnE,WAAO,KAAK;AAAA,MACV,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,MAC9C,YAAY,IAAI;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,IAAoC;AACpD,UAAM,KAAK;AAAA,MACT,gBAAgB,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,OAAyC;AACzD,UAAM,OAAO,IAAI,SAAS;AAC1B,SAAK,OAAO,QAAQ,MAAM,IAAuB;AACjD,QAAI,MAAM,YAAY,QAAW;AAC/B,WAAK,OAAO,YAAY,MAAM,OAAO;AAAA,IACvC;AACA,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAc,iBACZ,MACA,MACA,QACY;AACZ,UAAM,MAAM,KAAK,SAAS,IAAI;AAE9B,UAAM,UAAkC;AAAA,MACtC,eAAe,UAAU,KAAK,MAAM;AAAA,MACpC,YAAY,KAAK;AAAA,MACjB,QAAQ;AAAA,IACV;AAEA,QAAI,KAAK,YAAY;AACnB,YAAM,UAAU,MAAM,KAAK,WAAW;AACtC,UAAI,SAAS;AACX,gBAAQ,kBAAkB,IAAI;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAED,UAAM,MAAM,MAAM,SAAS,KAAK;AAChC,UAAM,UAAU,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI;AAEjD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,WACH,WAAW,OAAO,YAAY,YAAY,aAAa,UACpD,OAAQ,QAAiC,OAAO,IAChD,SAAS,sCAAsC,SAAS,MAAM;AACpE,YAAM,IAAI,aAAa,SAAS,SAAS,QAAQ,OAAO;AAAA,IAC1D;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,QACZ,QACA,MACA,MACY;AACZ,UAAM,MAAM,KAAK,SAAS,MAAM,KAAK,MAAM;AAE3C,UAAM,UAAkC;AAAA,MACtC,eAAe,UAAU,KAAK,MAAM;AAAA,MACpC,YAAY,KAAK;AAAA,MACjB,QAAQ;AAAA,IACV;AAEA,QAAI,KAAK,YAAY;AACnB,YAAM,UAAU,MAAM,KAAK,WAAW;AACtC,UAAI,SAAS;AACX,gBAAQ,kBAAkB,IAAI;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,OAAoB,EAAE,QAAQ,SAAS,QAAQ,KAAK,OAAO;AAEjE,QAAI,KAAK,SAAS,QAAW;AAC3B,cAAQ,cAAc,IAAI;AAC1B,WAAK,OAAO,KAAK,UAAU,KAAK,IAAI;AAAA,IACtC;AAEA,UAAM,WAAW,MAAM,MAAM,KAAK,IAAI;AAEtC,UAAM,MAAM,MAAM,SAAS,KAAK;AAChC,UAAM,UAAU,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI;AAEjD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,WACH,WAAW,OAAO,YAAY,YAAY,aAAa,UACpD,OAAQ,QAAiC,OAAO,IAChD,SAAS,sCAAsC,SAAS,MAAM;AACpE,YAAM,IAAI,aAAa,SAAS,SAAS,QAAQ,OAAO;AAAA,IAC1D;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,MAAc,QAA8B;AAC3D,UAAM,OAAO,KAAK,WAAW,GAAG,IAC5B,GAAG,KAAK,OAAO,GAAG,IAAI,KACtB,GAAG,KAAK,OAAO,IAAI,IAAI;AAC3B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,QAAQ,gBAAgB,MAAM;AACpC,WAAO,MAAM,SAAS,IAAI,GAAG,IAAI,IAAI,KAAK,KAAK;AAAA,EACjD;AACF;AAEA,SAAS,gBAAgB,QAA6B;AACpD,QAAM,QAAkB,CAAC;AACzB,eAAa,OAAO,MAAM;AAC1B,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,aAAa,OAAiB,OAAgB,QAAuB;AAC5E,MAAI,UAAU,UAAa,UAAU,KAAM;AAE3C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,CAAC,OAAQ;AACb,eAAW,QAAQ,OAAO;AACxB,UAAI,SAAS,UAAa,SAAS,KAAM;AACzC,YAAM,KAAK,GAAG,mBAAmB,MAAM,CAAC,MAAM,mBAAmB,OAAO,IAAI,CAAC,CAAC,EAAE;AAAA,IAClF;AACA;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAgC,GAAG;AAC3E,YAAM,UAAU,SAAS,GAAG,MAAM,IAAI,GAAG,MAAM;AAC/C,mBAAa,OAAO,OAAO,OAAO;AAAA,IACpC;AACA;AAAA,EACF;AAEA,MAAI,CAAC,OAAQ;AACb,QAAM,KAAK,GAAG,mBAAmB,MAAM,CAAC,IAAI,mBAAmB,OAAO,KAAK,CAAC,CAAC,EAAE;AACjF;AAEA,SAAS,SAAS,KAAsB;AACtC,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YACP,OACyB;AACzB,QAAM,EAAE,aAAa,GAAG,KAAK,IAAI;AAGjC,QAAM,OAAgC,EAAE,GAAG,KAAK;AAChD,MAAI,gBAAgB,QAAW;AAC7B,SAAK,eAAe;AAAA,EACtB;AACA,SAAO;AACT;;;ACvPA,SAAS,eAAe,kBAAkB;AAanC,IAAM,iBAAiB,cAA0C,IAAI;AAErE,SAAS,aAAkC;AAChD,QAAM,MAAM,WAAW,cAAc;AACrC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;ALwCM;AAvDN,IAAM,mBAAmB;AAYlB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,eAAe,OAAyB,IAAI;AAClD,MAAI,CAAC,aAAa,SAAS;AACzB,iBAAa,UAAU,IAAI,UAAU;AAAA,EACvC;AACA,QAAM,YAAY,aAAa;AAE/B,YAAU,MAAM;AACd,cAAU,MAAM;AAChB,WAAO,MAAM,UAAU,KAAK;AAAA,EAC9B,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,SAAS;AAAA,IACb,MACE,IAAI,cAAc;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,MAAM,UAAU,kBAAkB;AAAA,IAChD,CAAC;AAAA,IACH,CAAC,QAAQ,SAAS,SAAS,SAAS;AAAA,EACtC;AAEA,QAAM,sBAAsB;AAAA,IAC1B,MAAM,eAAe,IAAI,YAAY;AAAA,IACrC,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,QAAQ;AAAA,IACZ,OAAO,EAAE,QAAQ,WAAW,SAAS,OAAO;AAAA,IAC5C,CAAC,QAAQ,WAAW,SAAS,MAAM;AAAA,EACrC;AAEA,SACE,oBAAC,uBAAoB,QAAQ,qBAC3B,8BAAC,eAAe,UAAf,EAAwB,OACtB,UACH,GACF;AAEJ;;;AMpEO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAG1C,YAAY,SAAiB,MAAc;AACzC,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;;;ACLO,SAAS,mBAAkC;AAChD,SAAO,WAAW,EAAE;AACtB;;;ACLA,SAAS,sBAAsB,mBAAmB;AAe3C,SAAS,UAAyB;AACvC,QAAM,EAAE,UAAU,IAAI,WAAW;AAEjC,QAAM,WAAW;AAAA,IACf,CAAC,aAAa,UAAU,UAAU,QAAQ;AAAA,IAC1C,MAAM,UAAU,YAAY;AAAA,IAC5B,MAAM,UAAU,YAAY;AAAA,EAC9B;AAEA,QAAM,kBAAkB;AAAA,IACtB,OAAO,OAAe,aAAqB;AACzC,YAAM,OAAO,MAAM,aAAa,EAAE,2BAA2B,OAAO,QAAQ;AAC5E,aAAO,UAAU,YAAY,EAAE,QAAQ,WAAW,KAAK,IAAI;AAAA,IAC7D;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,kBAAkB;AAAA,IACtB,OAAO,OAAe,aAAqB;AACzC,YAAM,OAAO,MAAM,aAAa,EAAE,+BAA+B,OAAO,QAAQ;AAChF,aAAO,UAAU,YAAY,EAAE,QAAQ,WAAW,KAAK,IAAI;AAAA,IAC7D;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,yBAAyB,YAAY,OAAO,UAAkB;AAClE,UAAM,aAAa,EAAE,uBAAuB,KAAK;AAAA,EACnD,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAwB,YAAY,YAAY;AACpD,UAAM,UAAU,aAAa,EAAE;AAC/B,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,8BAA8B;AAC5D,UAAM,QAAQ,sBAAsB;AAAA,EACtC,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,YAAY;AACtC,UAAM,aAAa,EAAE,QAAQ;AAAA,EAC/B,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL,MAAM,SAAS;AAAA,IACf,QAAQ,SAAS;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAYA,SAAS,WAAW,IAAmC;AACrD,SAAO;AAAA,IACL,KAAK,GAAG;AAAA,IACR,OAAO,GAAG;AAAA,IACV,aAAa,GAAG;AAAA,IAChB,UAAU,GAAG;AAAA,IACb,aAAa,GAAG;AAAA,IAChB,aAAa,GAAG;AAAA,IAChB,YAAY,GAAG,cAAc;AAAA,EAC/B;AACF;;;ACrFA,SAAS,gBAAqC;AAwBvC,SAAS,WACd,UAAwB,CAAC,GACzB,UAAuB,CAAC,GACU;AAClC,QAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,WAAW;AACtD,QAAM,SAAS,QAAQ,UAAU;AAEjC,SAAO,SAAS;AAAA,IACd,UAAU,CAAC,WAAW,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAC;AAAA,IACvD,SAAS,CAAC,EAAE,OAAO,MACjB,OAAO,IAAsB,gBAAgB,EAAE,GAAG,SAAS,OAAO,GAAG,MAAM;AAAA,IAC7E,SAAS,QAAQ,WAAW;AAAA,EAC9B,CAAC;AACH;;;ACrCA,SAAS,YAAAA,iBAAqC;AAIvC,SAAS,SACd,IACA,UAAuB,CAAC,GACD;AACvB,QAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,WAAW;AACtD,QAAM,SAAS,QAAQ,UAAU;AAEjC,SAAOC,UAAS;AAAA,IACd,UAAU,CAAC,WAAW,SAAS,IAAI,EAAE,OAAO,CAAC;AAAA,IAC7C,SAAS,OAAO,EAAE,OAAO,MAAM;AAC7B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,gBAAgB,EAAE;AAAA,QAClB,EAAE,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,UAAU,QAAQ,WAAW,SAAS,MAAM,QAAQ,OAAO;AAAA,EAC7D,CAAC;AACH;;;ACvBA;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AAKA,SAAS,iBAId;AACA,QAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,QAAM,cAAc,eAAe;AAEnC,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,UAAU,OAAO,YAAY,KAAK;AAAA,IAC/C,WAAW,CAAC,UAAU;AACpB,kBAAY,kBAAkB,EAAE,UAAU,CAAC,WAAW,SAAS,EAAE,CAAC;AAClE,kBAAY,kBAAkB;AAAA,QAC5B,UAAU,CAAC,WAAW,SAAS,MAAM,EAAE;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;AC1BA;AAAA,EACE,eAAAC;AAAA,EACA,kBAAAC;AAAA,OAEK;AAKA,SAAS,iBAId;AACA,QAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,QAAM,cAAcC,gBAAe;AAEnC,SAAOC,aAAY;AAAA,IACjB,YAAY,CAAC,UAAU,OAAO,YAAY,KAAK;AAAA,IAC/C,WAAW,CAAC,OAAO,cAAc;AAC/B,kBAAY,kBAAkB,EAAE,UAAU,CAAC,WAAW,SAAS,EAAE,CAAC;AAClE,kBAAY,kBAAkB;AAAA,QAC5B,UAAU,CAAC,WAAW,SAAS,UAAU,EAAE;AAAA,MAC7C,CAAC;AACD,UAAI,MAAM,OAAO,UAAU,IAAI;AAC7B,oBAAY,kBAAkB;AAAA,UAC5B,UAAU,CAAC,WAAW,SAAS,MAAM,EAAE;AAAA,QACzC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC/BA;AAAA,EACE,eAAAC;AAAA,EACA,kBAAAC;AAAA,OAEK;AAIA,SAAS,iBAId;AACA,QAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,QAAM,cAAcC,gBAAe;AAEnC,SAAOC,aAAY;AAAA,IACjB,YAAY,CAAC,OAAO,OAAO,YAAY,EAAE;AAAA,IACzC,WAAW,CAAC,SAAS,OAAO;AAC1B,kBAAY,kBAAkB,EAAE,UAAU,CAAC,WAAW,SAAS,EAAE,CAAC;AAClE,kBAAY,cAAc,EAAE,UAAU,CAAC,WAAW,SAAS,EAAE,EAAE,CAAC;AAAA,IAClE;AAAA,EACF,CAAC;AACH;;;ACvBA,SAAS,eAAAC,oBAA2C;AAK7C,SAAS,iBAId;AACA,QAAM,EAAE,OAAO,IAAI,WAAW;AAE9B,SAAOC,aAAY;AAAA,IACjB,YAAY,CAAC,UAAU,OAAO,YAAY,KAAK;AAAA,EACjD,CAAC;AACH;;;ACfA,SAAS,YAAAC,iBAAqC;AAIvC,SAAS,YACd,UAA0B,CAAC,GAC3B,UAAuB,CAAC,GACY;AACpC,QAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,WAAW;AACtD,QAAM,SAAS,QAAQ,UAAU;AAEjC,SAAOC,UAAS;AAAA,IACd,UAAU,CAAC,WAAW,YAAY,EAAE,QAAQ,GAAG,QAAQ,CAAC;AAAA,IACxD,SAAS,CAAC,EAAE,OAAO,MACjB,OAAO,IAAwB,iBAAiB,EAAE,GAAG,SAAS,OAAO,GAAG,MAAM;AAAA,IAChF,SAAS,QAAQ,WAAW;AAAA,EAC9B,CAAC;AACH;;;ACjBA,SAAS,YAAAC,iBAAqC;AAIvC,SAAS,WACd,IACA,UAAuB,CAAC,GACC;AACzB,QAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,WAAW;AACtD,QAAM,SAAS,QAAQ,UAAU;AAEjC,SAAOC,UAAS;AAAA,IACd,UAAU,CAAC,WAAW,WAAW,IAAI,EAAE,OAAO,CAAC;AAAA,IAC/C,SAAS,OAAO,EAAE,OAAO,MAAM;AAC7B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,iBAAiB,EAAE;AAAA,QACnB,EAAE,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,UAAU,QAAQ,WAAW,SAAS,MAAM,QAAQ,OAAO;AAAA,EAC7D,CAAC;AACH;;;ACvBA,SAAS,YAAAC,iBAAqC;AAIvC,SAAS,WACd,UAAuB,CAAC,GACE;AAC1B,QAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,WAAW;AACtD,QAAM,SAAS,QAAQ,UAAU;AAEjC,SAAOC,UAAS;AAAA,IACd,UAAU,CAAC,WAAW,WAAW,EAAE,OAAO,CAAC;AAAA,IAC3C,SAAS,OAAO,EAAE,OAAO,MAAM;AAC7B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B;AAAA,QACA,EAAE,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,SAAS,QAAQ,WAAW;AAAA,EAC9B,CAAC;AACH;;;ACtBA,SAAS,YAAAC,iBAAqC;AAIvC,SAAS,UACd,IACA,UAAuB,CAAC,GACA;AACxB,QAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,WAAW;AACtD,QAAM,SAAS,QAAQ,UAAU;AAEjC,SAAOC,UAAS;AAAA,IACd,UAAU,CAAC,WAAW,UAAU,IAAI,EAAE,OAAO,CAAC;AAAA,IAC9C,SAAS,OAAO,EAAE,OAAO,MAAM;AAC7B,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5B,gBAAgB,EAAE;AAAA,QAClB,EAAE,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,UAAU,QAAQ,WAAW,SAAS,MAAM,QAAQ,OAAO;AAAA,EAC7D,CAAC;AACH;;;ACvBA,SAAS,eAAAC,cAAa,kBAAAC,uBAA8C;AAU7D,SAAS,0BAId;AACA,QAAM,EAAE,OAAO,IAAI,WAAW;AAC9B,QAAM,cAAcC,gBAAe;AAEnC,SAAOC,aAAY;AAAA,IACjB,YAAY,CAAC,EAAE,UAAU,SAAS,MAChC,OAAO,KAA2B,gBAAgB,QAAQ,YAAY;AAAA,MACpE,WAAW;AAAA,IACb,CAAC;AAAA,IACH,WAAW,CAAC,SAAS,cAAc;AACjC,kBAAY,kBAAkB;AAAA,QAC5B,UAAU,CAAC,WAAW,UAAU,UAAU,QAAQ;AAAA,MACpD,CAAC;AACD,kBAAY,kBAAkB,EAAE,UAAU,CAAC,WAAW,SAAS,EAAE,CAAC;AAAA,IACpE;AAAA,EACF,CAAC;AACH;","names":["useQuery","useQuery","useMutation","useQueryClient","useQueryClient","useMutation","useMutation","useQueryClient","useQueryClient","useMutation","useMutation","useMutation","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useQuery","useMutation","useQueryClient","useQueryClient","useMutation"]}
|