@axcode/axcloud-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/index.d.mts +41 -1
- package/dist/index.d.ts +41 -1
- package/dist/index.js +94 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +92 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/errors.ts","../src/core/client.ts","../src/core/types.ts","../src/core/forms.ts","../src/react/context.tsx","../src/react/provider.tsx","../src/react/auth/useAuth.ts","../src/react/auth/useUser.ts","../src/react/hooks/useOrg.ts","../src/react/hooks/useNews.ts","../src/react/hooks/useContent.ts","../src/react/hooks/useMySection.ts","../src/react/hooks/useForms.ts","../src/react/hooks/useLinkedAccounts.ts","../src/react/hooks/useMedia.ts","../src/react/components/LoginButton.tsx","../src/react/components/ProtectedRoute.tsx","../src/react/components/ModuleGate.tsx","../src/react/components/LinkedAccountsList.tsx"],"names":["useAuth0","useQuery","useCallback","useQueryClient","useMutation","jsx","Fragment"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * AxCloud SDK Error Types\n */\n\nexport type AxCloudErrorCode =\n | 'UNAUTHORIZED'\n | 'FORBIDDEN'\n | 'NOT_FOUND'\n | 'VALIDATION_ERROR'\n | 'NETWORK_ERROR'\n | 'TIMEOUT_ERROR'\n | 'SERVER_ERROR'\n | 'UNKNOWN_ERROR'\n\nexport class AxCloudError extends Error {\n readonly code: AxCloudErrorCode\n readonly status: number\n readonly details?: Record<string, unknown>\n\n constructor(\n message: string,\n code: AxCloudErrorCode,\n status: number,\n details?: Record<string, unknown>\n ) {\n super(message)\n this.name = 'AxCloudError'\n this.code = code\n this.status = status\n this.details = details\n\n // Maintains proper stack trace for where error was thrown (V8 only)\n const ErrorWithCapture = Error as typeof Error & { captureStackTrace?: (target: object, constructor: Function) => void }\n if (ErrorWithCapture.captureStackTrace) {\n ErrorWithCapture.captureStackTrace(this, AxCloudError)\n }\n }\n\n static fromResponse(status: number, body?: unknown): AxCloudError {\n const details = typeof body === 'object' ? (body as Record<string, unknown>) : undefined\n const message = details?.message as string | undefined\n\n switch (status) {\n case 401:\n return new AxCloudError(\n message || 'Authentication required',\n 'UNAUTHORIZED',\n status,\n details\n )\n case 403:\n return new AxCloudError(\n message || 'Access denied',\n 'FORBIDDEN',\n status,\n details\n )\n case 404:\n return new AxCloudError(\n message || 'Resource not found',\n 'NOT_FOUND',\n status,\n details\n )\n case 422:\n return new AxCloudError(\n message || 'Validation failed',\n 'VALIDATION_ERROR',\n status,\n details\n )\n default:\n if (status >= 500) {\n return new AxCloudError(\n message || 'Server error',\n 'SERVER_ERROR',\n status,\n details\n )\n }\n return new AxCloudError(\n message || 'An error occurred',\n 'UNKNOWN_ERROR',\n status,\n details\n )\n }\n }\n\n static networkError(originalError?: Error): AxCloudError {\n // Don't include original error details in production to avoid leaking sensitive info\n // Use typeof check to avoid issues in environments where process is not defined\n const isDev = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'\n const message = isDev && originalError?.message\n ? originalError.message\n : 'Network request failed'\n\n return new AxCloudError(\n message,\n 'NETWORK_ERROR',\n 0,\n isDev ? { originalError: originalError?.message } : undefined\n )\n }\n\n static timeoutError(timeoutMs: number): AxCloudError {\n return new AxCloudError(\n `Request timed out after ${timeoutMs}ms`,\n 'TIMEOUT_ERROR',\n 0,\n { timeout: timeoutMs }\n )\n }\n}\n\nexport function isAxCloudError(error: unknown): error is AxCloudError {\n return error instanceof AxCloudError\n}\n","/**\n * AxCloud API Client\n *\n * Fetch wrapper with authentication header injection and error handling.\n */\n\nimport { AxCloudError } from './errors'\n\nexport interface ClientConfig {\n baseUrl: string\n getAccessToken?: () => Promise<string | undefined>\n /** API key for public content endpoints */\n apiKey?: string\n /** Default request timeout in milliseconds (default: 30000) */\n timeout?: number\n}\n\nexport interface RequestOptions extends Omit<RequestInit, 'body'> {\n body?: unknown\n params?: Record<string, string | number | boolean | undefined>\n /** Request timeout in milliseconds (overrides client default) */\n timeout?: number\n}\n\nexport class AxCloudClient {\n private baseUrl: string\n private getAccessToken?: () => Promise<string | undefined>\n private apiKey?: string\n private defaultTimeout: number\n\n constructor(config: ClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '')\n this.getAccessToken = config.getAccessToken\n this.apiKey = config.apiKey\n this.defaultTimeout = config.timeout ?? 30000\n }\n\n /**\n * Update the access token getter (used when auth state changes)\n */\n setAccessTokenGetter(getter: () => Promise<string | undefined>) {\n this.getAccessToken = getter\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n })\n }\n\n return url.toString()\n }\n\n /**\n * API key should only be sent to public endpoints.\n * This avoids leaking public keys to authenticated/internal routes.\n */\n private shouldAttachApiKey(path: string): boolean {\n const normalized = path.startsWith('/') ? path : `/${path}`\n return (\n normalized.startsWith('/public/') ||\n normalized.startsWith('/api/public/') ||\n normalized.startsWith('/content/public/')\n )\n }\n\n /**\n * Make an authenticated request\n */\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const { body, params, headers: customHeaders, timeout, ...restOptions } = options\n\n // Initialize headers as Record<string, string> to avoid type casting\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n // Merge custom headers\n if (customHeaders) {\n const customHeadersRecord = customHeaders as Record<string, string>\n Object.assign(headers, customHeadersRecord)\n }\n\n // Add API key header only for public endpoints\n if (this.apiKey && this.shouldAttachApiKey(path)) {\n headers['x-api-key'] = this.apiKey\n }\n\n // Add auth header if we have a token getter\n if (this.getAccessToken) {\n try {\n const token = await this.getAccessToken()\n if (token) {\n headers['Authorization'] = `Bearer ${token}`\n }\n } catch (error) {\n // Log in development to help with debugging auth issues\n // Use typeof check to avoid issues in environments where process is not defined\n if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development') {\n console.warn(\n '[AxCloud SDK] Failed to fetch access token:',\n error instanceof Error ? error.message : error\n )\n }\n // Don't throw - allow request to continue (backend will return 401 if needed)\n }\n }\n\n const url = this.buildUrl(path, params)\n\n // Setup AbortController for timeout\n const controller = new AbortController()\n const requestTimeout = timeout ?? this.defaultTimeout\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout)\n\n try {\n const response = await fetch(url, {\n ...restOptions,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n })\n\n // Handle non-JSON responses\n const contentType = response.headers.get('content-type')\n const isJson = contentType?.includes('application/json')\n\n if (!response.ok) {\n const errorBody = isJson ? await response.json().catch(() => null) : null\n throw AxCloudError.fromResponse(response.status, errorBody)\n }\n\n // Return empty object for 204 No Content\n if (response.status === 204) {\n return {} as T\n }\n\n return isJson ? await response.json() : ({} as T)\n } catch (error) {\n if (error instanceof AxCloudError) {\n throw error\n }\n // Handle abort/timeout errors\n if (error instanceof Error && error.name === 'AbortError') {\n throw AxCloudError.timeoutError(requestTimeout)\n }\n throw AxCloudError.networkError(error instanceof Error ? error : undefined)\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * GET request\n */\n get<T>(path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T> {\n return this.request<T>(path, { method: 'GET', params })\n }\n\n /**\n * POST request\n */\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'POST', body })\n }\n\n /**\n * PUT request\n */\n put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PUT', body })\n }\n\n /**\n * PATCH request\n */\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PATCH', body })\n }\n\n /**\n * DELETE request\n */\n delete<T>(path: string): Promise<T> {\n return this.request<T>(path, { method: 'DELETE' })\n }\n}\n\n// Client instance registry - allows multiple providers without SSR issues\n// Uses WeakMap to prevent memory leaks when providers unmount\nconst clientRegistry = new WeakMap<object, AxCloudClient>()\n\n/**\n * Create a client instance associated with a key (typically the provider instance)\n * This allows multiple AxCloudProviders to coexist without conflicts\n */\nexport function createClient(config: ClientConfig, key?: object): AxCloudClient {\n const client = new AxCloudClient(config)\n if (key) {\n clientRegistry.set(key, client)\n }\n return client\n}\n\n/**\n * Get a client instance by key\n * @deprecated Use the client from useAxCloudContext() instead\n */\nexport function getClient(key?: object): AxCloudClient {\n if (key) {\n const client = clientRegistry.get(key)\n if (client) {\n return client\n }\n }\n throw new Error('AxCloud client not found. Make sure AxCloudProvider is mounted and use useAxCloudContext() to get the client.')\n}\n","/**\n * AxCloud SDK Types\n *\n * Note: In the future, these types should be auto-generated from the OpenAPI spec.\n * For now, they are manually defined based on the AxCloud API.\n */\n\n// Module types available in AxCloud\nexport type AxCloudModule =\n | 'content'\n | 'members'\n | 'sections'\n | 'training'\n | 'ai'\n | 'documents'\n | 'voting'\n\n// System roles (fixed, cannot be modified)\nexport type SystemRole = 'super_admin' | 'org_admin' | 'section_admin' | 'member' | 'viewer'\n\n// Legacy role names for backwards compatibility\nexport type UserRole = SystemRole | 'superadmin' | 'admin' | 'editor'\n\n// Base roles that custom roles can extend (excludes super_admin)\nexport type BaseRole = 'org_admin' | 'section_admin' | 'member' | 'viewer'\n\n/**\n * Custom role definition\n */\nexport interface CustomRole {\n role_id: string\n org_id: string\n name: string\n description?: string\n baseRole: BaseRole\n permissions?: string[] // Explicit permissions (optional)\n deniedPermissions?: string[] // Permissions removed from base role\n effectivePermissions?: string[] // Calculated: base - denied (from API)\n color?: string\n icon?: string\n hierarchy: number\n isSystem: false\n isActive: boolean\n createdAt: string\n updatedAt: string\n}\n\n// Organization\nexport interface Organization {\n id: string\n name: string\n slug: string\n description?: string\n modules: AxCloudModule[]\n settings?: OrganizationSettings\n createdAt: string\n updatedAt: string\n}\n\nexport interface OrganizationSettings {\n allowPublicSignup?: boolean\n requireEmailVerification?: boolean\n defaultUserRole?: UserRole\n theme?: {\n primaryColor?: string\n logo?: string\n }\n}\n\n// Section (groups within organization)\nexport interface Section {\n id: string\n organizationId: string\n name: string\n description?: string\n slug: string\n parentId?: string\n permissions?: SectionPermissions\n createdAt: string\n updatedAt: string\n}\n\nexport interface SectionPermissions {\n canViewMembers?: boolean\n canEditContent?: boolean\n canManageMembers?: boolean\n}\n\n// User\nexport interface User {\n id: string\n email: string\n name: string\n firstName?: string\n lastName?: string\n avatar?: string\n organizationId: string\n sectionId?: string\n role: UserRole // System role or custom role ID\n customRole?: CustomRole // Full custom role object if using custom role\n permissions?: string[] // Effective permissions (calculated)\n metadata?: Record<string, unknown>\n createdAt: string\n updatedAt: string\n}\n\n/**\n * Check if user has a specific permission\n */\nexport function userHasPermission(user: User, permission: string): boolean {\n // If user has explicit permissions array, use it\n if (user.permissions && user.permissions.length > 0) {\n return user.permissions.includes(permission)\n }\n\n // Fallback: check if user has a custom role with effective permissions\n if (user.customRole?.effectivePermissions) {\n return user.customRole.effectivePermissions.includes(permission)\n }\n\n return false\n}\n\n/**\n * Check if user has any of the specified permissions\n */\nexport function userHasAnyPermission(user: User, permissions: string[]): boolean {\n return permissions.some(p => userHasPermission(user, p))\n}\n\n/**\n * Check if user has all of the specified permissions\n */\nexport function userHasAllPermissions(user: User, permissions: string[]): boolean {\n return permissions.every(p => userHasPermission(user, p))\n}\n\n// Membership info (extended user data)\nexport interface Membership {\n userId: string\n organizationId: string\n sectionId?: string\n section?: Section\n role: UserRole\n status: 'active' | 'pending' | 'suspended' | 'expired'\n joinedAt: string\n expiresAt?: string\n metadata?: Record<string, unknown>\n}\n\n// Content types\nexport interface ContentBlock {\n id: string\n type: string\n content?: string\n url?: string\n alt?: string\n level?: 1 | 2 | 3 | 4 | 5 | 6\n items?: unknown[]\n language?: string\n caption?: string\n attributes?: Record<string, unknown>\n ordered?: boolean\n author?: string\n}\n\nexport interface ContentTranslation {\n title: string\n slug: string\n description?: string\n blocks: ContentBlock[]\n metaTitle?: string\n metaDescription?: string\n keywords?: string[]\n}\n\nexport type ContentPublicationState = 'draft' | 'published' | 'archived'\nexport type ContentAudience = 'public' | 'internal' | 'members' | 'section'\n\nexport interface ContentItem {\n id: string\n organizationId: string\n type: string\n title: string\n slug: string\n /** Legacy string content. New AxCloud content uses `blocks`. */\n content?: string\n description?: string\n blocks?: ContentBlock[]\n excerpt?: string\n author?: {\n id: string\n name: string\n }\n status?: ContentPublicationState\n visibility?: ContentPublicationState\n audience?: ContentAudience\n sectionId?: string\n tags?: string[]\n lang?: string\n featuredImage?: string\n metaTitle?: string\n metaDescription?: string\n keywords?: string[]\n translations?: Record<string, ContentTranslation>\n currentLanguage?: string\n availableLanguages?: string[]\n seo?: {\n canonical: string\n hreflang: Array<{ lang: string; href: string }>\n }\n publishedAt?: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface NewsItem extends ContentItem {\n type: 'news'\n featuredImage?: string\n category?: string\n tags?: string[]\n}\n\nexport interface Page extends ContentItem {\n type: 'page'\n template?: string\n order?: number\n}\n\n// API Response types\nexport interface PaginatedResponse<T> {\n items: T[]\n total: number\n page: number\n pageSize: number\n hasMore: boolean\n}\n\n// SDK Configuration\nexport interface AxCloudConfig {\n orgId: string\n apiUrl: string\n /** API stage - defaults to 'dev'. Use 'prod' for production. */\n stage: string\n /** API key for public content endpoints (optional - required for public API access) */\n apiKey?: string\n auth0: {\n domain: string\n clientId: string\n redirectUri: string\n audience?: string\n /** Database connection name for password operations. Defaults to 'Username-Password-Authentication' */\n connection?: string\n }\n}\n\n// Query options\nexport interface ContentQueryOptions {\n page?: number\n pageSize?: number\n status?: ContentPublicationState\n visibility?: ContentPublicationState\n audience?: ContentAudience\n sectionId?: string\n search?: string\n sortBy?: string\n sortOrder?: 'asc' | 'desc'\n /** Return the requested translation when content has language variants. */\n lang?: string\n /** Force public endpoint even when authenticated (for public pages) */\n publicOnly?: boolean\n}\n\n// ============================================\n// MEDIA & BRANDING TYPES\n// ============================================\n\n/**\n * Organization branding information\n */\nexport interface OrganizationBranding {\n organizationId: string\n name: string\n branding: {\n /** Signed URL for logo (expires in 1 hour) */\n logoUrl: string | null\n /** Seconds until logoUrl expires */\n logoExpiresIn: number | null\n /** Primary brand color (hex) */\n primaryColor: string | null\n /** Secondary brand color (hex) */\n secondaryColor: string | null\n }\n}\n\n/**\n * Signed URL response for media assets\n */\nexport interface SignedMediaUrl {\n /** Signed S3 URL (expires in 1 hour) */\n url: string\n /** Seconds until URL expires */\n expiresIn: number\n /** S3 bucket name */\n bucket: string\n /** S3 object key */\n key: string\n}\n\n/**\n * Media list item\n */\nexport interface MediaItem {\n /** File key (filename) */\n key: string\n /** File size in bytes */\n size: number\n /** Last modified timestamp */\n lastModified: string\n}\n\n/**\n * Media list response\n */\nexport interface MediaListResponse {\n items: MediaItem[]\n count: number\n bucket: string\n prefix: string\n}\n","/**\n * AxCloud Forms Module\n *\n * Public functions for form submissions.\n * Requires organization API key for authentication.\n * Used by public websites like airene.io, theremoters.io, etc.\n */\n\n/**\n * Form submission request\n */\nexport interface FormSubmission {\n /** Organization API key (required for authentication) */\n apiKey: string\n /** Site domain (e.g., 'airene.io') */\n site: string\n /** Form type: 'waitlist', 'contact', or 'membership' */\n formType: 'waitlist' | 'contact' | 'membership'\n /** Email address */\n email: string\n /** Additional form data */\n data?: Record<string, unknown>\n}\n\n/**\n * Form submission response\n */\nexport interface FormSubmissionResponse {\n /** Whether the submission was successful */\n success: boolean\n /** User-friendly message */\n message: string\n /** Unique submission ID */\n submissionId: string\n}\n\n/**\n * Form submission stored in database\n */\nexport interface FormSubmissionRecord {\n submission_id: string\n org_id: string\n site: string\n form_type: 'waitlist' | 'contact' | 'membership'\n status: 'pending' | 'approved' | 'rejected' | 'converted'\n email: string\n data: Record<string, unknown>\n created_at: string\n updated_at: string\n reviewed_by?: string\n reviewed_at?: string\n notes?: string\n user_id?: string\n}\n\n/**\n * Form stats response from API\n */\nexport interface FormStatsResponse {\n stats: {\n total: number\n byStatus: Record<string, number>\n byType: Record<string, number>\n bySite: Record<string, number>\n recent: {\n today: number\n last7Days: number\n last30Days: number\n }\n }\n summary: {\n pending: number\n approved: number\n rejected: number\n conversionRate: string\n }\n period: {\n days: number\n from: string\n to: string\n }\n}\n\n/**\n * Paginated response for form submissions\n */\nexport interface FormSubmissionsResponse {\n items: FormSubmissionRecord[]\n total: number\n cursor?: string\n hasMore: boolean\n}\n\n/**\n * Submit a form to AxCloud\n *\n * Requires organization API key for authentication.\n *\n * @param apiUrl - AxCloud Forms API base URL (e.g., 'https://api.axcloud.app/forms/dev')\n * @param submission - Form submission data including API key\n * @returns Submission response with ID\n *\n * @example\n * ```tsx\n * import { submitForm } from '@axcloud/sdk'\n *\n * const handleSubmit = async (email: string) => {\n * const result = await submitForm(\n * 'https://api.axcloud.app/forms/dev',\n * {\n * apiKey: 'your-org-api-key',\n * site: 'airene.io',\n * formType: 'waitlist',\n * email,\n * data: { name: 'John Doe' }\n * }\n * )\n * console.log(result.message) // \"Thanks! We'll notify you when we launch.\"\n * }\n * ```\n */\nexport async function submitForm(\n apiUrl: string,\n submission: FormSubmission\n): Promise<FormSubmissionResponse> {\n const baseUrl = apiUrl.replace(/\\/$/, '')\n\n try {\n const response = await fetch(`${baseUrl}/public/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n api_key: submission.apiKey,\n site: submission.site,\n form_type: submission.formType,\n email: submission.email,\n data: submission.data || {}\n })\n })\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Form submission failed' }))\n throw new Error(error.message || 'Form submission failed')\n }\n\n const result = await response.json()\n\n return {\n success: result.success,\n message: result.message,\n submissionId: result.submission_id\n }\n } catch (primaryError) {\n // Fallback: notify via email so signups aren't lost\n try {\n const notifyResponse = await fetch(`${baseUrl}/public/notify`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n api_key: submission.apiKey,\n site: submission.site,\n form_type: submission.formType,\n email: submission.email\n })\n })\n\n if (notifyResponse.ok) {\n const result = await notifyResponse.json()\n return {\n success: true,\n message: result.message || \"Thanks! We'll notify you when we launch.\",\n submissionId: 'fallback'\n }\n }\n } catch {\n // Notify also failed — throw original error\n }\n\n throw primaryError\n }\n}\n\n/**\n * Create a form submission helper with pre-configured API URL, API key, and site\n *\n * @param config - Configuration with apiUrl, apiKey, and site\n * @returns Object with submit functions\n *\n * @example\n * ```tsx\n * import { createFormHelper } from '@axcloud/sdk'\n *\n * const forms = createFormHelper({\n * apiUrl: 'https://api.axcloud.app/forms/dev',\n * apiKey: 'your-org-api-key',\n * site: 'airene.io'\n * })\n *\n * // Now you can submit forms without repeating apiUrl, apiKey and site\n * const result = await forms.submit('waitlist', 'user@example.com')\n * ```\n */\nexport function createFormHelper(config: { apiUrl: string; apiKey: string; site: string }) {\n return {\n /**\n * Submit a waitlist form\n */\n submitWaitlist: (email: string, data?: Record<string, unknown>) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType: 'waitlist',\n email,\n data\n }),\n\n /**\n * Submit a contact form\n */\n submitContact: (\n email: string,\n data: { name?: string; message: string; [key: string]: unknown }\n ) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType: 'contact',\n email,\n data\n }),\n\n /**\n * Submit a membership application\n */\n submitMembership: (\n email: string,\n data: {\n firstName?: string\n lastName?: string\n phone?: string\n [key: string]: unknown\n }\n ) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType: 'membership',\n email,\n data\n }),\n\n /**\n * Generic submit function\n */\n submit: (\n formType: 'waitlist' | 'contact' | 'membership',\n email: string,\n data?: Record<string, unknown>\n ) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType,\n email,\n data\n })\n }\n}\n","import { createContext, useContext } from 'react'\nimport type { AxCloudClient } from '../core/client'\nimport type { AxCloudConfig } from '../core/types'\n\nexport interface AxCloudContextValue {\n config: AxCloudConfig\n client: AxCloudClient\n orgId: string\n /** API stage (e.g., 'dev', 'prod') */\n stage: string\n /** Whether using public API mode (API key, no auth) */\n isPublicMode: boolean\n}\n\nexport const AxCloudContext = createContext<AxCloudContextValue | null>(null)\n\nexport function useAxCloudContext(): AxCloudContextValue {\n const context = useContext(AxCloudContext)\n if (!context) {\n throw new Error('useAxCloudContext must be used within a AxCloudProvider')\n }\n return context\n}\n","import React, { useMemo, useRef } from 'react'\nimport { Auth0Provider, useAuth0 } from '@auth0/auth0-react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { AxCloudContext } from './context'\nimport { AxCloudClient } from '../core/client'\nimport type { AxCloudConfig } from '../core/types'\n\ninterface AxCloudProviderProps {\n children: React.ReactNode\n orgId: string\n apiUrl: string\n /** API stage - defaults to 'dev'. Use 'prod' for production. */\n stage?: string\n /** API key for public content endpoints */\n apiKey?: string\n auth0: {\n domain: string\n clientId: string\n redirectUri: string\n audience?: string\n /** Database connection name for password operations. Defaults to 'Username-Password-Authentication' */\n connection?: string\n }\n queryClient?: QueryClient\n /** Default request timeout in milliseconds (default: 30000) */\n timeout?: number\n}\n\n// Default query client with sensible defaults for content fetching\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60 * 5, // 5 minutes\n gcTime: 1000 * 60 * 30, // 30 minutes (garbage collection)\n retry: 2,\n refetchOnWindowFocus: false,\n },\n },\n})\n\n/**\n * Inner provider that has access to Auth0 context\n */\nfunction AxCloudInnerProvider({\n children,\n config,\n timeout,\n}: {\n children: React.ReactNode\n config: AxCloudConfig\n timeout?: number\n}) {\n const { getAccessTokenSilently, isAuthenticated } = useAuth0()\n\n // Use ref to store the token getter so it can be updated without recreating the client\n const tokenGetterRef = useRef<() => Promise<string | undefined>>(async () => undefined)\n\n // Update the ref when auth state changes\n tokenGetterRef.current = isAuthenticated\n ? async () => {\n try {\n return await getAccessTokenSilently()\n } catch {\n return undefined\n }\n }\n : async () => undefined\n\n // Create the API client with a stable token getter that uses the ref\n // This avoids recreating the client on auth changes while still getting fresh tokens\n const client = useMemo(() => {\n return new AxCloudClient({\n baseUrl: config.apiUrl,\n apiKey: config.apiKey,\n timeout,\n // Use a wrapper function that delegates to the ref\n // This ensures the client always uses the current auth state\n getAccessToken: async () => {\n if (tokenGetterRef.current) {\n return tokenGetterRef.current()\n }\n return undefined\n },\n })\n }, [config.apiUrl, config.apiKey, timeout])\n\n const contextValue = useMemo(\n () => ({\n config,\n client,\n orgId: config.orgId,\n stage: config.stage,\n isPublicMode: Boolean(config.apiKey) && !isAuthenticated,\n }),\n [config, client, isAuthenticated]\n )\n\n return (\n <AxCloudContext.Provider value={contextValue}>\n {children}\n </AxCloudContext.Provider>\n )\n}\n\n/**\n * AxCloudProvider - Main provider for the SDK\n *\n * Combines Auth0Provider, QueryClientProvider, and AxCloud context.\n *\n * @example\n * ```tsx\n * <AxCloudProvider\n * orgId=\"spf\"\n * apiUrl=\"https://api.axcloud.app\"\n * apiKey=\"your-api-key\" // Required for public content access\n * auth0={{\n * domain: \"auth.axcloud.app\",\n * clientId: \"xxx\",\n * redirectUri: window.location.origin\n * }}\n * >\n * <App />\n * </AxCloudProvider>\n * ```\n */\nexport function AxCloudProvider({\n children,\n orgId,\n apiUrl,\n stage = 'dev',\n apiKey,\n auth0,\n queryClient = defaultQueryClient,\n timeout,\n}: AxCloudProviderProps) {\n const config: AxCloudConfig = useMemo(\n () => ({\n orgId,\n apiUrl,\n stage,\n apiKey,\n auth0,\n }),\n [orgId, apiUrl, stage, apiKey, auth0]\n )\n\n return (\n <QueryClientProvider client={queryClient}>\n <Auth0Provider\n domain={auth0.domain}\n clientId={auth0.clientId}\n authorizationParams={{\n redirect_uri: auth0.redirectUri,\n audience: auth0.audience,\n }}\n >\n <AxCloudInnerProvider config={config} timeout={timeout}>\n {children}\n </AxCloudInnerProvider>\n </Auth0Provider>\n </QueryClientProvider>\n )\n}\n","import { useCallback } from 'react'\nimport { useAuth0, User as Auth0User } from '@auth0/auth0-react'\nimport { useAxCloudContext } from '../context'\n\nexport interface AuthUser {\n id: string\n email: string\n name: string\n avatar?: string\n}\n\nexport interface UseAuthReturn {\n isAuthenticated: boolean\n isLoading: boolean\n error: Error | undefined\n user: AuthUser | null\n login: (options?: { returnTo?: string }) => Promise<void>\n logout: (options?: { returnTo?: string }) => Promise<void>\n getAccessToken: () => Promise<string | undefined>\n getAuth0Client: () => Auth0ClientState\n /** Request a password reset email for the current user or specified email */\n requestPasswordReset: (email?: string) => Promise<{ success: boolean; message: string }>\n}\n\nexport interface Auth0ClientState {\n loginWithRedirect: ReturnType<typeof useAuth0>['loginWithRedirect']\n logout: ReturnType<typeof useAuth0>['logout']\n getAccessTokenSilently: ReturnType<typeof useAuth0>['getAccessTokenSilently']\n getIdTokenClaims: ReturnType<typeof useAuth0>['getIdTokenClaims']\n user: Auth0User | undefined\n isAuthenticated: boolean\n isLoading: boolean\n error: Error | undefined\n}\n\n/**\n * useAuth - Authentication hook with simplified API and escape hatch\n *\n * Provides easy login/logout methods while allowing access to the\n * underlying Auth0 client for advanced use cases.\n *\n * @example\n * ```tsx\n * function Header() {\n * const { isAuthenticated, login, logout, user } = useAuth()\n *\n * return isAuthenticated ? (\n * <button onClick={logout}>Log out</button>\n * ) : (\n * <button onClick={login}>Log in</button>\n * )\n * }\n * ```\n *\n * @example\n * // Advanced: Get access token for manual API calls\n * ```tsx\n * function MyComponent() {\n * const { getAccessToken } = useAuth()\n *\n * const fetchData = async () => {\n * const token = await getAccessToken()\n * // Use token for custom API calls\n * }\n * }\n * ```\n */\nexport function useAuth(): UseAuthReturn {\n const { config } = useAxCloudContext()\n const {\n isAuthenticated,\n isLoading,\n user: auth0User,\n error,\n loginWithRedirect,\n logout: auth0Logout,\n getAccessTokenSilently,\n getIdTokenClaims,\n } = useAuth0()\n\n /**\n * Trigger login via Auth0 Universal Login\n */\n const login = useCallback(\n (options?: { returnTo?: string }) => {\n return loginWithRedirect({\n appState: {\n returnTo: options?.returnTo || window.location.pathname,\n },\n })\n },\n [loginWithRedirect]\n )\n\n /**\n * Log out and optionally redirect\n */\n const logout = useCallback(\n (options?: { returnTo?: string }) => {\n return auth0Logout({\n logoutParams: {\n returnTo: options?.returnTo || window.location.origin,\n },\n })\n },\n [auth0Logout]\n )\n\n /**\n * Get the current access token (for manual API calls)\n */\n const getAccessToken = useCallback(async () => {\n try {\n return await getAccessTokenSilently()\n } catch {\n return undefined\n }\n }, [getAccessTokenSilently])\n\n /**\n * Get the full Auth0 client for advanced use cases (escape hatch)\n */\n const getAuth0Client = useCallback(() => {\n return {\n loginWithRedirect,\n logout: auth0Logout,\n getAccessTokenSilently,\n getIdTokenClaims,\n user: auth0User,\n isAuthenticated,\n isLoading,\n error,\n }\n }, [\n loginWithRedirect,\n auth0Logout,\n getAccessTokenSilently,\n getIdTokenClaims,\n auth0User,\n isAuthenticated,\n isLoading,\n error,\n ])\n\n /**\n * Request a password reset email\n * Can be used by logged-in users or on a \"forgot password\" page\n */\n const requestPasswordReset = useCallback(\n async (email?: string): Promise<{ success: boolean; message: string }> => {\n const targetEmail = email || auth0User?.email\n\n if (!targetEmail) {\n return {\n success: false,\n message: 'Email address is required',\n }\n }\n\n try {\n // Call Auth0's change_password endpoint directly\n const auth0Domain = config.auth0.domain\n const clientId = config.auth0.clientId\n const connection = config.auth0.connection || 'Username-Password-Authentication'\n\n const response = await fetch(`https://${auth0Domain}/dbconnections/change_password`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n client_id: clientId,\n email: targetEmail.toLowerCase(),\n connection,\n }),\n })\n\n if (response.ok) {\n return {\n success: true,\n message: 'If an account exists with this email, a password reset link has been sent.',\n }\n }\n\n // Auth0 returns 200 even for non-existent emails for security\n return {\n success: true,\n message: 'If an account exists with this email, a password reset link has been sent.',\n }\n } catch {\n return {\n success: false,\n message: 'Failed to send password reset email. Please try again.',\n }\n }\n },\n [auth0User?.email, config.auth0.domain, config.auth0.clientId]\n )\n\n return {\n // Simple, abstracted API\n isAuthenticated,\n isLoading,\n error,\n user: auth0User\n ? {\n id: auth0User.sub || '',\n email: auth0User.email || '',\n name: auth0User.name || '',\n avatar: auth0User.picture,\n }\n : null,\n login,\n logout,\n\n // Escape hatch for advanced use cases\n getAccessToken,\n getAuth0Client,\n\n // Password management\n requestPasswordReset,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAuth0 } from '@auth0/auth0-react'\nimport { useAxCloudContext } from '../context'\nimport type { User } from '../../core/types'\n\n// Extended user response from API (exported for type usage)\nexport interface UserApiResponse extends User {\n all_org_ids?: string[]\n organization_memberships?: Record<string, { role: string; sections?: string[] }>\n isSuperAdmin?: boolean\n}\n\n/**\n * useUser - Fetch the current authenticated user from AxCloud\n *\n * Returns the full user profile including organization membership,\n * role, section, and permissions.\n *\n * Also validates that the user has access to the configured organization.\n *\n * @example\n * ```tsx\n * function Profile() {\n * const { user, isLoading, isError, hasOrgAccess } = useUser()\n *\n * if (isLoading) return <Spinner />\n * if (!hasOrgAccess) return <AccessDenied />\n * if (!user) return <LoginPrompt />\n *\n * return (\n * <div>\n * <h1>Welcome, {user.name}!</h1>\n * <p>Role: {user.role}</p>\n * <p>Organization: {user.organizationId}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useUser() {\n const { isAuthenticated, isLoading: isAuthLoading } = useAuth0()\n const { client, stage, orgId } = useAxCloudContext()\n\n const query = useQuery<UserApiResponse>({\n queryKey: ['axcloud', 'user', 'me', stage],\n queryFn: async () => {\n // Main API uses /{stage}/api base path\n return client.get<UserApiResponse>(`/${stage}/api/users/me`)\n },\n enabled: isAuthenticated && !isAuthLoading,\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n // Check if user has access to the configured organization\n const userData = query.data\n const userOrgIds = userData?.all_org_ids ?? []\n const isSuperAdmin = userData?.isSuperAdmin === true\n const hasOrgAccess = isSuperAdmin || userOrgIds.includes(orgId)\n\n // Get user's role in this specific organization\n const orgMembership = userData?.organization_memberships?.[orgId]\n const roleInOrg = orgMembership?.role ?? null\n\n return {\n user: query.data ?? null,\n isLoading: isAuthLoading || query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n\n // Organization access\n hasOrgAccess,\n roleInOrg,\n\n // Convenience properties\n isAuthenticated,\n role: query.data?.role ?? null,\n organizationId: query.data?.organizationId ?? null,\n sectionId: query.data?.sectionId ?? null,\n permissions: query.data?.permissions ?? [],\n isSuperAdmin,\n }\n}\n","import { useCallback } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type { Organization, AxCloudModule } from '../../core/types'\n\n/**\n * Public organization response from /content/public/{orgId}/org\n */\ninterface PublicOrganization {\n org_id: string\n name: string\n description?: string\n branding?: {\n logo?: string\n primaryColor?: string\n secondaryColor?: string\n }\n modules?: string[]\n contact?: {\n email?: string\n phone?: string\n website?: string\n }\n social?: {\n facebook?: string\n twitter?: string\n linkedin?: string\n instagram?: string\n }\n}\n\n/**\n * useOrg - Fetch organization info and check module availability\n *\n * Automatically uses the appropriate endpoint:\n * - With API key (public): `/content/public/{orgId}/org`\n * - With JWT auth: `/orgs/api/organizations/{orgId}`\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { org, hasModule, isLoading } = useOrg()\n *\n * if (isLoading) return <Spinner />\n *\n * return (\n * <div>\n * <h1>{org.name}</h1>\n * {org.branding?.logo && <img src={org.branding.logo} alt={org.name} />}\n * {hasModule('training') && <TrainingSection />}\n * {hasModule('ai') && <AIChatWidget />}\n * </div>\n * )\n * }\n * ```\n */\nexport function useOrg() {\n const { client, orgId, stage, isPublicMode } = useAxCloudContext()\n\n // Determine if we should use public endpoint (API key mode or not authenticated)\n const usePublicEndpoint = isPublicMode\n\n const query = useQuery<Organization | PublicOrganization>({\n queryKey: ['axcloud', 'organization', orgId, stage, usePublicEndpoint],\n queryFn: async () => {\n if (usePublicEndpoint) {\n // Public API: /content/public/{orgId}/org (requires x-api-key)\n return client.get<PublicOrganization>(`/content/public/${orgId}/org`)\n } else {\n // Organizations service: /orgs/api/organizations/{orgId}\n return client.get<Organization>(`/orgs/api/organizations/${orgId}`)\n }\n },\n staleTime: 1000 * 60 * 10, // 10 minutes (org data rarely changes)\n })\n\n // Normalize the response to handle both formats\n const orgData = query.data\n const normalizedOrg = orgData ? {\n id: (orgData as Organization).id || (orgData as PublicOrganization).org_id,\n org_id: (orgData as PublicOrganization).org_id || (orgData as Organization).id,\n name: orgData.name,\n description: orgData.description,\n branding: (orgData as PublicOrganization).branding || (orgData as Organization).settings?.theme,\n modules: orgData.modules || [],\n contact: (orgData as PublicOrganization).contact,\n social: (orgData as PublicOrganization).social,\n } : null\n\n /**\n * Check if a specific module is enabled for this organization\n */\n const hasModule = useCallback(\n (module: AxCloudModule): boolean => {\n const mods = normalizedOrg?.modules || []\n return mods.includes(module)\n },\n [normalizedOrg?.modules]\n )\n\n /**\n * Get all enabled modules\n */\n const modules = normalizedOrg?.modules ?? []\n\n return {\n org: normalizedOrg,\n orgId,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n\n // Module helpers\n hasModule,\n modules,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type { NewsItem, PaginatedResponse, ContentQueryOptions } from '../../core/types'\n\n/**\n * useNews - Fetch news articles for the organization\n *\n * When authenticated (isPublicMode = false), fetches news visible to members\n * including public, internal, and members-only content.\n *\n * When not authenticated (isPublicMode = true), fetches only public news.\n *\n * @example\n * ```tsx\n * function NewsPage() {\n * const { data: news, isLoading, isError, error } = useNews()\n *\n * if (isLoading) return <Spinner />\n * if (isError) return <Error message={error.message} />\n *\n * return (\n * <ul>\n * {news.map(item => (\n * <li key={item.id}>{item.title}</li>\n * ))}\n * </ul>\n * )\n * }\n * ```\n *\n * @example\n * // With pagination\n * ```tsx\n * const { data, hasMore, refetch } = useNews({\n * pageSize: 10,\n * status: 'published'\n * })\n * ```\n */\nexport function useNews(options: ContentQueryOptions = {}) {\n const { client, orgId, isPublicMode } = useAxCloudContext()\n\n const {\n page = 1,\n pageSize = 20,\n status = 'published',\n visibility,\n sectionId,\n search,\n sortBy = 'publishedAt',\n sortOrder = 'desc',\n publicOnly = false,\n } = options\n\n // Use public endpoint if: not authenticated OR explicitly requested publicOnly\n const usePublicEndpoint = isPublicMode || publicOnly\n\n const query = useQuery<PaginatedResponse<NewsItem>>({\n queryKey: ['axcloud', 'news', orgId, usePublicEndpoint,\n page, pageSize, status, visibility, sectionId, search, sortBy, sortOrder],\n queryFn: async () => {\n // Use member endpoint when authenticated and not publicOnly\n // Member endpoint returns public + internal + members content\n // Public endpoint returns only public content\n const endpoint = usePublicEndpoint\n ? `/content/public/${orgId}/news`\n : `/content/members/${orgId}/news`\n\n return client.get<PaginatedResponse<NewsItem>>(endpoint, {\n page,\n pageSize,\n status,\n visibility,\n sectionId,\n search,\n sortBy,\n sortOrder,\n })\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n data: query.data?.items ?? [],\n total: query.data?.total ?? 0,\n hasMore: query.data?.hasMore ?? false,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type { ContentItem, PaginatedResponse, ContentQueryOptions } from '../../core/types'\n\n/**\n * Content types that have member endpoints\n * These return public + internal + members content when authenticated\n */\nconst MEMBER_ENDPOINT_TYPES = ['news', 'pages', 'events']\nconst PAGE_CONTENT_TYPES = ['page', 'pages']\n\n/**\n * useContent - Generic content fetching hook\n *\n * When authenticated (isPublicMode = false), fetches content visible to members\n * including public, internal, and members-only content (for supported types).\n *\n * When not authenticated (isPublicMode = true), fetches only public content.\n *\n * @param contentType - The type of content to fetch (e.g., 'news', 'pages', 'events')\n * @param options - Query options for filtering and pagination\n *\n * @example\n * ```tsx\n * // Fetch pages\n * const { data: pages } = useContent('pages')\n *\n * // Fetch custom content type\n * const { data: events } = useContent('events', {\n * status: 'published',\n * sortBy: 'startDate'\n * })\n * ```\n */\nexport function useContent<T extends ContentItem = ContentItem>(\n contentType: string,\n options: ContentQueryOptions = {}\n) {\n const { client, orgId, isPublicMode } = useAxCloudContext()\n\n const {\n publicOnly = false,\n page = 1,\n pageSize = 20,\n status = 'published',\n visibility,\n sectionId,\n search,\n sortBy = 'createdAt',\n sortOrder = 'desc',\n lang,\n } = options\n\n const query = useQuery<PaginatedResponse<T>>({\n queryKey: ['axcloud', 'content', orgId, contentType, isPublicMode, publicOnly,\n page, pageSize, status, visibility, sectionId, search, sortBy, sortOrder, lang],\n queryFn: async () => {\n // Use member endpoint when authenticated (for supported content types) and not publicOnly\n // Member endpoint returns public + internal + members content based on membership\n // Public endpoint returns only public content\n const useMemberEndpoint = !isPublicMode && !publicOnly && MEMBER_ENDPOINT_TYPES.includes(contentType)\n const endpoint = useMemberEndpoint\n ? `/content/members/${orgId}/${contentType}`\n : `/content/public/${orgId}/${contentType}`\n\n return client.get<PaginatedResponse<T>>(endpoint, {\n page,\n pageSize,\n status,\n visibility,\n sectionId,\n search,\n sortBy,\n sortOrder,\n lang,\n })\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n data: query.data?.items ?? [],\n total: query.data?.total ?? 0,\n hasMore: query.data?.hasMore ?? false,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport interface ContentItemOptions {\n /** Force public endpoint even when authenticated */\n publicOnly?: boolean\n /** Return the requested translation when content has language variants. */\n lang?: string\n}\n\n/**\n * useContentItem - Fetch a single content item by ID or slug\n *\n * When authenticated (isPublicMode = false), fetches from member endpoint\n * which can return members-only content (for supported types).\n *\n * When not authenticated (isPublicMode = true), fetches only public content.\n *\n * @param contentType - The type of content (e.g., 'news', 'pages', 'events')\n * @param idOrSlug - The content ID or slug\n * @param options - Optional settings\n *\n * @example\n * ```tsx\n * // Fetch a page by slug\n * const { data: page } = useContentItem('pages', 'about-us', { lang: 'sv' })\n *\n * // Force public endpoint\n * const { data: page } = useContentItem('pages', 'about-us', { publicOnly: true })\n * ```\n */\nexport function useContentItem<T extends ContentItem = ContentItem>(\n contentType: string,\n idOrSlug: string,\n options: ContentItemOptions = {}\n) {\n const { client, orgId, isPublicMode } = useAxCloudContext()\n const { publicOnly = false, lang } = options\n\n // Use member endpoint when authenticated (for supported content types)\n const useMemberEndpoint = !isPublicMode && !publicOnly && (\n MEMBER_ENDPOINT_TYPES.includes(contentType) ||\n PAGE_CONTENT_TYPES.includes(contentType)\n )\n\n const query = useQuery<T>({\n queryKey: ['axcloud', 'content', orgId, contentType, idOrSlug, useMemberEndpoint, lang],\n queryFn: async () => {\n const basePath = useMemberEndpoint ? 'members' : 'public'\n const encodedIdOrSlug = encodeURIComponent(idOrSlug)\n const endpoint = PAGE_CONTENT_TYPES.includes(contentType)\n ? `/content/${basePath}/${orgId}/page/${encodedIdOrSlug}`\n : `/content/${basePath}/${orgId}/${contentType}/${encodedIdOrSlug}`\n return lang ? client.get<T>(endpoint, { lang }) : client.get<T>(endpoint)\n },\n enabled: !!idOrSlug,\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAuth0 } from '@auth0/auth0-react'\nimport { useAxCloudContext } from '../context'\nimport { useUser } from '../auth/useUser'\nimport type { Section, User } from '../../core/types'\n\ninterface SectionWithMembers extends Section {\n members?: User[]\n memberCount?: number\n}\n\n/**\n * useMySection - Fetch the current user's section\n *\n * Returns the section the authenticated user belongs to,\n * along with optional member list if the user has permission to view.\n *\n * @example\n * ```tsx\n * function MySectionPage() {\n * const { section, members, isLoading } = useMySection()\n *\n * if (isLoading) return <Spinner />\n * if (!section) return <p>You are not assigned to a section</p>\n *\n * return (\n * <div>\n * <h1>{section.name}</h1>\n * <p>{section.description}</p>\n * <h2>Members ({members.length})</h2>\n * <ul>\n * {members.map(m => <li key={m.id}>{m.name}</li>)}\n * </ul>\n * </div>\n * )\n * }\n * ```\n */\nexport function useMySection(options: { includeMembers?: boolean } = {}) {\n const { includeMembers = true } = options\n const { isAuthenticated } = useAuth0()\n const { client, orgId, stage } = useAxCloudContext()\n const { user, sectionId, isLoading: isUserLoading } = useUser()\n\n const query = useQuery<SectionWithMembers>({\n queryKey: ['axcloud', 'mySection', orgId, sectionId, includeMembers, stage],\n queryFn: async () => {\n if (!sectionId) {\n throw new Error('User is not assigned to a section')\n }\n\n // Organizations service uses /orgs base path\n // Response may be wrapped in { success, data } by responseWrapper\n const response = await client.get<SectionWithMembers | { success: boolean; data: SectionWithMembers }>(\n `/orgs/api/organizations/${orgId}/sections/${sectionId}`,\n { includeMembers: includeMembers ? 'true' : undefined }\n )\n\n return 'success' in response && response.success === true && response.data ? response.data : response as SectionWithMembers\n },\n enabled: isAuthenticated && !isUserLoading && !!sectionId,\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n section: query.data ?? null,\n sectionId,\n members: query.data?.members ?? [],\n memberCount: query.data?.memberCount ?? 0,\n isLoading: isUserLoading || query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n\n // Helper: Does the user have a section?\n hasSection: !!sectionId,\n\n // The current user in context\n user,\n }\n}\n\n/**\n * useSections - Fetch all sections for the organization\n *\n * @example\n * ```tsx\n * const { sections } = useSections()\n * ```\n */\ninterface SectionsResponse {\n sections: Section[]\n total: number\n}\n\nexport function useSections() {\n const { client, orgId, stage } = useAxCloudContext()\n\n const query = useQuery<SectionsResponse>({\n queryKey: ['axcloud', 'sections', orgId, stage],\n queryFn: async () => {\n // Organizations service uses /orgs base path\n // Response may be wrapped in { success, data } by responseWrapper\n const response = await client.get<SectionsResponse | { success: boolean; data: SectionsResponse }>(`/orgs/api/organizations/${orgId}/sections`)\n return 'success' in response && response.success === true && response.data ? response.data : response as SectionsResponse\n },\n staleTime: 1000 * 60 * 10, // 10 minutes\n })\n\n return {\n sections: query.data?.sections ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","/**\n * useForms - Admin hooks for managing form submissions\n *\n * These hooks require authentication and are intended for use in\n * the AxCloud admin dashboard.\n */\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type {\n FormSubmissionRecord,\n FormSubmissionsResponse,\n FormStatsResponse\n} from '../../core/forms'\n\nexport interface UseFormsOptions {\n /** Filter by form type */\n formType?: 'waitlist' | 'contact' | 'membership'\n /** Filter by status */\n status?: 'pending' | 'approved' | 'rejected' | 'converted'\n /** Number of items per page (default 50, max 100) */\n limit?: number\n /** Pagination cursor */\n cursor?: string\n}\n\nexport interface UseFormStatsOptions {\n /** Number of days to include (default 30, max 365) */\n days?: number\n}\n\n/**\n * useForms - Fetch form submissions for the organization (admin only)\n *\n * @example\n * ```tsx\n * function FormSubmissions() {\n * const { data, isLoading, hasMore, refetch } = useForms({\n * status: 'pending'\n * })\n *\n * if (isLoading) return <Spinner />\n *\n * return (\n * <ul>\n * {data.map(submission => (\n * <li key={submission.submission_id}>{submission.email}</li>\n * ))}\n * </ul>\n * )\n * }\n * ```\n */\nexport function useForms(options: UseFormsOptions = {}) {\n const { client, stage } = useAxCloudContext()\n\n const { formType, status, limit = 50, cursor } = options\n\n const query = useQuery<FormSubmissionsResponse>({\n queryKey: ['axcloud', 'forms', 'submissions', stage, formType, status, limit, cursor],\n queryFn: async () => {\n const params: Record<string, string | number> = { limit }\n if (formType) params.form_type = formType\n if (status) params.status = status\n if (cursor) params.cursor = cursor\n\n return client.get<FormSubmissionsResponse>(`/${stage}/api/admin/forms/submissions`, params)\n },\n staleTime: 1000 * 30 // 30 seconds\n })\n\n return {\n data: query.data?.items ?? [],\n total: query.data?.total ?? 0,\n hasMore: query.data?.hasMore ?? false,\n cursor: query.data?.cursor,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch\n }\n}\n\n/**\n * useFormStats - Fetch form submission statistics (admin only)\n *\n * @example\n * ```tsx\n * function FormDashboard() {\n * const { stats, summary, isLoading } = useFormStats({ days: 30 })\n *\n * if (isLoading) return <Spinner />\n *\n * return (\n * <div>\n * <p>Pending: {summary.pending}</p>\n * <p>Approved: {summary.approved}</p>\n * <p>Conversion Rate: {summary.conversionRate}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useFormStats(options: UseFormStatsOptions = {}) {\n const { client, stage } = useAxCloudContext()\n\n const { days = 30 } = options\n\n const query = useQuery<FormStatsResponse>({\n queryKey: ['axcloud', 'forms', 'stats', stage, days],\n queryFn: async () => {\n return client.get<FormStatsResponse>(`/${stage}/api/admin/forms/stats`, { days })\n },\n staleTime: 1000 * 60 * 5 // 5 minutes\n })\n\n return {\n stats: query.data?.stats,\n summary: query.data?.summary,\n period: query.data?.period,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch\n }\n}\n\n/**\n * useUpdateFormSubmission - Mutation hook for updating submission status\n *\n * @example\n * ```tsx\n * function SubmissionRow({ submission }) {\n * const { mutate: updateSubmission, isLoading } = useUpdateFormSubmission()\n *\n * const handleApprove = () => {\n * updateSubmission({\n * submissionId: submission.submission_id,\n * status: 'approved',\n * notes: 'Approved by admin'\n * })\n * }\n *\n * return (\n * <button onClick={handleApprove} disabled={isLoading}>\n * Approve\n * </button>\n * )\n * }\n * ```\n */\nexport function useUpdateFormSubmission() {\n const { client, stage } = useAxCloudContext()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({\n submissionId,\n status,\n notes\n }: {\n submissionId: string\n status: 'approved' | 'rejected'\n notes?: string\n }) => {\n return client.patch<{\n success: boolean\n message: string\n submission: FormSubmissionRecord\n user_created?: boolean\n user_id?: string\n }>(`/${stage}/api/admin/forms/submissions/${submissionId}`, { status, notes })\n },\n onSuccess: () => {\n // Invalidate forms queries to refresh the list\n queryClient.invalidateQueries({ queryKey: ['axcloud', 'forms'] })\n }\n })\n}\n","/**\n * useLinkedAccounts Hook\n *\n * Manages linked social accounts (identities) for the current user.\n * Supports Google, Microsoft, and Apple OAuth providers.\n *\n * Uses React-Query for caching, background refresh, and automatic refetch.\n *\n * @example\n * ```tsx\n * function AccountSettings() {\n * const {\n * identities,\n * availableProviders,\n * isLoading,\n * linkAccount,\n * unlinkAccount,\n * canUnlink\n * } = useLinkedAccounts()\n *\n * return (\n * <div>\n * {identities.map(identity => (\n * <div key={identity.provider}>\n * {identity.provider_display_name}\n * {canUnlink && !identity.is_primary && (\n * <button onClick={() => unlinkAccount(identity.provider)}>\n * Disconnect\n * </button>\n * )}\n * </div>\n * ))}\n * {availableProviders.map(provider => (\n * <button key={provider.provider} onClick={() => linkAccount(provider.provider)}>\n * Connect {provider.display_name}\n * </button>\n * ))}\n * </div>\n * )\n * }\n * ```\n */\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport { useAuth } from '../auth/useAuth'\n\nexport interface LinkedIdentity {\n provider: string\n provider_display_name: string\n provider_icon: string\n user_id: string\n connection: string\n is_social: boolean\n is_primary: boolean\n profile_data?: {\n email?: string\n name?: string\n picture?: string\n }\n}\n\nexport interface AvailableProvider {\n provider: string\n display_name: string\n icon: string\n}\n\nexport interface IdentitiesResponse {\n identities: LinkedIdentity[]\n available_providers: AvailableProvider[]\n can_unlink: boolean\n}\n\nexport interface LinkIdentityResponse {\n authorization_url: string\n provider: string\n provider_display_name: string\n message: string\n}\n\nexport interface UnlinkIdentityResponse {\n success: boolean\n message: string\n provider: string\n provider_display_name: string\n remaining_identities: number\n}\n\nexport interface UseLinkedAccountsReturn {\n /** List of linked identities/accounts */\n identities: LinkedIdentity[]\n /** List of providers available for linking */\n availableProviders: AvailableProvider[]\n /** Whether the user can unlink accounts (must have >1) */\n canUnlink: boolean\n /** Loading state */\n isLoading: boolean\n /** Error state */\n error: Error | null\n /** Initiate linking a new account - redirects to OAuth flow */\n linkAccount: (provider: 'google' | 'microsoft' | 'apple') => void\n /** Unlink an account */\n unlinkAccount: (provider: string) => void\n /** Whether a link operation is in progress */\n isLinking: boolean\n /** Whether an unlink operation is in progress */\n isUnlinking: boolean\n /** Refresh the identities list */\n refetch: () => Promise<unknown>\n}\n\n/** Query key for linked accounts */\nexport const LINKED_ACCOUNTS_QUERY_KEY = ['axcloud', 'linked-accounts'] as const\n\n/**\n * useLinkedAccounts - Manage social login accounts\n *\n * Provides functionality to view, link, and unlink social accounts\n * (Google, Microsoft, Apple) from the user's profile.\n *\n * Uses React-Query for caching and automatic state management.\n */\nexport function useLinkedAccounts(): UseLinkedAccountsReturn {\n const { client, stage } = useAxCloudContext()\n const { isAuthenticated } = useAuth()\n const queryClient = useQueryClient()\n\n /**\n * Query for fetching identities\n */\n const query = useQuery({\n queryKey: [...LINKED_ACCOUNTS_QUERY_KEY, stage],\n queryFn: async () => {\n return client.get<IdentitiesResponse>(`/identities/api/users/me/identities`)\n },\n enabled: isAuthenticated,\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n /**\n * Mutation for linking a new account\n */\n const linkMutation = useMutation({\n mutationFn: async (provider: 'google' | 'microsoft' | 'apple') => {\n const response = await client.post<LinkIdentityResponse>(\n `/identities/api/users/me/identities/${provider}/link`,\n {}\n )\n\n // Redirect to authorization URL\n if (response.authorization_url) {\n window.location.href = response.authorization_url\n }\n\n return response\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: LINKED_ACCOUNTS_QUERY_KEY })\n },\n })\n\n /**\n * Mutation for unlinking an account\n */\n const unlinkMutation = useMutation({\n mutationFn: async (provider: string) => {\n return client.delete<UnlinkIdentityResponse>(\n `/identities/api/users/me/identities/${provider}`\n )\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: LINKED_ACCOUNTS_QUERY_KEY })\n },\n })\n\n return {\n identities: query.data?.identities ?? [],\n availableProviders: query.data?.available_providers ?? [],\n canUnlink: query.data?.can_unlink ?? false,\n isLoading: query.isLoading,\n error: query.error,\n linkAccount: linkMutation.mutate,\n unlinkAccount: unlinkMutation.mutate,\n isLinking: linkMutation.isPending,\n isUnlinking: unlinkMutation.isPending,\n refetch: query.refetch,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type {\n OrganizationBranding,\n SignedMediaUrl,\n MediaListResponse,\n} from '../../core/types'\n\n/**\n * useBranding - Fetch organization branding (logo, colors)\n *\n * Returns branding information including a signed URL for the logo.\n * The logo URL expires after 1 hour and will be refreshed automatically.\n *\n * @example\n * ```tsx\n * const { branding, logoUrl, isLoading } = useBranding()\n *\n * return (\n * <header>\n * {logoUrl && <img src={logoUrl} alt=\"Logo\" />}\n * <h1 style={{ color: branding?.primaryColor }}>Welcome</h1>\n * </header>\n * )\n * ```\n */\nexport function useBranding() {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<OrganizationBranding>({\n queryKey: ['axcloud', 'media', 'branding', orgId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/branding\n return client.get<OrganizationBranding>(`/media/public/${orgId}/branding`)\n },\n staleTime: 1000 * 60 * 30, // 30 minutes (logo URL valid for 1 hour)\n gcTime: 1000 * 60 * 55, // Garbage collect before URL expires\n })\n\n return {\n branding: query.data?.branding ?? null,\n logoUrl: query.data?.branding?.logoUrl ?? null,\n organizationName: query.data?.name ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useLogo - Fetch organization logo URL\n *\n * Returns a signed URL for the organization logo.\n * Use this when you only need the logo, not full branding info.\n *\n * @example\n * ```tsx\n * const { logoUrl, isLoading } = useLogo()\n *\n * if (isLoading) return <Skeleton />\n * return logoUrl ? <img src={logoUrl} alt=\"Logo\" /> : <DefaultLogo />\n * ```\n */\nexport function useLogo() {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedMediaUrl>({\n queryKey: ['axcloud', 'media', 'logo', orgId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/logo\n return client.get<SignedMediaUrl>(`/media/public/${orgId}/logo`)\n },\n staleTime: 1000 * 60 * 30, // 30 minutes\n gcTime: 1000 * 60 * 55, // Garbage collect before URL expires\n })\n\n return {\n logoUrl: query.data?.url ?? null,\n expiresIn: query.data?.expiresIn ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useAvatar - Fetch user avatar URL\n *\n * @param userId - The user ID to fetch avatar for\n *\n * @example\n * ```tsx\n * const { avatarUrl } = useAvatar(user.id)\n * return <img src={avatarUrl || defaultAvatar} alt={user.name} />\n * ```\n */\nexport function useAvatar(userId: string) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedMediaUrl>({\n queryKey: ['axcloud', 'media', 'avatar', orgId, userId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/avatar/{userId}\n return client.get<SignedMediaUrl>(`/media/public/${orgId}/avatar/${userId}`)\n },\n enabled: !!userId,\n staleTime: 1000 * 60 * 30,\n gcTime: 1000 * 60 * 55,\n retry: false, // Don't retry if avatar doesn't exist\n })\n\n return {\n avatarUrl: query.data?.url ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useMediaList - List media files in organization's library\n *\n * @param type - Media type to list ('media', 'logos', 'avatars')\n * @param limit - Maximum number of items to return (default: 50)\n *\n * @example\n * ```tsx\n * const { items, isLoading } = useMediaList('media', 20)\n *\n * return (\n * <div className=\"grid\">\n * {items.map(item => (\n * <MediaThumbnail key={item.key} item={item} />\n * ))}\n * </div>\n * )\n * ```\n */\nexport function useMediaList(type: 'media' | 'logos' | 'avatars' = 'media', limit = 50) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<MediaListResponse>({\n queryKey: ['axcloud', 'media', 'list', orgId, type, limit],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/list?type=xxx&limit=xxx\n return client.get<MediaListResponse>(`/media/public/${orgId}/list`, {\n type,\n limit,\n })\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n items: query.data?.items ?? [],\n count: query.data?.count ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useMedia - Fetch a specific media file by ID\n *\n * @param mediaId - The media ID (filename including extension)\n *\n * @example\n * ```tsx\n * const { mediaUrl } = useMedia('hero-image.jpg')\n * return <img src={mediaUrl} alt=\"Hero\" />\n * ```\n */\nexport function useMedia(mediaId: string) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedMediaUrl>({\n queryKey: ['axcloud', 'media', 'file', orgId, mediaId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/media/{mediaId}\n return client.get<SignedMediaUrl>(`/media/public/${orgId}/media/${mediaId}`)\n },\n enabled: !!mediaId,\n staleTime: 1000 * 60 * 30,\n gcTime: 1000 * 60 * 55,\n })\n\n return {\n mediaUrl: query.data?.url ?? null,\n expiresIn: query.data?.expiresIn ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","import React from 'react'\nimport { useAuth } from '../auth/useAuth'\n\ninterface LoginButtonProps {\n /**\n * Button text when not authenticated\n */\n children?: React.ReactNode\n\n /**\n * URL to return to after login\n */\n returnTo?: string\n\n /**\n * Additional CSS class names\n */\n className?: string\n\n /**\n * Inline styles\n */\n style?: React.CSSProperties\n}\n\n/**\n * LoginButton - Trigger Auth0 Universal Login\n *\n * @example\n * ```tsx\n * <LoginButton>Sign In</LoginButton>\n *\n * // With custom return URL\n * <LoginButton returnTo=\"/dashboard\">Sign In</LoginButton>\n *\n * // With styling\n * <LoginButton className=\"btn btn-primary\">Sign In</LoginButton>\n * ```\n */\nexport function LoginButton({\n children = 'Log in',\n returnTo,\n className,\n style,\n}: LoginButtonProps) {\n const { login, isLoading } = useAuth()\n\n const handleClick = () => {\n login({ returnTo })\n }\n\n return (\n <button\n onClick={handleClick}\n disabled={isLoading}\n className={className}\n style={style}\n type=\"button\"\n >\n {isLoading ? 'Loading...' : children}\n </button>\n )\n}\n\ninterface LogoutButtonProps {\n /**\n * Button text\n */\n children?: React.ReactNode\n\n /**\n * URL to return to after logout\n */\n returnTo?: string\n\n /**\n * Additional CSS class names\n */\n className?: string\n\n /**\n * Inline styles\n */\n style?: React.CSSProperties\n}\n\n/**\n * LogoutButton - Trigger logout\n *\n * @example\n * ```tsx\n * <LogoutButton>Sign Out</LogoutButton>\n * ```\n */\nexport function LogoutButton({\n children = 'Log out',\n returnTo,\n className,\n style,\n}: LogoutButtonProps) {\n const { logout } = useAuth()\n\n const handleClick = () => {\n logout({ returnTo })\n }\n\n return (\n <button\n onClick={handleClick}\n className={className}\n style={style}\n type=\"button\"\n >\n {children}\n </button>\n )\n}\n","import React from 'react'\nimport { useAuth } from '../auth/useAuth'\nimport { useUser } from '../auth/useUser'\nimport type { UserRole } from '../../core/types'\n\ninterface ProtectedRouteProps {\n /**\n * Content to render when authenticated\n */\n children: React.ReactNode\n\n /**\n * Required role(s) to access this route\n */\n roles?: UserRole | UserRole[]\n\n /**\n * Component to render while loading\n */\n loadingComponent?: React.ReactNode\n\n /**\n * Component to render when not authenticated\n */\n unauthenticatedComponent?: React.ReactNode\n\n /**\n * Component to render when authenticated but lacking required role\n */\n unauthorizedComponent?: React.ReactNode\n\n /**\n * Whether to automatically redirect to login when not authenticated\n * @default false\n */\n redirectToLogin?: boolean\n\n /**\n * Return URL after login (only used with redirectToLogin)\n */\n returnTo?: string\n}\n\n/**\n * ProtectedRoute - Require authentication to view content\n *\n * @example\n * ```tsx\n * // Basic usage\n * <ProtectedRoute>\n * <MemberContent />\n * </ProtectedRoute>\n *\n * // With role requirement\n * <ProtectedRoute roles=\"admin\">\n * <AdminDashboard />\n * </ProtectedRoute>\n *\n * // With multiple allowed roles\n * <ProtectedRoute roles={['admin', 'editor']}>\n * <ContentEditor />\n * </ProtectedRoute>\n *\n * // With custom fallbacks\n * <ProtectedRoute\n * loadingComponent={<Spinner />}\n * unauthenticatedComponent={<LoginPrompt />}\n * unauthorizedComponent={<AccessDenied />}\n * >\n * <ProtectedContent />\n * </ProtectedRoute>\n *\n * // Auto-redirect to login\n * <ProtectedRoute redirectToLogin>\n * <MemberArea />\n * </ProtectedRoute>\n * ```\n */\nexport function ProtectedRoute({\n children,\n roles,\n loadingComponent,\n unauthenticatedComponent,\n unauthorizedComponent,\n redirectToLogin = false,\n returnTo,\n}: ProtectedRouteProps) {\n const { isAuthenticated, isLoading: isAuthLoading, login } = useAuth()\n const { user, role, isLoading: isUserLoading } = useUser()\n\n const isLoading = isAuthLoading || (isAuthenticated && isUserLoading)\n\n // Show loading state\n if (isLoading) {\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>\n }\n\n // Not authenticated\n if (!isAuthenticated) {\n if (redirectToLogin) {\n login({ returnTo: returnTo || window.location.pathname })\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>\n }\n return <>{unauthenticatedComponent ?? <DefaultUnauthenticatedComponent />}</>\n }\n\n // Check role requirements\n if (roles && role) {\n const requiredRoles = Array.isArray(roles) ? roles : [roles]\n const hasRequiredRole = requiredRoles.includes(role)\n\n if (!hasRequiredRole) {\n return <>{unauthorizedComponent ?? <DefaultUnauthorizedComponent />}</>\n }\n }\n\n // All checks passed\n return <>{children}</>\n}\n\n// Default fallback components (minimal styling)\nfunction DefaultLoadingComponent() {\n return (\n <div style={{ padding: '20px', textAlign: 'center' }}>\n Loading...\n </div>\n )\n}\n\nfunction DefaultUnauthenticatedComponent() {\n return (\n <div style={{ padding: '20px', textAlign: 'center' }}>\n <p>Please log in to view this content.</p>\n </div>\n )\n}\n\nfunction DefaultUnauthorizedComponent() {\n return (\n <div style={{ padding: '20px', textAlign: 'center' }}>\n <p>You don't have permission to view this content.</p>\n </div>\n )\n}\n","import React from 'react'\nimport { useOrg } from '../hooks/useOrg'\nimport type { AxCloudModule } from '../../core/types'\n\ninterface ModuleGateProps {\n /**\n * Required module(s) to render children\n */\n module: AxCloudModule | AxCloudModule[]\n\n /**\n * Content to render when module is enabled\n */\n children: React.ReactNode\n\n /**\n * Content to render when module is NOT enabled\n */\n fallback?: React.ReactNode\n\n /**\n * Whether ALL modules are required (true) or ANY module (false)\n * @default false (any)\n */\n requireAll?: boolean\n}\n\n/**\n * ModuleGate - Conditionally render based on organization modules\n *\n * Only renders children if the organization has the required module(s) enabled.\n *\n * @example\n * ```tsx\n * // Single module\n * <ModuleGate module=\"training\">\n * <TrainingSection />\n * </ModuleGate>\n *\n * // With fallback\n * <ModuleGate module=\"ai\" fallback={<UpgradePrompt />}>\n * <AIChatWidget />\n * </ModuleGate>\n *\n * // Multiple modules (any)\n * <ModuleGate module={['training', 'documents']}>\n * <LearningCenter />\n * </ModuleGate>\n *\n * // Multiple modules (all required)\n * <ModuleGate module={['training', 'ai']} requireAll>\n * <AITrainingAssistant />\n * </ModuleGate>\n * ```\n */\nexport function ModuleGate({\n module,\n children,\n fallback = null,\n requireAll = false,\n}: ModuleGateProps) {\n const { hasModule, isLoading } = useOrg()\n\n // While loading org data, don't render anything\n if (isLoading) {\n return null\n }\n\n const requiredModules = Array.isArray(module) ? module : [module]\n\n const hasAccess = requireAll\n ? requiredModules.every(m => hasModule(m))\n : requiredModules.some(m => hasModule(m))\n\n if (!hasAccess) {\n return <>{fallback}</>\n }\n\n return <>{children}</>\n}\n\n/**\n * useModuleAccess - Hook for programmatic module checks\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { hasModule, modules } = useModuleAccess()\n *\n * return (\n * <nav>\n * <Link to=\"/news\">News</Link>\n * {hasModule('training') && <Link to=\"/training\">Training</Link>}\n * {hasModule('ai') && <Link to=\"/chat\">AI Chat</Link>}\n * </nav>\n * )\n * }\n * ```\n */\nexport function useModuleAccess() {\n const { hasModule, modules, isLoading } = useOrg()\n\n return {\n hasModule,\n modules,\n isLoading,\n }\n}\n","/**\n * LinkedAccountsList Component\n *\n * Ready-to-use component for displaying and managing linked social accounts.\n * Can be used in customer frontends (SPF \"mina sidor\" etc.).\n *\n * Import the CSS file for default styling:\n * import '@axcode/axcloud-sdk/styles/linked-accounts.css'\n *\n * @example\n * ```tsx\n * import { LinkedAccountsList } from '@axcode/axcloud-sdk'\n * import '@axcode/axcloud-sdk/styles/linked-accounts.css'\n *\n * function MinProfil() {\n * return (\n * <div>\n * <h2>Kopplade konton</h2>\n * <LinkedAccountsList providers={['google', 'microsoft']} />\n * </div>\n * )\n * }\n * ```\n */\n\nimport React from 'react'\nimport { useLinkedAccounts, LinkedIdentity, AvailableProvider } from '../hooks/useLinkedAccounts'\n\nexport interface LinkedAccountsListProps {\n /** Which providers to show (default: all available) */\n providers?: ('google' | 'microsoft' | 'apple')[]\n /** Show connect buttons for unlinked providers */\n showConnectButtons?: boolean\n /** Custom class name for the container */\n className?: string\n /** Callback when an account is successfully unlinked */\n onUnlink?: (provider: string) => void\n /** Callback when link flow is initiated */\n onLinkInitiated?: (provider: string) => void\n /** Custom render for identity items */\n renderIdentity?: (identity: LinkedIdentity, onUnlink: () => void) => React.ReactNode\n /** Custom render for available provider items */\n renderAvailableProvider?: (provider: AvailableProvider, onLink: () => void) => React.ReactNode\n}\n\n// Default provider icons as inline SVG\n/**\n * Supported OAuth providers for account linking\n */\nconst SUPPORTED_OAUTH_PROVIDERS = ['google', 'microsoft', 'apple'] as const\ntype SupportedOAuthProvider = typeof SUPPORTED_OAUTH_PROVIDERS[number]\n\n/**\n * Type guard to validate if a provider string is a supported OAuth provider\n */\nfunction isSupportedOAuthProvider(provider: string): provider is SupportedOAuthProvider {\n return SUPPORTED_OAUTH_PROVIDERS.includes(provider as SupportedOAuthProvider)\n}\n\nconst ProviderIcons: Record<string, React.FC<{ className?: string }>> = {\n google: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" fill=\"#4285F4\"/>\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\"/>\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\"/>\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/>\n </svg>\n ),\n microsoft: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className}>\n <path fill=\"#F25022\" d=\"M1 1h10v10H1z\"/>\n <path fill=\"#00A4EF\" d=\"M1 13h10v10H1z\"/>\n <path fill=\"#7FBA00\" d=\"M13 1h10v10H13z\"/>\n <path fill=\"#FFB900\" d=\"M13 13h10v10H13z\"/>\n </svg>\n ),\n apple: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <path d=\"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z\"/>\n </svg>\n ),\n email: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"/>\n <polyline points=\"22,6 12,13 2,6\"/>\n </svg>\n ),\n}\n\n/**\n * LinkedAccountsList - Ready-to-use component for managing linked accounts\n *\n * Uses CSS classes for styling. Import the CSS file for default styles:\n * import '@axcode/axcloud-sdk/styles/linked-accounts.css'\n */\nexport function LinkedAccountsList({\n providers,\n showConnectButtons = true,\n className,\n onUnlink,\n onLinkInitiated,\n renderIdentity,\n renderAvailableProvider,\n}: LinkedAccountsListProps) {\n const {\n identities,\n availableProviders,\n canUnlink,\n isLoading,\n error,\n linkAccount,\n unlinkAccount,\n } = useLinkedAccounts()\n\n // Filter providers if specified\n const filteredIdentities = providers\n ? identities.filter(i =>\n providers.some(p =>\n i.provider.toLowerCase().includes(p) ||\n i.provider_icon === p\n )\n )\n : identities\n\n const filteredAvailableProviders = providers\n ? availableProviders.filter(p =>\n providers.some(provider =>\n p.provider.toLowerCase().includes(provider) ||\n p.icon === provider\n )\n )\n : availableProviders\n\n const handleUnlink = (provider: string) => {\n unlinkAccount(provider)\n onUnlink?.(provider)\n }\n\n const handleLink = (provider: 'google' | 'microsoft' | 'apple') => {\n onLinkInitiated?.(provider)\n linkAccount(provider)\n }\n\n if (isLoading) {\n return (\n <div className={`axcloud-linked-accounts__loading ${className || ''}`}>\n Loading linked accounts...\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={`axcloud-linked-accounts__error ${className || ''}`}>\n Failed to load linked accounts. Please try again.\n </div>\n )\n }\n\n const getIcon = (iconName: string, muted = false) => {\n const IconComponent = ProviderIcons[iconName] || ProviderIcons.email\n const iconClass = muted\n ? 'axcloud-linked-accounts__icon axcloud-linked-accounts__icon--muted'\n : 'axcloud-linked-accounts__icon'\n return <IconComponent className={iconClass} />\n }\n\n return (\n <div className={`axcloud-linked-accounts ${className || ''}`}>\n {/* Connected Accounts */}\n {filteredIdentities.map((identity) => {\n if (renderIdentity) {\n return renderIdentity(identity, () => handleUnlink(identity.provider))\n }\n\n return (\n <div key={`${identity.provider}-${identity.user_id}`} className=\"axcloud-linked-accounts__item\">\n <div className=\"axcloud-linked-accounts__info\">\n {getIcon(identity.provider_icon)}\n <div>\n <div className=\"axcloud-linked-accounts__name-row\">\n <span className=\"axcloud-linked-accounts__provider-name\">\n {identity.provider_display_name}\n </span>\n {identity.is_primary && (\n <span className=\"axcloud-linked-accounts__badge\">Primary</span>\n )}\n </div>\n {identity.profile_data?.email && (\n <div className=\"axcloud-linked-accounts__email\">\n {identity.profile_data.email}\n </div>\n )}\n </div>\n </div>\n <div className=\"axcloud-linked-accounts__actions\">\n <span className=\"axcloud-linked-accounts__connected\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n Connected\n </span>\n {canUnlink && !identity.is_primary && (\n <button\n onClick={() => handleUnlink(identity.provider)}\n className=\"axcloud-linked-accounts__button axcloud-linked-accounts__button--disconnect\"\n >\n Disconnect\n </button>\n )}\n </div>\n </div>\n )\n })}\n\n {/* Available Providers */}\n {showConnectButtons &&\n filteredAvailableProviders.map((provider) => {\n if (renderAvailableProvider) {\n return renderAvailableProvider(provider, () => {\n if (isSupportedOAuthProvider(provider.provider)) {\n handleLink(provider.provider)\n }\n })\n }\n\n return (\n <div key={provider.provider} className=\"axcloud-linked-accounts__available\">\n <div className=\"axcloud-linked-accounts__info\">\n {getIcon(provider.icon, true)}\n <div>\n <span className=\"axcloud-linked-accounts__provider-name\">\n {provider.display_name}\n </span>\n <div className=\"axcloud-linked-accounts__email\">Not connected</div>\n </div>\n </div>\n <button\n onClick={() => {\n if (isSupportedOAuthProvider(provider.provider)) {\n handleLink(provider.provider)\n }\n }}\n className=\"axcloud-linked-accounts__button axcloud-linked-accounts__button--connect\"\n >\n Connect\n </button>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport default LinkedAccountsList\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/errors.ts","../src/core/client.ts","../src/core/contentSlots.ts","../src/core/types.ts","../src/core/forms.ts","../src/react/context.tsx","../src/react/provider.tsx","../src/react/auth/useAuth.ts","../src/react/auth/useUser.ts","../src/react/hooks/useOrg.ts","../src/react/hooks/useNews.ts","../src/react/hooks/useContent.ts","../src/react/hooks/useMySection.ts","../src/react/hooks/useForms.ts","../src/react/hooks/useLinkedAccounts.ts","../src/react/hooks/useMedia.ts","../src/react/components/LoginButton.tsx","../src/react/components/ProtectedRoute.tsx","../src/react/components/ModuleGate.tsx","../src/react/components/LinkedAccountsList.tsx"],"names":["useAuth0","useQuery","useCallback","useMemo","useQueryClient","useMutation","jsx","Fragment"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * AxCloud SDK Error Types\n */\n\nexport type AxCloudErrorCode =\n | 'UNAUTHORIZED'\n | 'FORBIDDEN'\n | 'NOT_FOUND'\n | 'VALIDATION_ERROR'\n | 'NETWORK_ERROR'\n | 'TIMEOUT_ERROR'\n | 'SERVER_ERROR'\n | 'UNKNOWN_ERROR'\n\nexport class AxCloudError extends Error {\n readonly code: AxCloudErrorCode\n readonly status: number\n readonly details?: Record<string, unknown>\n\n constructor(\n message: string,\n code: AxCloudErrorCode,\n status: number,\n details?: Record<string, unknown>\n ) {\n super(message)\n this.name = 'AxCloudError'\n this.code = code\n this.status = status\n this.details = details\n\n // Maintains proper stack trace for where error was thrown (V8 only)\n const ErrorWithCapture = Error as typeof Error & { captureStackTrace?: (target: object, constructor: Function) => void }\n if (ErrorWithCapture.captureStackTrace) {\n ErrorWithCapture.captureStackTrace(this, AxCloudError)\n }\n }\n\n static fromResponse(status: number, body?: unknown): AxCloudError {\n const details = typeof body === 'object' ? (body as Record<string, unknown>) : undefined\n const message = details?.message as string | undefined\n\n switch (status) {\n case 401:\n return new AxCloudError(\n message || 'Authentication required',\n 'UNAUTHORIZED',\n status,\n details\n )\n case 403:\n return new AxCloudError(\n message || 'Access denied',\n 'FORBIDDEN',\n status,\n details\n )\n case 404:\n return new AxCloudError(\n message || 'Resource not found',\n 'NOT_FOUND',\n status,\n details\n )\n case 422:\n return new AxCloudError(\n message || 'Validation failed',\n 'VALIDATION_ERROR',\n status,\n details\n )\n default:\n if (status >= 500) {\n return new AxCloudError(\n message || 'Server error',\n 'SERVER_ERROR',\n status,\n details\n )\n }\n return new AxCloudError(\n message || 'An error occurred',\n 'UNKNOWN_ERROR',\n status,\n details\n )\n }\n }\n\n static networkError(originalError?: Error): AxCloudError {\n // Don't include original error details in production to avoid leaking sensitive info\n // Use typeof check to avoid issues in environments where process is not defined\n const isDev = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'\n const message = isDev && originalError?.message\n ? originalError.message\n : 'Network request failed'\n\n return new AxCloudError(\n message,\n 'NETWORK_ERROR',\n 0,\n isDev ? { originalError: originalError?.message } : undefined\n )\n }\n\n static timeoutError(timeoutMs: number): AxCloudError {\n return new AxCloudError(\n `Request timed out after ${timeoutMs}ms`,\n 'TIMEOUT_ERROR',\n 0,\n { timeout: timeoutMs }\n )\n }\n}\n\nexport function isAxCloudError(error: unknown): error is AxCloudError {\n return error instanceof AxCloudError\n}\n","/**\n * AxCloud API Client\n *\n * Fetch wrapper with authentication header injection and error handling.\n */\n\nimport { AxCloudError } from './errors'\n\nexport interface ClientConfig {\n baseUrl: string\n getAccessToken?: () => Promise<string | undefined>\n /** API key for public content endpoints */\n apiKey?: string\n /** Default request timeout in milliseconds (default: 30000) */\n timeout?: number\n}\n\nexport interface RequestOptions extends Omit<RequestInit, 'body'> {\n body?: unknown\n params?: Record<string, string | number | boolean | undefined>\n /** Request timeout in milliseconds (overrides client default) */\n timeout?: number\n}\n\nexport class AxCloudClient {\n private baseUrl: string\n private getAccessToken?: () => Promise<string | undefined>\n private apiKey?: string\n private defaultTimeout: number\n\n constructor(config: ClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '')\n this.getAccessToken = config.getAccessToken\n this.apiKey = config.apiKey\n this.defaultTimeout = config.timeout ?? 30000\n }\n\n /**\n * Update the access token getter (used when auth state changes)\n */\n setAccessTokenGetter(getter: () => Promise<string | undefined>) {\n this.getAccessToken = getter\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n })\n }\n\n return url.toString()\n }\n\n /**\n * API key should only be sent to public endpoints.\n * This avoids leaking public keys to authenticated/internal routes.\n */\n private shouldAttachApiKey(path: string): boolean {\n const normalized = path.startsWith('/') ? path : `/${path}`\n return (\n normalized.startsWith('/public/') ||\n normalized.startsWith('/api/public/') ||\n normalized.startsWith('/content/public/')\n )\n }\n\n /**\n * Make an authenticated request\n */\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const { body, params, headers: customHeaders, timeout, ...restOptions } = options\n\n // Initialize headers as Record<string, string> to avoid type casting\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n // Merge custom headers\n if (customHeaders) {\n const customHeadersRecord = customHeaders as Record<string, string>\n Object.assign(headers, customHeadersRecord)\n }\n\n // Add API key header only for public endpoints\n if (this.apiKey && this.shouldAttachApiKey(path)) {\n headers['x-api-key'] = this.apiKey\n }\n\n // Add auth header if we have a token getter\n if (this.getAccessToken) {\n try {\n const token = await this.getAccessToken()\n if (token) {\n headers['Authorization'] = `Bearer ${token}`\n }\n } catch (error) {\n // Log in development to help with debugging auth issues\n // Use typeof check to avoid issues in environments where process is not defined\n if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development') {\n console.warn(\n '[AxCloud SDK] Failed to fetch access token:',\n error instanceof Error ? error.message : error\n )\n }\n // Don't throw - allow request to continue (backend will return 401 if needed)\n }\n }\n\n const url = this.buildUrl(path, params)\n\n // Setup AbortController for timeout\n const controller = new AbortController()\n const requestTimeout = timeout ?? this.defaultTimeout\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout)\n\n try {\n const response = await fetch(url, {\n ...restOptions,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n })\n\n // Handle non-JSON responses\n const contentType = response.headers.get('content-type')\n const isJson = contentType?.includes('application/json')\n\n if (!response.ok) {\n const errorBody = isJson ? await response.json().catch(() => null) : null\n throw AxCloudError.fromResponse(response.status, errorBody)\n }\n\n // Return empty object for 204 No Content\n if (response.status === 204) {\n return {} as T\n }\n\n return isJson ? await response.json() : ({} as T)\n } catch (error) {\n if (error instanceof AxCloudError) {\n throw error\n }\n // Handle abort/timeout errors\n if (error instanceof Error && error.name === 'AbortError') {\n throw AxCloudError.timeoutError(requestTimeout)\n }\n throw AxCloudError.networkError(error instanceof Error ? error : undefined)\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * GET request\n */\n get<T>(path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T> {\n return this.request<T>(path, { method: 'GET', params })\n }\n\n /**\n * POST request\n */\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'POST', body })\n }\n\n /**\n * PUT request\n */\n put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PUT', body })\n }\n\n /**\n * PATCH request\n */\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PATCH', body })\n }\n\n /**\n * DELETE request\n */\n delete<T>(path: string): Promise<T> {\n return this.request<T>(path, { method: 'DELETE' })\n }\n}\n\n// Client instance registry - allows multiple providers without SSR issues\n// Uses WeakMap to prevent memory leaks when providers unmount\nconst clientRegistry = new WeakMap<object, AxCloudClient>()\n\n/**\n * Create a client instance associated with a key (typically the provider instance)\n * This allows multiple AxCloudProviders to coexist without conflicts\n */\nexport function createClient(config: ClientConfig, key?: object): AxCloudClient {\n const client = new AxCloudClient(config)\n if (key) {\n clientRegistry.set(key, client)\n }\n return client\n}\n\n/**\n * Get a client instance by key\n * @deprecated Use the client from useAxCloudContext() instead\n */\nexport function getClient(key?: object): AxCloudClient {\n if (key) {\n const client = clientRegistry.get(key)\n if (client) {\n return client\n }\n }\n throw new Error('AxCloud client not found. Make sure AxCloudProvider is mounted and use useAxCloudContext() to get the client.')\n}\n","import type { ContentBlock, ContentItem } from './types'\n\nexport type ContentSlotValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | string[]\n | Record<string, unknown>\n | unknown[]\n\nexport type ContentSlotMap = Record<string, ContentSlotValue>\n\nexport interface ContentSlotImage {\n url: string\n alt?: string\n caption?: string\n}\n\nexport interface ContentSlotReader {\n fields: ContentSlotMap\n value<T = ContentSlotValue>(key: string, fallback?: T): ContentSlotValue | T\n text(key: string, fallback?: string): string\n html(key: string, fallback?: string): string\n list(key: string, fallback?: string[]): string[]\n image(key: string, fallback?: ContentSlotImage): ContentSlotImage | undefined\n}\n\nconst SLOT_ATTRIBUTE_KEYS = ['slot', 'field', 'key', 'name']\n\nexport function getContentSlotMap(content?: Pick<ContentItem, 'fields' | 'blocks'> | null): ContentSlotMap {\n const fields: ContentSlotMap = isRecord(content?.fields) ? { ...(content?.fields as ContentSlotMap) } : {}\n\n for (const block of content?.blocks || []) {\n const slot = getBlockSlot(block)\n if (!slot) continue\n fields[slot] = blockToSlotValue(block)\n }\n\n return fields\n}\n\nexport function createContentSlotReader(content?: Pick<ContentItem, 'fields' | 'blocks'> | null): ContentSlotReader {\n const fields = getContentSlotMap(content)\n\n const value = <T = ContentSlotValue>(key: string, fallback?: T): ContentSlotValue | T => {\n return key in fields ? fields[key] : (fallback as T)\n }\n\n return {\n fields,\n value,\n text: (key, fallback = '') => stringifySlotValue(value(key, fallback)),\n html: (key, fallback = '') => stringifySlotValue(value(key, fallback)),\n list: (key, fallback = []) => slotValueToList(value(key, fallback)),\n image: (key, fallback) => slotValueToImage(value(key, fallback)),\n }\n}\n\nfunction getBlockSlot(block: ContentBlock): string | undefined {\n const attributes = block.attributes || {}\n\n for (const key of SLOT_ATTRIBUTE_KEYS) {\n const value = attributes[key]\n if (typeof value === 'string' && value.trim()) return value.trim()\n }\n\n return undefined\n}\n\nfunction blockToSlotValue(block: ContentBlock): ContentSlotValue {\n if (block.attributes && 'value' in block.attributes) {\n return block.attributes.value as ContentSlotValue\n }\n\n if (block.type === 'list') {\n return Array.isArray(block.items) ? block.items : []\n }\n\n if (block.type === 'image' && block.url) {\n return {\n url: block.url,\n alt: block.alt,\n caption: block.caption,\n }\n }\n\n return block.content ?? ''\n}\n\nfunction stringifySlotValue(value: unknown): string {\n if (value === undefined || value === null) return ''\n if (typeof value === 'string') return value\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n if (Array.isArray(value)) return value.map((item) => stringifySlotValue(item)).filter(Boolean).join('\\n')\n return ''\n}\n\nfunction slotValueToList(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map((item) => stringifySlotValue(item)).filter(Boolean)\n }\n\n if (typeof value === 'string') {\n return value\n .split(/\\r?\\n/)\n .map((item) => item.trim())\n .filter(Boolean)\n }\n\n return []\n}\n\nfunction slotValueToImage(value: unknown): ContentSlotImage | undefined {\n if (isRecord(value) && typeof value.url === 'string') {\n return {\n url: value.url,\n alt: typeof value.alt === 'string' ? value.alt : undefined,\n caption: typeof value.caption === 'string' ? value.caption : undefined,\n }\n }\n\n if (typeof value === 'string' && value) {\n return { url: value }\n }\n\n return undefined\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n","/**\n * AxCloud SDK Types\n *\n * Note: In the future, these types should be auto-generated from the OpenAPI spec.\n * For now, they are manually defined based on the AxCloud API.\n */\n\n// Module types available in AxCloud\nexport type AxCloudModule =\n | 'content'\n | 'members'\n | 'sections'\n | 'training'\n | 'ai'\n | 'documents'\n | 'voting'\n\n// System roles (fixed, cannot be modified)\nexport type SystemRole = 'super_admin' | 'org_admin' | 'section_admin' | 'member' | 'viewer'\n\n// Legacy role names for backwards compatibility\nexport type UserRole = SystemRole | 'superadmin' | 'admin' | 'editor'\n\n// Base roles that custom roles can extend (excludes super_admin)\nexport type BaseRole = 'org_admin' | 'section_admin' | 'member' | 'viewer'\n\n/**\n * Custom role definition\n */\nexport interface CustomRole {\n role_id: string\n org_id: string\n name: string\n description?: string\n baseRole: BaseRole\n permissions?: string[] // Explicit permissions (optional)\n deniedPermissions?: string[] // Permissions removed from base role\n effectivePermissions?: string[] // Calculated: base - denied (from API)\n color?: string\n icon?: string\n hierarchy: number\n isSystem: false\n isActive: boolean\n createdAt: string\n updatedAt: string\n}\n\n// Organization\nexport interface Organization {\n id: string\n name: string\n slug: string\n description?: string\n modules: AxCloudModule[]\n settings?: OrganizationSettings\n createdAt: string\n updatedAt: string\n}\n\nexport interface OrganizationSettings {\n allowPublicSignup?: boolean\n requireEmailVerification?: boolean\n defaultUserRole?: UserRole\n theme?: {\n primaryColor?: string\n logo?: string\n }\n}\n\n// Section (groups within organization)\nexport interface Section {\n id: string\n organizationId: string\n name: string\n description?: string\n slug: string\n parentId?: string\n permissions?: SectionPermissions\n createdAt: string\n updatedAt: string\n}\n\nexport interface SectionPermissions {\n canViewMembers?: boolean\n canEditContent?: boolean\n canManageMembers?: boolean\n}\n\n// User\nexport interface User {\n id: string\n email: string\n name: string\n firstName?: string\n lastName?: string\n avatar?: string\n organizationId: string\n sectionId?: string\n role: UserRole // System role or custom role ID\n customRole?: CustomRole // Full custom role object if using custom role\n permissions?: string[] // Effective permissions (calculated)\n metadata?: Record<string, unknown>\n createdAt: string\n updatedAt: string\n}\n\n/**\n * Check if user has a specific permission\n */\nexport function userHasPermission(user: User, permission: string): boolean {\n // If user has explicit permissions array, use it\n if (user.permissions && user.permissions.length > 0) {\n return user.permissions.includes(permission)\n }\n\n // Fallback: check if user has a custom role with effective permissions\n if (user.customRole?.effectivePermissions) {\n return user.customRole.effectivePermissions.includes(permission)\n }\n\n return false\n}\n\n/**\n * Check if user has any of the specified permissions\n */\nexport function userHasAnyPermission(user: User, permissions: string[]): boolean {\n return permissions.some(p => userHasPermission(user, p))\n}\n\n/**\n * Check if user has all of the specified permissions\n */\nexport function userHasAllPermissions(user: User, permissions: string[]): boolean {\n return permissions.every(p => userHasPermission(user, p))\n}\n\n// Membership info (extended user data)\nexport interface Membership {\n userId: string\n organizationId: string\n sectionId?: string\n section?: Section\n role: UserRole\n status: 'active' | 'pending' | 'suspended' | 'expired'\n joinedAt: string\n expiresAt?: string\n metadata?: Record<string, unknown>\n}\n\n// Content types\nexport interface ContentBlock {\n id: string\n type: string\n content?: string\n url?: string\n alt?: string\n level?: 1 | 2 | 3 | 4 | 5 | 6\n items?: unknown[]\n language?: string\n caption?: string\n attributes?: Record<string, unknown>\n ordered?: boolean\n author?: string\n}\n\nexport interface ContentTranslation {\n title: string\n slug: string\n description?: string\n blocks: ContentBlock[]\n /** Structured website/template fields for this language. */\n fields?: Record<string, unknown>\n metaTitle?: string\n metaDescription?: string\n keywords?: string[]\n}\n\nexport type ContentPublicationState = 'draft' | 'published' | 'archived'\nexport type ContentAudience = 'public' | 'internal' | 'members' | 'section'\n\nexport interface ContentItem {\n id: string\n organizationId: string\n type: string\n title: string\n slug: string\n /** Legacy string content. New AxCloud content uses `blocks`. */\n content?: string\n description?: string\n blocks?: ContentBlock[]\n /** Template identifier used by websites, e.g. \"home\" or \"landing\". */\n template?: string\n /** Structured website/template fields. Frontends own layout and read these values by key. */\n fields?: Record<string, unknown>\n excerpt?: string\n author?: {\n id: string\n name: string\n }\n status?: ContentPublicationState\n visibility?: ContentPublicationState\n audience?: ContentAudience\n sectionId?: string\n tags?: string[]\n lang?: string\n featuredImage?: string\n metaTitle?: string\n metaDescription?: string\n keywords?: string[]\n translations?: Record<string, ContentTranslation>\n currentLanguage?: string\n availableLanguages?: string[]\n seo?: {\n canonical: string\n hreflang: Array<{ lang: string; href: string }>\n }\n publishedAt?: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface NewsItem extends ContentItem {\n type: 'news'\n featuredImage?: string\n category?: string\n tags?: string[]\n}\n\nexport interface Page extends ContentItem {\n type: 'page'\n template?: string\n order?: number\n}\n\n// API Response types\nexport interface PaginatedResponse<T> {\n items: T[]\n total: number\n page: number\n pageSize: number\n hasMore: boolean\n}\n\n// SDK Configuration\nexport interface AxCloudConfig {\n orgId: string\n apiUrl: string\n /** API stage - defaults to 'dev'. Use 'prod' for production. */\n stage: string\n /** API key for public content endpoints (optional - required for public API access) */\n apiKey?: string\n auth0: {\n domain: string\n clientId: string\n redirectUri: string\n audience?: string\n /** Database connection name for password operations. Defaults to 'Username-Password-Authentication' */\n connection?: string\n }\n}\n\n// Query options\nexport interface ContentQueryOptions {\n page?: number\n pageSize?: number\n status?: ContentPublicationState\n visibility?: ContentPublicationState\n audience?: ContentAudience\n sectionId?: string\n search?: string\n sortBy?: string\n sortOrder?: 'asc' | 'desc'\n /** Return the requested translation when content has language variants. */\n lang?: string\n /** Force public endpoint even when authenticated (for public pages) */\n publicOnly?: boolean\n}\n\n// ============================================\n// MEDIA & BRANDING TYPES\n// ============================================\n\n/**\n * Organization branding information\n */\nexport interface OrganizationBranding {\n organizationId: string\n name: string\n branding: {\n /** Signed URL for logo (expires in 1 hour) */\n logoUrl: string | null\n /** Seconds until logoUrl expires */\n logoExpiresIn: number | null\n /** Primary brand color (hex) */\n primaryColor: string | null\n /** Secondary brand color (hex) */\n secondaryColor: string | null\n }\n}\n\n/**\n * Signed URL response for media assets\n */\nexport interface SignedMediaUrl {\n /** Signed S3 URL (expires in 1 hour) */\n url: string\n /** Seconds until URL expires */\n expiresIn: number\n /** S3 bucket name */\n bucket: string\n /** S3 object key */\n key: string\n}\n\n/**\n * Media list item\n */\nexport interface MediaItem {\n /** File key (filename) */\n key: string\n /** File size in bytes */\n size: number\n /** Last modified timestamp */\n lastModified: string\n}\n\n/**\n * Media list response\n */\nexport interface MediaListResponse {\n items: MediaItem[]\n count: number\n bucket: string\n prefix: string\n}\n","/**\n * AxCloud Forms Module\n *\n * Public functions for form submissions.\n * Requires organization API key for authentication.\n * Used by public websites like airene.io, theremoters.io, etc.\n */\n\n/**\n * Form submission request\n */\nexport interface FormSubmission {\n /** Organization API key (required for authentication) */\n apiKey: string\n /** Site domain (e.g., 'airene.io') */\n site: string\n /** Form type: 'waitlist', 'contact', or 'membership' */\n formType: 'waitlist' | 'contact' | 'membership'\n /** Email address */\n email: string\n /** Additional form data */\n data?: Record<string, unknown>\n}\n\n/**\n * Form submission response\n */\nexport interface FormSubmissionResponse {\n /** Whether the submission was successful */\n success: boolean\n /** User-friendly message */\n message: string\n /** Unique submission ID */\n submissionId: string\n}\n\n/**\n * Form submission stored in database\n */\nexport interface FormSubmissionRecord {\n submission_id: string\n org_id: string\n site: string\n form_type: 'waitlist' | 'contact' | 'membership'\n status: 'pending' | 'approved' | 'rejected' | 'converted'\n email: string\n data: Record<string, unknown>\n created_at: string\n updated_at: string\n reviewed_by?: string\n reviewed_at?: string\n notes?: string\n user_id?: string\n}\n\n/**\n * Form stats response from API\n */\nexport interface FormStatsResponse {\n stats: {\n total: number\n byStatus: Record<string, number>\n byType: Record<string, number>\n bySite: Record<string, number>\n recent: {\n today: number\n last7Days: number\n last30Days: number\n }\n }\n summary: {\n pending: number\n approved: number\n rejected: number\n conversionRate: string\n }\n period: {\n days: number\n from: string\n to: string\n }\n}\n\n/**\n * Paginated response for form submissions\n */\nexport interface FormSubmissionsResponse {\n items: FormSubmissionRecord[]\n total: number\n cursor?: string\n hasMore: boolean\n}\n\n/**\n * Submit a form to AxCloud\n *\n * Requires organization API key for authentication.\n *\n * @param apiUrl - AxCloud Forms API base URL (e.g., 'https://api.axcloud.app/forms/dev')\n * @param submission - Form submission data including API key\n * @returns Submission response with ID\n *\n * @example\n * ```tsx\n * import { submitForm } from '@axcloud/sdk'\n *\n * const handleSubmit = async (email: string) => {\n * const result = await submitForm(\n * 'https://api.axcloud.app/forms/dev',\n * {\n * apiKey: 'your-org-api-key',\n * site: 'airene.io',\n * formType: 'waitlist',\n * email,\n * data: { name: 'John Doe' }\n * }\n * )\n * console.log(result.message) // \"Thanks! We'll notify you when we launch.\"\n * }\n * ```\n */\nexport async function submitForm(\n apiUrl: string,\n submission: FormSubmission\n): Promise<FormSubmissionResponse> {\n const baseUrl = apiUrl.replace(/\\/$/, '')\n\n try {\n const response = await fetch(`${baseUrl}/public/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n api_key: submission.apiKey,\n site: submission.site,\n form_type: submission.formType,\n email: submission.email,\n data: submission.data || {}\n })\n })\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Form submission failed' }))\n throw new Error(error.message || 'Form submission failed')\n }\n\n const result = await response.json()\n\n return {\n success: result.success,\n message: result.message,\n submissionId: result.submission_id\n }\n } catch (primaryError) {\n // Fallback: notify via email so signups aren't lost\n try {\n const notifyResponse = await fetch(`${baseUrl}/public/notify`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n api_key: submission.apiKey,\n site: submission.site,\n form_type: submission.formType,\n email: submission.email\n })\n })\n\n if (notifyResponse.ok) {\n const result = await notifyResponse.json()\n return {\n success: true,\n message: result.message || \"Thanks! We'll notify you when we launch.\",\n submissionId: 'fallback'\n }\n }\n } catch {\n // Notify also failed — throw original error\n }\n\n throw primaryError\n }\n}\n\n/**\n * Create a form submission helper with pre-configured API URL, API key, and site\n *\n * @param config - Configuration with apiUrl, apiKey, and site\n * @returns Object with submit functions\n *\n * @example\n * ```tsx\n * import { createFormHelper } from '@axcloud/sdk'\n *\n * const forms = createFormHelper({\n * apiUrl: 'https://api.axcloud.app/forms/dev',\n * apiKey: 'your-org-api-key',\n * site: 'airene.io'\n * })\n *\n * // Now you can submit forms without repeating apiUrl, apiKey and site\n * const result = await forms.submit('waitlist', 'user@example.com')\n * ```\n */\nexport function createFormHelper(config: { apiUrl: string; apiKey: string; site: string }) {\n return {\n /**\n * Submit a waitlist form\n */\n submitWaitlist: (email: string, data?: Record<string, unknown>) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType: 'waitlist',\n email,\n data\n }),\n\n /**\n * Submit a contact form\n */\n submitContact: (\n email: string,\n data: { name?: string; message: string; [key: string]: unknown }\n ) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType: 'contact',\n email,\n data\n }),\n\n /**\n * Submit a membership application\n */\n submitMembership: (\n email: string,\n data: {\n firstName?: string\n lastName?: string\n phone?: string\n [key: string]: unknown\n }\n ) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType: 'membership',\n email,\n data\n }),\n\n /**\n * Generic submit function\n */\n submit: (\n formType: 'waitlist' | 'contact' | 'membership',\n email: string,\n data?: Record<string, unknown>\n ) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType,\n email,\n data\n })\n }\n}\n","import { createContext, useContext } from 'react'\nimport type { AxCloudClient } from '../core/client'\nimport type { AxCloudConfig } from '../core/types'\n\nexport interface AxCloudContextValue {\n config: AxCloudConfig\n client: AxCloudClient\n orgId: string\n /** API stage (e.g., 'dev', 'prod') */\n stage: string\n /** Whether using public API mode (API key, no auth) */\n isPublicMode: boolean\n}\n\nexport const AxCloudContext = createContext<AxCloudContextValue | null>(null)\n\nexport function useAxCloudContext(): AxCloudContextValue {\n const context = useContext(AxCloudContext)\n if (!context) {\n throw new Error('useAxCloudContext must be used within a AxCloudProvider')\n }\n return context\n}\n","import React, { useMemo, useRef } from 'react'\nimport { Auth0Provider, useAuth0 } from '@auth0/auth0-react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { AxCloudContext } from './context'\nimport { AxCloudClient } from '../core/client'\nimport type { AxCloudConfig } from '../core/types'\n\ninterface AxCloudProviderProps {\n children: React.ReactNode\n orgId: string\n apiUrl: string\n /** API stage - defaults to 'dev'. Use 'prod' for production. */\n stage?: string\n /** API key for public content endpoints */\n apiKey?: string\n auth0: {\n domain: string\n clientId: string\n redirectUri: string\n audience?: string\n /** Database connection name for password operations. Defaults to 'Username-Password-Authentication' */\n connection?: string\n }\n queryClient?: QueryClient\n /** Default request timeout in milliseconds (default: 30000) */\n timeout?: number\n}\n\n// Default query client with sensible defaults for content fetching\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60 * 5, // 5 minutes\n gcTime: 1000 * 60 * 30, // 30 minutes (garbage collection)\n retry: 2,\n refetchOnWindowFocus: false,\n },\n },\n})\n\n/**\n * Inner provider that has access to Auth0 context\n */\nfunction AxCloudInnerProvider({\n children,\n config,\n timeout,\n}: {\n children: React.ReactNode\n config: AxCloudConfig\n timeout?: number\n}) {\n const { getAccessTokenSilently, isAuthenticated } = useAuth0()\n\n // Use ref to store the token getter so it can be updated without recreating the client\n const tokenGetterRef = useRef<() => Promise<string | undefined>>(async () => undefined)\n\n // Update the ref when auth state changes\n tokenGetterRef.current = isAuthenticated\n ? async () => {\n try {\n return await getAccessTokenSilently()\n } catch {\n return undefined\n }\n }\n : async () => undefined\n\n // Create the API client with a stable token getter that uses the ref\n // This avoids recreating the client on auth changes while still getting fresh tokens\n const client = useMemo(() => {\n return new AxCloudClient({\n baseUrl: config.apiUrl,\n apiKey: config.apiKey,\n timeout,\n // Use a wrapper function that delegates to the ref\n // This ensures the client always uses the current auth state\n getAccessToken: async () => {\n if (tokenGetterRef.current) {\n return tokenGetterRef.current()\n }\n return undefined\n },\n })\n }, [config.apiUrl, config.apiKey, timeout])\n\n const contextValue = useMemo(\n () => ({\n config,\n client,\n orgId: config.orgId,\n stage: config.stage,\n isPublicMode: Boolean(config.apiKey) && !isAuthenticated,\n }),\n [config, client, isAuthenticated]\n )\n\n return (\n <AxCloudContext.Provider value={contextValue}>\n {children}\n </AxCloudContext.Provider>\n )\n}\n\n/**\n * AxCloudProvider - Main provider for the SDK\n *\n * Combines Auth0Provider, QueryClientProvider, and AxCloud context.\n *\n * @example\n * ```tsx\n * <AxCloudProvider\n * orgId=\"spf\"\n * apiUrl=\"https://api.axcloud.app\"\n * apiKey=\"your-api-key\" // Required for public content access\n * auth0={{\n * domain: \"auth.axcloud.app\",\n * clientId: \"xxx\",\n * redirectUri: window.location.origin\n * }}\n * >\n * <App />\n * </AxCloudProvider>\n * ```\n */\nexport function AxCloudProvider({\n children,\n orgId,\n apiUrl,\n stage = 'dev',\n apiKey,\n auth0,\n queryClient = defaultQueryClient,\n timeout,\n}: AxCloudProviderProps) {\n const config: AxCloudConfig = useMemo(\n () => ({\n orgId,\n apiUrl,\n stage,\n apiKey,\n auth0,\n }),\n [orgId, apiUrl, stage, apiKey, auth0]\n )\n\n return (\n <QueryClientProvider client={queryClient}>\n <Auth0Provider\n domain={auth0.domain}\n clientId={auth0.clientId}\n authorizationParams={{\n redirect_uri: auth0.redirectUri,\n audience: auth0.audience,\n }}\n >\n <AxCloudInnerProvider config={config} timeout={timeout}>\n {children}\n </AxCloudInnerProvider>\n </Auth0Provider>\n </QueryClientProvider>\n )\n}\n","import { useCallback } from 'react'\nimport { useAuth0, User as Auth0User } from '@auth0/auth0-react'\nimport { useAxCloudContext } from '../context'\n\nexport interface AuthUser {\n id: string\n email: string\n name: string\n avatar?: string\n}\n\nexport interface UseAuthReturn {\n isAuthenticated: boolean\n isLoading: boolean\n error: Error | undefined\n user: AuthUser | null\n login: (options?: { returnTo?: string }) => Promise<void>\n logout: (options?: { returnTo?: string }) => Promise<void>\n getAccessToken: () => Promise<string | undefined>\n getAuth0Client: () => Auth0ClientState\n /** Request a password reset email for the current user or specified email */\n requestPasswordReset: (email?: string) => Promise<{ success: boolean; message: string }>\n}\n\nexport interface Auth0ClientState {\n loginWithRedirect: ReturnType<typeof useAuth0>['loginWithRedirect']\n logout: ReturnType<typeof useAuth0>['logout']\n getAccessTokenSilently: ReturnType<typeof useAuth0>['getAccessTokenSilently']\n getIdTokenClaims: ReturnType<typeof useAuth0>['getIdTokenClaims']\n user: Auth0User | undefined\n isAuthenticated: boolean\n isLoading: boolean\n error: Error | undefined\n}\n\n/**\n * useAuth - Authentication hook with simplified API and escape hatch\n *\n * Provides easy login/logout methods while allowing access to the\n * underlying Auth0 client for advanced use cases.\n *\n * @example\n * ```tsx\n * function Header() {\n * const { isAuthenticated, login, logout, user } = useAuth()\n *\n * return isAuthenticated ? (\n * <button onClick={logout}>Log out</button>\n * ) : (\n * <button onClick={login}>Log in</button>\n * )\n * }\n * ```\n *\n * @example\n * // Advanced: Get access token for manual API calls\n * ```tsx\n * function MyComponent() {\n * const { getAccessToken } = useAuth()\n *\n * const fetchData = async () => {\n * const token = await getAccessToken()\n * // Use token for custom API calls\n * }\n * }\n * ```\n */\nexport function useAuth(): UseAuthReturn {\n const { config } = useAxCloudContext()\n const {\n isAuthenticated,\n isLoading,\n user: auth0User,\n error,\n loginWithRedirect,\n logout: auth0Logout,\n getAccessTokenSilently,\n getIdTokenClaims,\n } = useAuth0()\n\n /**\n * Trigger login via Auth0 Universal Login\n */\n const login = useCallback(\n (options?: { returnTo?: string }) => {\n return loginWithRedirect({\n appState: {\n returnTo: options?.returnTo || window.location.pathname,\n },\n })\n },\n [loginWithRedirect]\n )\n\n /**\n * Log out and optionally redirect\n */\n const logout = useCallback(\n (options?: { returnTo?: string }) => {\n return auth0Logout({\n logoutParams: {\n returnTo: options?.returnTo || window.location.origin,\n },\n })\n },\n [auth0Logout]\n )\n\n /**\n * Get the current access token (for manual API calls)\n */\n const getAccessToken = useCallback(async () => {\n try {\n return await getAccessTokenSilently()\n } catch {\n return undefined\n }\n }, [getAccessTokenSilently])\n\n /**\n * Get the full Auth0 client for advanced use cases (escape hatch)\n */\n const getAuth0Client = useCallback(() => {\n return {\n loginWithRedirect,\n logout: auth0Logout,\n getAccessTokenSilently,\n getIdTokenClaims,\n user: auth0User,\n isAuthenticated,\n isLoading,\n error,\n }\n }, [\n loginWithRedirect,\n auth0Logout,\n getAccessTokenSilently,\n getIdTokenClaims,\n auth0User,\n isAuthenticated,\n isLoading,\n error,\n ])\n\n /**\n * Request a password reset email\n * Can be used by logged-in users or on a \"forgot password\" page\n */\n const requestPasswordReset = useCallback(\n async (email?: string): Promise<{ success: boolean; message: string }> => {\n const targetEmail = email || auth0User?.email\n\n if (!targetEmail) {\n return {\n success: false,\n message: 'Email address is required',\n }\n }\n\n try {\n // Call Auth0's change_password endpoint directly\n const auth0Domain = config.auth0.domain\n const clientId = config.auth0.clientId\n const connection = config.auth0.connection || 'Username-Password-Authentication'\n\n const response = await fetch(`https://${auth0Domain}/dbconnections/change_password`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n client_id: clientId,\n email: targetEmail.toLowerCase(),\n connection,\n }),\n })\n\n if (response.ok) {\n return {\n success: true,\n message: 'If an account exists with this email, a password reset link has been sent.',\n }\n }\n\n // Auth0 returns 200 even for non-existent emails for security\n return {\n success: true,\n message: 'If an account exists with this email, a password reset link has been sent.',\n }\n } catch {\n return {\n success: false,\n message: 'Failed to send password reset email. Please try again.',\n }\n }\n },\n [auth0User?.email, config.auth0.domain, config.auth0.clientId]\n )\n\n return {\n // Simple, abstracted API\n isAuthenticated,\n isLoading,\n error,\n user: auth0User\n ? {\n id: auth0User.sub || '',\n email: auth0User.email || '',\n name: auth0User.name || '',\n avatar: auth0User.picture,\n }\n : null,\n login,\n logout,\n\n // Escape hatch for advanced use cases\n getAccessToken,\n getAuth0Client,\n\n // Password management\n requestPasswordReset,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAuth0 } from '@auth0/auth0-react'\nimport { useAxCloudContext } from '../context'\nimport type { User } from '../../core/types'\n\n// Extended user response from API (exported for type usage)\nexport interface UserApiResponse extends User {\n all_org_ids?: string[]\n organization_memberships?: Record<string, { role: string; sections?: string[] }>\n isSuperAdmin?: boolean\n}\n\n/**\n * useUser - Fetch the current authenticated user from AxCloud\n *\n * Returns the full user profile including organization membership,\n * role, section, and permissions.\n *\n * Also validates that the user has access to the configured organization.\n *\n * @example\n * ```tsx\n * function Profile() {\n * const { user, isLoading, isError, hasOrgAccess } = useUser()\n *\n * if (isLoading) return <Spinner />\n * if (!hasOrgAccess) return <AccessDenied />\n * if (!user) return <LoginPrompt />\n *\n * return (\n * <div>\n * <h1>Welcome, {user.name}!</h1>\n * <p>Role: {user.role}</p>\n * <p>Organization: {user.organizationId}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useUser() {\n const { isAuthenticated, isLoading: isAuthLoading } = useAuth0()\n const { client, stage, orgId } = useAxCloudContext()\n\n const query = useQuery<UserApiResponse>({\n queryKey: ['axcloud', 'user', 'me', stage],\n queryFn: async () => {\n // Main API uses /{stage}/api base path\n return client.get<UserApiResponse>(`/${stage}/api/users/me`)\n },\n enabled: isAuthenticated && !isAuthLoading,\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n // Check if user has access to the configured organization\n const userData = query.data\n const userOrgIds = userData?.all_org_ids ?? []\n const isSuperAdmin = userData?.isSuperAdmin === true\n const hasOrgAccess = isSuperAdmin || userOrgIds.includes(orgId)\n\n // Get user's role in this specific organization\n const orgMembership = userData?.organization_memberships?.[orgId]\n const roleInOrg = orgMembership?.role ?? null\n\n return {\n user: query.data ?? null,\n isLoading: isAuthLoading || query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n\n // Organization access\n hasOrgAccess,\n roleInOrg,\n\n // Convenience properties\n isAuthenticated,\n role: query.data?.role ?? null,\n organizationId: query.data?.organizationId ?? null,\n sectionId: query.data?.sectionId ?? null,\n permissions: query.data?.permissions ?? [],\n isSuperAdmin,\n }\n}\n","import { useCallback } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type { Organization, AxCloudModule } from '../../core/types'\n\n/**\n * Public organization response from /content/public/{orgId}/org\n */\ninterface PublicOrganization {\n org_id: string\n name: string\n description?: string\n branding?: {\n logo?: string\n primaryColor?: string\n secondaryColor?: string\n }\n modules?: string[]\n contact?: {\n email?: string\n phone?: string\n website?: string\n }\n social?: {\n facebook?: string\n twitter?: string\n linkedin?: string\n instagram?: string\n }\n}\n\n/**\n * useOrg - Fetch organization info and check module availability\n *\n * Automatically uses the appropriate endpoint:\n * - With API key (public): `/content/public/{orgId}/org`\n * - With JWT auth: `/orgs/api/organizations/{orgId}`\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { org, hasModule, isLoading } = useOrg()\n *\n * if (isLoading) return <Spinner />\n *\n * return (\n * <div>\n * <h1>{org.name}</h1>\n * {org.branding?.logo && <img src={org.branding.logo} alt={org.name} />}\n * {hasModule('training') && <TrainingSection />}\n * {hasModule('ai') && <AIChatWidget />}\n * </div>\n * )\n * }\n * ```\n */\nexport function useOrg() {\n const { client, orgId, stage, isPublicMode } = useAxCloudContext()\n\n // Determine if we should use public endpoint (API key mode or not authenticated)\n const usePublicEndpoint = isPublicMode\n\n const query = useQuery<Organization | PublicOrganization>({\n queryKey: ['axcloud', 'organization', orgId, stage, usePublicEndpoint],\n queryFn: async () => {\n if (usePublicEndpoint) {\n // Public API: /content/public/{orgId}/org (requires x-api-key)\n return client.get<PublicOrganization>(`/content/public/${orgId}/org`)\n } else {\n // Organizations service: /orgs/api/organizations/{orgId}\n return client.get<Organization>(`/orgs/api/organizations/${orgId}`)\n }\n },\n staleTime: 1000 * 60 * 10, // 10 minutes (org data rarely changes)\n })\n\n // Normalize the response to handle both formats\n const orgData = query.data\n const normalizedOrg = orgData ? {\n id: (orgData as Organization).id || (orgData as PublicOrganization).org_id,\n org_id: (orgData as PublicOrganization).org_id || (orgData as Organization).id,\n name: orgData.name,\n description: orgData.description,\n branding: (orgData as PublicOrganization).branding || (orgData as Organization).settings?.theme,\n modules: orgData.modules || [],\n contact: (orgData as PublicOrganization).contact,\n social: (orgData as PublicOrganization).social,\n } : null\n\n /**\n * Check if a specific module is enabled for this organization\n */\n const hasModule = useCallback(\n (module: AxCloudModule): boolean => {\n const mods = normalizedOrg?.modules || []\n return mods.includes(module)\n },\n [normalizedOrg?.modules]\n )\n\n /**\n * Get all enabled modules\n */\n const modules = normalizedOrg?.modules ?? []\n\n return {\n org: normalizedOrg,\n orgId,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n\n // Module helpers\n hasModule,\n modules,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type { NewsItem, PaginatedResponse, ContentQueryOptions } from '../../core/types'\n\n/**\n * useNews - Fetch news articles for the organization\n *\n * When authenticated (isPublicMode = false), fetches news visible to members\n * including public, internal, and members-only content.\n *\n * When not authenticated (isPublicMode = true), fetches only public news.\n *\n * @example\n * ```tsx\n * function NewsPage() {\n * const { data: news, isLoading, isError, error } = useNews()\n *\n * if (isLoading) return <Spinner />\n * if (isError) return <Error message={error.message} />\n *\n * return (\n * <ul>\n * {news.map(item => (\n * <li key={item.id}>{item.title}</li>\n * ))}\n * </ul>\n * )\n * }\n * ```\n *\n * @example\n * // With pagination\n * ```tsx\n * const { data, hasMore, refetch } = useNews({\n * pageSize: 10,\n * status: 'published'\n * })\n * ```\n */\nexport function useNews(options: ContentQueryOptions = {}) {\n const { client, orgId, isPublicMode } = useAxCloudContext()\n\n const {\n page = 1,\n pageSize = 20,\n status = 'published',\n visibility,\n sectionId,\n search,\n sortBy = 'publishedAt',\n sortOrder = 'desc',\n publicOnly = false,\n } = options\n\n // Use public endpoint if: not authenticated OR explicitly requested publicOnly\n const usePublicEndpoint = isPublicMode || publicOnly\n\n const query = useQuery<PaginatedResponse<NewsItem>>({\n queryKey: ['axcloud', 'news', orgId, usePublicEndpoint,\n page, pageSize, status, visibility, sectionId, search, sortBy, sortOrder],\n queryFn: async () => {\n // Use member endpoint when authenticated and not publicOnly\n // Member endpoint returns public + internal + members content\n // Public endpoint returns only public content\n const endpoint = usePublicEndpoint\n ? `/content/public/${orgId}/news`\n : `/content/members/${orgId}/news`\n\n return client.get<PaginatedResponse<NewsItem>>(endpoint, {\n page,\n pageSize,\n status,\n visibility,\n sectionId,\n search,\n sortBy,\n sortOrder,\n })\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n data: query.data?.items ?? [],\n total: query.data?.total ?? 0,\n hasMore: query.data?.hasMore ?? false,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","import { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type { ContentItem, PaginatedResponse, ContentQueryOptions } from '../../core/types'\nimport { createContentSlotReader, type ContentSlotReader } from '../../core/contentSlots'\n\n/**\n * Content types that have member endpoints\n * These return public + internal + members content when authenticated\n */\nconst MEMBER_ENDPOINT_TYPES = ['news', 'pages', 'events']\nconst PAGE_CONTENT_TYPES = ['page', 'pages']\n\n/**\n * useContent - Generic content fetching hook\n *\n * When authenticated (isPublicMode = false), fetches content visible to members\n * including public, internal, and members-only content (for supported types).\n *\n * When not authenticated (isPublicMode = true), fetches only public content.\n *\n * @param contentType - The type of content to fetch (e.g., 'news', 'pages', 'events')\n * @param options - Query options for filtering and pagination\n *\n * @example\n * ```tsx\n * // Fetch pages\n * const { data: pages } = useContent('pages')\n *\n * // Fetch custom content type\n * const { data: events } = useContent('events', {\n * status: 'published',\n * sortBy: 'startDate'\n * })\n * ```\n */\nexport function useContent<T extends ContentItem = ContentItem>(\n contentType: string,\n options: ContentQueryOptions = {}\n) {\n const { client, orgId, isPublicMode } = useAxCloudContext()\n\n const {\n publicOnly = false,\n page = 1,\n pageSize = 20,\n status = 'published',\n visibility,\n sectionId,\n search,\n sortBy = 'createdAt',\n sortOrder = 'desc',\n lang,\n } = options\n\n const query = useQuery<PaginatedResponse<T>>({\n queryKey: ['axcloud', 'content', orgId, contentType, isPublicMode, publicOnly,\n page, pageSize, status, visibility, sectionId, search, sortBy, sortOrder, lang],\n queryFn: async () => {\n // Use member endpoint when authenticated (for supported content types) and not publicOnly\n // Member endpoint returns public + internal + members content based on membership\n // Public endpoint returns only public content\n const useMemberEndpoint = !isPublicMode && !publicOnly && MEMBER_ENDPOINT_TYPES.includes(contentType)\n const endpoint = useMemberEndpoint\n ? `/content/members/${orgId}/${contentType}`\n : `/content/public/${orgId}/${contentType}`\n\n return client.get<PaginatedResponse<T>>(endpoint, {\n page,\n pageSize,\n status,\n visibility,\n sectionId,\n search,\n sortBy,\n sortOrder,\n lang,\n })\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n data: query.data?.items ?? [],\n total: query.data?.total ?? 0,\n hasMore: query.data?.hasMore ?? false,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport interface ContentItemOptions {\n /** Force public endpoint even when authenticated */\n publicOnly?: boolean\n /** Return the requested translation when content has language variants. */\n lang?: string\n}\n\n/**\n * useContentItem - Fetch a single content item by ID or slug\n *\n * When authenticated (isPublicMode = false), fetches from member endpoint\n * which can return members-only content (for supported types).\n *\n * When not authenticated (isPublicMode = true), fetches only public content.\n *\n * @param contentType - The type of content (e.g., 'news', 'pages', 'events')\n * @param idOrSlug - The content ID or slug\n * @param options - Optional settings\n *\n * @example\n * ```tsx\n * // Fetch a page by slug\n * const { data: page } = useContentItem('pages', 'about-us', { lang: 'sv' })\n *\n * // Force public endpoint\n * const { data: page } = useContentItem('pages', 'about-us', { publicOnly: true })\n * ```\n */\nexport function useContentItem<T extends ContentItem = ContentItem>(\n contentType: string,\n idOrSlug: string,\n options: ContentItemOptions = {}\n) {\n const { client, orgId, isPublicMode } = useAxCloudContext()\n const { publicOnly = false, lang } = options\n\n // Use member endpoint when authenticated (for supported content types)\n const useMemberEndpoint = !isPublicMode && !publicOnly && (\n MEMBER_ENDPOINT_TYPES.includes(contentType) ||\n PAGE_CONTENT_TYPES.includes(contentType)\n )\n\n const query = useQuery<T>({\n queryKey: ['axcloud', 'content', orgId, contentType, idOrSlug, useMemberEndpoint, lang],\n queryFn: async () => {\n const basePath = useMemberEndpoint ? 'members' : 'public'\n const encodedIdOrSlug = encodeURIComponent(idOrSlug)\n const endpoint = PAGE_CONTENT_TYPES.includes(contentType)\n ? `/content/${basePath}/${orgId}/page/${encodedIdOrSlug}`\n : `/content/${basePath}/${orgId}/${contentType}/${encodedIdOrSlug}`\n return lang ? client.get<T>(endpoint, { lang }) : client.get<T>(endpoint)\n },\n enabled: !!idOrSlug,\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n data: query.data ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport interface PageContentState<T extends ContentItem = ContentItem> extends ContentSlotReader {\n page: T | null\n data: T | null\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => unknown\n}\n\n/**\n * usePageContent - Fetch a website page and expose structured template fields.\n *\n * Use `page.content`/`page.blocks` for article-like rich text pages. Use\n * `text('hero.title')`, `list('benefits.items')`, etc. for designed website templates\n * where the frontend owns layout and AxCloud owns content.\n */\nexport function usePageContent<T extends ContentItem = ContentItem>(\n slug: string,\n options: ContentItemOptions = {}\n): PageContentState<T> {\n const state = useContentItem<T>('pages', slug, options)\n const reader = useMemo(() => createContentSlotReader(state.data), [state.data])\n\n return {\n ...state,\n page: state.data,\n ...reader,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAuth0 } from '@auth0/auth0-react'\nimport { useAxCloudContext } from '../context'\nimport { useUser } from '../auth/useUser'\nimport type { Section, User } from '../../core/types'\n\ninterface SectionWithMembers extends Section {\n members?: User[]\n memberCount?: number\n}\n\n/**\n * useMySection - Fetch the current user's section\n *\n * Returns the section the authenticated user belongs to,\n * along with optional member list if the user has permission to view.\n *\n * @example\n * ```tsx\n * function MySectionPage() {\n * const { section, members, isLoading } = useMySection()\n *\n * if (isLoading) return <Spinner />\n * if (!section) return <p>You are not assigned to a section</p>\n *\n * return (\n * <div>\n * <h1>{section.name}</h1>\n * <p>{section.description}</p>\n * <h2>Members ({members.length})</h2>\n * <ul>\n * {members.map(m => <li key={m.id}>{m.name}</li>)}\n * </ul>\n * </div>\n * )\n * }\n * ```\n */\nexport function useMySection(options: { includeMembers?: boolean } = {}) {\n const { includeMembers = true } = options\n const { isAuthenticated } = useAuth0()\n const { client, orgId, stage } = useAxCloudContext()\n const { user, sectionId, isLoading: isUserLoading } = useUser()\n\n const query = useQuery<SectionWithMembers>({\n queryKey: ['axcloud', 'mySection', orgId, sectionId, includeMembers, stage],\n queryFn: async () => {\n if (!sectionId) {\n throw new Error('User is not assigned to a section')\n }\n\n // Organizations service uses /orgs base path\n // Response may be wrapped in { success, data } by responseWrapper\n const response = await client.get<SectionWithMembers | { success: boolean; data: SectionWithMembers }>(\n `/orgs/api/organizations/${orgId}/sections/${sectionId}`,\n { includeMembers: includeMembers ? 'true' : undefined }\n )\n\n return 'success' in response && response.success === true && response.data ? response.data : response as SectionWithMembers\n },\n enabled: isAuthenticated && !isUserLoading && !!sectionId,\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n section: query.data ?? null,\n sectionId,\n members: query.data?.members ?? [],\n memberCount: query.data?.memberCount ?? 0,\n isLoading: isUserLoading || query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n\n // Helper: Does the user have a section?\n hasSection: !!sectionId,\n\n // The current user in context\n user,\n }\n}\n\n/**\n * useSections - Fetch all sections for the organization\n *\n * @example\n * ```tsx\n * const { sections } = useSections()\n * ```\n */\ninterface SectionsResponse {\n sections: Section[]\n total: number\n}\n\nexport function useSections() {\n const { client, orgId, stage } = useAxCloudContext()\n\n const query = useQuery<SectionsResponse>({\n queryKey: ['axcloud', 'sections', orgId, stage],\n queryFn: async () => {\n // Organizations service uses /orgs base path\n // Response may be wrapped in { success, data } by responseWrapper\n const response = await client.get<SectionsResponse | { success: boolean; data: SectionsResponse }>(`/orgs/api/organizations/${orgId}/sections`)\n return 'success' in response && response.success === true && response.data ? response.data : response as SectionsResponse\n },\n staleTime: 1000 * 60 * 10, // 10 minutes\n })\n\n return {\n sections: query.data?.sections ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","/**\n * useForms - Admin hooks for managing form submissions\n *\n * These hooks require authentication and are intended for use in\n * the AxCloud admin dashboard.\n */\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type {\n FormSubmissionRecord,\n FormSubmissionsResponse,\n FormStatsResponse\n} from '../../core/forms'\n\nexport interface UseFormsOptions {\n /** Filter by form type */\n formType?: 'waitlist' | 'contact' | 'membership'\n /** Filter by status */\n status?: 'pending' | 'approved' | 'rejected' | 'converted'\n /** Number of items per page (default 50, max 100) */\n limit?: number\n /** Pagination cursor */\n cursor?: string\n}\n\nexport interface UseFormStatsOptions {\n /** Number of days to include (default 30, max 365) */\n days?: number\n}\n\n/**\n * useForms - Fetch form submissions for the organization (admin only)\n *\n * @example\n * ```tsx\n * function FormSubmissions() {\n * const { data, isLoading, hasMore, refetch } = useForms({\n * status: 'pending'\n * })\n *\n * if (isLoading) return <Spinner />\n *\n * return (\n * <ul>\n * {data.map(submission => (\n * <li key={submission.submission_id}>{submission.email}</li>\n * ))}\n * </ul>\n * )\n * }\n * ```\n */\nexport function useForms(options: UseFormsOptions = {}) {\n const { client, stage } = useAxCloudContext()\n\n const { formType, status, limit = 50, cursor } = options\n\n const query = useQuery<FormSubmissionsResponse>({\n queryKey: ['axcloud', 'forms', 'submissions', stage, formType, status, limit, cursor],\n queryFn: async () => {\n const params: Record<string, string | number> = { limit }\n if (formType) params.form_type = formType\n if (status) params.status = status\n if (cursor) params.cursor = cursor\n\n return client.get<FormSubmissionsResponse>(`/${stage}/api/admin/forms/submissions`, params)\n },\n staleTime: 1000 * 30 // 30 seconds\n })\n\n return {\n data: query.data?.items ?? [],\n total: query.data?.total ?? 0,\n hasMore: query.data?.hasMore ?? false,\n cursor: query.data?.cursor,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch\n }\n}\n\n/**\n * useFormStats - Fetch form submission statistics (admin only)\n *\n * @example\n * ```tsx\n * function FormDashboard() {\n * const { stats, summary, isLoading } = useFormStats({ days: 30 })\n *\n * if (isLoading) return <Spinner />\n *\n * return (\n * <div>\n * <p>Pending: {summary.pending}</p>\n * <p>Approved: {summary.approved}</p>\n * <p>Conversion Rate: {summary.conversionRate}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useFormStats(options: UseFormStatsOptions = {}) {\n const { client, stage } = useAxCloudContext()\n\n const { days = 30 } = options\n\n const query = useQuery<FormStatsResponse>({\n queryKey: ['axcloud', 'forms', 'stats', stage, days],\n queryFn: async () => {\n return client.get<FormStatsResponse>(`/${stage}/api/admin/forms/stats`, { days })\n },\n staleTime: 1000 * 60 * 5 // 5 minutes\n })\n\n return {\n stats: query.data?.stats,\n summary: query.data?.summary,\n period: query.data?.period,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch\n }\n}\n\n/**\n * useUpdateFormSubmission - Mutation hook for updating submission status\n *\n * @example\n * ```tsx\n * function SubmissionRow({ submission }) {\n * const { mutate: updateSubmission, isLoading } = useUpdateFormSubmission()\n *\n * const handleApprove = () => {\n * updateSubmission({\n * submissionId: submission.submission_id,\n * status: 'approved',\n * notes: 'Approved by admin'\n * })\n * }\n *\n * return (\n * <button onClick={handleApprove} disabled={isLoading}>\n * Approve\n * </button>\n * )\n * }\n * ```\n */\nexport function useUpdateFormSubmission() {\n const { client, stage } = useAxCloudContext()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({\n submissionId,\n status,\n notes\n }: {\n submissionId: string\n status: 'approved' | 'rejected'\n notes?: string\n }) => {\n return client.patch<{\n success: boolean\n message: string\n submission: FormSubmissionRecord\n user_created?: boolean\n user_id?: string\n }>(`/${stage}/api/admin/forms/submissions/${submissionId}`, { status, notes })\n },\n onSuccess: () => {\n // Invalidate forms queries to refresh the list\n queryClient.invalidateQueries({ queryKey: ['axcloud', 'forms'] })\n }\n })\n}\n","/**\n * useLinkedAccounts Hook\n *\n * Manages linked social accounts (identities) for the current user.\n * Supports Google, Microsoft, and Apple OAuth providers.\n *\n * Uses React-Query for caching, background refresh, and automatic refetch.\n *\n * @example\n * ```tsx\n * function AccountSettings() {\n * const {\n * identities,\n * availableProviders,\n * isLoading,\n * linkAccount,\n * unlinkAccount,\n * canUnlink\n * } = useLinkedAccounts()\n *\n * return (\n * <div>\n * {identities.map(identity => (\n * <div key={identity.provider}>\n * {identity.provider_display_name}\n * {canUnlink && !identity.is_primary && (\n * <button onClick={() => unlinkAccount(identity.provider)}>\n * Disconnect\n * </button>\n * )}\n * </div>\n * ))}\n * {availableProviders.map(provider => (\n * <button key={provider.provider} onClick={() => linkAccount(provider.provider)}>\n * Connect {provider.display_name}\n * </button>\n * ))}\n * </div>\n * )\n * }\n * ```\n */\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport { useAuth } from '../auth/useAuth'\n\nexport interface LinkedIdentity {\n provider: string\n provider_display_name: string\n provider_icon: string\n user_id: string\n connection: string\n is_social: boolean\n is_primary: boolean\n profile_data?: {\n email?: string\n name?: string\n picture?: string\n }\n}\n\nexport interface AvailableProvider {\n provider: string\n display_name: string\n icon: string\n}\n\nexport interface IdentitiesResponse {\n identities: LinkedIdentity[]\n available_providers: AvailableProvider[]\n can_unlink: boolean\n}\n\nexport interface LinkIdentityResponse {\n authorization_url: string\n provider: string\n provider_display_name: string\n message: string\n}\n\nexport interface UnlinkIdentityResponse {\n success: boolean\n message: string\n provider: string\n provider_display_name: string\n remaining_identities: number\n}\n\nexport interface UseLinkedAccountsReturn {\n /** List of linked identities/accounts */\n identities: LinkedIdentity[]\n /** List of providers available for linking */\n availableProviders: AvailableProvider[]\n /** Whether the user can unlink accounts (must have >1) */\n canUnlink: boolean\n /** Loading state */\n isLoading: boolean\n /** Error state */\n error: Error | null\n /** Initiate linking a new account - redirects to OAuth flow */\n linkAccount: (provider: 'google' | 'microsoft' | 'apple') => void\n /** Unlink an account */\n unlinkAccount: (provider: string) => void\n /** Whether a link operation is in progress */\n isLinking: boolean\n /** Whether an unlink operation is in progress */\n isUnlinking: boolean\n /** Refresh the identities list */\n refetch: () => Promise<unknown>\n}\n\n/** Query key for linked accounts */\nexport const LINKED_ACCOUNTS_QUERY_KEY = ['axcloud', 'linked-accounts'] as const\n\n/**\n * useLinkedAccounts - Manage social login accounts\n *\n * Provides functionality to view, link, and unlink social accounts\n * (Google, Microsoft, Apple) from the user's profile.\n *\n * Uses React-Query for caching and automatic state management.\n */\nexport function useLinkedAccounts(): UseLinkedAccountsReturn {\n const { client, stage } = useAxCloudContext()\n const { isAuthenticated } = useAuth()\n const queryClient = useQueryClient()\n\n /**\n * Query for fetching identities\n */\n const query = useQuery({\n queryKey: [...LINKED_ACCOUNTS_QUERY_KEY, stage],\n queryFn: async () => {\n return client.get<IdentitiesResponse>(`/identities/api/users/me/identities`)\n },\n enabled: isAuthenticated,\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n /**\n * Mutation for linking a new account\n */\n const linkMutation = useMutation({\n mutationFn: async (provider: 'google' | 'microsoft' | 'apple') => {\n const response = await client.post<LinkIdentityResponse>(\n `/identities/api/users/me/identities/${provider}/link`,\n {}\n )\n\n // Redirect to authorization URL\n if (response.authorization_url) {\n window.location.href = response.authorization_url\n }\n\n return response\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: LINKED_ACCOUNTS_QUERY_KEY })\n },\n })\n\n /**\n * Mutation for unlinking an account\n */\n const unlinkMutation = useMutation({\n mutationFn: async (provider: string) => {\n return client.delete<UnlinkIdentityResponse>(\n `/identities/api/users/me/identities/${provider}`\n )\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: LINKED_ACCOUNTS_QUERY_KEY })\n },\n })\n\n return {\n identities: query.data?.identities ?? [],\n availableProviders: query.data?.available_providers ?? [],\n canUnlink: query.data?.can_unlink ?? false,\n isLoading: query.isLoading,\n error: query.error,\n linkAccount: linkMutation.mutate,\n unlinkAccount: unlinkMutation.mutate,\n isLinking: linkMutation.isPending,\n isUnlinking: unlinkMutation.isPending,\n refetch: query.refetch,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type {\n OrganizationBranding,\n SignedMediaUrl,\n MediaListResponse,\n} from '../../core/types'\n\n/**\n * useBranding - Fetch organization branding (logo, colors)\n *\n * Returns branding information including a signed URL for the logo.\n * The logo URL expires after 1 hour and will be refreshed automatically.\n *\n * @example\n * ```tsx\n * const { branding, logoUrl, isLoading } = useBranding()\n *\n * return (\n * <header>\n * {logoUrl && <img src={logoUrl} alt=\"Logo\" />}\n * <h1 style={{ color: branding?.primaryColor }}>Welcome</h1>\n * </header>\n * )\n * ```\n */\nexport function useBranding() {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<OrganizationBranding>({\n queryKey: ['axcloud', 'media', 'branding', orgId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/branding\n return client.get<OrganizationBranding>(`/media/public/${orgId}/branding`)\n },\n staleTime: 1000 * 60 * 30, // 30 minutes (logo URL valid for 1 hour)\n gcTime: 1000 * 60 * 55, // Garbage collect before URL expires\n })\n\n return {\n branding: query.data?.branding ?? null,\n logoUrl: query.data?.branding?.logoUrl ?? null,\n organizationName: query.data?.name ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useLogo - Fetch organization logo URL\n *\n * Returns a signed URL for the organization logo.\n * Use this when you only need the logo, not full branding info.\n *\n * @example\n * ```tsx\n * const { logoUrl, isLoading } = useLogo()\n *\n * if (isLoading) return <Skeleton />\n * return logoUrl ? <img src={logoUrl} alt=\"Logo\" /> : <DefaultLogo />\n * ```\n */\nexport function useLogo() {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedMediaUrl>({\n queryKey: ['axcloud', 'media', 'logo', orgId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/logo\n return client.get<SignedMediaUrl>(`/media/public/${orgId}/logo`)\n },\n staleTime: 1000 * 60 * 30, // 30 minutes\n gcTime: 1000 * 60 * 55, // Garbage collect before URL expires\n })\n\n return {\n logoUrl: query.data?.url ?? null,\n expiresIn: query.data?.expiresIn ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useAvatar - Fetch user avatar URL\n *\n * @param userId - The user ID to fetch avatar for\n *\n * @example\n * ```tsx\n * const { avatarUrl } = useAvatar(user.id)\n * return <img src={avatarUrl || defaultAvatar} alt={user.name} />\n * ```\n */\nexport function useAvatar(userId: string) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedMediaUrl>({\n queryKey: ['axcloud', 'media', 'avatar', orgId, userId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/avatar/{userId}\n return client.get<SignedMediaUrl>(`/media/public/${orgId}/avatar/${userId}`)\n },\n enabled: !!userId,\n staleTime: 1000 * 60 * 30,\n gcTime: 1000 * 60 * 55,\n retry: false, // Don't retry if avatar doesn't exist\n })\n\n return {\n avatarUrl: query.data?.url ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useMediaList - List media files in organization's library\n *\n * @param type - Media type to list ('media', 'logos', 'avatars')\n * @param limit - Maximum number of items to return (default: 50)\n *\n * @example\n * ```tsx\n * const { items, isLoading } = useMediaList('media', 20)\n *\n * return (\n * <div className=\"grid\">\n * {items.map(item => (\n * <MediaThumbnail key={item.key} item={item} />\n * ))}\n * </div>\n * )\n * ```\n */\nexport function useMediaList(type: 'media' | 'logos' | 'avatars' = 'media', limit = 50) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<MediaListResponse>({\n queryKey: ['axcloud', 'media', 'list', orgId, type, limit],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/list?type=xxx&limit=xxx\n return client.get<MediaListResponse>(`/media/public/${orgId}/list`, {\n type,\n limit,\n })\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n items: query.data?.items ?? [],\n count: query.data?.count ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useMedia - Fetch a specific media file by ID\n *\n * @param mediaId - The media ID (filename including extension)\n *\n * @example\n * ```tsx\n * const { mediaUrl } = useMedia('hero-image.jpg')\n * return <img src={mediaUrl} alt=\"Hero\" />\n * ```\n */\nexport function useMedia(mediaId: string) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedMediaUrl>({\n queryKey: ['axcloud', 'media', 'file', orgId, mediaId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/media/{mediaId}\n return client.get<SignedMediaUrl>(`/media/public/${orgId}/media/${mediaId}`)\n },\n enabled: !!mediaId,\n staleTime: 1000 * 60 * 30,\n gcTime: 1000 * 60 * 55,\n })\n\n return {\n mediaUrl: query.data?.url ?? null,\n expiresIn: query.data?.expiresIn ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","import React from 'react'\nimport { useAuth } from '../auth/useAuth'\n\ninterface LoginButtonProps {\n /**\n * Button text when not authenticated\n */\n children?: React.ReactNode\n\n /**\n * URL to return to after login\n */\n returnTo?: string\n\n /**\n * Additional CSS class names\n */\n className?: string\n\n /**\n * Inline styles\n */\n style?: React.CSSProperties\n}\n\n/**\n * LoginButton - Trigger Auth0 Universal Login\n *\n * @example\n * ```tsx\n * <LoginButton>Sign In</LoginButton>\n *\n * // With custom return URL\n * <LoginButton returnTo=\"/dashboard\">Sign In</LoginButton>\n *\n * // With styling\n * <LoginButton className=\"btn btn-primary\">Sign In</LoginButton>\n * ```\n */\nexport function LoginButton({\n children = 'Log in',\n returnTo,\n className,\n style,\n}: LoginButtonProps) {\n const { login, isLoading } = useAuth()\n\n const handleClick = () => {\n login({ returnTo })\n }\n\n return (\n <button\n onClick={handleClick}\n disabled={isLoading}\n className={className}\n style={style}\n type=\"button\"\n >\n {isLoading ? 'Loading...' : children}\n </button>\n )\n}\n\ninterface LogoutButtonProps {\n /**\n * Button text\n */\n children?: React.ReactNode\n\n /**\n * URL to return to after logout\n */\n returnTo?: string\n\n /**\n * Additional CSS class names\n */\n className?: string\n\n /**\n * Inline styles\n */\n style?: React.CSSProperties\n}\n\n/**\n * LogoutButton - Trigger logout\n *\n * @example\n * ```tsx\n * <LogoutButton>Sign Out</LogoutButton>\n * ```\n */\nexport function LogoutButton({\n children = 'Log out',\n returnTo,\n className,\n style,\n}: LogoutButtonProps) {\n const { logout } = useAuth()\n\n const handleClick = () => {\n logout({ returnTo })\n }\n\n return (\n <button\n onClick={handleClick}\n className={className}\n style={style}\n type=\"button\"\n >\n {children}\n </button>\n )\n}\n","import React from 'react'\nimport { useAuth } from '../auth/useAuth'\nimport { useUser } from '../auth/useUser'\nimport type { UserRole } from '../../core/types'\n\ninterface ProtectedRouteProps {\n /**\n * Content to render when authenticated\n */\n children: React.ReactNode\n\n /**\n * Required role(s) to access this route\n */\n roles?: UserRole | UserRole[]\n\n /**\n * Component to render while loading\n */\n loadingComponent?: React.ReactNode\n\n /**\n * Component to render when not authenticated\n */\n unauthenticatedComponent?: React.ReactNode\n\n /**\n * Component to render when authenticated but lacking required role\n */\n unauthorizedComponent?: React.ReactNode\n\n /**\n * Whether to automatically redirect to login when not authenticated\n * @default false\n */\n redirectToLogin?: boolean\n\n /**\n * Return URL after login (only used with redirectToLogin)\n */\n returnTo?: string\n}\n\n/**\n * ProtectedRoute - Require authentication to view content\n *\n * @example\n * ```tsx\n * // Basic usage\n * <ProtectedRoute>\n * <MemberContent />\n * </ProtectedRoute>\n *\n * // With role requirement\n * <ProtectedRoute roles=\"admin\">\n * <AdminDashboard />\n * </ProtectedRoute>\n *\n * // With multiple allowed roles\n * <ProtectedRoute roles={['admin', 'editor']}>\n * <ContentEditor />\n * </ProtectedRoute>\n *\n * // With custom fallbacks\n * <ProtectedRoute\n * loadingComponent={<Spinner />}\n * unauthenticatedComponent={<LoginPrompt />}\n * unauthorizedComponent={<AccessDenied />}\n * >\n * <ProtectedContent />\n * </ProtectedRoute>\n *\n * // Auto-redirect to login\n * <ProtectedRoute redirectToLogin>\n * <MemberArea />\n * </ProtectedRoute>\n * ```\n */\nexport function ProtectedRoute({\n children,\n roles,\n loadingComponent,\n unauthenticatedComponent,\n unauthorizedComponent,\n redirectToLogin = false,\n returnTo,\n}: ProtectedRouteProps) {\n const { isAuthenticated, isLoading: isAuthLoading, login } = useAuth()\n const { user, role, isLoading: isUserLoading } = useUser()\n\n const isLoading = isAuthLoading || (isAuthenticated && isUserLoading)\n\n // Show loading state\n if (isLoading) {\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>\n }\n\n // Not authenticated\n if (!isAuthenticated) {\n if (redirectToLogin) {\n login({ returnTo: returnTo || window.location.pathname })\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>\n }\n return <>{unauthenticatedComponent ?? <DefaultUnauthenticatedComponent />}</>\n }\n\n // Check role requirements\n if (roles && role) {\n const requiredRoles = Array.isArray(roles) ? roles : [roles]\n const hasRequiredRole = requiredRoles.includes(role)\n\n if (!hasRequiredRole) {\n return <>{unauthorizedComponent ?? <DefaultUnauthorizedComponent />}</>\n }\n }\n\n // All checks passed\n return <>{children}</>\n}\n\n// Default fallback components (minimal styling)\nfunction DefaultLoadingComponent() {\n return (\n <div style={{ padding: '20px', textAlign: 'center' }}>\n Loading...\n </div>\n )\n}\n\nfunction DefaultUnauthenticatedComponent() {\n return (\n <div style={{ padding: '20px', textAlign: 'center' }}>\n <p>Please log in to view this content.</p>\n </div>\n )\n}\n\nfunction DefaultUnauthorizedComponent() {\n return (\n <div style={{ padding: '20px', textAlign: 'center' }}>\n <p>You don't have permission to view this content.</p>\n </div>\n )\n}\n","import React from 'react'\nimport { useOrg } from '../hooks/useOrg'\nimport type { AxCloudModule } from '../../core/types'\n\ninterface ModuleGateProps {\n /**\n * Required module(s) to render children\n */\n module: AxCloudModule | AxCloudModule[]\n\n /**\n * Content to render when module is enabled\n */\n children: React.ReactNode\n\n /**\n * Content to render when module is NOT enabled\n */\n fallback?: React.ReactNode\n\n /**\n * Whether ALL modules are required (true) or ANY module (false)\n * @default false (any)\n */\n requireAll?: boolean\n}\n\n/**\n * ModuleGate - Conditionally render based on organization modules\n *\n * Only renders children if the organization has the required module(s) enabled.\n *\n * @example\n * ```tsx\n * // Single module\n * <ModuleGate module=\"training\">\n * <TrainingSection />\n * </ModuleGate>\n *\n * // With fallback\n * <ModuleGate module=\"ai\" fallback={<UpgradePrompt />}>\n * <AIChatWidget />\n * </ModuleGate>\n *\n * // Multiple modules (any)\n * <ModuleGate module={['training', 'documents']}>\n * <LearningCenter />\n * </ModuleGate>\n *\n * // Multiple modules (all required)\n * <ModuleGate module={['training', 'ai']} requireAll>\n * <AITrainingAssistant />\n * </ModuleGate>\n * ```\n */\nexport function ModuleGate({\n module,\n children,\n fallback = null,\n requireAll = false,\n}: ModuleGateProps) {\n const { hasModule, isLoading } = useOrg()\n\n // While loading org data, don't render anything\n if (isLoading) {\n return null\n }\n\n const requiredModules = Array.isArray(module) ? module : [module]\n\n const hasAccess = requireAll\n ? requiredModules.every(m => hasModule(m))\n : requiredModules.some(m => hasModule(m))\n\n if (!hasAccess) {\n return <>{fallback}</>\n }\n\n return <>{children}</>\n}\n\n/**\n * useModuleAccess - Hook for programmatic module checks\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { hasModule, modules } = useModuleAccess()\n *\n * return (\n * <nav>\n * <Link to=\"/news\">News</Link>\n * {hasModule('training') && <Link to=\"/training\">Training</Link>}\n * {hasModule('ai') && <Link to=\"/chat\">AI Chat</Link>}\n * </nav>\n * )\n * }\n * ```\n */\nexport function useModuleAccess() {\n const { hasModule, modules, isLoading } = useOrg()\n\n return {\n hasModule,\n modules,\n isLoading,\n }\n}\n","/**\n * LinkedAccountsList Component\n *\n * Ready-to-use component for displaying and managing linked social accounts.\n * Can be used in customer frontends (SPF \"mina sidor\" etc.).\n *\n * Import the CSS file for default styling:\n * import '@axcode/axcloud-sdk/styles/linked-accounts.css'\n *\n * @example\n * ```tsx\n * import { LinkedAccountsList } from '@axcode/axcloud-sdk'\n * import '@axcode/axcloud-sdk/styles/linked-accounts.css'\n *\n * function MinProfil() {\n * return (\n * <div>\n * <h2>Kopplade konton</h2>\n * <LinkedAccountsList providers={['google', 'microsoft']} />\n * </div>\n * )\n * }\n * ```\n */\n\nimport React from 'react'\nimport { useLinkedAccounts, LinkedIdentity, AvailableProvider } from '../hooks/useLinkedAccounts'\n\nexport interface LinkedAccountsListProps {\n /** Which providers to show (default: all available) */\n providers?: ('google' | 'microsoft' | 'apple')[]\n /** Show connect buttons for unlinked providers */\n showConnectButtons?: boolean\n /** Custom class name for the container */\n className?: string\n /** Callback when an account is successfully unlinked */\n onUnlink?: (provider: string) => void\n /** Callback when link flow is initiated */\n onLinkInitiated?: (provider: string) => void\n /** Custom render for identity items */\n renderIdentity?: (identity: LinkedIdentity, onUnlink: () => void) => React.ReactNode\n /** Custom render for available provider items */\n renderAvailableProvider?: (provider: AvailableProvider, onLink: () => void) => React.ReactNode\n}\n\n// Default provider icons as inline SVG\n/**\n * Supported OAuth providers for account linking\n */\nconst SUPPORTED_OAUTH_PROVIDERS = ['google', 'microsoft', 'apple'] as const\ntype SupportedOAuthProvider = typeof SUPPORTED_OAUTH_PROVIDERS[number]\n\n/**\n * Type guard to validate if a provider string is a supported OAuth provider\n */\nfunction isSupportedOAuthProvider(provider: string): provider is SupportedOAuthProvider {\n return SUPPORTED_OAUTH_PROVIDERS.includes(provider as SupportedOAuthProvider)\n}\n\nconst ProviderIcons: Record<string, React.FC<{ className?: string }>> = {\n google: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" fill=\"#4285F4\"/>\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\"/>\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\"/>\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/>\n </svg>\n ),\n microsoft: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className}>\n <path fill=\"#F25022\" d=\"M1 1h10v10H1z\"/>\n <path fill=\"#00A4EF\" d=\"M1 13h10v10H1z\"/>\n <path fill=\"#7FBA00\" d=\"M13 1h10v10H13z\"/>\n <path fill=\"#FFB900\" d=\"M13 13h10v10H13z\"/>\n </svg>\n ),\n apple: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <path d=\"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z\"/>\n </svg>\n ),\n email: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"/>\n <polyline points=\"22,6 12,13 2,6\"/>\n </svg>\n ),\n}\n\n/**\n * LinkedAccountsList - Ready-to-use component for managing linked accounts\n *\n * Uses CSS classes for styling. Import the CSS file for default styles:\n * import '@axcode/axcloud-sdk/styles/linked-accounts.css'\n */\nexport function LinkedAccountsList({\n providers,\n showConnectButtons = true,\n className,\n onUnlink,\n onLinkInitiated,\n renderIdentity,\n renderAvailableProvider,\n}: LinkedAccountsListProps) {\n const {\n identities,\n availableProviders,\n canUnlink,\n isLoading,\n error,\n linkAccount,\n unlinkAccount,\n } = useLinkedAccounts()\n\n // Filter providers if specified\n const filteredIdentities = providers\n ? identities.filter(i =>\n providers.some(p =>\n i.provider.toLowerCase().includes(p) ||\n i.provider_icon === p\n )\n )\n : identities\n\n const filteredAvailableProviders = providers\n ? availableProviders.filter(p =>\n providers.some(provider =>\n p.provider.toLowerCase().includes(provider) ||\n p.icon === provider\n )\n )\n : availableProviders\n\n const handleUnlink = (provider: string) => {\n unlinkAccount(provider)\n onUnlink?.(provider)\n }\n\n const handleLink = (provider: 'google' | 'microsoft' | 'apple') => {\n onLinkInitiated?.(provider)\n linkAccount(provider)\n }\n\n if (isLoading) {\n return (\n <div className={`axcloud-linked-accounts__loading ${className || ''}`}>\n Loading linked accounts...\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={`axcloud-linked-accounts__error ${className || ''}`}>\n Failed to load linked accounts. Please try again.\n </div>\n )\n }\n\n const getIcon = (iconName: string, muted = false) => {\n const IconComponent = ProviderIcons[iconName] || ProviderIcons.email\n const iconClass = muted\n ? 'axcloud-linked-accounts__icon axcloud-linked-accounts__icon--muted'\n : 'axcloud-linked-accounts__icon'\n return <IconComponent className={iconClass} />\n }\n\n return (\n <div className={`axcloud-linked-accounts ${className || ''}`}>\n {/* Connected Accounts */}\n {filteredIdentities.map((identity) => {\n if (renderIdentity) {\n return renderIdentity(identity, () => handleUnlink(identity.provider))\n }\n\n return (\n <div key={`${identity.provider}-${identity.user_id}`} className=\"axcloud-linked-accounts__item\">\n <div className=\"axcloud-linked-accounts__info\">\n {getIcon(identity.provider_icon)}\n <div>\n <div className=\"axcloud-linked-accounts__name-row\">\n <span className=\"axcloud-linked-accounts__provider-name\">\n {identity.provider_display_name}\n </span>\n {identity.is_primary && (\n <span className=\"axcloud-linked-accounts__badge\">Primary</span>\n )}\n </div>\n {identity.profile_data?.email && (\n <div className=\"axcloud-linked-accounts__email\">\n {identity.profile_data.email}\n </div>\n )}\n </div>\n </div>\n <div className=\"axcloud-linked-accounts__actions\">\n <span className=\"axcloud-linked-accounts__connected\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n Connected\n </span>\n {canUnlink && !identity.is_primary && (\n <button\n onClick={() => handleUnlink(identity.provider)}\n className=\"axcloud-linked-accounts__button axcloud-linked-accounts__button--disconnect\"\n >\n Disconnect\n </button>\n )}\n </div>\n </div>\n )\n })}\n\n {/* Available Providers */}\n {showConnectButtons &&\n filteredAvailableProviders.map((provider) => {\n if (renderAvailableProvider) {\n return renderAvailableProvider(provider, () => {\n if (isSupportedOAuthProvider(provider.provider)) {\n handleLink(provider.provider)\n }\n })\n }\n\n return (\n <div key={provider.provider} className=\"axcloud-linked-accounts__available\">\n <div className=\"axcloud-linked-accounts__info\">\n {getIcon(provider.icon, true)}\n <div>\n <span className=\"axcloud-linked-accounts__provider-name\">\n {provider.display_name}\n </span>\n <div className=\"axcloud-linked-accounts__email\">Not connected</div>\n </div>\n </div>\n <button\n onClick={() => {\n if (isSupportedOAuthProvider(provider.provider)) {\n handleLink(provider.provider)\n }\n }}\n className=\"axcloud-linked-accounts__button axcloud-linked-accounts__button--connect\"\n >\n Connect\n </button>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport default LinkedAccountsList\n"]}
|