@fluid-app/rep-sdk 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/MessagingScreen-TWFEUBE3.js +4 -0
- package/dist/{MessagingScreen-BBINFP67.js.map → MessagingScreen-TWFEUBE3.js.map} +1 -1
- package/dist/MessagingScreen-ZATI4W3W.cjs +17 -0
- package/dist/{MessagingScreen-PLRU75YQ.cjs.map → MessagingScreen-ZATI4W3W.cjs.map} +1 -1
- package/dist/{chunk-W37C774B.cjs → chunk-4UJ7ZPDE.cjs} +3 -2
- package/dist/chunk-4UJ7ZPDE.cjs.map +1 -0
- package/dist/{chunk-O47ODLEF.js → chunk-PFXVDCYO.js} +3 -2
- package/dist/chunk-PFXVDCYO.js.map +1 -0
- package/dist/index.cjs +60 -60
- package/dist/index.d.cts +3 -11
- package/dist/index.d.ts +3 -11
- package/dist/index.js +3 -3
- package/package.json +5 -5
- package/dist/MessagingScreen-BBINFP67.js +0 -4
- package/dist/MessagingScreen-PLRU75YQ.cjs +0 -17
- package/dist/chunk-O47ODLEF.js.map +0 -1
- package/dist/chunk-W37C774B.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/FluidAuthProvider.tsx","../../../platform/api-client-core/src/fetch-client.ts","../../../fluidos/api-client/src/namespaces/fluid_os.ts","../src/client/types.ts","../src/transforms/screen-transforms.ts","../src/transforms/navigation-transforms.ts","../src/transforms/index.ts","../src/client/fluid-client.ts","../src/themes/index.ts","../src/providers/FluidThemeProvider.tsx","../src/core/default-widget-registry.ts","../src/providers/FluidProvider.tsx","../src/hooks/use-fluid-api.ts","../src/messaging/use-messaging-auth.ts","../src/messaging/use-messaging-config.ts","../src/messaging/fluid-file-uploader.ts","../src/screens/MessagingScreen.tsx"],"names":["error","contentType","getActiveThemeId","transformThemes","ApiError","isApiError","createContext","coreApplyTheme","useState","useEffect","useCallback","useMemo","jsx","useContext","useRef"],"mappings":"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","file":"chunk-PFXVDCYO.js","sourcesContent":["/**\n * FluidAuthProvider - Authentication Provider for Fluid Rep SDK\n *\n * Handles JWT token extraction from URL, validation, storage, and\n * provides authentication context to child components.\n */\n\nimport {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport type {\n FluidAuthConfig,\n FluidAuthContextValue,\n JWTPayload,\n} from \"../auth/types\";\nimport { extractTokenFromUrl, cleanTokenFromUrl } from \"../auth/url-token\";\nimport { getStoredToken, storeToken, clearTokens } from \"../auth/token-storage\";\nimport {\n validateToken,\n verifyToken,\n isTokenExpired,\n} from \"../auth/token-utils\";\nimport { isDevBypassActive, createDevUser } from \"../auth/dev-utils\";\nimport {\n resolveAuthFailureHandler,\n AUTH_REDIRECT_TOKEN_KEY,\n} from \"../auth/auth-redirect\";\n\n/**\n * Auth context - null when outside provider\n */\nconst FluidAuthContext = createContext<FluidAuthContextValue | null>(null);\n\nexport interface FluidAuthProviderProps {\n /** React children to wrap with auth context */\n children: ReactNode;\n /** Auth configuration options */\n config?: FluidAuthConfig;\n}\n\n/**\n * Authentication provider for Fluid rep portal applications.\n *\n * On mount, this provider:\n * 1. Checks for a token in the URL (passed from parent app)\n * 2. Cleans token from URL immediately (security)\n * 3. Falls back to stored token (cookie/localStorage)\n * 4. Validates the token (checks expiration)\n * 5. Stores valid tokens for future use\n * 6. Calls onAuthFailure if no valid token found\n *\n * @example\n * ```tsx\n * import { FluidAuthProvider } from \"@fluid-app/rep-sdk\";\n *\n * function App() {\n * return (\n * <FluidAuthProvider\n * config={{\n * onAuthFailure: () => {\n * window.location.href = \"/login\";\n * },\n * }}\n * >\n * <YourApp />\n * </FluidAuthProvider>\n * );\n * }\n * ```\n */\nexport function FluidAuthProvider({\n children,\n config,\n}: FluidAuthProviderProps) {\n const configRef = useRef(config);\n configRef.current = config;\n\n const [isLoading, setIsLoading] = useState(true);\n const [token, setToken] = useState<string | null>(null);\n const [user, setUser] = useState<JWTPayload | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n // Initialize auth on mount\n useEffect(() => {\n const initializeAuth = async () => {\n const handleAuthFailure = () => {\n const current = configRef.current;\n const handler = resolveAuthFailureHandler(\n current?.onAuthFailure,\n current?.authUrl,\n );\n handler();\n };\n\n try {\n // DEV BYPASS: Check for env variable token first, then dev bypass\n if (isDevBypassActive(config?.devBypass)) {\n // Check for VITE_DEV_TOKEN env variable first (real token in dev)\n const envToken = import.meta.env.VITE_DEV_TOKEN;\n if (envToken) {\n const validation = validateToken(envToken, config?.gracePeriodMs);\n if (validation.isValid && validation.payload) {\n storeToken(envToken, config);\n setToken(envToken);\n setUser(validation.payload);\n setError(null);\n return;\n }\n console.warn(\n \"[FluidAuth] VITE_DEV_TOKEN is invalid or expired, falling back to mock user\",\n );\n }\n\n // No valid env token - use synthetic dev user\n console.warn(\n \"[FluidAuth] Dev bypass active - using mock user. API calls will fail without a real token.\",\n );\n const devUser = createDevUser();\n setToken(null);\n setUser(devUser);\n setError(null);\n return;\n }\n\n // 1. Try to get token from URL first (fresh authentication)\n const tokenKey = config?.tokenKey ?? \"fluidUserToken\";\n let candidateToken = extractTokenFromUrl(tokenKey);\n\n // Fallback: auth.fluid.app returns the token as \"jwt\", not \"fluidUserToken\"\n if (!candidateToken && tokenKey !== AUTH_REDIRECT_TOKEN_KEY) {\n candidateToken = extractTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);\n }\n\n // Clean token from URL immediately after extraction (security)\n // Do this BEFORE validation so the URL is clean even if validation fails\n cleanTokenFromUrl(tokenKey);\n cleanTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);\n\n // 2. Fall back to stored token\n if (!candidateToken) {\n candidateToken = getStoredToken(config);\n }\n\n // 3. If we have a token, validate it\n if (candidateToken) {\n let payload: JWTPayload | null = null;\n\n if (config?.jwksUrl) {\n // Signature verification enabled - use verifyToken\n payload = await verifyToken(candidateToken, config.jwksUrl);\n if (!payload) {\n clearTokens(config);\n setToken(null);\n setUser(null);\n setError(new Error(\"JWT signature verification failed\"));\n handleAuthFailure();\n return;\n }\n // Also check expiration\n if (isTokenExpired(candidateToken, config?.gracePeriodMs)) {\n clearTokens(config);\n setToken(null);\n setUser(null);\n setError(new Error(\"Token has expired\"));\n handleAuthFailure();\n return;\n }\n } else {\n // No JWKS - existing behavior (decode only, check expiration)\n const validation = validateToken(\n candidateToken,\n config?.gracePeriodMs,\n );\n if (validation.isValid && validation.payload) {\n payload = validation.payload;\n } else {\n clearTokens(config);\n setToken(null);\n setUser(null);\n setError(new Error(validation.error ?? \"Invalid token\"));\n handleAuthFailure();\n return;\n }\n }\n\n // Valid token - store it and update state\n storeToken(candidateToken, config);\n setToken(candidateToken);\n setUser(payload);\n setError(null);\n } else {\n // No token available\n setToken(null);\n setUser(null);\n setError(new Error(\"No authentication token found\"));\n handleAuthFailure();\n }\n } catch (err) {\n const error =\n err instanceof Error ? err : new Error(\"Authentication error\");\n setError(error);\n setToken(null);\n setUser(null);\n handleAuthFailure();\n } finally {\n setIsLoading(false);\n }\n };\n\n void initializeAuth();\n // Only run on mount - config changes don't re-initialize\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Clear auth handler\n const clearAuth = useCallback(() => {\n clearTokens(configRef.current);\n setToken(null);\n setUser(null);\n setError(null);\n }, []);\n\n // Memoize context value\n // Use `satisfies` to validate shape at compile time while preserving inference\n const contextValue = useMemo(\n () =>\n ({\n isAuthenticated: user !== null,\n isLoading,\n user,\n token,\n clearAuth,\n error,\n }) satisfies FluidAuthContextValue,\n [token, isLoading, user, clearAuth, error],\n );\n\n return (\n <FluidAuthContext.Provider value={contextValue}>\n {children}\n </FluidAuthContext.Provider>\n );\n}\n\n/**\n * Hook to access the auth context directly.\n * Prefer using `useFluidAuth` for most use cases.\n *\n * @throws Error if used outside FluidAuthProvider\n */\nexport function useFluidAuthContext(): FluidAuthContextValue {\n const context = useContext(FluidAuthContext);\n\n if (!context) {\n throw new Error(\n \"useFluidAuthContext must be used within a FluidAuthProvider. \" +\n \"Wrap your app with <FluidAuthProvider> to use authentication features.\",\n );\n }\n\n return context;\n}\n\n/** Safe accessor — returns null when outside FluidAuthProvider (no throw) */\nexport function useFluidAuthOptional(): FluidAuthContextValue | null {\n return useContext(FluidAuthContext);\n}\n","/**\n * Minimal, framework-agnostic fetch client for Fluid APIs\n * Compatible with fluid-admin patterns but usable standalone\n */\n\nexport interface FetchClientConfig {\n /**\n * Base URL for all requests (e.g., \"https://api.fluid.app/api\")\n */\n baseUrl: string;\n\n /**\n * Optional function to get auth token\n * Return null/undefined if no token available\n */\n getAuthToken?: () => string | null | Promise<string | null>;\n\n /**\n * Optional callback when 401 auth error occurs\n */\n onAuthError?: () => void;\n\n /**\n * Default headers to include in all requests\n * Example: { \"x-fluid-client\": \"admin\" }\n */\n defaultHeaders?: Record<string, string>;\n}\n\nexport interface RequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n headers?: Record<string, string>;\n params?: Record<string, unknown>;\n body?: unknown;\n signal?: AbortSignal;\n}\n\n/**\n * API Error class compatible with fluid-admin's ApiError\n */\nexport class ApiError extends Error {\n public readonly status: number;\n public readonly data: unknown;\n\n constructor(message: string, status: number, data?: unknown) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n\n if (\"captureStackTrace\" in Error) {\n (\n Error as {\n captureStackTrace: (\n target: Error,\n constructor: NewableFunction,\n ) => void;\n }\n ).captureStackTrace(this, ApiError);\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n data: this.data,\n };\n }\n}\n\n/**\n * Type guard for ApiError\n */\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError;\n}\n\n/**\n * Creates a configured fetch client instance\n */\nexport function createFetchClient(config: FetchClientConfig) {\n const { baseUrl, getAuthToken, onAuthError, defaultHeaders = {} } = config;\n\n /**\n * Build headers for a request\n */\n async function buildHeaders(\n customHeaders?: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...defaultHeaders,\n ...customHeaders,\n };\n\n // Add auth token if available\n if (getAuthToken) {\n const token = await getAuthToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Join baseUrl + endpoint via string concatenation (matches fetchApi).\n * Using `new URL(endpoint, baseUrl)` would strip any path prefix from\n * baseUrl (e.g. \"/api\") when the endpoint starts with \"/\".\n */\n function joinUrl(endpoint: string): string {\n return `${baseUrl}${endpoint}`;\n }\n\n /**\n * Build URL with query parameters for GET requests\n * Compatible with fluid-admin's query param handling\n */\n function buildUrl(\n endpoint: string,\n params?: Record<string, unknown>,\n ): string {\n const fullUrl = joinUrl(endpoint);\n\n if (!params || Object.keys(params).length === 0) {\n return fullUrl;\n }\n\n const queryString = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return; // Skip undefined/null values\n }\n\n if (Array.isArray(value)) {\n // Handle arrays like Rails expects: key[]\n value.forEach((item) => queryString.append(`${key}[]`, String(item)));\n } else if (typeof value === \"object\") {\n // Handle nested objects: key[subkey]\n Object.entries(value).forEach(([subKey, subValue]) => {\n if (subValue === undefined || subValue === null) {\n return;\n }\n\n if (Array.isArray(subValue)) {\n subValue.forEach((item) =>\n queryString.append(`${key}[${subKey}][]`, String(item)),\n );\n } else {\n queryString.append(`${key}[${subKey}]`, String(subValue));\n }\n });\n } else {\n queryString.append(key, String(value));\n }\n });\n\n const qs = queryString.toString();\n return qs ? `${fullUrl}?${qs}` : fullUrl;\n }\n\n /**\n * Shared response handler for both JSON and FormData requests.\n * Handles auth errors, non-OK responses, 204 No Content, and JSON parsing.\n */\n async function handleResponse<TResponse>(\n response: Response,\n method: string,\n _url: string,\n ): Promise<TResponse> {\n if (response.status === 401 && onAuthError) {\n onAuthError();\n }\n\n if (!response.ok) {\n try {\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n const data = await response.json();\n throw new ApiError(\n data.message || data.error_message || `${method} request failed`,\n response.status,\n data.errors || data,\n );\n } else {\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n } catch (error) {\n if (error instanceof ApiError) {\n throw error;\n }\n\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n }\n\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n ) {\n return null as TResponse;\n }\n\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType?.includes(\"application/json\")) {\n try {\n const data = await response.json();\n return data as TResponse;\n } catch {\n try {\n // API declared JSON content-type but body isn't valid JSON\n const text = await response.text();\n return text as TResponse;\n } catch {\n return null as TResponse;\n }\n }\n }\n\n // Non-JSON response (text/plain, text/html, etc.)\n return null as TResponse;\n }\n\n /**\n * Main request function\n */\n async function request<TResponse = unknown>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse> {\n const {\n method = \"GET\",\n headers: customHeaders,\n params,\n body,\n signal,\n } = options;\n\n const url = params ? buildUrl(endpoint, params) : joinUrl(endpoint);\n\n const headers = await buildHeaders(customHeaders);\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = { method, headers };\n const serializedBody =\n body && method !== \"GET\" ? JSON.stringify(body) : null;\n if (serializedBody) fetchOptions.body = serializedBody;\n if (signal) fetchOptions.signal = signal;\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n return handleResponse<TResponse>(response, method, url);\n }\n\n /**\n * Request with FormData (for file uploads)\n */\n async function requestWithFormData<TResponse = unknown>(\n endpoint: string,\n formData: FormData,\n options: Omit<RequestOptions, \"body\" | \"params\"> & {\n method?: \"POST\" | \"PUT\" | \"PATCH\";\n } = {},\n ): Promise<TResponse> {\n const { method = \"POST\", headers: customHeaders, signal } = options;\n\n const url = joinUrl(endpoint);\n const headers = await buildHeaders(customHeaders);\n\n // Remove Content-Type to let browser set it with boundary\n delete headers[\"Content-Type\"];\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = { method, headers, body: formData };\n if (signal) fetchOptions.signal = signal;\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n return handleResponse<TResponse>(response, method, url);\n }\n\n // Return client with convenience methods\n return {\n request,\n requestWithFormData,\n\n // Convenience methods for common HTTP verbs\n get: <TResponse = unknown>(\n endpoint: string,\n params?: Record<string, unknown>,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ) =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"GET\" as const,\n ...(params && { params }),\n }),\n\n post: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"POST\",\n body,\n }),\n\n put: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"PUT\",\n body,\n }),\n\n patch: <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"PATCH\",\n body,\n }),\n\n delete: <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ) =>\n request<TResponse>(endpoint, {\n ...options,\n method: \"DELETE\",\n }),\n };\n}\n\nexport type FetchClient = ReturnType<typeof createFetchClient>;\n","/**\n * Generated API client functions for fluid_os\n *\n * DO NOT EDIT THIS FILE DIRECTLY\n * This file is auto-generated. To update:\n * 1. Update the OpenAPI spec file\n * 2. Run: pnpm generate\n */\n\nimport type { FetchClient } from \"../lib/fetch-client\";\nimport type { operations } from \"../generated/fluid_os\";\n\n// ============================================================================\n// Fluid OS - Definitions\n// ============================================================================\n\n/**\n * List Fluid OS definitions\n * Retrieve a list of Fluid OS definitions for the current company\n *\n * @param client - Fetch client instance\n * @param params? - params?\n */\nexport async function listFluidOSDefinitions(\n client: FetchClient,\n params?: operations[\"listFluidOSDefinitions\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSDefinitions\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/fluid_os/definitions`, params);\n}\n\n/**\n * Create a Fluid OS definition\n * Create a new Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param body - body\n */\nexport async function createFluidOSDefinition(\n client: FetchClient,\n body: operations[\"createFluidOSDefinition\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(`/api/company/fluid_os/definitions`, body);\n}\n\n/**\n * Get a Fluid OS definition\n * Retrieve a specific Fluid OS definition with all associations\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function getFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"getFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/company/fluid_os/definitions/${id}`);\n}\n\n/**\n * Update a Fluid OS definition\n * Update an existing Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n body: operations[\"updateFluidOSDefinition\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(`/api/company/fluid_os/definitions/${id}`, body);\n}\n\n/**\n * Delete a Fluid OS definition\n * Delete a Definition\n *\n * @param client - Fetch client instance\n * @param id - id\n */\nexport async function deleteFluidOSDefinition(\n client: FetchClient,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSDefinition\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(`/api/company/fluid_os/definitions/${id}`);\n}\n\n// ============================================================================\n// Fluid OS - Navigation Items\n// ============================================================================\n\n/**\n * List navigation items for a navigation\n * Retrieve a list of navigation items for a specific navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n */\nexport async function listFluidOSNavigationItems(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n): Promise<\n operations[\"listFluidOSNavigationItems\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items`,\n );\n}\n\n/**\n * Create a navigation item\n * Create a new navigation item for a navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param body - body\n */\nexport async function createFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n body: operations[\"createFluidOSNavigationItem\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items`,\n body,\n );\n}\n\n/**\n * Get a specific navigation item\n * Retrieve a specific navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n */\nexport async function getFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n );\n}\n\n/**\n * Update a navigation item\n * Update an existing navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSNavigationItem\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n body,\n );\n}\n\n/**\n * Delete a navigation item\n * Delete a navigation item\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param navigation_id - navigation_id\n * @param id - id\n */\nexport async function deleteFluidOSNavigationItem(\n client: FetchClient,\n definition_id: string | number,\n navigation_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSNavigationItem\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${navigation_id}/navigation_items/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Navigations\n// ============================================================================\n\n/**\n * List navigations for a Fluid OS definition\n * Retrieve a list of navigations for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSNavigations(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSNavigations\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSNavigations\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations`,\n params,\n );\n}\n\n/**\n * Create a navigation for a Fluid OS definition\n * Create a new navigation for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSNavigation\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/navigations`,\n body,\n );\n}\n\n/**\n * Get a specific navigation\n * Retrieve a specific navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n );\n}\n\n/**\n * Update a navigation\n * Update an existing navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSNavigation\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n body,\n );\n}\n\n/**\n * Delete a navigation\n * Delete a navigation\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSNavigation(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSNavigation\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/navigations/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Profiles\n// ============================================================================\n\n/**\n * List profiles for a Fluid OS definition\n * Retrieve a list of profiles for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSProfiles(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSProfiles\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSProfiles\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles`,\n params,\n );\n}\n\n/**\n * Create a profile for a Fluid OS definition\n * Create a new profile for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSProfile\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/profiles`,\n body,\n );\n}\n\n/**\n * Get the default profile\n * Retrieve the default profile for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n */\nexport async function getDefaultFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n): Promise<\n operations[\"getDefaultFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/default`,\n );\n}\n\n/**\n * Get a specific profile\n * Retrieve a specific profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n );\n}\n\n/**\n * Update a profile\n * Update an existing profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSProfile\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n body,\n );\n}\n\n/**\n * Delete a profile\n * Delete a profile\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSProfile(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSProfile\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/profiles/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Public\n// ============================================================================\n\n/**\n * Get active Fluid OS definition\n * Retrieve the active Fluid OS definition manifest for a specific platform\n *\n * @param client - Fetch client instance\n * @param params? - params?\n */\nexport async function getFluidOSManifest(\n client: FetchClient,\n params?: operations[\"getFluidOSManifest\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"getFluidOSManifest\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(`/api/fluid_os/definitions/active`, params);\n}\n\n// ============================================================================\n// Fluid OS - Screens\n// ============================================================================\n\n/**\n * List screens for a Fluid OS definition\n * Retrieve a list of screens for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSScreens(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSScreens\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSScreens\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/screens`,\n params,\n );\n}\n\n/**\n * Create a screen for a Fluid OS definition\n * Create a new screen for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSScreen\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/screens`,\n body,\n );\n}\n\n/**\n * Get a specific screen\n * Retrieve a specific screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n );\n}\n\n/**\n * Update a screen\n * Update an existing screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSScreen\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n body,\n );\n}\n\n/**\n * Delete a screen\n * Delete a screen\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSScreen(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSScreen\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/screens/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Themes\n// ============================================================================\n\n/**\n * List themes for a Fluid OS definition\n * Retrieve a list of themes for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSThemes(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSThemes\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSThemes\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/themes`,\n params,\n );\n}\n\n/**\n * Create a theme for a Fluid OS definition\n * Create a new theme for a Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param body - body\n */\nexport async function createFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n body: operations[\"createFluidOSTheme\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"createFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/themes`,\n body,\n );\n}\n\n/**\n * Get a specific theme\n * Retrieve a specific theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n );\n}\n\n/**\n * Update a theme\n * Update an existing theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSTheme\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n body,\n );\n}\n\n/**\n * Delete a theme\n * Delete a theme\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function deleteFluidOSTheme(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"deleteFluidOSTheme\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.delete(\n `/api/company/fluid_os/definitions/${definition_id}/themes/${id}`,\n );\n}\n\n// ============================================================================\n// Fluid OS - Versions\n// ============================================================================\n\n/**\n * List versions for a Fluid OS definition\n * Retrieve a list of published versions for a specific Fluid OS definition\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param params? - params?\n */\nexport async function listFluidOSVersions(\n client: FetchClient,\n definition_id: string | number,\n params?: operations[\"listFluidOSVersions\"][\"parameters\"][\"query\"],\n): Promise<\n operations[\"listFluidOSVersions\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/versions`,\n params,\n );\n}\n\n/**\n * Publish a new version of a Fluid OS definition\n * Publish a new version of the Fluid OS definition. This creates a snapshot of the current definition state including all screens, profiles, themes, and navigations. No request body is required - the manifest is built automatically from the current definition state.\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n */\nexport async function createFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n): Promise<\n operations[\"createFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.post(\n `/api/company/fluid_os/definitions/${definition_id}/versions`,\n );\n}\n\n/**\n * Get a specific version\n * Retrieve a specific published version including its manifest\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n */\nexport async function getFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n): Promise<\n operations[\"getFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.get(\n `/api/company/fluid_os/definitions/${definition_id}/versions/${id}`,\n );\n}\n\n/**\n * Update a version\n * Update a version. Currently only supports activating/deactivating a version.\n *\n * @param client - Fetch client instance\n * @param definition_id - definition_id\n * @param id - id\n * @param body - body\n */\nexport async function updateFluidOSVersion(\n client: FetchClient,\n definition_id: string | number,\n id: string | number,\n body: operations[\"updateFluidOSVersion\"][\"requestBody\"][\"content\"][\"application/json\"],\n): Promise<\n operations[\"updateFluidOSVersion\"][\"responses\"][200][\"content\"][\"application/json\"]\n> {\n return client.put(\n `/api/company/fluid_os/definitions/${definition_id}/versions/${id}`,\n body,\n );\n}\n","// ============================================================================\n// HTTP Method Constants\n// ============================================================================\n\n/**\n * HTTP methods supported by the API client.\n * Use `as const` for literal type inference and type safety.\n */\nexport const HTTP_METHODS = {\n GET: \"GET\",\n POST: \"POST\",\n PUT: \"PUT\",\n PATCH: \"PATCH\",\n DELETE: \"DELETE\",\n} as const;\n\n/**\n * Union type of all supported HTTP methods.\n * Derived from HTTP_METHODS constant to avoid duplication.\n */\nexport type HttpMethod = (typeof HTTP_METHODS)[keyof typeof HTTP_METHODS];\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Configuration for the Fluid SDK client.\n * Use Readonly<FluidSDKConfig> when the config should not be modified after creation.\n */\nexport interface FluidSDKConfig {\n /**\n * Base URL for API requests.\n * Accepts either the domain root (e.g., \"https://api.fluid.app\") or\n * with the /api path (e.g., \"https://api.fluid.app/api\").\n * The SDK normalizes internally for each consumer.\n */\n readonly baseUrl: string;\n\n /**\n * Function to retrieve the authentication token\n * Return null/undefined if no token is available\n */\n readonly getAuthToken?: () => string | null | Promise<string | null>;\n\n /**\n * Callback invoked when a 401 authentication error occurs\n * Use this to trigger re-authentication flows\n */\n readonly onAuthError?: () => void;\n\n /**\n * Default headers to include in all requests\n * Example: { \"x-fluid-client\": \"rep-portal\" }\n */\n readonly defaultHeaders?: Readonly<Record<string, string>>;\n\n /**\n * Filestack API key for messaging file uploads.\n * If not provided, file attachments will be disabled in the messaging composer.\n */\n readonly filestackApiKey?: string;\n\n /**\n * Override WebSocket URL for real-time messaging.\n * Default: derived from baseUrl by replacing trailing /api with /cable\n */\n readonly websocketUrl?: string;\n}\n\n/**\n * Options for individual API requests.\n * Uses HttpMethod type for method to ensure type safety.\n */\nexport interface RequestOptions {\n readonly method?: HttpMethod;\n readonly body?: unknown;\n readonly params?: Readonly<Record<string, unknown>>;\n readonly headers?: Readonly<Record<string, string>>;\n readonly signal?: AbortSignal;\n}\n\n// ============================================================================\n// Pagination Types\n// ============================================================================\n\n/**\n * Pagination parameters for list endpoints\n */\nexport interface PaginationParams {\n readonly page?: number;\n readonly per_page?: number;\n}\n\n// ============================================================================\n// Sort Order - Derive from constant for single source of truth\n// ============================================================================\n\n/**\n * Sort order constant - single source of truth for sort direction values.\n * Use SORT_ORDERS.asc instead of \"asc\" for type-safe comparisons.\n */\nexport const SORT_ORDERS = {\n asc: \"asc\",\n desc: \"desc\",\n} as const;\n\n/**\n * Union type of sort order values, derived from SORT_ORDERS constant.\n * @see deriving-typeof-for-object-keys pattern\n */\nexport type SortOrder = (typeof SORT_ORDERS)[keyof typeof SORT_ORDERS];\n\n/**\n * Common filter parameters for list endpoints\n */\nexport interface BaseListParams extends PaginationParams {\n readonly sort_by?: string;\n readonly sort_order?: SortOrder;\n readonly search?: string;\n}\n","/**\n * Screen Transforms\n * Convert FluidOS API screen objects to ScreenDefinition format.\n *\n * Extracted from:\n * - apps/fluid-admin/networking/app-builder/app-screens/types.ts\n * - apps/fluid-admin/networking/reps/screens.api.ts\n */\n\nimport type { WidgetSchema } from \"@fluid-app/rep-core/types\";\nimport type { ScreenDefinition } from \"@fluid-app/rep-core/types\";\n\n/** Raw screen from the FluidOS API */\nexport interface RawApiScreen {\n id: number | string;\n definition_id?: number | string;\n name?: string | null;\n slug?: string | null;\n component_tree?: unknown;\n}\n\n/**\n * Normalize component_tree to always be an array.\n * The API stores component_tree as a hash (object), but the frontend expects an array.\n */\nexport function normalizeComponentTree(componentTree: unknown): WidgetSchema[] {\n if (!componentTree) return [];\n if (Array.isArray(componentTree)) return componentTree as WidgetSchema[];\n if (typeof componentTree === \"object\") {\n return [componentTree as WidgetSchema];\n }\n return [];\n}\n\n/**\n * Convert a raw FluidOS screen to ScreenDefinition.\n * Normalizes component_tree and converts string IDs to numbers.\n */\nexport function toScreenDefinition(screen: RawApiScreen): ScreenDefinition {\n return {\n id: Number(screen.id),\n slug: screen.slug ?? \"\",\n name: screen.name ?? \"\",\n component_tree: normalizeComponentTree(screen.component_tree),\n };\n}\n","/**\n * Navigation Transforms\n * Convert FluidOS API navigation items to NavigationItem format.\n *\n * Extracted from:\n * - apps/fluid-admin/networking/app-builder/app-navigation-items/types.ts\n * - apps/fluid-admin/networking/reps/screens.api.ts\n */\n\nimport type { NavigationItem } from \"@fluid-app/rep-core/types\";\nimport type { components } from \"@fluid-app/fluidos-api-client\";\n\n/** Raw navigation item from the FluidOS API (derived from generated types) */\nexport type RawApiNavigationItem =\n components[\"schemas\"][\"FluidOSNavigationItem\"];\n\n/**\n * Convert a raw FluidOS navigation item to NavigationItem.\n * Recursively transforms children and sorts by position.\n */\nexport function toNavigationItem(item: RawApiNavigationItem): NavigationItem {\n const children = (item.children ?? [])\n .map(toNavigationItem)\n .sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n\n return {\n id: Number(item.id),\n label: item.label ?? \"Untitled\",\n // Use conditional spread for optional properties (exactOptionalPropertyTypes)\n ...(item.slug != null ? { slug: String(item.slug) } : {}),\n ...(item.icon != null ? { icon: String(item.icon) } : {}),\n ...(item.screen_id != null ? { screen_id: Number(item.screen_id) } : {}),\n ...(item.parent_id != null ? { parent_id: Number(item.parent_id) } : {}),\n ...(item.source != null ? { source: item.source } : {}),\n position: item.position ?? 0,\n children,\n };\n}\n","/**\n * Data Transforms\n * Convert FluidOS API responses to RepAppData format.\n *\n * This is the main entry point for all transforms used by the SDK client\n * and hooks when fetching from the fluidos API.\n */\n\nexport {\n transformThemes,\n buildThemeDefinition,\n getActiveThemeId,\n type RawApiTheme,\n} from \"@fluid-app/rep-core/theme\";\n\nexport {\n normalizeComponentTree,\n toScreenDefinition,\n type RawApiScreen,\n} from \"./screen-transforms\";\n\nexport {\n toNavigationItem,\n type RawApiNavigationItem,\n} from \"./navigation-transforms\";\n\nimport type { RepAppData, RepAppManifest } from \"@fluid-app/rep-core/types\";\nimport {\n transformThemes,\n getActiveThemeId,\n type RawApiTheme,\n} from \"@fluid-app/rep-core/theme\";\nimport { toScreenDefinition, type RawApiScreen } from \"./screen-transforms\";\nimport {\n toNavigationItem,\n type RawApiNavigationItem,\n} from \"./navigation-transforms\";\n\n/** Raw manifest shape from the `/fluid_os/definitions/active` API response */\nexport interface RawManifestResponse {\n manifest: {\n definition_id: number;\n published_version?: number;\n screens?: RawApiScreen[];\n profile?: {\n name?: string;\n definition_id: number;\n themes?: RawApiTheme[];\n navigation?: {\n id: number;\n name?: string;\n definition_id: number;\n navigation_items?: RawApiNavigationItem[];\n };\n mobile_navigation?: {\n id: number;\n name?: string;\n definition_id: number;\n navigation_items?: RawApiNavigationItem[];\n };\n };\n };\n}\n\n/**\n * Transform a raw FluidOS manifest API response into RepAppData.\n *\n * This is the top-level transform used by `FluidClient.app.get()`.\n * It handles:\n * - Theme transformation (legacy and new formats)\n * - Screen normalization (component_tree array wrapping)\n * - Navigation item transformation (recursive with position sorting)\n */\nexport function transformManifestToRepAppData(\n response: RawManifestResponse,\n): RepAppData {\n const manifest = response.manifest;\n const rawProfile = manifest.profile;\n\n const rawThemes: RawApiTheme[] = Array.isArray(rawProfile?.themes)\n ? rawProfile.themes\n : [];\n\n const screens = (manifest.screens ?? []).map((screen) =>\n toScreenDefinition(screen),\n );\n\n const navigationItems = (rawProfile?.navigation?.navigation_items ?? []).map(\n toNavigationItem,\n );\n\n const nav = rawProfile?.navigation;\n const mobileNav = rawProfile?.mobile_navigation;\n const mobileNavigationItems = (mobileNav?.navigation_items ?? []).map(\n toNavigationItem,\n );\n const activeThemeId = getActiveThemeId(rawThemes);\n\n return {\n definition_id: manifest.definition_id,\n published_version: manifest.published_version ?? 0,\n screens,\n profile: {\n name: rawProfile?.name ?? \"Default\",\n definition_id: rawProfile?.definition_id ?? manifest.definition_id,\n themes: transformThemes(rawThemes),\n // Conditional spread for exactOptionalPropertyTypes compliance\n ...(activeThemeId !== undefined ? { activeThemeId } : {}),\n navigation: {\n definition_id: nav?.definition_id ?? manifest.definition_id,\n id: nav?.id ?? 0,\n name: nav?.name ?? \"Main Navigation\",\n navigation_items: navigationItems,\n screens,\n },\n ...(mobileNav\n ? {\n mobile_navigation: {\n definition_id: mobileNav.definition_id ?? manifest.definition_id,\n id: mobileNav.id ?? 0,\n name: mobileNav.name ?? \"Mobile Navigation\",\n navigation_items: mobileNavigationItems,\n screens,\n },\n }\n : {}),\n },\n };\n}\n\n/**\n * Transform a raw manifest response, unwrapping the `{ manifest }` envelope.\n * Convenience wrapper matching the `RepAppManifest` type.\n */\nexport function transformRawManifest(\n response: RawManifestResponse,\n): RepAppManifest {\n return {\n manifest: transformManifestToRepAppData(response),\n };\n}\n","/**\n * Fluid API Client\n * Adapted from: packages/fluidos-api-client/src/lib/fetch-client.ts\n * Provides authenticated API access with domain-specific methods\n */\n\nimport type { Rep, UpdateRepData, UserMe } from \"../types/rep\";\nimport type { Profile } from \"../types/profile\";\nimport type { UserPermissions } from \"../types/permissions\";\nimport type { RepAppData } from \"@fluid-app/rep-core/types\";\nimport {\n createFetchClient,\n fluidOs,\n type FetchClient,\n} from \"@fluid-app/fluidos-api-client\";\nimport {\n HTTP_METHODS,\n type FluidSDKConfig,\n type RequestOptions,\n type BaseListParams,\n} from \"./types\";\nimport { createDefaultAuthRedirect } from \"../auth/auth-redirect\";\nimport {\n transformManifestToRepAppData,\n type RawManifestResponse,\n} from \"../transforms\";\n\n/**\n * API Error class for structured error handling\n */\nexport class ApiError extends Error {\n readonly status: number;\n readonly data: unknown;\n\n constructor(message: string, status: number, data?: unknown) {\n super(message);\n this.name = \"ApiError\";\n this.status = status;\n this.data = data;\n\n // V8-specific stack trace capture (Node.js, Chrome)\n const errorWithCapture = Error as typeof Error & {\n captureStackTrace?: (\n target: object,\n constructor: typeof ApiError,\n ) => void;\n };\n if (errorWithCapture.captureStackTrace) {\n errorWithCapture.captureStackTrace(this, ApiError);\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n data: this.data,\n };\n }\n}\n\n/**\n * Type guard for ApiError\n */\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError;\n}\n\n// ============================================================================\n// Discriminated Union for API Responses\n// ============================================================================\n\n/**\n * Discriminated union representing the result of an API call.\n * Use `isApiSuccess` and `isApiFailure` type guards to narrow.\n */\nexport type ApiResult<T> =\n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly error: ApiError };\n\n/**\n * Type guard for successful API result\n */\nexport function isApiSuccess<T>(\n result: ApiResult<T>,\n): result is { readonly success: true; readonly data: T } {\n return result.success === true;\n}\n\n/**\n * Type guard for failed API result\n */\nexport function isApiFailure<T>(\n result: ApiResult<T>,\n): result is { readonly success: false; readonly error: ApiError } {\n return result.success === false;\n}\n\n/**\n * Type guard to check if a value is a non-null string\n */\nfunction isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * Extract error message from API response data using `in` operator narrowing.\n * Checks common error message field names in order of precedence.\n */\nfunction extractErrorMessage(\n data: Readonly<Record<string, unknown>>,\n fallback: string,\n): string {\n // Use `in` operator to narrow and then type guard to validate string type\n if (\"message\" in data && isString(data.message)) {\n return data.message;\n }\n if (\"error_message\" in data && isString(data.error_message)) {\n return data.error_message;\n }\n if (\"error\" in data && isString(data.error)) {\n return data.error;\n }\n return fallback;\n}\n\n// ============================================================================\n// Domain Types\n// ============================================================================\n\n// ============================================================================\n// Product Types\n// ============================================================================\n\nexport interface Product {\n readonly id: number;\n readonly title: string;\n readonly sku?: string | null;\n readonly price: string | number;\n readonly description?: string | null;\n readonly image_url?: string;\n readonly status?: string;\n readonly active?: boolean;\n readonly slug?: string;\n readonly in_stock?: boolean;\n readonly display_price?: string;\n readonly currency_code?: string;\n readonly updated_at?: string;\n}\n\nexport interface ProductListParams extends BaseListParams {\n readonly search_query?: string;\n readonly status?: readonly (\"active\" | \"draft\" | \"archived\" | \"all\")[];\n readonly category_id?: string;\n readonly category_ids?: readonly number[];\n readonly collection_id?: string;\n readonly collection_ids?: readonly number[];\n readonly order_by?: readonly string[];\n readonly country_code?: readonly string[];\n readonly published_stores?: readonly (\"retail\" | \"rep\")[];\n}\n\nexport interface ProductsResponse {\n readonly products: readonly Product[];\n readonly meta: {\n readonly request_id: string;\n readonly timestamp: string;\n readonly pagination?: {\n readonly current_page: number;\n readonly per_page: number;\n readonly total_pages: number;\n readonly total_count: number;\n };\n };\n}\n\n// ============================================================================\n// Order Types\n// ============================================================================\n\nexport interface Order {\n readonly id: string;\n readonly order_number: string;\n readonly status: string;\n readonly total: number;\n readonly customer_id: string;\n readonly rep_id?: string;\n readonly created_at: string;\n readonly updated_at: string;\n}\n\nexport interface OrderListParams extends BaseListParams {\n readonly status?: string;\n readonly customer_id?: string;\n readonly date_from?: string;\n readonly date_to?: string;\n}\n\nexport interface CreateOrderData {\n readonly customer_id: string;\n readonly line_items: readonly OrderLineItem[];\n readonly notes?: string;\n}\n\nexport interface OrderLineItem {\n readonly product_id: string;\n readonly quantity: number;\n readonly price?: number;\n}\n\n// ============================================================================\n// Analytics Types\n// ============================================================================\n\nexport interface DashboardData {\n readonly total_sales: number;\n readonly total_orders: number;\n readonly total_customers: number;\n readonly recent_orders: readonly Order[];\n}\n\nexport interface SalesParams {\n readonly date_from?: string;\n readonly date_to?: string;\n readonly group_by?: \"day\" | \"week\" | \"month\";\n}\n\nexport interface SalesData {\n readonly total: number;\n readonly data: readonly SalesDataPoint[];\n}\n\nexport interface SalesDataPoint {\n readonly date: string;\n readonly amount: number;\n readonly orders: number;\n}\n\n// ============================================================================\n// Client Implementation\n// ============================================================================\n\n/**\n * Creates a configured Fluid API client instance\n */\nexport function createFluidClient(config: FluidSDKConfig) {\n const { baseUrl, getAuthToken, onAuthError, defaultHeaders = {} } = config;\n const effectiveOnAuthError = onAuthError ?? createDefaultAuthRedirect();\n\n // Create a fluidos FetchClient for structured API calls (manifest, etc.)\n // Conditional spread for exactOptionalPropertyTypes: only include getAuthToken when defined\n const fetchClient: FetchClient = createFetchClient({\n baseUrl,\n ...(getAuthToken ? { getAuthToken } : {}),\n onAuthError: effectiveOnAuthError,\n defaultHeaders,\n });\n\n /**\n * Build headers for a request\n */\n async function buildHeaders(\n customHeaders?: Record<string, string>,\n ): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...defaultHeaders,\n ...customHeaders,\n };\n\n if (getAuthToken) {\n const token = await getAuthToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Build URL with query parameters (Rails-compatible)\n */\n function buildUrl(\n endpoint: string,\n params?: Record<string, unknown>,\n ): string {\n // Construct URL by concatenating baseUrl + endpoint\n // Using URL constructor with relative paths would strip the baseUrl path (e.g., /api)\n const normalizedBase = baseUrl.endsWith(\"/\")\n ? baseUrl.slice(0, -1)\n : baseUrl;\n const normalizedEndpoint = endpoint.startsWith(\"/\")\n ? endpoint\n : `/${endpoint}`;\n const url = new URL(normalizedBase + normalizedEndpoint);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n // Handle arrays like Rails expects: key[]\n for (const item of value) {\n url.searchParams.append(`${key}[]`, String(item));\n }\n } else if (typeof value === \"object\") {\n // Handle nested objects: key[subkey]\n for (const [subKey, subValue] of Object.entries(\n value as Record<string, unknown>,\n )) {\n if (subValue === undefined || subValue === null) {\n continue;\n }\n\n if (Array.isArray(subValue)) {\n for (const item of subValue) {\n url.searchParams.append(`${key}[${subKey}][]`, String(item));\n }\n } else {\n url.searchParams.append(`${key}[${subKey}]`, String(subValue));\n }\n }\n } else {\n url.searchParams.append(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Default request options for type-safe defaults.\n * Uses `satisfies` to validate against RequestOptions while preserving literal types.\n */\n const defaultRequestOptions = {\n method: HTTP_METHODS.GET,\n } as const satisfies Partial<RequestOptions>;\n\n /**\n * Main request function\n */\n async function request<TResponse = unknown>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse> {\n const {\n method = defaultRequestOptions.method,\n headers: customHeaders,\n params,\n body,\n signal,\n } = options;\n\n // Use buildUrl for all requests to ensure baseUrl path is preserved\n const url = buildUrl(\n endpoint,\n method === HTTP_METHODS.GET ? params : undefined,\n );\n\n const headers = await buildHeaders(customHeaders);\n\n let response: Response;\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers,\n };\n // Only add signal and body when defined to satisfy exactOptionalPropertyTypes\n // RequestInit expects signal: AbortSignal | null, not undefined\n if (signal !== undefined) {\n fetchOptions.signal = signal;\n }\n if (body && method !== HTTP_METHODS.GET) {\n fetchOptions.body = JSON.stringify(body);\n }\n response = await fetch(url, fetchOptions);\n } catch (networkError) {\n throw new ApiError(\n `Network error: ${networkError instanceof Error ? networkError.message : \"Unknown network error\"}`,\n 0,\n null,\n );\n }\n\n // Handle authentication errors — invoke the handler, then throw so\n // TanStack Query surfaces the error instead of caching `null` as data.\n if (response.status === 401) {\n effectiveOnAuthError();\n throw new ApiError(\"Authentication required\", 401, null);\n }\n\n if (!response.ok) {\n try {\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n const data = (await response.json()) as Record<string, unknown>;\n // Use `in` operator narrowing to safely extract error message\n const errorMessage = extractErrorMessage(\n data,\n `${method} request failed`,\n );\n throw new ApiError(\n errorMessage,\n response.status,\n \"errors\" in data ? data.errors : data,\n );\n } else {\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n } catch (error) {\n if (isApiError(error)) {\n throw error;\n }\n\n throw new ApiError(\n `${method} request failed with status ${response.status}`,\n response.status,\n null,\n );\n }\n }\n\n // Handle empty responses (204 No Content)\n // Note: Callers expecting nullable responses should use requestNullable<T>\n // which properly types the return as T | null\n if (\n response.status === 204 ||\n response.headers.get(\"content-length\") === \"0\"\n ) {\n // Type assertion required: 204 No Content has no body to parse.\n // This is safe when TResponse is a union including null (e.g., T | null).\n // For fully type-safe nullable handling, prefer requestNullable() or safeRequest().\n return null as TResponse;\n }\n\n try {\n const data: unknown = await response.json();\n // Runtime check: verify we got an object/array, not a primitive that would be mistyped\n if (data === null || data === undefined) {\n throw new ApiError(\n \"Unexpected null/undefined in JSON response\",\n response.status,\n null,\n );\n }\n // Type assertion required: JSON.parse returns `unknown`, but we've validated\n // the response is not null/undefined. The caller specifies TResponse based on\n // their knowledge of the API endpoint's response schema.\n return data as TResponse;\n } catch (parseError) {\n if (isApiError(parseError)) {\n throw parseError;\n }\n throw new ApiError(\n \"Failed to parse response as JSON\",\n response.status,\n null,\n );\n }\n }\n\n /**\n * Request function for endpoints that may return null (204 No Content).\n * Properly types the return as T | null.\n */\n async function requestNullable<TResponse>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<TResponse | null> {\n return request<TResponse | null>(endpoint, options);\n }\n\n /**\n * Safe request wrapper that returns a discriminated union instead of throwing.\n * Use `isApiSuccess` or `isApiFailure` to narrow the result.\n */\n async function safeRequest<TResponse>(\n endpoint: string,\n options: RequestOptions = {},\n ): Promise<ApiResult<TResponse>> {\n try {\n const data = await request<TResponse>(endpoint, options);\n return { success: true, data };\n } catch (error) {\n if (isApiError(error)) {\n return { success: false, error };\n }\n // Wrap unknown errors in ApiError\n return {\n success: false,\n error: new ApiError(\n error instanceof Error ? error.message : \"Unknown error\",\n 0,\n null,\n ),\n };\n }\n }\n\n /**\n * Helper to safely convert typed params to Record<string, unknown>.\n * Type assertion required: TypeScript's structural typing allows any object\n * to be treated as Record<string, unknown> when we only need to iterate\n * over its entries. This is safe because buildUrl only reads properties.\n */\n function toParams<T extends object>(\n params: T | undefined,\n ): Record<string, unknown> | undefined {\n return params as Record<string, unknown> | undefined;\n }\n\n // Convenience HTTP methods using HTTP_METHODS constant for type safety\n const get = <\n TResponse = unknown,\n TParams extends object = Record<string, unknown>,\n >(\n endpoint: string,\n params?: TParams,\n options?: Omit<RequestOptions, \"method\" | \"params\">,\n ) => {\n // Build request options object, only adding params if defined\n const baseOptions = {\n ...options,\n method: HTTP_METHODS.GET,\n } satisfies RequestOptions;\n\n const convertedParams = toParams(params);\n const requestOptions: RequestOptions =\n convertedParams !== undefined\n ? { ...baseOptions, params: convertedParams }\n : baseOptions;\n\n return request<TResponse>(endpoint, requestOptions);\n };\n\n const post = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.POST,\n body,\n } satisfies RequestOptions);\n\n const put = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.PUT,\n body,\n } satisfies RequestOptions);\n\n const patch = <TResponse = unknown>(\n endpoint: string,\n body?: unknown,\n options?: Omit<RequestOptions, \"method\" | \"body\">,\n ) =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.PATCH,\n body,\n } satisfies RequestOptions);\n\n const del = <TResponse = unknown>(\n endpoint: string,\n options?: Omit<RequestOptions, \"method\">,\n ) =>\n request<TResponse>(endpoint, {\n ...options,\n method: HTTP_METHODS.DELETE,\n } satisfies RequestOptions);\n\n // ============================================================================\n // Domain-Specific API Methods\n // ============================================================================\n\n return {\n // Fluidos FetchClient for structured API calls\n fetchClient,\n\n // Low-level methods for custom endpoints\n request,\n requestNullable,\n safeRequest,\n get,\n post,\n put,\n patch,\n delete: del,\n\n // Products API - matches fluid-admin's /company/v1/products\n products: {\n list: (params?: ProductListParams) =>\n get<ProductsResponse, ProductListParams>(\n \"/company/v1/products\",\n params,\n ),\n get: (id: string | number) =>\n get<{ product: Product }>(`/company/v1/products/${id}`),\n search: (query: string, params?: ProductListParams) =>\n get<ProductsResponse>(\"/company/v1/products\", {\n search_query: query,\n ...params,\n } as Record<string, unknown>),\n },\n\n // Orders API\n orders: {\n list: (params?: OrderListParams) =>\n get<Order[], OrderListParams>(\"/orders\", params),\n get: (id: string) => get<Order>(`/orders/${id}`),\n create: (data: CreateOrderData) => post<Order>(\"/orders\", data),\n },\n\n // Users API\n users: {\n me: () => get<UserMe>(\"/api/me\"),\n },\n\n // Reps API\n reps: {\n current: () => get<Rep>(\"/reps/me\"),\n updateProfile: (data: UpdateRepData) => patch<Rep>(\"/reps/me\", data),\n },\n\n // Profile API (themes, navigation, screens) — legacy endpoint\n profile: {\n get: () => get<Profile>(\"/rep_app/manifest\"),\n },\n\n // App API — fluidos endpoint (full manifest with transforms)\n app: {\n /** Fetch the raw manifest (plain JSON, no Color objects). Cache-safe. */\n getRaw: async (): Promise<RawManifestResponse> => {\n const raw = await fluidOs.getFluidOSManifest(fetchClient, {\n platform: \"browser\",\n });\n // The fluidos-api-client returns { manifest?, meta? } — cast to\n // RawManifestResponse shape which transformManifestToRepAppData expects\n return raw as unknown as RawManifestResponse;\n },\n /** Fetch the active app definition with full theme/screen/navigation transforms */\n get: async (): Promise<RepAppData> => {\n const raw = await fluidOs.getFluidOSManifest(fetchClient, {\n platform: \"browser\",\n });\n return transformManifestToRepAppData(\n raw as unknown as RawManifestResponse,\n );\n },\n },\n\n // Permissions API\n permissions: {\n get: () => get<UserPermissions>(\"/company/roles/my_permissions\"),\n },\n\n // Analytics API\n analytics: {\n dashboard: () => get<DashboardData>(\"/analytics/dashboard\"),\n sales: (params?: SalesParams) =>\n get<SalesData, SalesParams>(\"/analytics/sales\", params),\n },\n };\n}\n\nexport type FluidClient = ReturnType<typeof createFluidClient>;\n","export * from \"@fluid-app/rep-core/theme\";\n","/**\n * Theme Provider for Fluid SDK\n * Handles CSS variable injection using rep-core's theme engine.\n * Accepts ThemeDefinition objects and resolves them into CSS via generateThemeCSS.\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useMemo,\n useCallback,\n type ReactNode,\n} from \"react\";\nimport type { ThemeDefinition } from \"../types/theme\";\nimport {\n resolveTheme,\n applyTheme as coreApplyTheme,\n removeAllThemes,\n} from \"../themes\";\n\ntype ThemeMode = \"light\" | \"dark\";\n\n/**\n * Context value for theme management.\n * All properties are readonly since context values should not be mutated by consumers.\n */\ninterface ThemeContextValue {\n /** Currently active theme definition */\n readonly currentTheme: ThemeDefinition | null;\n /** Switch to a different theme */\n readonly setTheme: (theme: ThemeDefinition) => void;\n /** Switch between light and dark mode for the current theme */\n readonly setThemeMode: (mode: ThemeMode) => void;\n /** Current theme mode */\n readonly mode: ThemeMode | undefined;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nexport interface FluidThemeProviderProps {\n children: ReactNode;\n /** Initial theme to apply */\n initialTheme?: ThemeDefinition;\n /** Container element for scoped theme application (defaults to document.documentElement) */\n container?: HTMLElement | null;\n}\n\n/**\n * Apply a theme to the DOM using the shared rep-core pipeline.\n * Also sets data attributes on the container for CSS selector targeting.\n */\nfunction applyThemeToDOM(\n theme: ThemeDefinition,\n mode: ThemeMode | undefined,\n container: HTMLElement | null,\n): void {\n const target = container ?? document.documentElement;\n\n // Use shared resolve + inject pipeline from rep-core\n const resolved = resolveTheme(theme);\n coreApplyTheme(resolved);\n\n // Set data attributes for CSS selector targeting\n target.dataset.theme = theme.id;\n if (mode) {\n target.dataset.themeMode = mode;\n } else {\n delete target.dataset.themeMode;\n }\n}\n\nexport function FluidThemeProvider({\n children,\n initialTheme,\n container,\n}: FluidThemeProviderProps) {\n const [currentTheme, setCurrentTheme] = useState<ThemeDefinition | null>(\n initialTheme ?? null,\n );\n const [mode, setMode] = useState<ThemeMode | undefined>(undefined);\n\n // Apply theme CSS when theme or mode changes\n useEffect(() => {\n if (currentTheme) {\n applyThemeToDOM(currentTheme, mode, container ?? null);\n }\n\n return () => {\n removeAllThemes();\n };\n }, [currentTheme, mode, container]);\n\n const setTheme = useCallback((theme: ThemeDefinition) => {\n setCurrentTheme(theme);\n }, []);\n\n const setThemeMode = useCallback((newMode: ThemeMode) => {\n setMode(newMode);\n }, []);\n\n const value = useMemo(\n () =>\n ({\n currentTheme,\n setTheme,\n setThemeMode,\n mode,\n }) satisfies ThemeContextValue,\n [currentTheme, setTheme, setThemeMode, mode],\n );\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n}\n\n/**\n * Hook to access theme context\n * Must be used within a FluidThemeProvider\n */\nexport function useThemeContext(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error(\"useThemeContext must be used within a FluidThemeProvider\");\n }\n return context;\n}\n","/**\n * Default widget registry for SDK apps.\n * Maps widget type names to their view-only components from rep-widgets.\n */\n\nimport { createWidgetRegistry } from \"@fluid-app/rep-core/widget-utils\";\nimport {\n AlertWidget,\n CalendarWidget,\n CarouselWidget,\n CatchUpWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n} from \"@fluid-app/rep-widgets/widgets\";\n\nexport const DEFAULT_SDK_WIDGET_REGISTRY = createWidgetRegistry({\n AlertWidget,\n CalendarWidget,\n CarouselWidget,\n CatchUpWidget,\n ChartWidget,\n ContainerWidget,\n EmbedWidget,\n ImageWidget,\n LayoutWidget,\n ListWidget,\n MySiteWidget,\n NestedWidget,\n QuickShareWidget,\n RecentActivityWidget,\n SpacerWidget,\n TableWidget,\n TextWidget,\n ToDoWidget,\n VideoWidget,\n});\n","/**\n * Main Fluid SDK Provider\n * Wraps QueryClientProvider and FluidThemeProvider\n */\n\nimport {\n createContext,\n useContext,\n useCallback,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { createFluidClient, type FluidClient } from \"../client/fluid-client\";\nimport { FluidThemeProvider } from \"./FluidThemeProvider\";\nimport { useFluidAuthOptional } from \"./FluidAuthProvider\";\nimport { DataSourceRegistryProvider } from \"@fluid-app/rep-core/data-sources/registry-context\";\nimport { RegistryProvider } from \"@fluid-app/rep-widgets/contexts\";\nimport { DEFAULT_SDK_WIDGET_REGISTRY } from \"../core/default-widget-registry\";\nimport type { FluidSDKConfig } from \"../client/types\";\nimport type { ThemeDefinition } from \"../types/theme\";\n\n/**\n * Context value for FluidProvider.\n * All properties are readonly since context values should not be mutated by consumers.\n */\ninterface FluidContextValue {\n /** Configured API client instance */\n readonly client: FluidClient;\n /** SDK configuration */\n readonly config: FluidSDKConfig;\n}\n\nconst FluidContext = createContext<FluidContextValue | null>(null);\n\nexport interface FluidProviderProps {\n /** SDK configuration (baseUrl, auth, etc.) */\n config: FluidSDKConfig;\n /** React children */\n children: ReactNode;\n /** Optional custom QueryClient instance */\n queryClient?: QueryClient;\n /** Optional initial theme */\n initialTheme?: ThemeDefinition;\n /** Optional container for scoped theme application */\n themeContainer?: HTMLElement | null;\n /** Optional custom widget registry (defaults to all built-in widgets) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n widgetRegistry?: Record<string, React.ComponentType<any>>;\n /** Dynamic variables for data source endpoint path substitution (e.g., { rep_id: \"123\" }) */\n variables?: Record<string, string>;\n}\n\n/**\n * Main provider for the Fluid Rep SDK\n *\n * @example\n * ```tsx\n * import { FluidProvider } from \"@fluid-app/rep-sdk\";\n *\n * function App() {\n * return (\n * <FluidProvider\n * config={{\n * baseUrl: \"https://api.fluid.app/api\",\n * getAuthToken: () => localStorage.getItem(\"token\"),\n * }}\n * >\n * <YourApp />\n * </FluidProvider>\n * );\n * }\n * ```\n */\nexport function FluidProvider({\n config,\n children,\n queryClient,\n initialTheme,\n themeContainer,\n widgetRegistry,\n variables,\n}: FluidProviderProps) {\n // Create default QueryClient if none provided\n // Using lazy initialization to ensure it's only created once\n const defaultQueryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60, // 1 minute\n retry: 1,\n },\n },\n }),\n [],\n );\n\n // Keep latest config in a ref so client creation reads current values\n const configRef = useRef(config);\n configRef.current = config;\n\n // Recreate client only when baseUrl changes (primitive dependency).\n // Wrap callbacks in closures so they always read the latest from configRef,\n // avoiding stale captures when parent passes new getAuthToken/onAuthError.\n const client = useMemo(\n () =>\n createFluidClient({\n ...configRef.current,\n getAuthToken: () => configRef.current.getAuthToken?.() ?? null,\n onAuthError: () => configRef.current.onAuthError?.(),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [config.baseUrl],\n );\n\n // Context value only changes when client changes\n const contextValue = useMemo(\n () => ({ client, config: configRef.current }) satisfies FluidContextValue,\n [client],\n );\n\n // Stable callback to provide auth headers for data source fetchers.\n // getAuthToken is typically a synchronous cookie/localStorage read,\n // so we call it and use the result if it's a string (not a Promise).\n const getApiHeaders = useCallback((): Record<string, string> => {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n const getAuthToken = configRef.current.getAuthToken;\n if (typeof getAuthToken === \"function\") {\n const tokenOrPromise = getAuthToken();\n // Only use synchronous results — async tokens are handled by the SDK client\n if (typeof tokenOrPromise === \"string\") {\n headers.Authorization = `Bearer ${tokenOrPromise}`;\n }\n }\n\n return headers;\n }, []);\n\n // Data source endpoints (e.g., /company/v1/products) expect the base URL\n // to include /api, matching fluid-admin's NEXT_PUBLIC_API_URL pattern.\n const dataSourceBaseUrl = useMemo(() => {\n const base = config.baseUrl.replace(/\\/+$/, \"\");\n return base.endsWith(\"/api\") ? base : `${base}/api`;\n }, [config.baseUrl]);\n\n // Auto-derive rep_id from auth context for data source path interpolation\n const authContext = useFluidAuthOptional();\n\n const autoVariables = useMemo(() => {\n if (authContext?.user?.id != null) {\n return { rep_id: String(authContext.user.id) };\n }\n return undefined;\n }, [authContext?.user?.id]);\n\n // Explicit prop takes precedence over auto-derived variables\n const effectiveVariables = variables ?? autoVariables;\n\n // Build theme provider props conditionally to satisfy exactOptionalPropertyTypes\n // We only pass props that are defined to avoid passing `undefined` explicitly\n const themeProviderProps = {\n ...(initialTheme !== undefined && { initialTheme }),\n ...(themeContainer !== undefined && { container: themeContainer }),\n };\n\n // Use provided registry or fall back to the default SDK widget registry\n const registry = widgetRegistry ?? DEFAULT_SDK_WIDGET_REGISTRY;\n\n return (\n <QueryClientProvider client={queryClient ?? defaultQueryClient}>\n <FluidContext.Provider value={contextValue}>\n <DataSourceRegistryProvider\n baseUrl={dataSourceBaseUrl}\n getApiHeaders={getApiHeaders}\n variables={effectiveVariables}\n >\n <RegistryProvider registry={registry}>\n <FluidThemeProvider {...themeProviderProps}>\n {children}\n </FluidThemeProvider>\n </RegistryProvider>\n </DataSourceRegistryProvider>\n </FluidContext.Provider>\n </QueryClientProvider>\n );\n}\n\n/**\n * Hook to access the Fluid context\n * Must be used within a FluidProvider\n */\nexport function useFluidContext(): FluidContextValue {\n const context = useContext(FluidContext);\n if (!context) {\n throw new Error(\"useFluidContext must be used within a FluidProvider\");\n }\n return context;\n}\n","import { useFluidContext } from \"../providers/FluidProvider\";\nimport type { FluidClient } from \"../client/fluid-client\";\n\n/**\n * Hook to access the Fluid API client\n *\n * @example\n * ```tsx\n * function ProductList() {\n * const api = useFluidApi();\n *\n * const { data: products } = useQuery({\n * queryKey: [\"products\"],\n * queryFn: () => api.products.list(),\n * });\n *\n * return <ul>{products?.map(p => <li key={p.id}>{p.name}</li>)}</ul>;\n * }\n * ```\n */\nexport function useFluidApi(): FluidClient {\n const { client } = useFluidContext();\n return client;\n}\n","/**\n * Bridge hook: maps rep SDK auth context to MessagingAuthContext.\n *\n * The messaging system identifies users by `recipient_id`, which is NOT in the\n * JWT payload or the /reps/me endpoint. It IS returned by GET /api/me.\n * This hook fetches that data and maps it into the shape MessagingApp expects.\n */\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport type {\n MessagingAuthContext,\n MessagingCurrentUser,\n} from \"@fluid-app/fluid-messaging-core\";\nimport { useFluidAuthContext } from \"../providers/FluidAuthProvider\";\nimport { useFluidApi } from \"../hooks/use-fluid-api\";\n\nconst USERS_ME_QUERY_KEY = [\"fluid\", \"users\", \"me\"] as const;\n\nexport function useMessagingAuth(): MessagingAuthContext {\n const auth = useFluidAuthContext();\n const api = useFluidApi();\n\n const {\n data: userMe,\n isLoading: isUserMeLoading,\n isError,\n } = useQuery({\n queryKey: USERS_ME_QUERY_KEY,\n queryFn: () => api.users.me(),\n enabled: auth.isAuthenticated,\n staleTime: Infinity,\n retry: 1,\n });\n\n if (auth.isLoading || (auth.isAuthenticated && isUserMeLoading)) {\n return {\n recipientId: null,\n companyId: null,\n currentUser: null,\n isLoading: true,\n };\n }\n\n if (!auth.isAuthenticated || isError || !userMe) {\n return {\n recipientId: null,\n companyId: null,\n currentUser: null,\n isLoading: false,\n };\n }\n\n const currentUser: MessagingCurrentUser | null = userMe.recipient_id\n ? {\n id: userMe.id,\n recipientId: userMe.recipient_id,\n firstName: userMe.first_name ?? \"\",\n lastName: userMe.last_name ?? \"\",\n email: userMe.email,\n ...(userMe.image_url != null && { imageUrl: userMe.image_url }),\n ...(userMe.affiliate_id != null && {\n affiliateId: userMe.affiliate_id,\n }),\n }\n : null;\n\n return {\n recipientId: userMe.recipient_id,\n companyId: userMe.company_id ?? null,\n currentUser,\n isLoading: false,\n };\n}\n","/**\n * Hook that derives MessagingApiConfig from the rep SDK's FluidProvider context.\n *\n * Maps FluidSDKConfig fields to the shape expected by MessagingApp:\n * - baseUrl -> from config.baseUrl\n * - getHeaders -> builds Authorization header from config.getAuthToken()\n * - onAuthError -> from config.onAuthError\n * - websocketUrl -> config.websocketUrl or derived from baseUrl\n * - token -> from auth context\n */\n\nimport { useCallback, useMemo } from \"react\";\nimport type { MessagingApiConfig } from \"@fluid-app/fluid-messaging-api-client\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { useFluidAuthContext } from \"../providers/FluidAuthProvider\";\n\nexport interface MessagingConfig {\n readonly apiConfig: MessagingApiConfig;\n readonly websocketUrl: string;\n readonly token: string | null;\n}\n\nfunction deriveWebsocketUrl(baseUrl: string): string {\n // Strip trailing slashes and /api suffix, then append /cable\n // Handles both \"https://api.fluid.app\" and \"https://api.fluid.app/api\"\n const base = baseUrl.replace(/\\/+$/, \"\").replace(/\\/api$/, \"\");\n return `${base}/cable`;\n}\n\nexport function useMessagingConfig(): MessagingConfig {\n const { config } = useFluidContext();\n const auth = useFluidAuthContext();\n\n const getHeaders = useCallback(async (): Promise<Record<string, string>> => {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...config.defaultHeaders,\n };\n\n if (config.getAuthToken) {\n const token = await config.getAuthToken();\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n return headers;\n }, [config]);\n\n const apiBaseUrl = useMemo(() => {\n const base = config.baseUrl.replace(/\\/+$/, \"\");\n return base.endsWith(\"/api\") ? base : `${base}/api`;\n }, [config.baseUrl]);\n\n const apiConfig = useMemo(\n (): MessagingApiConfig => ({\n baseUrl: apiBaseUrl,\n getHeaders,\n ...(config.onAuthError != null && { onAuthError: config.onAuthError }),\n }),\n [apiBaseUrl, config.onAuthError, getHeaders],\n );\n\n const websocketUrl = useMemo(\n () => config.websocketUrl ?? deriveWebsocketUrl(config.baseUrl),\n [config.websocketUrl, config.baseUrl],\n );\n\n return {\n apiConfig,\n websocketUrl,\n token: auth.token,\n };\n}\n","/**\n * Lightweight Filestack file uploader for the rep SDK.\n *\n * Uploads files to Filestack using the REST API (no filestack-js dependency).\n * Flow: upload to `https://www.filestackapi.com/api/store/S3?key=<apiKey>`\n * Uses XMLHttpRequest for upload progress tracking.\n */\n\nimport type {\n FileUploader,\n UploadCallbacks,\n UploadResult,\n} from \"@fluid-app/fluid-messaging-core\";\nimport { getFileTypeFromMimetype } from \"@fluid-app/fluid-messaging-core\";\n\nconst FILESTACK_UPLOAD_URL = \"https://www.filestackapi.com/api/store/S3\";\n\nfunction getImageDimensions(\n file: File,\n): Promise<{ width: number; height: number } | null> {\n if (!file.type.startsWith(\"image/\")) return Promise.resolve(null);\n\n return new Promise((resolve) => {\n const img = new Image();\n const url = URL.createObjectURL(file);\n\n img.onload = () => {\n URL.revokeObjectURL(url);\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve(null);\n };\n\n img.src = url;\n });\n}\n\nfunction uploadToFilestack(\n file: File,\n apiKey: string,\n callbacks: UploadCallbacks,\n): { abort: () => void } {\n const xhr = new XMLHttpRequest();\n let aborted = false;\n\n // Extract dimensions first (for images), then upload\n getImageDimensions(file)\n .then((metadata) => {\n if (aborted) return;\n\n const url = `${FILESTACK_UPLOAD_URL}?key=${encodeURIComponent(apiKey)}`;\n\n xhr.open(\"POST\", url);\n xhr.setRequestHeader(\"Content-Type\", file.type);\n\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) {\n const progress = Math.round((event.loaded / event.total) * 100);\n callbacks.onProgress(progress);\n }\n };\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText) as {\n url: string;\n size: number;\n type: string;\n };\n\n const result: UploadResult = {\n url: response.url,\n size: file.size,\n mimetype: file.type,\n kind: getFileTypeFromMimetype(file.type),\n metadata,\n };\n callbacks.onSuccess(result);\n } catch {\n callbacks.onError(new Error(\"Failed to parse upload response\"));\n }\n } else {\n callbacks.onError(\n new Error(`Upload failed with status ${xhr.status}`),\n );\n }\n };\n\n xhr.onerror = () => {\n if (!aborted) {\n callbacks.onError(new Error(\"Upload failed due to a network error\"));\n }\n };\n\n xhr.onabort = () => {\n // Silently handle abort — caller initiated it\n };\n\n xhr.send(file);\n })\n .catch((error) => {\n if (!aborted) {\n callbacks.onError(\n error instanceof Error\n ? error\n : new Error(\"Upload preparation failed\"),\n );\n }\n });\n\n return {\n abort: () => {\n aborted = true;\n xhr.abort();\n },\n };\n}\n\n/**\n * Creates a FileUploader that uploads to Filestack using the REST API.\n *\n * @param apiKey - Filestack API key. If falsy, returns a noop uploader\n * that rejects uploads with a helpful error message.\n */\nexport function createFluidFileUploader(\n apiKey: string | undefined,\n): FileUploader {\n if (!apiKey) {\n return {\n uploadFile: (_file: File, callbacks: UploadCallbacks) => {\n callbacks.onError(\n new Error(\n \"File uploads are not configured. Set filestackApiKey in your SDK config to enable attachments.\",\n ),\n );\n return { abort: () => {} };\n },\n };\n }\n\n return {\n uploadFile: (file: File, callbacks: UploadCallbacks) =>\n uploadToFilestack(file, apiKey, callbacks),\n };\n}\n","import {\n useCallback,\n useMemo,\n type ComponentProps,\n type ReactNode,\n} from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { MessagingApp } from \"@fluid-app/fluid-messaging-ui/app\";\nimport type { TagOption } from \"@fluid-app/fluid-messaging-ui\";\nimport {\n extractEmoji,\n formatMessageChannelName,\n} from \"@fluid-app/fluid-messaging-ui\";\nimport {\n listConnectedRecipients,\n searchConversations,\n} from \"@fluid-app/fluid-messaging-api-client\";\nimport type {\n Recipient,\n NominalConversation,\n} from \"@fluid-app/fluid-messaging-api-client\";\nimport { useMessagingAuth } from \"../messaging/use-messaging-auth\";\nimport { useMessagingConfig } from \"../messaging/use-messaging-config\";\nimport { createFluidFileUploader } from \"../messaging/fluid-file-uploader\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\n\ntype MessagingScreenProps = ComponentProps<\"div\"> & {\n // Styling\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n\n // Messaging overrides\n onToast?: (message: string, type: \"success\" | \"error\") => void;\n filestackApiKey?: string;\n websocketUrl?: string;\n};\n\nfunction renderImage(props: {\n src: string;\n alt: string;\n width: number;\n height: number;\n className?: string;\n}): ReactNode {\n return (\n <img\n src={props.src}\n alt={props.alt}\n width={props.width}\n height={props.height}\n className={props.className}\n />\n );\n}\n\nfunction defaultToast(message: string, type: \"success\" | \"error\") {\n if (type === \"error\") {\n console.warn(\"[Messaging]\", message);\n }\n}\n\nexport function MessagingScreen({\n onToast,\n filestackApiKey,\n websocketUrl: websocketUrlOverride,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: MessagingScreenProps) {\n const { config } = useFluidContext();\n const { apiConfig, websocketUrl, token } = useMessagingConfig();\n const messagingAuth = useMessagingAuth();\n\n const effectiveApiKey = filestackApiKey ?? config.filestackApiKey;\n const uploader = useMemo(\n () => createFluidFileUploader(effectiveApiKey),\n [effectiveApiKey],\n );\n\n const effectiveWsUrl = websocketUrlOverride ?? websocketUrl;\n const effectiveToast = onToast ?? defaultToast;\n\n const searchUsers = useCallback(\n async (query: string): Promise<TagOption[]> => {\n const result = await listConnectedRecipients(apiConfig, {\n filterrific: { search_query: query },\n per_page: 10,\n page: 1,\n });\n // Without `kind`, the API returns Recipient[] (not WithContactRecipient[])\n const recipients = (result?.[1]?.items ?? []) as Recipient[];\n return recipients.map((user) => {\n const hasName =\n [user.first_name, user.last_name].filter(Boolean).length > 0;\n const name = hasName\n ? [user.first_name, user.last_name].filter(Boolean).join(\" \")\n : `User ${user.id}`;\n return {\n id: String(user.id),\n label: name,\n imageType: \"user\" as const,\n userData: {\n first_name: user.first_name,\n last_name: user.last_name,\n image_url: user.avatar_url,\n phone: user.phone || undefined,\n email: user.email || undefined,\n },\n conversationName: name,\n };\n });\n },\n [apiConfig],\n );\n\n const searchChannels = useCallback(\n async (query: string): Promise<TagOption[]> => {\n const channels = ((await searchConversations(apiConfig, {\n filterrific: { search_query: query },\n })) ?? []) as NominalConversation[];\n return channels.map((channel) => {\n const { text: nameWithoutEmoji } = extractEmoji(channel.name);\n return {\n id: `channel-${channel.id}`,\n label: formatMessageChannelName(nameWithoutEmoji),\n imageType: \"channel\" as const,\n userData: {\n first_name: channel.name,\n last_name: null,\n image_url: channel.avatar_url,\n },\n conversationName: channel.name,\n };\n });\n },\n [apiConfig],\n );\n\n if (messagingAuth.isLoading) {\n return (\n <div\n {...divProps}\n className={`flex h-full items-center justify-center ${divProps.className ?? \"\"}`}\n >\n <div className=\"text-muted-foreground\">Loading messaging...</div>\n </div>\n );\n }\n\n if (!messagingAuth.recipientId) {\n return (\n <div\n {...divProps}\n className={`flex h-full items-center justify-center ${divProps.className ?? \"\"}`}\n >\n <div className=\"max-w-sm rounded-lg border border-dashed border-border p-8 text-center\">\n <h2 className=\"text-xl font-semibold text-foreground\">Messaging</h2>\n <p className=\"mt-2 text-muted-foreground\">\n Messaging is not available for your account\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div {...divProps} className={`h-full ${divProps.className ?? \"\"}`}>\n <MessagingApp\n config={apiConfig}\n auth={messagingAuth}\n websocketUrl={effectiveWsUrl}\n token={token}\n renderImage={renderImage}\n showAdminFeatures={false}\n onToast={effectiveToast}\n messagesViewProps={{\n uploader,\n saveDrafts: true,\n onToast: effectiveToast,\n }}\n newMessageViewProps={{\n searchUsers,\n searchChannels,\n }}\n />\n </div>\n );\n}\n\nexport const messagingScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"MessagingScreen\",\n displayName: \"Messaging Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"]}
|