@mesob/auth-react 0.2.3 → 0.2.5
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/components/auth/countdown.js +2 -3
- package/dist/components/auth/countdown.js.map +1 -1
- package/dist/components/auth/forgot-password.js +9 -11
- package/dist/components/auth/forgot-password.js.map +1 -1
- package/dist/components/auth/reset-password-form.js +11 -13
- package/dist/components/auth/reset-password-form.js.map +1 -1
- package/dist/components/auth/sign-in.js +9 -11
- package/dist/components/auth/sign-in.js.map +1 -1
- package/dist/components/auth/sign-up.js +8 -10
- package/dist/components/auth/sign-up.js.map +1 -1
- package/dist/components/auth/verification-form.js +9 -8
- package/dist/components/auth/verification-form.js.map +1 -1
- package/dist/components/auth/verify-email.js +12 -15
- package/dist/components/auth/verify-email.js.map +1 -1
- package/dist/components/auth/verify-phone.js +13 -14
- package/dist/components/auth/verify-phone.js.map +1 -1
- package/dist/components/error-boundary.js +1 -1
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/iam/permissions.js +3 -4
- package/dist/components/iam/permissions.js.map +1 -1
- package/dist/components/iam/roles.js +3 -4
- package/dist/components/iam/roles.js.map +1 -1
- package/dist/components/iam/sessions.js +3 -3
- package/dist/components/iam/sessions.js.map +1 -1
- package/dist/components/iam/tenants.js +3 -4
- package/dist/components/iam/tenants.js.map +1 -1
- package/dist/components/iam/users.js +3 -4
- package/dist/components/iam/users.js.map +1 -1
- package/dist/components/profile/account.js +1 -1
- package/dist/components/profile/account.js.map +1 -1
- package/dist/components/profile/change-email-form.js +13 -15
- package/dist/components/profile/change-email-form.js.map +1 -1
- package/dist/components/profile/change-password-form.js +6 -6
- package/dist/components/profile/change-password-form.js.map +1 -1
- package/dist/components/profile/change-phone-form.js +13 -15
- package/dist/components/profile/change-phone-form.js.map +1 -1
- package/dist/components/profile/change-profile.js +3 -3
- package/dist/components/profile/change-profile.js.map +1 -1
- package/dist/components/profile/otp-verification-modal.js +10 -9
- package/dist/components/profile/otp-verification-modal.js.map +1 -1
- package/dist/components/profile/request-change-email-form.js +1 -4
- package/dist/components/profile/request-change-email-form.js.map +1 -1
- package/dist/components/profile/request-change-phone-form.js +1 -4
- package/dist/components/profile/request-change-phone-form.js.map +1 -1
- package/dist/components/profile/security.js +22 -27
- package/dist/components/profile/security.js.map +1 -1
- package/dist/components/profile/verify-change-email-form.js +10 -9
- package/dist/components/profile/verify-change-email-form.js.map +1 -1
- package/dist/components/profile/verify-change-phone-form.js +10 -9
- package/dist/components/profile/verify-change-phone-form.js.map +1 -1
- package/dist/components/shared/data-table.js +2 -2
- package/dist/components/shared/data-table.js.map +1 -1
- package/dist/components/skeletons/auth-form-skeleton.js +1 -1
- package/dist/components/skeletons/auth-form-skeleton.js.map +1 -1
- package/dist/components/skeletons/profile-skeleton.js +1 -1
- package/dist/components/skeletons/profile-skeleton.js.map +1 -1
- package/dist/components/skeletons/table-skeleton.js +1 -1
- package/dist/components/skeletons/table-skeleton.js.map +1 -1
- package/dist/index.js +84 -107
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/auth/auth-card.tsx","../src/components/auth/forgot-password.tsx","../src/hooks/use-translator.ts","../src/lib/translations.ts","../src/provider.tsx","../src/types.ts","../src/utils/cookie.ts","../src/utils/custom-fetch.ts","../src/constants/auth.error.codes.ts","../src/utils/handle-error.ts","../src/components/auth/auth-layout.tsx","../src/components/auth/reset-password-form.tsx","../src/components/auth/sign-in.tsx","../src/utils/normalize-phone.ts","../src/components/auth/sign-up.tsx","../src/components/auth/verification-form.tsx","../src/components/auth/countdown.tsx","../src/components/auth/verify-email.tsx","../src/components/auth/verify-phone.tsx","../src/components/error-boundary.tsx","../src/components/iam/permissions.tsx","../src/components/shared/data-table.tsx","../src/components/skeletons/table-skeleton.tsx","../src/components/iam/roles.tsx","../src/components/iam/sessions.tsx","../src/components/iam/tenants.tsx","../src/components/iam/users.tsx","../src/components/profile/account.tsx","../src/components/profile/change-email-form.tsx","../src/components/profile/request-change-email-form.tsx","../src/components/profile/verify-change-email-form.tsx","../src/components/profile/otp-verification-modal.tsx","../src/components/profile/change-password-form.tsx","../src/components/profile/change-phone-form.tsx","../src/components/profile/request-change-phone-form.tsx","../src/components/profile/verify-change-phone-form.tsx","../src/components/profile/security.tsx","../src/components/skeletons/auth-form-skeleton.tsx","../src/components/skeletons/profile-skeleton.tsx","../src/hooks/use-session-cookie-name.ts"],"sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\n\ntype AuthCardProps = {\n children: ReactNode;\n};\n\nexport const AuthCard = ({ children }: AuthCardProps) => {\n return (\n <div className=\"flex min-h-screen w-full p-4 items-center justify-center\">\n <div className=\"w-full min-w-[280px] max-w-[28rem] shrink-0\">\n <div className=\"rounded-xl border border-border bg-card p-6 shadow-lg sm:p-8\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from '@mesob/ui/components/alert';\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Field,\n FieldError,\n FieldGroup,\n FieldLabel,\n} from '@mesob/ui/components/field';\nimport { Input } from '@mesob/ui/components/input';\nimport { useMesob } from '@mesob/ui/components/mesob-context';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { AuthLayout } from './auth-layout';\n\ntype ForgotPasswordFormValues = {\n account: string;\n};\n\nconst forgotPasswordSchema = (t: (key: string) => string) =>\n z.object({\n account: z.string().min(1, t('errors.accountRequired')),\n });\n\nexport const ForgotPassword = () => {\n const { hooks } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const t = useTranslator('Auth.forgotPassword');\n const Link = mesob?.linkComponent ?? config.navigation?.linkComponent;\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const forgotPasswordMutation = hooks.useMutation('post', '/password/forgot');\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n\n const form = useForm<ForgotPasswordFormValues>({\n resolver: zodResolver(forgotPasswordSchema(t)),\n defaultValues: {\n account: '',\n },\n });\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n setIsLoading(true);\n setError(null);\n\n try {\n const res = await forgotPasswordMutation.mutateAsync({\n body: {\n identifier: values.account,\n },\n });\n\n if ('verificationId' in res && res.verificationId) {\n onNavigate(`/auth/reset-password?verificationId=${res.verificationId}`);\n } else {\n onNavigate(\n `/auth/reset-password?identifier=${encodeURIComponent(values.account)}`,\n );\n }\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n });\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n return (\n <AuthLayout\n title={t('title')}\n description={t('description')}\n logoImage={logoImage}\n footer={\n Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {t('footer.backToSignIn')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {t('footer.backToSignIn')}\n </a>\n )\n }\n >\n <form id=\"forgot-password-form\" onSubmit={handleSubmit}>\n <FieldGroup>\n <Controller\n name=\"account\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"forgot-password-account\">\n {t('form.accountLabel')}\n </FieldLabel>\n <Input\n {...field}\n id=\"forgot-password-account\"\n type=\"text\"\n placeholder={t('form.accountPlaceholder')}\n aria-invalid={fieldState.invalid}\n />\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n </FieldGroup>\n <div className=\"mt-4\">\n <Button\n type=\"submit\"\n form=\"forgot-password-form\"\n className=\"w-full\"\n disabled={isLoading || forgotPasswordMutation.isPending}\n >\n {isLoading || (forgotPasswordMutation.isPending && <Spinner />)}\n {isLoading || forgotPasswordMutation.isPending\n ? t('form.submitting')\n : t('form.submit')}\n </Button>\n </div>\n </form>\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n );\n};\n","import { useMesob } from '@mesob/ui/components/mesob-context';\nimport { createTranslator } from '../lib/translations';\nimport { useConfig } from '../provider';\n\nexport function useTranslator(namespace?: string) {\n const mesob = useMesob();\n const { config } = useConfig();\n\n if (mesob?.t) {\n return (key: string, params?: Record<string, string | number>) =>\n mesob.t!(namespace ? `${namespace}.${key}` : key, params);\n }\n\n return createTranslator(config.messages || {}, namespace);\n}\n","type Messages = Record<string, unknown>;\n\nexport function createTranslator(messages: Messages, namespace?: string) {\n return (key: string, params?: Record<string, string | number>): string => {\n const fullKey = namespace ? `${namespace}.${key}` : key;\n const keys = fullKey.split('.');\n\n let value: unknown = messages;\n for (const k of keys) {\n if (value && typeof value === 'object' && value !== null) {\n value = (value as Record<string, unknown>)[k];\n } else {\n return fullKey;\n }\n }\n\n if (typeof value !== 'string') {\n return fullKey;\n }\n\n // Simple parameter replacement\n if (params) {\n return value.replace(/\\{(\\w+)\\}/g, (_, param) =>\n String(params[param] ?? `{${param}}`),\n );\n }\n\n return value;\n };\n}\n","'use client';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { deepmerge } from 'deepmerge-ts';\nimport createFetchClient from 'openapi-fetch';\nimport createClient from 'openapi-react-query';\nimport type { ReactNode } from 'react';\nimport { createContext, useContext, useMemo, useState } from 'react';\nimport type { paths } from './data/openapi';\nimport { createTranslator } from './lib/translations';\nimport {\n type AuthClientConfig,\n type AuthResponse,\n defaultAuthClientConfig,\n type Session,\n type User,\n} from './types';\nimport { getSessionCookieName } from './utils/cookie';\nimport { createCustomFetch } from './utils/custom-fetch';\n\n// biome-ignore lint/suspicious/noExplicitAny: OpenAPI hooks type\ntype OpenApiHooks = any;\n\n// --- Utility: Check if running on server ---\nfunction isServer(): boolean {\n return typeof document === 'undefined';\n}\n\n/**\n * @deprecated Cookie is httpOnly and cannot be read client-side.\n * Use `useSession().isAuthenticated` instead.\n * This function always returns false on client.\n */\nexport function hasAuthCookie(_cookieName: string): boolean {\n // Cookie is httpOnly, can't check client-side\n // Always return false - use useSession() for auth status\n return false;\n}\n\n// --- Types ---\nexport type AuthStatus = 'loading' | 'authenticated' | 'unauthenticated';\n\ntype AuthState = {\n user: User | null;\n session: Session | null;\n status: AuthStatus;\n error: Error | null;\n};\n\ntype SessionContextValue = AuthState & {\n isLoading: boolean;\n isAuthenticated: boolean;\n refresh: () => Promise<void>;\n signOut: () => Promise<void>;\n};\n\ntype ApiContextValue = {\n hooks: OpenApiHooks;\n setAuth: (auth: AuthResponse) => void;\n clearAuth: () => void;\n refresh: () => Promise<void>;\n};\n\ntype ConfigContextValue = {\n config: AuthClientConfig;\n cookieName: string;\n t: (key: string, params?: Record<string, string | number>) => string;\n};\n\nconst SessionContext = createContext<SessionContextValue | null>(null);\nconst ApiContext = createContext<ApiContextValue | null>(null);\nconst ConfigContext = createContext<ConfigContextValue | null>(null);\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n },\n },\n});\n\n// --- Hooks ---\n\n/**\n * Get session state including user, session, and auth status.\n * - `status`: 'loading' | 'authenticated' | 'unauthenticated'\n * - `isLoading`: true while fetching session\n * - `isAuthenticated`: true if user and session exist\n */\nexport function useSession(): SessionContextValue {\n const context = useContext(SessionContext);\n if (!context) {\n throw new Error('useSession must be used within MesobAuthProvider');\n }\n return context;\n}\n\nexport function useApi(): ApiContextValue {\n const context = useContext(ApiContext);\n if (!context) {\n throw new Error('useApi must be used within MesobAuthProvider');\n }\n return context;\n}\n\nexport function useConfig(): ConfigContextValue {\n const context = useContext(ConfigContext);\n if (!context) {\n throw new Error('useConfig must be used within MesobAuthProvider');\n }\n return context;\n}\n\n/**\n * @deprecated Cookie is httpOnly, can't be checked client-side.\n * Use `useSession().isAuthenticated` instead.\n */\nexport function useHasAuthCookie(): boolean {\n const { status } = useSession();\n return status === 'authenticated' || status === 'loading';\n}\n\n// --- Provider ---\n\ntype MesobAuthProviderProps = {\n config: AuthClientConfig;\n children: ReactNode;\n};\n\nexport function MesobAuthProvider({\n config,\n children,\n}: MesobAuthProviderProps) {\n const mergedConfig = useMemo(\n () =>\n deepmerge(\n { ...defaultAuthClientConfig } as Partial<AuthClientConfig>,\n config,\n ) as AuthClientConfig,\n [config],\n );\n\n const api = useMemo(\n () =>\n createFetchClient<paths>({\n baseUrl: mergedConfig.baseURL,\n fetch: createCustomFetch(mergedConfig),\n }),\n [mergedConfig],\n );\n\n const hooks = useMemo(() => createClient(api), [api]);\n const cookieName = useMemo(\n () => getSessionCookieName(mergedConfig),\n [mergedConfig],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <AuthStateProvider\n config={mergedConfig}\n hooks={hooks}\n cookieName={cookieName}\n >\n {children}\n </AuthStateProvider>\n </QueryClientProvider>\n );\n}\n\ntype AuthStateProviderProps = {\n config: AuthClientConfig;\n hooks: OpenApiHooks;\n cookieName: string;\n children: ReactNode;\n};\n\nfunction AuthStateProvider({\n config,\n hooks,\n cookieName,\n children,\n}: AuthStateProviderProps) {\n // Manual override for sign-out / sign-in\n const [override, setOverride] = useState<AuthState | null>(null);\n\n // Always fetch session - cookie is httpOnly, can't check client-side\n // Server will read the cookie and return user/session if valid\n const {\n data: sessionData,\n isLoading,\n isFetched,\n error: sessionError,\n refetch,\n } = hooks.useQuery(\n 'get',\n '/session',\n {},\n {\n enabled: !(override || isServer()),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: false,\n gcTime: 0,\n staleTime: 0,\n },\n );\n\n // Derive state directly - no useEffect\n const user = override?.user ?? sessionData?.user ?? null;\n const session = override?.session ?? sessionData?.session ?? null;\n const error = override?.error ?? (sessionError as Error | null);\n\n // Check error status code\n const errorStatus = (() => {\n if (!sessionError) {\n return null;\n }\n const err = sessionError as { status?: number };\n return err.status ?? null;\n })();\n\n // Check if error is a network/connection error\n const isNetworkError = (() => {\n if (!sessionError) {\n return false;\n }\n const error = sessionError as Error & { cause?: unknown; data?: unknown };\n const errorMessage =\n error.message || String(error) || JSON.stringify(error);\n // Network errors: TypeError, DOMException, or fetch failures\n if (\n error instanceof TypeError ||\n error instanceof DOMException ||\n error.name === 'TypeError' ||\n errorMessage.includes('Failed to fetch') ||\n errorMessage.includes('ERR_CONNECTION_REFUSED') ||\n errorMessage.includes('NetworkError') ||\n errorMessage.includes('Network request failed') ||\n errorMessage.includes('fetch failed')\n ) {\n return true;\n }\n // Check error cause\n if (error.cause) {\n const causeStr = String(error.cause);\n if (\n causeStr.includes('Failed to fetch') ||\n causeStr.includes('ERR_CONNECTION_REFUSED') ||\n causeStr.includes('NetworkError')\n ) {\n return true;\n }\n }\n return false;\n })();\n\n // Compute status\n // biome-ignore lint: Status determination requires multiple checks\n const status: AuthStatus = (() => {\n if (override) {\n return override.status;\n }\n if (isServer()) {\n return 'loading';\n }\n if (user && session) {\n return 'authenticated';\n }\n // Check for network errors or auth errors first - allow auth page to show\n if (isNetworkError || errorStatus === 401) {\n return 'unauthenticated';\n }\n // If we have an error but it's not a network error, still check loading state\n if (sessionError && !isNetworkError && errorStatus !== 401) {\n if (errorStatus && errorStatus >= 500) {\n return 'authenticated';\n }\n // Other errors mean unauthenticated\n if (isFetched) {\n return 'unauthenticated';\n }\n }\n if (isLoading || !isFetched) {\n return 'loading';\n }\n if (isFetched && !user && !session) {\n return 'unauthenticated';\n }\n return 'unauthenticated';\n })();\n\n const signOutMutation = hooks.useMutation('post', '/sign-out');\n const t = createTranslator(config.messages || {});\n\n const setAuth = (auth: AuthResponse) => {\n setOverride({\n user: auth.user,\n session: auth.session,\n status: 'authenticated',\n error: null,\n });\n };\n\n const clearAuth = () => {\n setOverride({\n user: null,\n session: null,\n status: 'unauthenticated',\n error: null,\n });\n };\n\n const refresh = async () => {\n setOverride(null);\n await refetch();\n };\n\n const signOut = async () => {\n try {\n await signOutMutation.mutateAsync({});\n } finally {\n clearAuth();\n }\n };\n\n return (\n <ConfigContext.Provider value={{ config, cookieName, t }}>\n <ApiContext.Provider value={{ hooks, setAuth, clearAuth, refresh }}>\n <SessionContext.Provider\n value={{\n user,\n session,\n status,\n error,\n isLoading: status === 'loading',\n isAuthenticated: status === 'authenticated',\n refresh,\n signOut,\n }}\n >\n {children}\n </SessionContext.Provider>\n </ApiContext.Provider>\n </ConfigContext.Provider>\n );\n}\n","export type UIConfig = {\n logo: React.ReactNode;\n name: React.ReactNode;\n logoImage?: string;\n};\n\nexport type FeaturesConfig = {\n enableSignup?: boolean;\n enablePasswordReset?: boolean;\n enableEmailSignup?: boolean;\n enablePhoneSignup?: boolean;\n enableSocialSignup?: boolean;\n socialProviders?: string[];\n};\n\nexport type TenantConfig = {\n enabled: boolean;\n tenantId: string;\n};\n\nexport type NavigationConfig = {\n locale?: string;\n defaultRedirectUrl?: string;\n onNavigate?: (path: string) => void;\n linkComponent?: React.ComponentType<\n React.ComponentProps<'a'> & { href: string }\n >;\n links?: {\n signIn?: string;\n signUp?: string;\n forgotPassword?: string;\n };\n};\n\nexport type AuthClientConfig = {\n baseURL: string;\n ui: UIConfig;\n features?: FeaturesConfig;\n tenant?: TenantConfig;\n navigation?: NavigationConfig;\n messages?: Record<string, unknown>;\n cookiePrefix?: string;\n phoneRegex?: RegExp | string;\n};\n\ntype DefaultAuthClientConfig = {\n readonly features: {\n readonly enableSignup: true;\n readonly enablePasswordReset: true;\n readonly enableEmailSignup: true;\n readonly enablePhoneSignup: true;\n readonly enableSocialSignup: false;\n readonly socialProviders: [];\n };\n readonly navigation: {\n readonly locale: 'en';\n };\n readonly cookiePrefix: 'msb';\n readonly phoneRegex: RegExp;\n};\n\nexport const defaultAuthClientConfig: DefaultAuthClientConfig = {\n features: {\n enableSignup: true,\n enablePasswordReset: true,\n enableEmailSignup: true,\n enablePhoneSignup: true,\n enableSocialSignup: false,\n socialProviders: [],\n },\n navigation: {\n locale: 'en',\n },\n cookiePrefix: 'msb',\n phoneRegex: /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/,\n} as const;\n\nexport type UserRole = {\n id: string;\n roleId: string;\n code: string;\n name: string;\n description: string;\n};\nexport type User = {\n id: string;\n tenantId: string;\n fullName: string;\n email: string | null;\n phone: string | null;\n handle: string;\n image: string | null;\n emailVerified: boolean;\n phoneVerified: boolean;\n lastSignInAt: string | null;\n userRoles?: UserRole[];\n};\n\nexport type Session = {\n id: string;\n expiresAt: string;\n createdAt?: string;\n userAgent: string | null;\n ip: string | null;\n};\n\nexport type AuthResponse = {\n user: User;\n session: Session;\n sessionToken: string;\n sessionExpiresAt: string;\n};\n\nexport type AuthErrorCode =\n | 'USER_NOT_FOUND'\n | 'INVALID_PASSWORD'\n | 'USER_EXISTS'\n | 'VERIFICATION_EXPIRED'\n | 'VERIFICATION_MISMATCH'\n | 'VERIFICATION_NOT_FOUND'\n | 'TOO_MANY_ATTEMPTS'\n | 'REQUIRES_VERIFICATION'\n | 'UNAUTHORIZED'\n | 'ACCESS_DENIED'\n | 'HAS_NO_PASSWORD';\n\nexport type AuthError = {\n message: string;\n code?: AuthErrorCode;\n status?: number;\n details?: Record<string, unknown>;\n};\n","import type { AuthClientConfig } from '../types';\n\nconst isProduction =\n typeof process !== 'undefined' && process.env.NODE_ENV === 'production';\n\nexport const getSessionCookieName = (config: AuthClientConfig): string => {\n const prefix = config.cookiePrefix || '';\n const baseName = 'session_token';\n if (prefix) {\n return `${prefix}_${baseName}`;\n }\n return isProduction ? '__Host-session_token' : baseName;\n};\n","import type { AuthClientConfig } from '../types';\n\nexport const createCustomFetch = (_config: AuthClientConfig) => {\n return (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n if (input instanceof Request) {\n return fetch(input, { ...init, credentials: 'include' });\n }\n return fetch(input, { ...init, credentials: 'include' });\n };\n};\n","export const AUTH_ERROR_MAPPING: Record<\n string,\n { title: string; description: string }\n> = {\n USER_NOT_FOUND: {\n title: 'Account Not Found',\n description:\n 'We could not find an account with that identifier. Please check your spelling or sign up.',\n },\n INVALID_PASSWORD: {\n title: 'Invalid Password',\n description: 'The password you entered is incorrect. Please try again.',\n },\n USER_EXISTS: {\n title: 'Account Already Exists',\n description:\n 'An account with this identifier already exists. Please sign in instead.',\n },\n VERIFICATION_EXPIRED: {\n title: 'Verification Expired',\n description:\n 'The verification code or link has expired. Please request a new one.',\n },\n VERIFICATION_MISMATCH: {\n title: 'Invalid Code',\n description:\n 'The verification code you entered is invalid. Please double-check and try again.',\n },\n VERIFICATION_NOT_FOUND: {\n title: 'Verification Not Found',\n description:\n 'We could not find a pending verification request. Please restart the process.',\n },\n TOO_MANY_ATTEMPTS: {\n title: 'Too Many Attempts',\n description:\n 'You have made too many requests recently. Please wait a moment before trying again.',\n },\n REQUIRES_VERIFICATION: {\n title: 'Verification Required',\n description:\n 'You need to verify your account before you can continue. Please check your email or phone.',\n },\n UNAUTHORIZED: {\n title: 'Unauthorized',\n description:\n 'You are not authorized to perform this action. Please sign in again.',\n },\n ACCESS_DENIED: {\n title: 'Access Denied',\n description:\n 'You do not have permission to access this resource. Please contact support if you believe this is an error.',\n },\n HAS_NO_PASSWORD: {\n title: 'No Password Set',\n description:\n 'Your account does not have a password set (e.g. social login). Please sign in with your provider or reset your password.',\n },\n};\n\nexport const validCodes = Object.keys(AUTH_ERROR_MAPPING);\n","import { AUTH_ERROR_MAPPING, validCodes } from '../constants/auth.error.codes';\nimport type { AuthError } from '../types';\n\nexport type AuthErrorContent = {\n title: string;\n description: string;\n};\n\n// Translator function type\ntype TranslatorFunction = (\n key: string,\n params?: Record<string, string | number>,\n) => string;\n\n// Type guard to check if error is an AuthError\nfunction isAuthError(err: unknown): err is AuthError {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'message' in err &&\n typeof (err as { message: unknown }).message === 'string'\n );\n}\n\nfunction extractErrorCode(err: AuthError): string {\n if (err.code && validCodes.includes(err.code)) {\n return err.code;\n }\n if (err.message) {\n const messageUpper = err.message.toUpperCase().trim();\n if (validCodes.includes(messageUpper)) {\n return messageUpper;\n }\n }\n return '';\n}\n\nfunction sanitizeErrorMessage(message: string): string {\n const lowerMessage = message.toLowerCase();\n const isDatabaseError =\n lowerMessage.includes('failed query') ||\n lowerMessage.includes('select') ||\n lowerMessage.includes('insert') ||\n lowerMessage.includes('update') ||\n lowerMessage.includes('delete') ||\n lowerMessage.includes('from') ||\n lowerMessage.includes('where') ||\n lowerMessage.includes('limit') ||\n lowerMessage.includes('params:') ||\n lowerMessage.includes('query') ||\n message.includes('\"iam\".') ||\n message.includes('\"tenants\"') ||\n message.includes('\"users\"') ||\n message.includes('\"sessions\"') ||\n message.includes('\"accounts\"') ||\n lowerMessage.includes('relation') ||\n lowerMessage.includes('column') ||\n lowerMessage.includes('syntax error') ||\n lowerMessage.includes('database') ||\n lowerMessage.includes('postgres') ||\n lowerMessage.includes('sql');\n\n if (isDatabaseError) {\n return 'An error occurred while processing your request';\n }\n\n return message;\n}\n\nfunction handleAuthError(\n err: AuthError,\n setError: (error: AuthErrorContent | null) => void,\n t: TranslatorFunction,\n) {\n const errorCode = extractErrorCode(err);\n\n if (errorCode && AUTH_ERROR_MAPPING[errorCode]) {\n const mapping = AUTH_ERROR_MAPPING[errorCode];\n setError({\n title: mapping.title,\n description: mapping.description,\n });\n return;\n }\n\n const sanitizedMessage = sanitizeErrorMessage(\n err.message || t('errors.fallback'),\n );\n setError({\n title: t('errors.fallback'),\n description: sanitizedMessage,\n });\n}\n\nfunction handleGenericError(\n err: unknown,\n setError: (error: AuthErrorContent | null) => void,\n t: TranslatorFunction,\n) {\n const rawMessage = err instanceof Error ? err.message : t('errors.fallback');\n const sanitizedMessage = sanitizeErrorMessage(rawMessage);\n setError({\n title: 'Error',\n description: sanitizedMessage,\n });\n}\n\nexport const handleError = (\n err: unknown,\n setError: (error: AuthErrorContent | null) => void,\n t: TranslatorFunction,\n) => {\n if (isAuthError(err)) {\n handleAuthError(err, setError, t);\n } else {\n handleGenericError(err, setError, t);\n }\n};\n","'use client';\n\nimport type { ReactNode } from 'react';\n\ntype AuthLayoutProps = {\n title: string;\n description?: string;\n children: ReactNode;\n footer?: ReactNode;\n logoImage?: string;\n};\n\nexport const AuthLayout = ({\n title,\n description,\n children,\n footer,\n logoImage,\n}: AuthLayoutProps) => {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex size-8 mb-6 w-full items-center justify-center rounded-md\">\n {/** biome-ignore lint/performance/noImgElement: logo image */}\n <img src={logoImage || ''} alt=\"Mesob\" width={42} height={42} />\n </div>\n <div className=\"text-center\">\n <h1 className=\"text-2xl font-bold tracking-tight\">{title}</h1>\n {description && (\n <p className=\"mt-2 text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n\n {children}\n\n <div className=\"mt-2 w-full\">\n {footer && (\n <div className=\"w-full text-center text-sm text-muted-foreground\">\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from '@mesob/ui/components/alert';\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Field,\n FieldError,\n FieldGroup,\n FieldLabel,\n} from '@mesob/ui/components/field';\nimport { Input } from '@mesob/ui/components/input';\nimport {\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n} from '@mesob/ui/components/input-otp';\nimport { Link } from '@mesob/ui/components/link';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { IconAlertCircle, IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { AuthLayout } from './auth-layout';\n\ntype ResetPasswordFormValues = {\n code: string;\n password: string;\n confirmPassword: string;\n};\n\ntype ResetPasswordFormProps = {\n verificationId: string;\n redirectUrl?: string;\n};\n\nconst resetPasswordSchema = (t: (key: string) => string) =>\n z\n .object({\n code: z.string().length(6, t('errors.codeLength')),\n password: z.string().min(8, t('errors.passwordLength')),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: t('errors.passwordsMismatch'),\n path: ['confirmPassword'],\n });\n\nexport const ResetPasswordForm = ({\n verificationId,\n redirectUrl,\n}: ResetPasswordFormProps) => {\n const { hooks, refresh } = useApi();\n const { config } = useConfig();\n const t = useTranslator('Auth.resetPassword');\n const common = useTranslator('Common');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n const [showPassword, setShowPassword] = useState(false);\n\n const resetPasswordMutation = hooks.useMutation('post', '/password/reset');\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const forgotPasswordLink =\n config.navigation?.links?.forgotPassword || '/auth/forgot-password';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/';\n\n const form = useForm<ResetPasswordFormValues>({\n resolver: zodResolver(resetPasswordSchema(t)),\n defaultValues: {\n code: '',\n password: '',\n confirmPassword: '',\n },\n });\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n if (!verificationId) {\n setError({\n title: t('errors.fallback'),\n description: t('errors.missingVerificationId'),\n });\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await resetPasswordMutation.mutateAsync({\n body: {\n verificationId,\n code: values.code,\n password: values.password,\n },\n });\n await refresh();\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n });\n\n if (!verificationId) {\n return (\n <AuthLayout\n title={common('invalidLinkTitle')}\n description={common('invalidLinkDescription')}\n logoImage={logoImage}\n footer={\n <Link\n href={forgotPasswordLink}\n className=\"text-primary hover:underline\"\n >\n {t('footer.requestNew')}\n </Link>\n }\n >\n <div />\n </AuthLayout>\n );\n }\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n return (\n <AuthLayout\n title={t('title')}\n description={t('description')}\n logoImage={logoImage}\n footer={\n <div className=\"flex items-center justify-between w-full gap-2\">\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {t('footer.backToSignIn')}\n </Link>\n <Link\n href={forgotPasswordLink}\n className=\"text-primary hover:underline\"\n >\n {t('footer.changeAccount')}\n </Link>\n </div>\n }\n >\n <form id=\"reset-password-form\" onSubmit={handleSubmit}>\n <FieldGroup>\n <Controller\n name=\"code\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <div className=\"flex justify-center\">\n <FieldLabel>{t('form.codeLabel')}</FieldLabel>\n </div>\n <div className=\"flex mt-2 justify-center\">\n <InputOTP\n maxLength={6}\n value={field.value}\n onChange={field.onChange}\n onBlur={field.onBlur}\n containerClassName=\"gap-4\"\n aria-invalid={fieldState.invalid}\n >\n <InputOTPGroup className=\"gap-3 *:data-[slot=input-otp-slot]:h-12 *:data-[slot=input-otp-slot]:w-12 *:data-[slot=input-otp-slot]:rounded-md *:data-[slot=input-otp-slot]:border *:data-[slot=input-otp-slot]:text-xl\">\n <InputOTPSlot className=\"h-12\" index={0} />\n <InputOTPSlot className=\"h-12\" index={1} />\n <InputOTPSlot className=\"h-12\" index={2} />\n <InputOTPSlot className=\"h-12\" index={3} />\n <InputOTPSlot className=\"h-12\" index={4} />\n <InputOTPSlot className=\"h-12\" index={5} />\n </InputOTPGroup>\n </InputOTP>\n </div>\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n <Controller\n name=\"password\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"reset-password-password\">\n {t('form.passwordLabel')}\n </FieldLabel>\n <div className=\"relative\">\n <Input\n {...field}\n id=\"reset-password-password\"\n type={showPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n aria-invalid={fieldState.invalid}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n <Controller\n name=\"confirmPassword\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"reset-password-confirmPassword\">\n {t('form.confirmPasswordLabel')}\n </FieldLabel>\n <div className=\"relative\">\n <Input\n {...field}\n id=\"reset-password-confirmPassword\"\n type={showPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n aria-invalid={fieldState.invalid}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n </FieldGroup>\n <div className=\"mt-4\">\n <Button\n type=\"submit\"\n form=\"reset-password-form\"\n className=\"w-full\"\n disabled={isLoading || resetPasswordMutation.isPending}\n >\n {isLoading || (resetPasswordMutation.isPending && <Spinner />)}\n {isLoading || resetPasswordMutation.isPending\n ? t('form.submitting')\n : t('form.submit')}\n </Button>\n </div>\n </form>\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from '@mesob/ui/components/alert';\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Field,\n FieldError,\n FieldGroup,\n FieldLabel,\n} from '@mesob/ui/components/field';\nimport { Input } from '@mesob/ui/components/input';\nimport { useMesob } from '@mesob/ui/components/mesob-context';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { IconAlertCircle, IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { normalizePhone } from '../../utils/normalize-phone';\nimport { AuthLayout } from './auth-layout';\n\nconst isPhone = (s: string) => /^\\+?[0-9()[\\]\\s-]{6,}$/.test(s);\n\ntype SignInProps = {\n redirectUrl?: string;\n};\n\nconst usernameSchema = (t: (key: string) => string, phoneRegex: RegExp) =>\n z.object({\n username: z\n .string()\n .trim()\n .min(1, { message: t('errors.requiredField') })\n .refine(\n (val) => {\n const isEmail = z.email().safeParse(val).success;\n const isPhone = phoneRegex.test(val);\n return isEmail || isPhone;\n },\n {\n message: t('errors.invalidEmailOrPhone'),\n },\n ),\n });\n\nconst passwordSchema = (t: (key: string) => string) =>\n z.object({\n password: z\n .string()\n .min(8, t('errors.passwordLength'))\n .max(128, t('errors.longPasswordError')),\n });\n\nexport const SignIn = ({ redirectUrl }: SignInProps = {}) => {\n const { hooks, setAuth } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const t = useTranslator('Auth.signIn');\n const Link = mesob?.linkComponent ?? config.navigation?.linkComponent;\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n const [showPasswordField, setShowPasswordField] = useState(false);\n const [showPassword, setShowPassword] = useState(false);\n const [username, setUsername] = useState('');\n const [isChecking, setIsChecking] = useState(false);\n\n const checkUserMutation = hooks.useMutation('post', '/check-account');\n const signInMutation = hooks.useMutation('post', '/sign-in');\n\n const phoneRegex =\n typeof config.phoneRegex === 'string'\n ? new RegExp(config.phoneRegex)\n : config.phoneRegex || /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/;\n\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/dashboard';\n const forgotPasswordLink =\n config.navigation?.links?.forgotPassword || '/auth/forgot-password';\n const signUpLink = config.navigation?.links?.signUp || '/auth/sign-up';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n\n const usernameForm = useForm<{ username: string }>({\n resolver: zodResolver(usernameSchema(t, phoneRegex)),\n defaultValues: { username: '' },\n mode: 'onChange',\n });\n\n const passwordForm = useForm<{ password: string }>({\n resolver: zodResolver(passwordSchema(t)),\n defaultValues: { password: '' },\n mode: 'onChange',\n });\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleCheckAccount = async (usernameValue: string) => {\n setIsChecking(true);\n try {\n const normalizedUsername = phoneRegex.test(usernameValue)\n ? normalizePhone(usernameValue)\n : usernameValue;\n\n const result = await checkUserMutation.mutateAsync({\n body: {\n username: normalizedUsername,\n },\n });\n\n if (result.exists) {\n setUsername(normalizedUsername);\n setShowPasswordField(true);\n } else {\n const email = isPhone(normalizedUsername) ? '' : normalizedUsername;\n if (email) {\n onNavigate(`${signUpLink}?email=${encodeURIComponent(email)}`);\n } else {\n onNavigate(\n `${signUpLink}?phone=${encodeURIComponent(normalizedUsername)}`,\n );\n }\n }\n } catch {\n usernameForm.setError('username', {\n message: t('errors.checkAccountFailed'),\n });\n } finally {\n setIsChecking(false);\n }\n };\n\n const handleUsernameSubmit = async (values: { username: string }) => {\n await handleCheckAccount(values.username);\n };\n\n const handlePasswordSubmit = async (values: { password: string }) => {\n setIsLoading(true);\n setError(null);\n\n try {\n const res = await signInMutation.mutateAsync({\n body: {\n identifier: username,\n password: values.password,\n },\n });\n\n if ('verificationId' in res && res.verificationId) {\n const verifyPath = isPhone(username)\n ? `/auth/verify-phone?context=sign-in&verificationId=${res.verificationId}&identifier=${encodeURIComponent(username)}`\n : `/auth/verify-email?verificationId=${res.verificationId}`;\n onNavigate(verifyPath);\n return;\n }\n\n if ('user' in res && 'session' in res) {\n setAuth(res);\n }\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleBack = () => {\n setShowPasswordField(false);\n setUsername('');\n passwordForm.reset();\n };\n\n const isSubmitting =\n isLoading ||\n checkUserMutation.isPending ||\n signInMutation.isPending ||\n isChecking;\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n const formContent = showPasswordField ? (\n <form\n id=\"sign-in-form\"\n onSubmit={passwordForm.handleSubmit(handlePasswordSubmit)}\n >\n <FieldGroup>\n <div className=\"text-center mb-4\">\n <p className=\"text-sm text-muted-foreground mb-1\">\n {t('form.enterPasswordFor')}\n </p>\n <p className=\"font-medium text-foreground\">{username}</p>\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"text-sm text-primary hover:underline mt-2\"\n >\n {t('changeAccount')}\n </button>\n </div>\n <Controller\n name=\"password\"\n control={passwordForm.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"sign-in-password\">\n {t('form.passwordLabel')}\n </FieldLabel>\n <div className=\"relative\">\n <Input\n {...field}\n id=\"sign-in-password\"\n type={showPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n autoComplete=\"current-password\"\n aria-invalid={fieldState.invalid}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {fieldState.invalid && <FieldError errors={[fieldState.error]} />}\n </Field>\n )}\n />\n </FieldGroup>\n <div className=\"mt-4\">\n <Button type=\"submit\" className=\"w-full\" disabled={isSubmitting}>\n {isSubmitting && <Spinner />}\n {isSubmitting ? t('form.submitting') : t('form.submit')}\n </Button>\n </div>\n </form>\n ) : (\n <form\n id=\"sign-in-form\"\n onSubmit={usernameForm.handleSubmit(handleUsernameSubmit)}\n >\n <FieldGroup>\n <Controller\n name=\"username\"\n control={usernameForm.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"sign-in-username\">\n {t('form.accountLabel')}\n </FieldLabel>\n <Input\n {...field}\n id=\"sign-in-username\"\n type=\"text\"\n placeholder={t('form.accountPlaceholder')}\n autoComplete=\"username\"\n aria-invalid={fieldState.invalid}\n />\n {fieldState.invalid && <FieldError errors={[fieldState.error]} />}\n </Field>\n )}\n />\n </FieldGroup>\n <div className=\"mt-4\">\n <Button type=\"submit\" className=\"w-full\" disabled={isSubmitting}>\n {isSubmitting && <Spinner />}\n {isSubmitting ? t('form.submitting') : t('form.continue')}\n </Button>\n </div>\n </form>\n );\n\n return (\n <div className=\"space-y-4\">\n <AuthLayout\n title={t('title')}\n description={t('description')}\n logoImage={logoImage}\n footer={\n showPasswordField ? (\n <div className=\"flex items-center justify-center w-full\">\n {Link ? (\n <Link\n href={forgotPasswordLink}\n className=\"text-primary inline-block hover:underline\"\n >\n {t('footer.forgotPassword')}\n </Link>\n ) : (\n <a\n href={forgotPasswordLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(forgotPasswordLink);\n }}\n className=\"text-primary inline-block hover:underline\"\n >\n {t('footer.forgotPassword')}\n </a>\n )}\n </div>\n ) : undefined\n }\n >\n {formContent}\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n </div>\n );\n};\n","export function normalizePhone(phone: string): string {\n const cleaned = phone.trim().replace(/\\s/g, '');\n if (cleaned.startsWith('+2519') || cleaned.startsWith('+2517')) {\n return cleaned;\n }\n if (cleaned.startsWith('2519') || cleaned.startsWith('2517')) {\n return `+${cleaned}`;\n }\n if (cleaned.startsWith('09') || cleaned.startsWith('07')) {\n return `+251${cleaned.slice(1)}`;\n }\n if (\n (cleaned.startsWith('9') || cleaned.startsWith('7')) &&\n cleaned.length === 9\n ) {\n return `+251${cleaned}`;\n }\n return cleaned;\n}\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from '@mesob/ui/components/alert';\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Field,\n FieldError,\n FieldGroup,\n FieldLabel,\n} from '@mesob/ui/components/field';\nimport { Input } from '@mesob/ui/components/input';\nimport { useMesob } from '@mesob/ui/components/mesob-context';\nimport { IconAlertCircle, IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { AuthLayout } from './auth-layout';\n\nconst isPhone = (s: string) => /^\\+?[0-9()[\\]\\s-]{6,}$/.test(s);\n\ntype SignUpFormValues = {\n fullName: string;\n identifier: string;\n handle?: string;\n password: string;\n confirmPassword: string;\n};\n\ntype SignUpProps = {\n redirectUrl?: string;\n initialIdentifier?: string;\n};\n\nconst signUpSchema = (t: (key: string) => string) =>\n z\n .object({\n fullName: z.string().min(1, t('errors.fullNameRequired')),\n identifier: z\n .string()\n .min(1, t('errors.contactRequired'))\n .refine(\n (val) => {\n if (!val) {\n return false;\n }\n return val.includes('@') || isPhone(val);\n },\n {\n message: t('errors.invalidEmailOrPhone'),\n },\n ),\n password: z\n .string()\n .min(8, t('errors.passwordLength'))\n .max(128, t('errors.longPasswordError')),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: t('errors.passwordsMismatch'),\n path: ['confirmPassword'],\n });\n\nexport const SignUp = ({\n redirectUrl,\n initialIdentifier,\n}: SignUpProps = {}) => {\n const { hooks, setAuth } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const t = useTranslator('Auth.signUp');\n const Link = mesob?.linkComponent ?? config.navigation?.linkComponent;\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n\n const signUpMutation = hooks.useMutation('post', '/sign-up');\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/';\n\n const hasInitialIdentifier = !!initialIdentifier;\n\n const form = useForm<SignUpFormValues>({\n resolver: zodResolver(signUpSchema(t)),\n defaultValues: {\n fullName: '',\n identifier: initialIdentifier || '',\n password: '',\n confirmPassword: '',\n },\n });\n\n useEffect(() => {\n if (initialIdentifier) {\n form.setValue('identifier', initialIdentifier);\n }\n }, [initialIdentifier, form]);\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n setIsLoading(true);\n setError(null);\n\n try {\n const identifier = values.identifier;\n const usingPhone = isPhone(identifier);\n\n const res = await signUpMutation.mutateAsync({\n body: usingPhone\n ? {\n phone: identifier,\n password: values.password,\n fullName: values.fullName,\n handle: values.handle,\n }\n : {\n email: identifier,\n password: values.password,\n fullName: values.fullName,\n handle: values.handle,\n },\n });\n\n if ('verificationId' in res && res.verificationId) {\n if (usingPhone) {\n onNavigate(\n `/auth/verify-phone?context=sign-up&verificationId=${res.verificationId}&phone=${encodeURIComponent(identifier)}`,\n );\n } else {\n onNavigate(\n `/auth/verify-email?verificationId=${res.verificationId}&email=${encodeURIComponent(identifier)}`,\n );\n }\n return;\n }\n\n if ('user' in res && 'session' in res) {\n setAuth(res);\n }\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n });\n\n const getIdentifierLabel = () => {\n if (!hasInitialIdentifier) {\n return t('form.accountLabel') || 'Email/Phone';\n }\n if (initialIdentifier?.includes('@')) {\n return t('form.emailLabel');\n }\n return t('form.phoneLabel');\n };\n const identifierLabel = getIdentifierLabel();\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n return (\n <AuthLayout\n title={t('title')}\n description={t('description')}\n logoImage={logoImage}\n footer={\n <p>\n {t('footer.hasAccount')}{' '}\n {Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {t('footer.signInCta')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {t('footer.signInCta')}\n </a>\n )}\n </p>\n }\n >\n <form id=\"sign-up-form\" onSubmit={handleSubmit}>\n <FieldGroup>\n <Controller\n name=\"fullName\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"sign-up-fullName\">\n {t('form.fullNameLabel')}\n </FieldLabel>\n <Input\n {...field}\n id=\"sign-up-fullName\"\n placeholder={t('form.fullNamePlaceholder')}\n aria-invalid={fieldState.invalid}\n />\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n <Controller\n name=\"identifier\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel\n htmlFor=\"sign-up-identifier\"\n className={hasInitialIdentifier ? 'block' : undefined}\n >\n {identifierLabel}\n </FieldLabel>\n <Input\n {...field}\n id=\"sign-up-identifier\"\n type={field.value.includes('@') ? 'email' : 'tel'}\n placeholder={\n hasInitialIdentifier\n ? undefined\n : t('form.accountPlaceholder') || 'Email or phone number'\n }\n disabled={hasInitialIdentifier}\n aria-invalid={fieldState.invalid}\n />\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n <Controller\n name=\"password\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"sign-up-password\">\n {t('form.passwordLabel')}\n </FieldLabel>\n <div className=\"relative\">\n <Input\n {...field}\n id=\"sign-up-password\"\n type={showPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n aria-invalid={fieldState.invalid}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n <Controller\n name=\"confirmPassword\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"sign-up-confirmPassword\">\n {t('form.confirmPasswordLabel')}\n </FieldLabel>\n <div className=\"relative\">\n <Input\n {...field}\n id=\"sign-up-confirmPassword\"\n type={showConfirmPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n aria-invalid={fieldState.invalid}\n />\n <button\n type=\"button\"\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showConfirmPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n </FieldGroup>\n <div className=\"mt-4\">\n <Button\n type=\"submit\"\n form=\"sign-up-form\"\n className=\"w-full\"\n disabled={isLoading || signUpMutation.isPending}\n >\n {isLoading || signUpMutation.isPending\n ? t('form.submitting')\n : t('form.submit')}\n </Button>\n </div>\n </form>\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Button } from '@mesob/ui/components/button';\nimport { Field, FieldError, FieldGroup } from '@mesob/ui/components/field';\nimport {\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n} from '@mesob/ui/components/input-otp';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { Controller, useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { Countdown } from './countdown';\n\ntype VerificationFormValues = {\n code: string;\n};\n\ntype VerificationFormProps = {\n verificationId: string;\n onSubmit: (values: VerificationFormValues) => Promise<void> | void;\n onResend: () => Promise<void> | void;\n isLoading?: boolean;\n error?: AuthErrorContent | string | null;\n};\n\nconst verificationSchema = (t: (key: string) => string) =>\n z.object({\n code: z.string().length(6, t('form.codeLength')),\n });\n\nexport const VerificationForm = ({\n onSubmit,\n onResend,\n isLoading = false,\n}: VerificationFormProps) => {\n const t = useTranslator('Auth.verification');\n const form = useForm<VerificationFormValues>({\n resolver: zodResolver(verificationSchema(t)),\n defaultValues: {\n code: '',\n },\n });\n\n const handleSubmit = form.handleSubmit(async (values) => {\n await onSubmit(values);\n });\n\n return (\n <form id=\"verification-form\" onSubmit={handleSubmit}>\n <FieldGroup>\n <Controller\n name=\"code\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <div className=\"flex justify-center\">\n <InputOTP\n maxLength={6}\n id=\"otp\"\n required\n value={field.value ?? ''}\n onChange={field.onChange}\n onBlur={field.onBlur}\n containerClassName=\"gap-4 justify-center mb-2 flex items-center\"\n aria-invalid={fieldState.invalid}\n >\n <InputOTPGroup className=\"gap-3 *:data-[slot=input-otp-slot]:h-12 *:data-[slot=input-otp-slot]:w-12 *:data-[slot=input-otp-slot]:rounded-md *:data-[slot=input-otp-slot]:border *:data-[slot=input-otp-slot]:text-xl\">\n <InputOTPSlot className=\"h-12\" index={0} />\n <InputOTPSlot className=\"h-12\" index={1} />\n <InputOTPSlot className=\"h-12\" index={2} />\n <InputOTPSlot className=\"h-12\" index={3} />\n <InputOTPSlot className=\"h-12\" index={4} />\n <InputOTPSlot className=\"h-12\" index={5} />\n </InputOTPGroup>\n </InputOTP>\n </div>\n {fieldState.invalid && <FieldError errors={[fieldState.error]} />}\n </Field>\n )}\n />\n </FieldGroup>\n <div className=\"flex justify-between items-center mt-4\">\n <Countdown onResend={onResend} resending={isLoading} />\n <Button\n type=\"submit\"\n form=\"verification-form\"\n disabled={isLoading || form.watch('code').length !== 6}\n >\n {isLoading && <Spinner />}\n {t('form.confirm')}\n </Button>\n </div>\n </form>\n );\n};\n","'use client';\n\nimport { Button } from '@mesob/ui/components/button';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { useEffect, useState } from 'react';\nimport { useTranslator } from '../../hooks/use-translator';\n\ntype CountdownProps = {\n initialSeconds?: number;\n onResend: () => Promise<void> | void;\n resending?: boolean;\n};\n\nexport const Countdown = ({\n initialSeconds = 60,\n onResend,\n resending = false,\n}: CountdownProps) => {\n const t = useTranslator('Common');\n const [seconds, setSeconds] = useState(initialSeconds);\n const [isResending, setIsResending] = useState(false);\n\n useEffect(() => {\n if (seconds <= 0) {\n return;\n }\n\n const timer = setInterval(() => {\n setSeconds((prev) => {\n if (prev <= 1) {\n clearInterval(timer);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [seconds]);\n\n const handleResend = async () => {\n setIsResending(true);\n try {\n await onResend();\n setSeconds(initialSeconds);\n } catch (_error) {\n // Error handling is done by parent\n } finally {\n setIsResending(false);\n }\n };\n\n if (seconds > 0) {\n return (\n <Button variant=\"ghost\" disabled>\n {t('resendIn', { seconds })}\n </Button>\n );\n }\n\n return (\n <Button\n variant=\"ghost\"\n onClick={handleResend}\n disabled={isResending || resending}\n >\n {isResending || (resending && <Spinner />)}\n {t('resend')}\n </Button>\n );\n};\n","'use client';\n\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from '@mesob/ui/components/alert';\nimport { useMesob } from '@mesob/ui/components/mesob-context';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { toast } from 'sonner';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { AuthLayout } from './auth-layout';\nimport { VerificationForm } from './verification-form';\n\ntype VerifyEmailProps = {\n verificationId: string;\n email: string;\n redirectUrl?: string;\n};\n\nexport const VerifyEmail = ({\n verificationId,\n email,\n redirectUrl,\n}: VerifyEmailProps) => {\n const { hooks, setAuth } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const t = useTranslator('Auth.verification');\n const common = useTranslator('Common');\n const footer = useTranslator('Auth.forgotPassword.footer');\n const Link = mesob?.linkComponent ?? config.navigation?.linkComponent;\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const verifyEmailMutation = hooks.useMutation(\n 'post',\n '/email/verification/confirm',\n );\n const requestEmailMutation = hooks.useMutation(\n 'post',\n '/email/verification/request',\n );\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/';\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = async (values: { code: string }) => {\n if (!verificationId) {\n setError({\n title: t('errors.fallback'),\n description: t('errors.missingVerificationId'),\n });\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const res = await verifyEmailMutation.mutateAsync({\n body: {\n verificationId,\n code: values.code,\n },\n });\n if ('user' in res && 'session' in res) {\n setAuth(res);\n }\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleResend = async () => {\n setError(null);\n try {\n const res = await requestEmailMutation.mutateAsync({\n body: {\n email,\n },\n });\n if (res.verificationId) {\n onNavigate(\n `/auth/verify-email?verificationId=${res.verificationId}&email=${encodeURIComponent(email)}`,\n );\n } else {\n setError({\n title: t('errors.fallback'),\n description: t('errors.resendFailed'),\n });\n }\n } catch (err) {\n handleError(err, setError, t);\n }\n };\n\n if (!verificationId) {\n return (\n <AuthLayout\n title={common('invalidLinkTitle')}\n description={common('invalidLinkDescription')}\n footer={\n Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {footer('backToSignIn')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {footer('backToSignIn')}\n </a>\n )\n }\n >\n <div />\n </AuthLayout>\n );\n }\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n return (\n <AuthLayout\n title={t('email.title')}\n description={t('email.description')}\n logoImage={logoImage}\n footer={\n Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {footer('backToSignIn')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {footer('backToSignIn')}\n </a>\n )\n }\n >\n <VerificationForm\n verificationId={verificationId}\n onSubmit={handleSubmit}\n onResend={handleResend}\n isLoading={\n isLoading ||\n verifyEmailMutation.isPending ||\n requestEmailMutation.isPending\n }\n error={error}\n />\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n );\n};\n","'use client';\n\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from '@mesob/ui/components/alert';\nimport { Link } from '@mesob/ui/components/link';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { toast } from 'sonner';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthResponse } from '../../types';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { AuthLayout } from './auth-layout';\nimport { VerificationForm } from './verification-form';\n\ntype VerifyPhoneProps = {\n verificationId: string;\n context: 'sign-in' | 'sign-up';\n phone?: string;\n redirectUrl?: string;\n};\n\nexport const VerifyPhone = ({\n verificationId,\n context,\n phone = '',\n redirectUrl,\n}: VerifyPhoneProps) => {\n const { hooks, refresh, setAuth } = useApi();\n const { config } = useConfig();\n const t = useTranslator('Auth.verification');\n const common = useTranslator('Common');\n const footer = useTranslator('Auth.forgotPassword.footer');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const verifyPhoneMutation = hooks.useMutation(\n 'post',\n '/phone/verification/confirm',\n );\n const requestPhoneMutation = hooks.useMutation(\n 'post',\n '/phone/verification/request',\n );\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/';\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = async (values: { code: string }) => {\n if (!verificationId) {\n setError({\n title: t('errors.fallback'),\n description: t('errors.fallback'),\n });\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const res = await verifyPhoneMutation.mutateAsync({\n body: {\n verificationId,\n code: values.code,\n context,\n },\n });\n if (res && 'user' in res && 'session' in res && res.session) {\n setAuth(res as AuthResponse);\n onNavigate(defaultRedirect);\n return;\n }\n await refresh();\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleResend = async () => {\n setError(null);\n try {\n const targetPhone = context === 'sign-up' ? phone : null;\n if (!targetPhone) {\n setError({\n title: t('errors.fallback'),\n description: t('phone.missingPhone'),\n });\n return;\n }\n const res = await requestPhoneMutation.mutateAsync({\n body: {\n phone: targetPhone,\n context,\n },\n });\n if (res && 'verificationId' in res && res.verificationId) {\n onNavigate(\n `/auth/verify-phone?context=${context}&verificationId=${res.verificationId}&phone=${targetPhone}`,\n );\n return;\n }\n setError({\n title: t('errors.fallback'),\n description: t('phone.resendFailed'),\n });\n } catch (err) {\n handleError(err, setError, t);\n }\n };\n\n if (!verificationId) {\n return (\n <AuthLayout\n title={common('invalidLinkTitle')}\n description={common('invalidLinkDescription')}\n footer={\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {footer('backToSignIn')}\n </Link>\n }\n >\n <div />\n </AuthLayout>\n );\n }\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n return (\n <AuthLayout\n title={t('phone.title')}\n description={t('phone.description', {\n target: phone || t('phone.missingPhone'),\n })}\n logoImage={logoImage}\n footer={\n Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {footer('backToSignIn')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {footer('backToSignIn')}\n </a>\n )\n }\n >\n <VerificationForm\n verificationId={verificationId}\n onSubmit={handleSubmit}\n onResend={handleResend}\n isLoading={\n isLoading ||\n verifyPhoneMutation.isPending ||\n requestPhoneMutation.isPending\n }\n error={error}\n />\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n );\n};\n","'use client';\n\nimport { Button } from '@mesob/ui/components/button';\nimport { Component, type ErrorInfo, type ReactNode } from 'react';\n\ntype ErrorBoundaryProps = {\n children: ReactNode;\n fallback?: (props: { error: Error; reset: () => void }) => ReactNode;\n};\n\ntype ErrorBoundaryState = {\n hasError: boolean;\n error: Error | null;\n};\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(_error: Error, _errorInfo: ErrorInfo) {\n // Error logged via getDerivedStateFromError\n }\n\n reset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render() {\n if (this.state.hasError && this.state.error) {\n if (this.props.fallback) {\n return this.props.fallback({\n error: this.state.error,\n reset: this.reset,\n });\n }\n return <ErrorFallback error={this.state.error} reset={this.reset} />;\n }\n\n return this.props.children;\n }\n}\n\nfunction ErrorFallback({ error, reset }: { error: Error; reset: () => void }) {\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[400px] p-6\">\n <div className=\"max-w-md w-full space-y-4 text-center\">\n <div className=\"space-y-2\">\n <h2 className=\"text-2xl font-bold text-destructive\">\n Something went wrong\n </h2>\n <p className=\"text-muted-foreground\">\n {error.message || 'An unexpected error occurred'}\n </p>\n </div>\n <Button onClick={reset} variant=\"outline\">\n Try again\n </Button>\n </div>\n </div>\n );\n}\n\nexport function AuthErrorBoundary({ children }: { children: ReactNode }) {\n return <ErrorBoundary>{children}</ErrorBoundary>;\n}\n","'use client';\n\nimport { Badge } from '@mesob/ui/components/badge';\nimport { Button } from '@mesob/ui/components/button';\nimport { useLocale } from 'next-intl';\nimport { useState } from 'react';\nimport { useApi } from '../../provider';\nimport { DataTable, type DataTableColumn } from '../shared/data-table';\n\n// Permission type from OpenAPI schema\ntype Permission = {\n id: string;\n code: string;\n name: string | { am?: string; en?: string };\n description: string | { am?: string; en?: string };\n resource: string;\n action: string;\n createdAt: string;\n};\n\nfunction getTranslation(\n value: string | { am?: string; en?: string } | null | undefined,\n locale: string,\n): string {\n if (!value) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'object') {\n return value[locale as 'am' | 'en'] ?? value.en ?? value.am ?? '';\n }\n return '';\n}\n\nexport function Permissions() {\n const { hooks } = useApi();\n const locale = useLocale();\n const [page, setPage] = useState(1);\n const limit = 20;\n\n // Use openapi-react-query hooks\n const { data, isLoading, error } = hooks.useQuery('get', '/permissions', {\n params: {\n query: {\n page: String(page),\n limit: String(limit),\n },\n },\n });\n\n const columns: DataTableColumn<Permission>[] = [\n {\n key: 'name',\n header: 'Permission',\n cell: (permission) => (\n <div>\n <p className=\"font-medium\">\n {getTranslation(permission.name, locale)}\n </p>\n <Badge variant=\"outline\" className=\"mt-1 font-mono text-xs\">\n {permission.code}\n </Badge>\n </div>\n ),\n },\n {\n key: 'resource',\n header: 'Resource',\n cell: (permission) => (\n <Badge variant=\"secondary\">{permission.resource}</Badge>\n ),\n },\n {\n key: 'action',\n header: 'Action',\n cell: (permission) => (\n <Badge variant=\"outline\">{permission.action}</Badge>\n ),\n },\n {\n key: 'description',\n header: 'Description',\n cell: (permission) => (\n <p className=\"text-sm text-muted-foreground max-w-xs truncate\">\n {getTranslation(permission.description, locale)}\n </p>\n ),\n },\n {\n key: 'actions',\n header: 'Actions',\n cell: (_permission) => (\n <Button variant=\"outline\" size=\"sm\">\n Edit\n </Button>\n ),\n },\n ];\n\n if (error) {\n return (\n <div className=\"p-6 text-center\">\n <p className=\"text-destructive\">Error loading permissions</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-6 space-y-4\">\n <div className=\"flex justify-between items-center\">\n <div>\n <h1 className=\"text-3xl font-bold\">Permissions</h1>\n <p className=\"text-muted-foreground\">Manage system permissions</p>\n </div>\n <Button>Create Permission</Button>\n </div>\n\n <DataTable\n data={(data as { permissions: Permission[] })?.permissions || []}\n columns={columns}\n isLoading={isLoading}\n emptyMessage=\"No permissions found\"\n />\n\n {data &&\n 'permissions' in data &&\n data.permissions &&\n (data.permissions as Permission[]).length >= limit && (\n <div className=\"flex justify-between items-center\">\n <Button\n variant=\"outline\"\n disabled={page === 1}\n onClick={() => setPage(page - 1)}\n >\n Previous\n </Button>\n <span className=\"text-sm text-muted-foreground\">Page {page}</span>\n <Button variant=\"outline\" onClick={() => setPage(page + 1)}>\n Next\n </Button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@mesob/ui/components/table';\nimport type { ReactNode } from 'react';\nimport { TableSkeleton } from '../skeletons/table-skeleton';\n\nexport type DataTableColumn<T> = {\n key: string;\n header: string;\n cell: (row: T) => ReactNode;\n sortable?: boolean;\n};\n\ntype DataTableProps<T> = {\n data: T[];\n columns: DataTableColumn<T>[];\n isLoading?: boolean;\n onRowClick?: (row: T) => void;\n emptyMessage?: string;\n actions?: ReactNode;\n};\n\nexport function DataTable<T extends { id: string }>({\n data,\n columns,\n isLoading,\n onRowClick,\n emptyMessage = 'No data available',\n actions,\n}: DataTableProps<T>) {\n if (isLoading) {\n return <TableSkeleton columns={columns.length} rows={5} />;\n }\n\n if (data.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[400px] p-6\">\n <p className=\"text-muted-foreground\">{emptyMessage}</p>\n {actions && <div className=\"mt-4\">{actions}</div>}\n </div>\n );\n }\n\n return (\n <div className=\"w-full space-y-4\">\n {actions && <div className=\"flex justify-end\">{actions}</div>}\n\n <div className=\"border rounded-lg overflow-hidden\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead key={column.key}>{column.header}</TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.map((row) => (\n <TableRow\n key={row.id}\n onClick={() => onRowClick?.(row)}\n className={onRowClick ? 'cursor-pointer hover:bg-muted/50' : ''}\n >\n {columns.map((column) => (\n <TableCell key={`${row.id}-${column.key}`}>\n {column.cell(row)}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Skeleton } from '@mesob/ui/components/skeleton';\n\ntype TableSkeletonProps = {\n columns?: number;\n rows?: number;\n};\n\nexport function TableSkeleton({ columns = 5, rows = 10 }: TableSkeletonProps) {\n const headerKeys = Array.from({ length: columns }, (_, i) => `header-${i}`);\n const rowKeys = Array.from({ length: rows }, (_, i) => `row-${i}`);\n const cellKeys = Array.from({ length: rows }, (_, rowIdx) =>\n Array.from({ length: columns }, (_, colIdx) => `cell-${rowIdx}-${colIdx}`),\n );\n\n return (\n <div className=\"w-full space-y-4\">\n {/* Header */}\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-8 w-48\" />\n <Skeleton className=\"h-10 w-32\" />\n </div>\n\n {/* Search/filters */}\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-10 flex-1 max-w-sm\" />\n <Skeleton className=\"h-10 w-24\" />\n <Skeleton className=\"h-10 w-24\" />\n </div>\n\n {/* Table */}\n <div className=\"border rounded-lg overflow-hidden\">\n {/* Table header */}\n <div className=\"flex gap-4 p-4 bg-muted\">\n {headerKeys.map((key) => (\n <Skeleton key={key} className=\"h-4 flex-1\" />\n ))}\n </div>\n\n {/* Table rows */}\n {rowKeys.map((rowKey, rowIdx) => (\n <div key={rowKey} className=\"flex gap-4 p-4 border-t\">\n {cellKeys[rowIdx]?.map((cellKey) => (\n <Skeleton key={cellKey} className=\"h-4 flex-1\" />\n ))}\n </div>\n ))}\n </div>\n\n {/* Pagination */}\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-4 w-32\" />\n <div className=\"flex gap-2\">\n <Skeleton className=\"h-10 w-20\" />\n <Skeleton className=\"h-10 w-20\" />\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Badge } from '@mesob/ui/components/badge';\nimport { Button } from '@mesob/ui/components/button';\nimport { useLocale } from 'next-intl';\nimport { useState } from 'react';\nimport { useApi } from '../../provider';\nimport { DataTable, type DataTableColumn } from '../shared/data-table';\n\n// Role type from OpenAPI schema\ntype Role = {\n id: string;\n code: string;\n name: string | { am?: string; en?: string };\n description: string | { am?: string; en?: string };\n createdAt: string;\n};\n\nfunction getTranslation(\n value: string | { am?: string; en?: string } | null | undefined,\n locale: string,\n): string {\n if (!value) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'object') {\n return value[locale as 'am' | 'en'] ?? value.en ?? value.am ?? '';\n }\n return '';\n}\n\nexport function Roles() {\n const { hooks } = useApi();\n const locale = useLocale();\n const [page, setPage] = useState(1);\n const limit = 20;\n\n // Use openapi-react-query hooks\n const { data, isLoading, error } = hooks.useQuery('get', '/roles', {\n params: {\n query: {\n page: String(page),\n limit: String(limit),\n },\n },\n });\n\n const columns: DataTableColumn<Role>[] = [\n {\n key: 'name',\n header: 'Role',\n cell: (role) => (\n <div>\n <p className=\"font-medium\">{getTranslation(role.name, locale)}</p>\n <Badge variant=\"outline\" className=\"mt-1\">\n {role.code}\n </Badge>\n </div>\n ),\n },\n {\n key: 'description',\n header: 'Description',\n cell: (role) => (\n <p className=\"text-sm text-muted-foreground\">\n {getTranslation(role.description, locale)}\n </p>\n ),\n },\n {\n key: 'createdAt',\n header: 'Created',\n cell: (role) => (\n <p className=\"text-sm\">\n {new Date(role.createdAt).toLocaleDateString()}\n </p>\n ),\n },\n {\n key: 'actions',\n header: 'Actions',\n cell: (_role) => (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n Permissions\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n Edit\n </Button>\n </div>\n ),\n },\n ];\n\n if (error) {\n return (\n <div className=\"p-6 text-center\">\n <p className=\"text-destructive\">Error loading roles</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-6 space-y-4\">\n <div className=\"flex justify-between items-center\">\n <div>\n <h1 className=\"text-3xl font-bold\">Roles</h1>\n <p className=\"text-muted-foreground\">Manage user roles</p>\n </div>\n <Button>Create Role</Button>\n </div>\n\n <DataTable\n data={(data as { roles: Role[] })?.roles || []}\n columns={columns}\n isLoading={isLoading}\n emptyMessage=\"No roles found\"\n />\n\n {data &&\n 'roles' in data &&\n data.roles &&\n (data.roles as Role[]).length >= limit && (\n <div className=\"flex justify-between items-center\">\n <Button\n variant=\"outline\"\n disabled={page === 1}\n onClick={() => setPage(page - 1)}\n >\n Previous\n </Button>\n <span className=\"text-sm text-muted-foreground\">Page {page}</span>\n <Button variant=\"outline\" onClick={() => setPage(page + 1)}>\n Next\n </Button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { Button } from '@mesob/ui/components/button';\nimport { useState } from 'react';\nimport { useApi } from '../../provider';\nimport { DataTable, type DataTableColumn } from '../shared/data-table';\n\n// Session type from OpenAPI schema\ntype Session = {\n id: string;\n userId: string;\n expiresAt: string;\n createdAt: string;\n userAgent: string | null;\n ip: string | null;\n};\n\nexport function Sessions() {\n const { hooks } = useApi();\n const [selectedSessionId] = useState<string | null>(null);\n\n // Fetch sessions\n const { data, isLoading, error, refetch } = hooks.useQuery(\n 'get',\n '/sessions',\n );\n\n // Delete session mutation\n const deleteMutation = hooks.useMutation('delete', '/sessions/{id}', {\n onSuccess: () => {\n // Refetch sessions after deletion\n refetch();\n },\n });\n\n const handleDeleteSession = async (sessionId: string) => {\n if (confirm('Are you sure you want to revoke this session?')) {\n try {\n await deleteMutation.mutateAsync({\n params: {\n path: { id: sessionId },\n },\n });\n } catch (_err) {\n // Error handled by mutation error state\n }\n }\n };\n\n const columns: DataTableColumn<Session>[] = [\n {\n key: 'createdAt',\n header: 'Created',\n cell: (session) => (\n <div>\n <p className=\"text-sm font-medium\">\n {new Date(session.createdAt).toLocaleDateString()}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {new Date(session.createdAt).toLocaleTimeString()}\n </p>\n </div>\n ),\n },\n {\n key: 'expiresAt',\n header: 'Expires',\n cell: (session) => (\n <p className=\"text-sm\">\n {new Date(session.expiresAt).toLocaleDateString()}\n </p>\n ),\n },\n {\n key: 'userAgent',\n header: 'Device',\n cell: (session) => (\n <p className=\"text-sm truncate max-w-xs\">\n {session.userAgent || 'Unknown'}\n </p>\n ),\n },\n {\n key: 'ip',\n header: 'IP Address',\n cell: (session) => (\n <p className=\"text-sm font-mono\">{session.ip || 'Unknown'}</p>\n ),\n },\n {\n key: 'actions',\n header: 'Actions',\n cell: (session) => (\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => handleDeleteSession(session.id)}\n disabled={\n deleteMutation.isPending && selectedSessionId === session.id\n }\n >\n {deleteMutation.isPending && selectedSessionId === session.id\n ? 'Revoking...'\n : 'Revoke'}\n </Button>\n ),\n },\n ];\n\n if (error) {\n return (\n <div className=\"p-6 text-center\">\n <p className=\"text-destructive\">Error loading sessions</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-6 space-y-4\">\n <div>\n <h1 className=\"text-3xl font-bold\">Sessions</h1>\n <p className=\"text-muted-foreground\">View and manage active sessions</p>\n </div>\n\n <DataTable\n data={(data as { sessions: Session[] })?.sessions || []}\n columns={columns}\n isLoading={isLoading}\n emptyMessage=\"No active sessions\"\n />\n </div>\n );\n}\n","'use client';\n\nimport { Badge } from '@mesob/ui/components/badge';\nimport { Button } from '@mesob/ui/components/button';\nimport { useState } from 'react';\nimport { useApi } from '../../provider';\nimport { DataTable, type DataTableColumn } from '../shared/data-table';\n\n// Tenant type from OpenAPI schema\ntype Tenant = {\n id: string;\n name: string;\n slug: string;\n status: string;\n createdAt: string;\n};\n\nexport function Tenants() {\n const { hooks } = useApi();\n const [page, setPage] = useState(1);\n const limit = 20;\n\n // Use openapi-react-query hooks\n const { data, isLoading, error } = hooks.useQuery('get', '/tenants', {\n params: {\n query: {\n page: String(page),\n limit: String(limit),\n },\n },\n });\n\n const columns: DataTableColumn<Tenant>[] = [\n {\n key: 'name',\n header: 'Tenant',\n cell: (tenant) => (\n <div>\n <p className=\"font-medium\">{tenant.name}</p>\n <p className=\"text-sm text-muted-foreground\">/{tenant.slug}</p>\n </div>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n cell: (tenant) => (\n <Badge variant={tenant.status === 'active' ? 'default' : 'secondary'}>\n {tenant.status}\n </Badge>\n ),\n },\n {\n key: 'createdAt',\n header: 'Created',\n cell: (tenant) => (\n <p className=\"text-sm\">\n {new Date(tenant.createdAt).toLocaleDateString()}\n </p>\n ),\n },\n {\n key: 'actions',\n header: 'Actions',\n cell: (_tenant) => (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n Domains\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n Edit\n </Button>\n </div>\n ),\n },\n ];\n\n if (error) {\n return (\n <div className=\"p-6 text-center\">\n <p className=\"text-destructive\">Error loading tenants</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-6 space-y-4\">\n <div className=\"flex justify-between items-center\">\n <div>\n <h1 className=\"text-3xl font-bold\">Tenants</h1>\n <p className=\"text-muted-foreground\">Manage tenant organizations</p>\n </div>\n <Button>Create Tenant</Button>\n </div>\n\n <DataTable\n data={(data as { tenants: Tenant[] })?.tenants || []}\n columns={columns}\n isLoading={isLoading}\n emptyMessage=\"No tenants found\"\n />\n\n {data &&\n 'tenants' in data &&\n data.tenants &&\n (data.tenants as Tenant[]).length >= limit && (\n <div className=\"flex justify-between items-center\">\n <Button\n variant=\"outline\"\n disabled={page === 1}\n onClick={() => setPage(page - 1)}\n >\n Previous\n </Button>\n <span className=\"text-sm text-muted-foreground\">Page {page}</span>\n <Button variant=\"outline\" onClick={() => setPage(page + 1)}>\n Next\n </Button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { Badge } from '@mesob/ui/components/badge';\nimport { Button } from '@mesob/ui/components/button';\nimport { useState } from 'react';\nimport { useApi } from '../../provider';\nimport { DataTable, type DataTableColumn } from '../shared/data-table';\n\n// User type from OpenAPI schema\ntype User = {\n id: string;\n fullName: string;\n email: string | null;\n phone: string | null;\n handle: string;\n emailVerified: boolean;\n phoneVerified: boolean;\n lastSignInAt: string | null;\n};\n\nexport function Users() {\n const { hooks } = useApi();\n const [page, setPage] = useState(1);\n const limit = 20;\n\n // Use openapi-react-query hooks\n const { data, isLoading, error } = hooks.useQuery('get', '/users', {\n params: {\n query: {\n page: String(page),\n limit: String(limit),\n },\n },\n });\n\n const columns: DataTableColumn<User>[] = [\n {\n key: 'fullName',\n header: 'Name',\n cell: (user) => (\n <div>\n <p className=\"font-medium\">{user.fullName}</p>\n <p className=\"text-sm text-muted-foreground\">@{user.handle}</p>\n </div>\n ),\n },\n {\n key: 'contact',\n header: 'Contact',\n cell: (user) => (\n <div className=\"space-y-1\">\n {user.email && (\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm\">{user.email}</p>\n {user.emailVerified && (\n <Badge variant=\"outline\" className=\"text-xs\">\n Verified\n </Badge>\n )}\n </div>\n )}\n {user.phone && (\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm\">{user.phone}</p>\n {user.phoneVerified && (\n <Badge variant=\"outline\" className=\"text-xs\">\n Verified\n </Badge>\n )}\n </div>\n )}\n </div>\n ),\n },\n {\n key: 'lastSignIn',\n header: 'Last Sign In',\n cell: (user) => (\n <p className=\"text-sm\">\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'Never'}\n </p>\n ),\n },\n {\n key: 'actions',\n header: 'Actions',\n cell: (_user) => (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n View\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n Edit\n </Button>\n </div>\n ),\n },\n ];\n\n if (error) {\n return (\n <div className=\"p-6 text-center\">\n <p className=\"text-destructive\">Error loading users</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-6 space-y-4\">\n <div className=\"flex justify-between items-center\">\n <div>\n <h1 className=\"text-3xl font-bold\">Users</h1>\n <p className=\"text-muted-foreground\">Manage user accounts</p>\n </div>\n <Button>Create User</Button>\n </div>\n\n <DataTable\n data={(data as { users: User[] })?.users || []}\n columns={columns}\n isLoading={isLoading}\n emptyMessage=\"No users found\"\n />\n\n {data &&\n 'users' in data &&\n data.users &&\n (data.users as User[]).length >= limit && (\n <div className=\"flex justify-between items-center\">\n <Button\n variant=\"outline\"\n disabled={page === 1}\n onClick={() => setPage(page - 1)}\n >\n Previous\n </Button>\n <span className=\"text-sm text-muted-foreground\">Page {page}</span>\n <Button variant=\"outline\" onClick={() => setPage(page + 1)}>\n Next\n </Button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { Separator } from '@mesob/ui/components/separator';\nimport { useSession } from '../../provider';\n\nexport function Account() {\n const { user, isAuthenticated } = useSession();\n\n if (!(isAuthenticated && user)) {\n return <div>Sign in required</div>;\n }\n\n return (\n <div className=\"p-6 max-w-4xl\">\n <div className=\"mb-6\">\n <h2 className=\"text-lg font-semibold mb-4\">Profile details</h2>\n <Separator />\n </div>\n\n <div className=\"space-y-6 transition-all duration-300 ease-in-out\">\n {/* Profile Section */}\n <div className=\"flex flex-col md:flex-row items-start gap-4 md:gap-12 min-h-[3rem]\">\n <div className=\"w-full md:w-48 mt-4 shrink-0 h-fit\">\n <span className=\"font-medium text-sm\">Profile</span>\n </div>\n </div>\n\n <Separator />\n\n {/* Email addresses Section */}\n <div className=\"flex flex-col md:flex-row gap-4 md:gap-12 py-2\">\n <div className=\"w-full md:w-48 shrink-0\">\n <span className=\"font-medium text-sm\">Email addresses</span>\n </div>\n <div className=\"flex-1 space-y-4\">\n <div className=\"flex items-center justify-between group\">\n {user.email ? (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm\">{user.email}</span>\n </div>\n ) : (\n <span className=\"text-sm text-muted-foreground\">\n No email address\n </span>\n )}\n </div>\n </div>\n </div>\n\n <Separator />\n\n {/* Phone numbers Section */}\n <div className=\"flex flex-col md:flex-row gap-4 md:gap-12 py-2\">\n <div className=\"w-full md:w-48 shrink-0\">\n <span className=\"font-medium text-sm\">Phone numbers</span>\n </div>\n <div className=\"flex-1 space-y-4\">\n {user.phone ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm\">{user.phone}</span>\n </div>\n ) : (\n <span className=\"text-sm text-muted-foreground\">\n No phone number\n </span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '@mesob/ui/components/collapsible';\nimport { IconChevronDown } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { useSession } from '../../provider';\nimport { RequestChangeEmailForm } from './request-change-email-form';\nimport { VerifyChangeEmailForm } from './verify-change-email-form';\n\nexport function ChangeEmailForm() {\n const { user } = useSession();\n const [isOpen, setIsOpen] = useState(false);\n const [showOtp, setShowOtp] = useState(false);\n const [verificationId, setVerificationId] = useState<string | null>(null);\n const [newEmail, setNewEmail] = useState<string>('');\n\n const resetForms = () => {\n setShowOtp(false);\n setVerificationId(null);\n setNewEmail('');\n };\n\n const handleRequestSuccess = (id: string, email: string) => {\n setVerificationId(id);\n setNewEmail(email);\n setShowOtp(true);\n };\n\n const handleVerifySuccess = () => {\n resetForms();\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n resetForms();\n setIsOpen(false);\n };\n\n const title = user?.email ? 'Change Email' : 'Add Email';\n const description = user?.email\n ? 'Update your email address'\n : 'Add an email address to your account';\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen}>\n <div className=\"border rounded-lg\">\n <CollapsibleTrigger asChild>\n <Button variant=\"ghost\" className=\"w-full justify-between p-4 h-auto\">\n <div className=\"flex flex-col items-start\">\n <span className=\"font-medium\">{title}</span>\n <span className=\"text-sm text-muted-foreground\">\n {description}\n </span>\n </div>\n <IconChevronDown\n className={`h-4 w-4 transition-transform ${\n isOpen ? 'rotate-180' : ''\n }`}\n />\n </Button>\n </CollapsibleTrigger>\n\n <CollapsibleContent>\n {showOtp ? (\n <VerifyChangeEmailForm\n email={newEmail}\n verificationId={verificationId}\n onSuccess={handleVerifySuccess}\n onCancel={handleCancel}\n />\n ) : (\n <RequestChangeEmailForm\n onSuccess={handleRequestSuccess}\n onCancel={handleCancel}\n buttonText={title}\n />\n )}\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Button } from '@mesob/ui/components/button';\nimport { Input } from '@mesob/ui/components/input';\nimport { Label } from '@mesob/ui/components/label';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useApi, useSession } from '../../provider';\n\nconst emailPasswordSchema = z.object({\n email: z.string().email('Invalid email address'),\n password: z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .max(128, 'Password too long'),\n});\n\ntype EmailPasswordFormData = z.infer<typeof emailPasswordSchema>;\n\ntype AuthErrorLike = {\n code?: string;\n message?: string;\n name?: string;\n};\n\nfunction isAuthError(error: unknown): error is AuthErrorLike {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('code' in error || 'message' in error || 'name' in error)\n );\n}\n\nfunction getErrorCode(error: AuthErrorLike): string | undefined {\n if (error.code) {\n return error.code;\n }\n if (error.message) {\n const upperMessage = error.message.toUpperCase().trim();\n const validCodes = [\n 'USER_NOT_FOUND',\n 'USER_EXISTS',\n 'INVALID_PASSWORD',\n 'VERIFICATION_EXPIRED',\n 'VERIFICATION_MISMATCH',\n 'VERIFICATION_NOT_FOUND',\n 'TOO_MANY_ATTEMPTS',\n 'UNAUTHORIZED',\n ];\n if (validCodes.includes(upperMessage)) {\n return upperMessage;\n }\n }\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n switch (errorCode) {\n case 'USER_EXISTS':\n return 'This email is already taken. Please use a different email.';\n case 'VERIFICATION_EXPIRED':\n return 'Verification code has expired. Please request a new one.';\n case 'VERIFICATION_MISMATCH':\n return 'Invalid verification code. Please try again.';\n case 'VERIFICATION_NOT_FOUND':\n return 'Verification not found. Please request a new code.';\n default:\n return error.message || 'An error occurred. Please try again.';\n }\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An error occurred. Please try again.';\n}\n\ninterface RequestChangeEmailFormProps {\n onSuccess: (verificationId: string, email: string) => void;\n onCancel: () => void;\n buttonText: string;\n}\n\nexport function RequestChangeEmailForm({\n onSuccess,\n onCancel,\n buttonText,\n}: RequestChangeEmailFormProps) {\n const { user } = useSession();\n const { hooks } = useApi();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isChecking, setIsChecking] = useState(true);\n const [showPassword, setShowPassword] = useState(false);\n\n const getPendingAccountChangeQuery = hooks.useQuery(\n 'get',\n '/account-change/pending',\n {},\n { enabled: false },\n );\n const verifyPasswordMutation = hooks.useMutation('post', '/password/verify');\n const checkUserMutation = hooks.useMutation('post', '/check-account');\n const requestEmailVerificationMutation = hooks.useMutation(\n 'post',\n '/email/verification/request',\n );\n\n const emailPasswordForm = useForm<EmailPasswordFormData>({\n resolver: zodResolver(emailPasswordSchema),\n defaultValues: {\n email: '',\n password: '',\n },\n });\n\n const {\n register,\n handleSubmit,\n getValues,\n setValue,\n formState: { errors },\n } = emailPasswordForm;\n\n useEffect(() => {\n let active = true;\n const run = async () => {\n try {\n const data = await getPendingAccountChangeQuery.refetch();\n if (!active) {\n return;\n }\n const accountChange = data.data?.accountChange;\n const verificationId = data.data?.verificationId;\n if (accountChange?.changeType !== 'email') {\n setIsChecking(false);\n return;\n }\n if (!accountChange.newEmail) {\n setIsChecking(false);\n return;\n }\n if (getValues('email')) {\n setIsChecking(false);\n return;\n }\n setValue('email', accountChange.newEmail, { shouldValidate: true });\n\n if (verificationId) {\n toast.message('Resuming verification…');\n onSuccess(verificationId, accountChange.newEmail);\n return;\n }\n\n setIsChecking(false);\n } catch {\n setIsChecking(false);\n }\n };\n run().catch(() => undefined);\n return () => {\n active = false;\n };\n }, [getPendingAccountChangeQuery.refetch, getValues, onSuccess, setValue]);\n\n const onEmailPasswordSubmit = async (data: EmailPasswordFormData) => {\n if (!user) {\n toast.error('User not found');\n return;\n }\n\n try {\n setIsSubmitting(true);\n\n // Verify password first\n await verifyPasswordMutation.mutateAsync({\n body: { password: data.password },\n });\n\n // Check if email exists\n const checkResult = await checkUserMutation.mutateAsync({\n body: { identifier: data.email },\n });\n if (checkResult.data?.exists) {\n // Check if it belongs to current user\n if (user?.email?.toLowerCase() === data.email.toLowerCase()) {\n toast.error('This is already your current email address.');\n return;\n }\n toast.error(\n 'This email is already taken. Please use a different email.',\n );\n return;\n }\n\n // Request verification\n const verification = await requestEmailVerificationMutation.mutateAsync({\n body: { email: data.email },\n });\n\n toast.success('Verification code sent to your email');\n onSuccess(verification.data?.verificationId ?? '', data.email);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n if (\n errorCode === 'INVALID_PASSWORD' ||\n errorCode === 'USER_NOT_FOUND'\n ) {\n toast.error('Incorrect password. Please try again.');\n return;\n }\n }\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const isLoading = isSubmitting || isChecking;\n\n return (\n <form\n onSubmit={handleSubmit(onEmailPasswordSubmit)}\n className=\"p-4 space-y-4 border-t\"\n >\n <div className=\"space-y-4 w-full md:w-1/2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\">New Email Address</Label>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"Enter your new email\"\n {...register('email')}\n disabled={isLoading}\n />\n {errors.email && (\n <p className=\"text-sm text-destructive\">{errors.email.message}</p>\n )}\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"password\">Password</Label>\n <div className=\"relative\">\n <Input\n id=\"password\"\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"current-password\"\n placeholder=\"Enter your password\"\n {...register('password')}\n disabled={isLoading}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n disabled={isLoading}\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {errors.password && (\n <p className=\"text-sm text-destructive\">\n {errors.password.message}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isLoading}>\n {isLoading && <Spinner className=\"mr-2 h-4 w-4\" />}\n {isChecking ? 'Checking…' : buttonText}\n </Button>\n </div>\n </form>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useApi, useSession } from '../../provider';\nimport { OtpVerificationModal } from './otp-verification-modal';\n\ntype AuthErrorLike = {\n code?: string;\n message?: string;\n name?: string;\n};\n\nfunction isAuthError(error: unknown): error is AuthErrorLike {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('code' in error || 'message' in error || 'name' in error)\n );\n}\n\nfunction getErrorCode(error: AuthErrorLike): string | undefined {\n if (error.code) {\n return error.code;\n }\n if (error.message) {\n const upperMessage = error.message.toUpperCase().trim();\n const validCodes = [\n 'USER_NOT_FOUND',\n 'USER_EXISTS',\n 'INVALID_PASSWORD',\n 'VERIFICATION_EXPIRED',\n 'VERIFICATION_MISMATCH',\n 'VERIFICATION_NOT_FOUND',\n 'TOO_MANY_ATTEMPTS',\n 'UNAUTHORIZED',\n ];\n if (validCodes.includes(upperMessage)) {\n return upperMessage;\n }\n }\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n switch (errorCode) {\n case 'USER_EXISTS':\n return 'This email is already taken. Please use a different email.';\n case 'VERIFICATION_EXPIRED':\n return 'Verification code has expired. Please request a new one.';\n case 'VERIFICATION_MISMATCH':\n return 'Invalid verification code. Please try again.';\n case 'VERIFICATION_NOT_FOUND':\n return 'Verification not found. Please request a new code.';\n default:\n return error.message || 'An error occurred. Please try again.';\n }\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An error occurred. Please try again.';\n}\n\ntype VerifyChangeEmailFormProps = {\n email: string;\n verificationId: string | null;\n onSuccess: () => void;\n onCancel: () => void;\n};\n\nexport function VerifyChangeEmailForm({\n email,\n verificationId,\n onSuccess,\n onCancel,\n}: VerifyChangeEmailFormProps) {\n const { refresh } = useSession();\n const { hooks } = useApi();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [currentVerificationId, setCurrentVerificationId] =\n useState(verificationId);\n\n const verifyEmailMutation = hooks.useMutation(\n 'post',\n '/email/verification/confirm',\n );\n const updateEmailMutation = hooks.useMutation('put', '/profile/email');\n const requestEmailVerificationMutation = hooks.useMutation(\n 'post',\n '/email/verification/request',\n );\n\n const onOtpSubmit = async (code: string) => {\n if (!currentVerificationId) {\n toast.error('Verification not found. Please request a new code.');\n return;\n }\n try {\n setIsSubmitting(true);\n\n // Verify email\n await verifyEmailMutation.mutateAsync({\n body: {\n verificationId: currentVerificationId,\n code,\n },\n });\n\n // Update email via auth client\n await updateEmailMutation.mutateAsync({\n body: { email },\n });\n\n toast.success('Email updated successfully');\n await refresh();\n onSuccess();\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n if (!currentVerificationId) {\n toast.error('Verification not found. Please request a new code.');\n return null;\n }\n\n return (\n <OtpVerificationModal\n open\n title=\"Verify email\"\n description={`Enter the verification code sent to ${email}`}\n verificationId={currentVerificationId}\n isLoading={isSubmitting}\n onSubmit={onOtpSubmit}\n onResend={async () => {\n try {\n setIsSubmitting(true);\n const next = await requestEmailVerificationMutation.mutateAsync({\n body: { email },\n });\n setCurrentVerificationId(next.data?.verificationId ?? null);\n toast.success('Verification code resent');\n } catch (error) {\n toast.error(getErrorMessage(error));\n } finally {\n setIsSubmitting(false);\n }\n }}\n onCancel={onCancel}\n />\n );\n}\n","'use client';\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@mesob/ui/components/dialog';\nimport { VerificationForm } from '../auth/verification-form';\n\ntype OtpVerificationModalProps = {\n open: boolean;\n title: string;\n description?: string;\n verificationId: string;\n isLoading?: boolean;\n onSubmit: (code: string) => Promise<void> | void;\n onResend?: () => Promise<void> | void;\n onCancel?: () => void;\n};\n\nexport function OtpVerificationModal({\n open,\n title,\n description,\n verificationId,\n isLoading,\n onSubmit,\n onResend,\n onCancel,\n}: OtpVerificationModalProps) {\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onCancel?.();\n }\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n\n <VerificationForm\n verificationId={verificationId}\n isLoading={isLoading}\n onSubmit={async ({ code }: { code: string }) => onSubmit(code)}\n onResend={onResend ?? (() => undefined)}\n />\n </DialogContent>\n </Dialog>\n );\n}\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '@mesob/ui/components/collapsible';\nimport { Input } from '@mesob/ui/components/input';\nimport { Label } from '@mesob/ui/components/label';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { IconChevronDown, IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useSession } from '../../provider';\n\nconst changePasswordSchema = z\n .object({\n currentPassword: z\n .string()\n .min(8, 'Password must be at least 8 characters'),\n newPassword: z.string().min(8, 'Password must be at least 8 characters'),\n confirmPassword: z\n .string()\n .min(8, 'Password must be at least 8 characters'),\n })\n .refine((data) => data.newPassword === data.confirmPassword, {\n message: \"Passwords don't match\",\n path: ['confirmPassword'],\n });\n\ntype ChangePasswordFormData = z.infer<typeof changePasswordSchema>;\n\ntype AuthErrorLike = {\n code?: string;\n message?: string;\n name?: string;\n};\n\nfunction isAuthError(error: unknown): error is AuthErrorLike {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('code' in error || 'message' in error || 'name' in error)\n );\n}\n\nfunction getErrorCode(error: AuthErrorLike): string | undefined {\n if (error.code) {\n return error.code;\n }\n if (error.message) {\n const upperMessage = error.message.toUpperCase().trim();\n const validCodes = [\n 'INVALID_PASSWORD',\n 'UNAUTHORIZED',\n 'HAS_NO_PASSWORD',\n 'USER_NOT_FOUND',\n 'USER_EXISTS',\n 'VERIFICATION_EXPIRED',\n 'VERIFICATION_MISMATCH',\n 'VERIFICATION_NOT_FOUND',\n 'TOO_MANY_ATTEMPTS',\n 'REQUIRES_VERIFICATION',\n 'ACCESS_DENIED',\n ];\n if (validCodes.includes(upperMessage)) {\n return upperMessage;\n }\n }\n return undefined;\n}\n\nfunction getPasswordChangeErrorMessage(error: unknown): string {\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n switch (errorCode) {\n case 'INVALID_PASSWORD':\n return 'The current password you entered is incorrect. Please try again.';\n case 'UNAUTHORIZED':\n return 'You are not authorized to perform this action. Please sign in again.';\n case 'HAS_NO_PASSWORD':\n return 'Your account does not have a password set. Please use password reset instead.';\n default:\n return error.message || 'Failed to change password. Please try again.';\n }\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'Failed to change password. Please try again.';\n}\n\nexport function ChangePasswordForm() {\n const { user: _user } = useSession();\n const [isOpen, setIsOpen] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [showPassword, setShowPassword] = useState(false);\n const [showNewPassword, setShowNewPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n\n const form = useForm<ChangePasswordFormData>({\n resolver: zodResolver(changePasswordSchema),\n defaultValues: {\n currentPassword: '',\n newPassword: '',\n confirmPassword: '',\n },\n });\n\n const { register, handleSubmit, formState, reset } = form;\n\n const onSubmit = (_data: ChangePasswordFormData) => {\n try {\n setIsSubmitting(true);\n toast.error('Password change unavailable');\n setIsOpen(false);\n } catch (error) {\n const errorMessage = getPasswordChangeErrorMessage(error);\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen}>\n <div className=\"border rounded-lg\">\n <CollapsibleTrigger asChild>\n <Button variant=\"ghost\" className=\"w-full justify-between p-4 h-auto\">\n <div className=\"flex flex-col items-start\">\n <span className=\"font-medium\">Change Password</span>\n <span className=\"text-sm text-muted-foreground\">\n Update your account password\n </span>\n </div>\n <IconChevronDown\n className={`h-4 w-4 transition-transform ${\n isOpen ? 'rotate-180' : ''\n }`}\n />\n </Button>\n </CollapsibleTrigger>\n\n <CollapsibleContent>\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"p-4 space-y-4 border-t\"\n >\n <div className=\"space-y-2 w-full md:w-1/2\">\n <Label htmlFor=\"currentPassword\">Old Password</Label>\n <div className=\"relative\">\n <Input\n id=\"currentPassword\"\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"current-password\"\n placeholder=\"Enter your current password\"\n {...register('currentPassword')}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {formState.errors.currentPassword && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.currentPassword.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2 w-full md:w-1/2\">\n <Label htmlFor=\"newPassword\">New Password</Label>\n <div className=\"relative\">\n <Input\n id=\"newPassword\"\n type={showNewPassword ? 'text' : 'password'}\n placeholder=\"Enter your new password\"\n autoComplete=\"new-password\"\n {...register('newPassword')}\n />\n\n <button\n type=\"button\"\n onClick={() => setShowNewPassword(!showNewPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showNewPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {formState.errors.newPassword && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.newPassword.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2 w-full md:w-1/2\">\n <Label htmlFor=\"confirmPassword\">Confirm New Password</Label>\n <div className=\"relative\">\n <Input\n id=\"confirmPassword\"\n type={showConfirmPassword ? 'text' : 'password'}\n placeholder=\"Confirm your new password\"\n autoComplete=\"new-password\"\n {...register('confirmPassword')}\n />\n\n <button\n type=\"button\"\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showConfirmPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {formState.errors.confirmPassword && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.confirmPassword.message}\n </p>\n )}\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n reset();\n setIsOpen(false);\n }}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting && <Spinner className=\"mr-2 h-4 w-4\" />}\n Change Password\n </Button>\n </div>\n </form>\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n","'use client';\n\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '@mesob/ui/components/collapsible';\nimport { IconChevronDown } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { useSession } from '../../provider';\nimport { RequestChangePhoneForm } from './request-change-phone-form';\nimport { VerifyChangePhoneForm } from './verify-change-phone-form';\n\nexport function ChangePhoneForm() {\n const { user } = useSession();\n const [isOpen, setIsOpen] = useState(false);\n const [showOtp, setShowOtp] = useState(false);\n const [verificationId, setVerificationId] = useState<string | null>(null);\n const [newPhone, setNewPhone] = useState<string>('');\n\n const resetForms = () => {\n setShowOtp(false);\n setVerificationId(null);\n setNewPhone('');\n };\n\n const handleRequestSuccess = (id: string, phone: string) => {\n setVerificationId(id);\n setNewPhone(phone);\n setShowOtp(true);\n };\n\n const handleVerifySuccess = () => {\n resetForms();\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n resetForms();\n setIsOpen(false);\n };\n\n const title = user?.phone ? 'Change Phone' : 'Add Phone';\n const description = user?.phone\n ? 'Update your phone number'\n : 'Add a phone number to your account';\n\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen}>\n <div className=\"border rounded-lg\">\n <CollapsibleTrigger asChild>\n <Button variant=\"ghost\" className=\"w-full justify-between p-4 h-auto\">\n <div className=\"flex flex-col items-start\">\n <span className=\"font-medium\">{title}</span>\n <span className=\"text-sm text-muted-foreground\">\n {description}\n </span>\n </div>\n <IconChevronDown\n className={`h-4 w-4 transition-transform ${\n isOpen ? 'rotate-180' : ''\n }`}\n />\n </Button>\n </CollapsibleTrigger>\n\n <CollapsibleContent>\n {showOtp ? (\n <VerifyChangePhoneForm\n phone={newPhone}\n verificationId={verificationId}\n onSuccess={handleVerifySuccess}\n onCancel={handleCancel}\n />\n ) : (\n <RequestChangePhoneForm\n onSuccess={handleRequestSuccess}\n onCancel={handleCancel}\n buttonText={title}\n />\n )}\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Button } from '@mesob/ui/components/button';\nimport { Input } from '@mesob/ui/components/input';\nimport { Label } from '@mesob/ui/components/label';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useApi, useConfig, useSession } from '../../provider';\nimport { normalizePhone } from '../../utils/normalize-phone';\n\nconst phonePasswordSchema = (phoneRegex: RegExp) =>\n z.object({\n phone: z\n .string()\n .trim()\n .min(1, { message: 'Phone number is required' })\n .refine(\n (val) => {\n const isPhone = phoneRegex.test(val);\n return isPhone;\n },\n {\n message: 'Invalid phone number',\n },\n ),\n password: z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .max(128, 'Password too long'),\n });\n\ntype PhonePasswordFormData = z.infer<ReturnType<typeof phonePasswordSchema>>;\n\ntype AuthErrorLike = {\n code?: string;\n message?: string;\n name?: string;\n};\n\nfunction isAuthError(error: unknown): error is AuthErrorLike {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('code' in error || 'message' in error || 'name' in error)\n );\n}\n\nfunction getErrorCode(error: AuthErrorLike): string | undefined {\n if (error.code) {\n return error.code;\n }\n if (error.message) {\n const upperMessage = error.message.toUpperCase().trim();\n const validCodes = [\n 'USER_NOT_FOUND',\n 'USER_EXISTS',\n 'INVALID_PASSWORD',\n 'VERIFICATION_EXPIRED',\n 'VERIFICATION_MISMATCH',\n 'VERIFICATION_NOT_FOUND',\n 'TOO_MANY_ATTEMPTS',\n 'UNAUTHORIZED',\n ];\n if (validCodes.includes(upperMessage)) {\n return upperMessage;\n }\n }\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n switch (errorCode) {\n case 'USER_EXISTS':\n return 'This phone number is already taken. Please use a different number.';\n case 'VERIFICATION_EXPIRED':\n return 'Verification code has expired. Please request a new one.';\n case 'VERIFICATION_MISMATCH':\n return 'Invalid verification code. Please try again.';\n case 'VERIFICATION_NOT_FOUND':\n return 'Verification not found. Please request a new code.';\n default:\n return error.message || 'An error occurred. Please try again.';\n }\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An error occurred. Please try again.';\n}\n\ninterface RequestChangePhoneFormProps {\n onSuccess: (verificationId: string, phone: string) => void;\n onCancel: () => void;\n buttonText: string;\n}\n\nexport function RequestChangePhoneForm({\n onSuccess,\n onCancel,\n buttonText,\n}: RequestChangePhoneFormProps) {\n const { user } = useSession();\n const { hooks } = useApi();\n const { config } = useConfig();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isChecking, setIsChecking] = useState(true);\n const [showPassword, setShowPassword] = useState(false);\n\n const phoneRegex =\n typeof config.phoneRegex === 'string'\n ? new RegExp(config.phoneRegex)\n : config.phoneRegex || /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/;\n\n const getPendingAccountChangeQuery = hooks.useQuery(\n 'get',\n '/account-change/pending',\n {},\n { enabled: false },\n );\n const verifyPasswordMutation = hooks.useMutation('post', '/password/verify');\n const checkUserMutation = hooks.useMutation('post', '/check-account');\n const requestPhoneOtpMutation = hooks.useMutation(\n 'post',\n '/phone/verification/request',\n );\n\n const phonePasswordForm = useForm<PhonePasswordFormData>({\n resolver: zodResolver(phonePasswordSchema(phoneRegex)),\n defaultValues: {\n phone: '',\n password: '',\n },\n });\n\n const {\n register,\n handleSubmit,\n getValues,\n setValue,\n formState: { errors },\n } = phonePasswordForm;\n\n useEffect(() => {\n let active = true;\n const run = async () => {\n try {\n const data = await getPendingAccountChangeQuery.refetch();\n if (!active) {\n return;\n }\n const accountChange = data.data?.accountChange;\n const verificationId = data.data?.verificationId;\n if (accountChange?.changeType !== 'phone') {\n setIsChecking(false);\n return;\n }\n if (!accountChange.newPhone) {\n setIsChecking(false);\n return;\n }\n if (getValues('phone')) {\n setIsChecking(false);\n return;\n }\n setValue('phone', accountChange.newPhone, { shouldValidate: true });\n\n if (verificationId) {\n toast.message('Resuming verification…');\n onSuccess(verificationId, accountChange.newPhone);\n return;\n }\n\n setIsChecking(false);\n } catch {\n setIsChecking(false);\n }\n };\n run().catch(() => undefined);\n return () => {\n active = false;\n };\n }, [getPendingAccountChangeQuery.refetch, getValues, onSuccess, setValue]);\n\n const onPhonePasswordSubmit = async (data: PhonePasswordFormData) => {\n if (!user) {\n toast.error('User not found');\n return;\n }\n\n try {\n setIsSubmitting(true);\n\n const normalizedPhone = normalizePhone(data.phone);\n\n // Verify password first\n await verifyPasswordMutation.mutateAsync({\n body: { password: data.password },\n });\n\n // Check if phone exists\n const checkResult = await checkUserMutation.mutateAsync({\n body: { identifier: normalizedPhone },\n });\n if (checkResult.data?.exists) {\n // Check if it belongs to current user\n if (\n user?.phone?.replace(/\\s/g, '') === normalizedPhone.replace(/\\s/g, '')\n ) {\n toast.error('This is already your current phone number.');\n return;\n }\n toast.error(\n 'This phone number is already taken. Please use a different number.',\n );\n return;\n }\n\n // Request OTP\n const verification = await requestPhoneOtpMutation.mutateAsync({\n body: {\n phone: normalizedPhone,\n context: 'change-phone',\n },\n });\n\n toast.success('Verification code sent to your phone');\n onSuccess(verification.data?.verificationId ?? '', normalizedPhone);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n if (\n errorCode === 'INVALID_PASSWORD' ||\n errorCode === 'USER_NOT_FOUND'\n ) {\n toast.error('Incorrect password. Please try again.');\n return;\n }\n }\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const isLoading = isSubmitting || isChecking;\n\n return (\n <form\n onSubmit={handleSubmit(onPhonePasswordSubmit)}\n className=\"p-4 space-y-4 border-t\"\n >\n <div className=\"space-y-4 w-full md:w-1/2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"phone\">Phone Number</Label>\n <Input\n id=\"phone\"\n type=\"tel\"\n placeholder=\"Enter your new phone number\"\n {...register('phone')}\n disabled={isLoading}\n />\n {errors.phone && (\n <p className=\"text-sm text-destructive\">{errors.phone.message}</p>\n )}\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"password\">Password</Label>\n <div className=\"relative\">\n <Input\n id=\"password\"\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"current-password\"\n placeholder=\"Enter your password\"\n {...register('password')}\n disabled={isLoading}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {errors.password && (\n <p className=\"text-sm text-destructive\">\n {errors.password.message}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isLoading}>\n {isLoading && <Spinner className=\"mr-2 h-4 w-4\" />}\n {isChecking ? 'Checking…' : buttonText}\n </Button>\n </div>\n </form>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useApi, useSession } from '../../provider';\nimport { OtpVerificationModal } from './otp-verification-modal';\n\ntype AuthErrorLike = {\n code?: string;\n message?: string;\n name?: string;\n};\n\nfunction isAuthError(error: unknown): error is AuthErrorLike {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('code' in error || 'message' in error || 'name' in error)\n );\n}\n\nfunction getErrorCode(error: AuthErrorLike): string | undefined {\n if (error.code) {\n return error.code;\n }\n if (error.message) {\n const upperMessage = error.message.toUpperCase().trim();\n const validCodes = [\n 'USER_NOT_FOUND',\n 'USER_EXISTS',\n 'INVALID_PASSWORD',\n 'VERIFICATION_EXPIRED',\n 'VERIFICATION_MISMATCH',\n 'VERIFICATION_NOT_FOUND',\n 'TOO_MANY_ATTEMPTS',\n 'UNAUTHORIZED',\n ];\n if (validCodes.includes(upperMessage)) {\n return upperMessage;\n }\n }\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n switch (errorCode) {\n case 'USER_EXISTS':\n return 'This phone number is already taken. Please use a different number.';\n case 'VERIFICATION_EXPIRED':\n return 'Verification code has expired. Please request a new one.';\n case 'VERIFICATION_MISMATCH':\n return 'Invalid verification code. Please try again.';\n case 'VERIFICATION_NOT_FOUND':\n return 'Verification not found. Please request a new code.';\n default:\n return error.message || 'An error occurred. Please try again.';\n }\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An error occurred. Please try again.';\n}\n\ntype VerifyChangePhoneFormProps = {\n phone: string;\n verificationId: string | null;\n onSuccess: () => void;\n onCancel: () => void;\n};\n\nexport function VerifyChangePhoneForm({\n phone,\n verificationId,\n onSuccess,\n onCancel,\n}: VerifyChangePhoneFormProps) {\n const { refresh } = useSession();\n const { hooks } = useApi();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [currentVerificationId, setCurrentVerificationId] =\n useState(verificationId);\n\n const verifyPhoneOtpMutation = hooks.useMutation(\n 'post',\n '/phone/verification/confirm',\n );\n const updatePhoneMutation = hooks.useMutation('put', '/profile/phone');\n const requestPhoneOtpMutation = hooks.useMutation(\n 'post',\n '/phone/verification/request',\n );\n\n const onOtpSubmit = async (code: string) => {\n if (!currentVerificationId) {\n toast.error('Verification not found. Please request a new code.');\n return;\n }\n try {\n setIsSubmitting(true);\n\n // Verify phone\n await verifyPhoneOtpMutation.mutateAsync({\n body: {\n verificationId: currentVerificationId,\n code,\n context: 'change-phone',\n },\n });\n\n // Update phone via auth client\n await updatePhoneMutation.mutateAsync({\n body: { phone },\n });\n\n toast.success('Phone number updated successfully');\n await refresh();\n onSuccess();\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n if (!currentVerificationId) {\n toast.error('Verification not found. Please request a new code.');\n return null;\n }\n\n return (\n <OtpVerificationModal\n open\n title=\"Verify phone\"\n description={`Enter the verification code sent to ${phone}`}\n verificationId={currentVerificationId}\n isLoading={isSubmitting}\n onSubmit={onOtpSubmit}\n onResend={async () => {\n try {\n setIsSubmitting(true);\n const next = await requestPhoneOtpMutation.mutateAsync({\n body: {\n phone,\n context: 'change-phone',\n },\n });\n setCurrentVerificationId(next.data?.verificationId ?? null);\n toast.success('Verification code resent');\n } catch (error) {\n toast.error(getErrorMessage(error));\n } finally {\n setIsSubmitting(false);\n }\n }}\n onCancel={onCancel}\n />\n );\n}\n","'use client';\n\nimport { ChangeEmailForm } from './change-email-form';\nimport { ChangePasswordForm } from './change-password-form';\nimport { ChangePhoneForm } from './change-phone-form';\n\nexport function Security() {\n return (\n <div className=\"p-6 space-y-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Security</h1>\n <p className=\"text-muted-foreground\">Manage your security settings</p>\n </div>\n\n <div className=\"space-y-4\">\n <ChangePasswordForm />\n <ChangeEmailForm />\n <ChangePhoneForm />\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Skeleton } from '@mesob/ui/components/skeleton';\n\nexport function AuthFormSkeleton() {\n return (\n <div className=\"w-full max-w-md space-y-6 p-6\">\n <div className=\"space-y-2 text-center\">\n <Skeleton className=\"h-8 w-48 mx-auto\" />\n <Skeleton className=\"h-4 w-64 mx-auto\" />\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n\n <Skeleton className=\"h-10 w-full\" />\n </div>\n\n <div className=\"space-y-2\">\n <Skeleton className=\"h-px w-full\" />\n <Skeleton className=\"h-4 w-32 mx-auto\" />\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Skeleton } from '@mesob/ui/components/skeleton';\n\nexport function ProfileSkeleton() {\n return (\n <div className=\"w-full max-w-4xl space-y-8 p-6\">\n {/* Header */}\n <div className=\"flex items-center gap-6\">\n <Skeleton className=\"h-24 w-24 rounded-full\" />\n <div className=\"space-y-2 flex-1\">\n <Skeleton className=\"h-8 w-48\" />\n <Skeleton className=\"h-4 w-64\" />\n </div>\n </div>\n\n {/* Profile sections */}\n <div className=\"space-y-6\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"space-y-4\">\n <Skeleton className=\"h-6 w-32\" />\n <div className=\"space-y-3\">\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-32\" />\n </div>\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-40\" />\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useConfig } from '../provider';\nimport { getSessionCookieName } from '../utils/cookie';\n\nexport function useSessionCookieName(): string {\n const { config } = useConfig();\n return getSessionCookieName(config);\n}\n"],"mappings":"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","names":["useMesob","useState","jsx","error","jsx","jsx","jsxs","useMesob","Link","useState","zodResolver","Alert","AlertDescription","AlertTitle","Button","Field","FieldError","FieldGroup","FieldLabel","Input","Spinner","IconAlertCircle","useEffect","useState","Controller","useForm","toast","z","jsx","jsxs","z","useState","useForm","zodResolver","useEffect","toast","FieldGroup","Controller","Field","FieldLabel","FieldError","Input","Button","Spinner","Alert","IconAlertCircle","AlertTitle","AlertDescription","zodResolver","Alert","AlertDescription","AlertTitle","Button","Field","FieldError","FieldGroup","FieldLabel","Input","useMesob","Spinner","IconAlertCircle","IconEye","IconEyeOff","useEffect","useState","Controller","useForm","toast","z","jsx","jsxs","z","isPhone","useMesob","Link","useState","useForm","zodResolver","useEffect","toast","FieldGroup","Controller","Field","FieldLabel","Input","IconEyeOff","IconEye","FieldError","Button","Spinner","Alert","IconAlertCircle","AlertTitle","AlertDescription","zodResolver","Alert","AlertDescription","AlertTitle","Button","Field","FieldError","FieldGroup","FieldLabel","Input","useMesob","IconAlertCircle","IconEye","IconEyeOff","useEffect","useState","Controller","useForm","toast","z","jsx","jsxs","isPhone","z","useMesob","Link","useState","useForm","zodResolver","useEffect","toast","FieldGroup","Controller","Field","FieldLabel","Input","FieldError","IconEyeOff","IconEye","Button","Alert","IconAlertCircle","AlertTitle","AlertDescription","zodResolver","Button","Field","FieldError","FieldGroup","InputOTP","InputOTPGroup","InputOTPSlot","Spinner","Controller","useForm","z","Button","Spinner","useEffect","useState","jsx","jsxs","useState","useEffect","Button","Spinner","jsx","jsxs","z","useForm","zodResolver","FieldGroup","Controller","Field","InputOTP","InputOTPGroup","InputOTPSlot","FieldError","Button","Spinner","Alert","AlertDescription","AlertTitle","useMesob","IconAlertCircle","useEffect","useState","toast","jsx","jsxs","useMesob","Link","useState","useEffect","toast","Alert","IconAlertCircle","AlertTitle","AlertDescription","Alert","AlertDescription","AlertTitle","Link","IconAlertCircle","useEffect","useState","toast","jsx","jsxs","useState","useEffect","toast","Link","Alert","IconAlertCircle","AlertTitle","AlertDescription","Button","jsx","jsxs","Button","useState","jsx","jsxs","_","jsx","jsxs","jsx","jsxs","useState","Button","Badge","Button","useLocale","useState","jsx","jsxs","getTranslation","useLocale","useState","Badge","Button","Button","useState","jsx","jsxs","useState","Button","Badge","Button","useState","jsx","jsxs","useState","Badge","Button","Badge","Button","useState","jsx","jsxs","useState","Badge","Button","jsx","jsxs","Button","useState","zodResolver","Button","Input","Spinner","IconEye","IconEyeOff","useEffect","useState","useForm","toast","z","jsx","jsxs","z","isAuthError","validCodes","useState","useForm","zodResolver","useEffect","toast","Input","IconEyeOff","IconEye","Button","Spinner","useState","toast","jsx","jsxs","jsx","isAuthError","getErrorCode","validCodes","getErrorMessage","useState","toast","jsx","jsxs","useState","Button","zodResolver","Button","Collapsible","CollapsibleContent","CollapsibleTrigger","Input","Label","Spinner","IconChevronDown","IconEye","IconEyeOff","useState","useForm","toast","z","jsx","jsxs","z","isAuthError","getErrorCode","validCodes","useState","useForm","zodResolver","toast","Collapsible","CollapsibleTrigger","Button","IconChevronDown","CollapsibleContent","Label","Input","IconEyeOff","IconEye","Spinner","Button","Collapsible","CollapsibleContent","CollapsibleTrigger","IconChevronDown","useState","zodResolver","Button","Input","Label","Spinner","IconEye","IconEyeOff","useEffect","useState","useForm","toast","z","jsx","jsxs","z","isPhone","isAuthError","getErrorCode","validCodes","getErrorMessage","useState","useForm","zodResolver","useEffect","toast","Label","Input","IconEyeOff","IconEye","Button","Spinner","useState","toast","jsx","isAuthError","getErrorCode","validCodes","getErrorMessage","useState","toast","jsx","jsxs","useState","Collapsible","CollapsibleTrigger","Button","IconChevronDown","CollapsibleContent","jsx","jsxs","Skeleton","jsx","jsxs","Skeleton","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/auth/auth-card.tsx","../src/components/auth/forgot-password.tsx","../src/hooks/use-translator.ts","../src/lib/translations.ts","../src/provider.tsx","../src/types.ts","../src/utils/cookie.ts","../src/utils/custom-fetch.ts","../src/constants/auth.error.codes.ts","../src/utils/handle-error.ts","../src/components/auth/auth-layout.tsx","../src/components/auth/reset-password-form.tsx","../src/components/auth/sign-in.tsx","../src/utils/normalize-phone.ts","../src/components/auth/sign-up.tsx","../src/components/auth/verification-form.tsx","../src/components/auth/countdown.tsx","../src/components/auth/verify-email.tsx","../src/components/auth/verify-phone.tsx","../src/components/error-boundary.tsx","../src/components/iam/permissions.tsx","../src/components/shared/data-table.tsx","../src/components/skeletons/table-skeleton.tsx","../src/components/iam/roles.tsx","../src/components/iam/sessions.tsx","../src/components/iam/tenants.tsx","../src/components/iam/users.tsx","../src/components/profile/account.tsx","../src/components/profile/change-email-form.tsx","../src/components/profile/request-change-email-form.tsx","../src/components/profile/verify-change-email-form.tsx","../src/components/profile/otp-verification-modal.tsx","../src/components/profile/change-password-form.tsx","../src/components/profile/change-phone-form.tsx","../src/components/profile/request-change-phone-form.tsx","../src/components/profile/verify-change-phone-form.tsx","../src/components/profile/security.tsx","../src/components/skeletons/auth-form-skeleton.tsx","../src/components/skeletons/profile-skeleton.tsx","../src/hooks/use-session-cookie-name.ts"],"sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\n\ntype AuthCardProps = {\n children: ReactNode;\n};\n\nexport const AuthCard = ({ children }: AuthCardProps) => {\n return (\n <div className=\"flex min-h-screen w-full p-4 items-center justify-center\">\n <div className=\"w-full min-w-[280px] max-w-[28rem] shrink-0\">\n <div className=\"rounded-xl border border-border bg-card p-6 shadow-lg sm:p-8\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n Button,\n Field,\n FieldError,\n FieldGroup,\n FieldLabel,\n Input,\n Spinner,\n} from '@mesob/ui/components';\nimport { useMesob } from '@mesob/ui/providers';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { AuthLayout } from './auth-layout';\n\ntype ForgotPasswordFormValues = {\n account: string;\n};\n\nconst forgotPasswordSchema = (t: (key: string) => string) =>\n z.object({\n account: z.string().min(1, t('errors.accountRequired')),\n });\n\nexport const ForgotPassword = () => {\n const { hooks } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const t = useTranslator('Auth.forgotPassword');\n const Link = mesob?.navigation?.Link;\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const forgotPasswordMutation = hooks.useMutation('post', '/password/forgot');\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n\n const form = useForm<ForgotPasswordFormValues>({\n resolver: zodResolver(forgotPasswordSchema(t)),\n defaultValues: {\n account: '',\n },\n });\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n setIsLoading(true);\n setError(null);\n\n try {\n const res = await forgotPasswordMutation.mutateAsync({\n body: {\n identifier: values.account,\n },\n });\n\n if ('verificationId' in res && res.verificationId) {\n onNavigate(`/auth/reset-password?verificationId=${res.verificationId}`);\n } else {\n onNavigate(\n `/auth/reset-password?identifier=${encodeURIComponent(values.account)}`,\n );\n }\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n });\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n return (\n <AuthLayout\n title={t('title')}\n description={t('description')}\n logoImage={logoImage}\n footer={\n Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {t('footer.backToSignIn')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {t('footer.backToSignIn')}\n </a>\n )\n }\n >\n <form id=\"forgot-password-form\" onSubmit={handleSubmit}>\n <FieldGroup>\n <Controller\n name=\"account\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"forgot-password-account\">\n {t('form.accountLabel')}\n </FieldLabel>\n <Input\n {...field}\n id=\"forgot-password-account\"\n type=\"text\"\n placeholder={t('form.accountPlaceholder')}\n aria-invalid={fieldState.invalid}\n />\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n </FieldGroup>\n <div className=\"mt-4\">\n <Button\n type=\"submit\"\n form=\"forgot-password-form\"\n className=\"w-full\"\n disabled={isLoading || forgotPasswordMutation.isPending}\n >\n {isLoading || (forgotPasswordMutation.isPending && <Spinner />)}\n {isLoading || forgotPasswordMutation.isPending\n ? t('form.submitting')\n : t('form.submit')}\n </Button>\n </div>\n </form>\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n );\n};\n","import { useMesob } from '@mesob/ui/providers';\nimport { createTranslator } from '../lib/translations';\nimport { useConfig } from '../provider';\n\nexport function useTranslator(namespace?: string) {\n const mesob = useMesob();\n const { config } = useConfig();\n\n if (mesob?.t) {\n return (key: string, params?: Record<string, string | number>) =>\n mesob.t!(namespace ? `${namespace}.${key}` : key, params);\n }\n\n return createTranslator(config.messages || {}, namespace);\n}\n","type Messages = Record<string, unknown>;\n\nexport function createTranslator(messages: Messages, namespace?: string) {\n return (key: string, params?: Record<string, string | number>): string => {\n const fullKey = namespace ? `${namespace}.${key}` : key;\n const keys = fullKey.split('.');\n\n let value: unknown = messages;\n for (const k of keys) {\n if (value && typeof value === 'object' && value !== null) {\n value = (value as Record<string, unknown>)[k];\n } else {\n return fullKey;\n }\n }\n\n if (typeof value !== 'string') {\n return fullKey;\n }\n\n // Simple parameter replacement\n if (params) {\n return value.replace(/\\{(\\w+)\\}/g, (_, param) =>\n String(params[param] ?? `{${param}}`),\n );\n }\n\n return value;\n };\n}\n","'use client';\n\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { deepmerge } from 'deepmerge-ts';\nimport createFetchClient from 'openapi-fetch';\nimport createClient from 'openapi-react-query';\nimport type { ReactNode } from 'react';\nimport { createContext, useContext, useMemo, useState } from 'react';\nimport type { paths } from './data/openapi';\nimport { createTranslator } from './lib/translations';\nimport {\n type AuthClientConfig,\n type AuthResponse,\n defaultAuthClientConfig,\n type Session,\n type User,\n} from './types';\nimport { getSessionCookieName } from './utils/cookie';\nimport { createCustomFetch } from './utils/custom-fetch';\n\n// biome-ignore lint/suspicious/noExplicitAny: OpenAPI hooks type\ntype OpenApiHooks = any;\n\n// --- Utility: Check if running on server ---\nfunction isServer(): boolean {\n return typeof document === 'undefined';\n}\n\n/**\n * @deprecated Cookie is httpOnly and cannot be read client-side.\n * Use `useSession().isAuthenticated` instead.\n * This function always returns false on client.\n */\nexport function hasAuthCookie(_cookieName: string): boolean {\n // Cookie is httpOnly, can't check client-side\n // Always return false - use useSession() for auth status\n return false;\n}\n\n// --- Types ---\nexport type AuthStatus = 'loading' | 'authenticated' | 'unauthenticated';\n\ntype AuthState = {\n user: User | null;\n session: Session | null;\n status: AuthStatus;\n error: Error | null;\n};\n\ntype SessionContextValue = AuthState & {\n isLoading: boolean;\n isAuthenticated: boolean;\n refresh: () => Promise<void>;\n signOut: () => Promise<void>;\n};\n\ntype ApiContextValue = {\n hooks: OpenApiHooks;\n setAuth: (auth: AuthResponse) => void;\n clearAuth: () => void;\n refresh: () => Promise<void>;\n};\n\ntype ConfigContextValue = {\n config: AuthClientConfig;\n cookieName: string;\n t: (key: string, params?: Record<string, string | number>) => string;\n};\n\nconst SessionContext = createContext<SessionContextValue | null>(null);\nconst ApiContext = createContext<ApiContextValue | null>(null);\nconst ConfigContext = createContext<ConfigContextValue | null>(null);\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n },\n },\n});\n\n// --- Hooks ---\n\n/**\n * Get session state including user, session, and auth status.\n * - `status`: 'loading' | 'authenticated' | 'unauthenticated'\n * - `isLoading`: true while fetching session\n * - `isAuthenticated`: true if user and session exist\n */\nexport function useSession(): SessionContextValue {\n const context = useContext(SessionContext);\n if (!context) {\n throw new Error('useSession must be used within MesobAuthProvider');\n }\n return context;\n}\n\nexport function useApi(): ApiContextValue {\n const context = useContext(ApiContext);\n if (!context) {\n throw new Error('useApi must be used within MesobAuthProvider');\n }\n return context;\n}\n\nexport function useConfig(): ConfigContextValue {\n const context = useContext(ConfigContext);\n if (!context) {\n throw new Error('useConfig must be used within MesobAuthProvider');\n }\n return context;\n}\n\n/**\n * @deprecated Cookie is httpOnly, can't be checked client-side.\n * Use `useSession().isAuthenticated` instead.\n */\nexport function useHasAuthCookie(): boolean {\n const { status } = useSession();\n return status === 'authenticated' || status === 'loading';\n}\n\n// --- Provider ---\n\ntype MesobAuthProviderProps = {\n config: AuthClientConfig;\n children: ReactNode;\n};\n\nexport function MesobAuthProvider({\n config,\n children,\n}: MesobAuthProviderProps) {\n const mergedConfig = useMemo(\n () =>\n deepmerge(\n { ...defaultAuthClientConfig } as Partial<AuthClientConfig>,\n config,\n ) as AuthClientConfig,\n [config],\n );\n\n const api = useMemo(\n () =>\n createFetchClient<paths>({\n baseUrl: mergedConfig.baseURL,\n fetch: createCustomFetch(mergedConfig),\n }),\n [mergedConfig],\n );\n\n const hooks = useMemo(() => createClient(api), [api]);\n const cookieName = useMemo(\n () => getSessionCookieName(mergedConfig),\n [mergedConfig],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <AuthStateProvider\n config={mergedConfig}\n hooks={hooks}\n cookieName={cookieName}\n >\n {children}\n </AuthStateProvider>\n </QueryClientProvider>\n );\n}\n\ntype AuthStateProviderProps = {\n config: AuthClientConfig;\n hooks: OpenApiHooks;\n cookieName: string;\n children: ReactNode;\n};\n\nfunction AuthStateProvider({\n config,\n hooks,\n cookieName,\n children,\n}: AuthStateProviderProps) {\n // Manual override for sign-out / sign-in\n const [override, setOverride] = useState<AuthState | null>(null);\n\n // Always fetch session - cookie is httpOnly, can't check client-side\n // Server will read the cookie and return user/session if valid\n const {\n data: sessionData,\n isLoading,\n isFetched,\n error: sessionError,\n refetch,\n } = hooks.useQuery(\n 'get',\n '/session',\n {},\n {\n enabled: !(override || isServer()),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: false,\n gcTime: 0,\n staleTime: 0,\n },\n );\n\n // Derive state directly - no useEffect\n const user = override?.user ?? sessionData?.user ?? null;\n const session = override?.session ?? sessionData?.session ?? null;\n const error = override?.error ?? (sessionError as Error | null);\n\n // Check error status code\n const errorStatus = (() => {\n if (!sessionError) {\n return null;\n }\n const err = sessionError as { status?: number };\n return err.status ?? null;\n })();\n\n // Check if error is a network/connection error\n const isNetworkError = (() => {\n if (!sessionError) {\n return false;\n }\n const error = sessionError as Error & { cause?: unknown; data?: unknown };\n const errorMessage =\n error.message || String(error) || JSON.stringify(error);\n // Network errors: TypeError, DOMException, or fetch failures\n if (\n error instanceof TypeError ||\n error instanceof DOMException ||\n error.name === 'TypeError' ||\n errorMessage.includes('Failed to fetch') ||\n errorMessage.includes('ERR_CONNECTION_REFUSED') ||\n errorMessage.includes('NetworkError') ||\n errorMessage.includes('Network request failed') ||\n errorMessage.includes('fetch failed')\n ) {\n return true;\n }\n // Check error cause\n if (error.cause) {\n const causeStr = String(error.cause);\n if (\n causeStr.includes('Failed to fetch') ||\n causeStr.includes('ERR_CONNECTION_REFUSED') ||\n causeStr.includes('NetworkError')\n ) {\n return true;\n }\n }\n return false;\n })();\n\n // Compute status\n // biome-ignore lint: Status determination requires multiple checks\n const status: AuthStatus = (() => {\n if (override) {\n return override.status;\n }\n if (isServer()) {\n return 'loading';\n }\n if (user && session) {\n return 'authenticated';\n }\n // Check for network errors or auth errors first - allow auth page to show\n if (isNetworkError || errorStatus === 401) {\n return 'unauthenticated';\n }\n // If we have an error but it's not a network error, still check loading state\n if (sessionError && !isNetworkError && errorStatus !== 401) {\n if (errorStatus && errorStatus >= 500) {\n return 'authenticated';\n }\n // Other errors mean unauthenticated\n if (isFetched) {\n return 'unauthenticated';\n }\n }\n if (isLoading || !isFetched) {\n return 'loading';\n }\n if (isFetched && !user && !session) {\n return 'unauthenticated';\n }\n return 'unauthenticated';\n })();\n\n const signOutMutation = hooks.useMutation('post', '/sign-out');\n const t = createTranslator(config.messages || {});\n\n const setAuth = (auth: AuthResponse) => {\n setOverride({\n user: auth.user,\n session: auth.session,\n status: 'authenticated',\n error: null,\n });\n };\n\n const clearAuth = () => {\n setOverride({\n user: null,\n session: null,\n status: 'unauthenticated',\n error: null,\n });\n };\n\n const refresh = async () => {\n setOverride(null);\n await refetch();\n };\n\n const signOut = async () => {\n try {\n await signOutMutation.mutateAsync({});\n } finally {\n clearAuth();\n }\n };\n\n return (\n <ConfigContext.Provider value={{ config, cookieName, t }}>\n <ApiContext.Provider value={{ hooks, setAuth, clearAuth, refresh }}>\n <SessionContext.Provider\n value={{\n user,\n session,\n status,\n error,\n isLoading: status === 'loading',\n isAuthenticated: status === 'authenticated',\n refresh,\n signOut,\n }}\n >\n {children}\n </SessionContext.Provider>\n </ApiContext.Provider>\n </ConfigContext.Provider>\n );\n}\n","export type UIConfig = {\n logo: React.ReactNode;\n name: React.ReactNode;\n logoImage?: string;\n};\n\nexport type FeaturesConfig = {\n enableSignup?: boolean;\n enablePasswordReset?: boolean;\n enableEmailSignup?: boolean;\n enablePhoneSignup?: boolean;\n enableSocialSignup?: boolean;\n socialProviders?: string[];\n};\n\nexport type TenantConfig = {\n enabled: boolean;\n tenantId: string;\n};\n\nexport type NavigationConfig = {\n locale?: string;\n defaultRedirectUrl?: string;\n onNavigate?: (path: string) => void;\n linkComponent?: React.ComponentType<\n React.ComponentProps<'a'> & { href: string }\n >;\n links?: {\n signIn?: string;\n signUp?: string;\n forgotPassword?: string;\n };\n};\n\nexport type AuthClientConfig = {\n baseURL: string;\n ui: UIConfig;\n features?: FeaturesConfig;\n tenant?: TenantConfig;\n navigation?: NavigationConfig;\n messages?: Record<string, unknown>;\n cookiePrefix?: string;\n phoneRegex?: RegExp | string;\n};\n\ntype DefaultAuthClientConfig = {\n readonly features: {\n readonly enableSignup: true;\n readonly enablePasswordReset: true;\n readonly enableEmailSignup: true;\n readonly enablePhoneSignup: true;\n readonly enableSocialSignup: false;\n readonly socialProviders: [];\n };\n readonly navigation: {\n readonly locale: 'en';\n };\n readonly cookiePrefix: 'msb';\n readonly phoneRegex: RegExp;\n};\n\nexport const defaultAuthClientConfig: DefaultAuthClientConfig = {\n features: {\n enableSignup: true,\n enablePasswordReset: true,\n enableEmailSignup: true,\n enablePhoneSignup: true,\n enableSocialSignup: false,\n socialProviders: [],\n },\n navigation: {\n locale: 'en',\n },\n cookiePrefix: 'msb',\n phoneRegex: /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/,\n} as const;\n\nexport type UserRole = {\n id: string;\n roleId: string;\n code: string;\n name: string;\n description: string;\n};\nexport type User = {\n id: string;\n tenantId: string;\n fullName: string;\n email: string | null;\n phone: string | null;\n handle: string;\n image: string | null;\n emailVerified: boolean;\n phoneVerified: boolean;\n lastSignInAt: string | null;\n userRoles?: UserRole[];\n};\n\nexport type Session = {\n id: string;\n expiresAt: string;\n createdAt?: string;\n userAgent: string | null;\n ip: string | null;\n};\n\nexport type AuthResponse = {\n user: User;\n session: Session;\n sessionToken: string;\n sessionExpiresAt: string;\n};\n\nexport type AuthErrorCode =\n | 'USER_NOT_FOUND'\n | 'INVALID_PASSWORD'\n | 'USER_EXISTS'\n | 'VERIFICATION_EXPIRED'\n | 'VERIFICATION_MISMATCH'\n | 'VERIFICATION_NOT_FOUND'\n | 'TOO_MANY_ATTEMPTS'\n | 'REQUIRES_VERIFICATION'\n | 'UNAUTHORIZED'\n | 'ACCESS_DENIED'\n | 'HAS_NO_PASSWORD';\n\nexport type AuthError = {\n message: string;\n code?: AuthErrorCode;\n status?: number;\n details?: Record<string, unknown>;\n};\n","import type { AuthClientConfig } from '../types';\n\nconst isProduction =\n typeof process !== 'undefined' && process.env.NODE_ENV === 'production';\n\nexport const getSessionCookieName = (config: AuthClientConfig): string => {\n const prefix = config.cookiePrefix || '';\n const baseName = 'session_token';\n if (prefix) {\n return `${prefix}_${baseName}`;\n }\n return isProduction ? '__Host-session_token' : baseName;\n};\n","import type { AuthClientConfig } from '../types';\n\nexport const createCustomFetch = (_config: AuthClientConfig) => {\n return (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n if (input instanceof Request) {\n return fetch(input, { ...init, credentials: 'include' });\n }\n return fetch(input, { ...init, credentials: 'include' });\n };\n};\n","export const AUTH_ERROR_MAPPING: Record<\n string,\n { title: string; description: string }\n> = {\n USER_NOT_FOUND: {\n title: 'Account Not Found',\n description:\n 'We could not find an account with that identifier. Please check your spelling or sign up.',\n },\n INVALID_PASSWORD: {\n title: 'Invalid Password',\n description: 'The password you entered is incorrect. Please try again.',\n },\n USER_EXISTS: {\n title: 'Account Already Exists',\n description:\n 'An account with this identifier already exists. Please sign in instead.',\n },\n VERIFICATION_EXPIRED: {\n title: 'Verification Expired',\n description:\n 'The verification code or link has expired. Please request a new one.',\n },\n VERIFICATION_MISMATCH: {\n title: 'Invalid Code',\n description:\n 'The verification code you entered is invalid. Please double-check and try again.',\n },\n VERIFICATION_NOT_FOUND: {\n title: 'Verification Not Found',\n description:\n 'We could not find a pending verification request. Please restart the process.',\n },\n TOO_MANY_ATTEMPTS: {\n title: 'Too Many Attempts',\n description:\n 'You have made too many requests recently. Please wait a moment before trying again.',\n },\n REQUIRES_VERIFICATION: {\n title: 'Verification Required',\n description:\n 'You need to verify your account before you can continue. Please check your email or phone.',\n },\n UNAUTHORIZED: {\n title: 'Unauthorized',\n description:\n 'You are not authorized to perform this action. Please sign in again.',\n },\n ACCESS_DENIED: {\n title: 'Access Denied',\n description:\n 'You do not have permission to access this resource. Please contact support if you believe this is an error.',\n },\n HAS_NO_PASSWORD: {\n title: 'No Password Set',\n description:\n 'Your account does not have a password set (e.g. social login). Please sign in with your provider or reset your password.',\n },\n};\n\nexport const validCodes = Object.keys(AUTH_ERROR_MAPPING);\n","import { AUTH_ERROR_MAPPING, validCodes } from '../constants/auth.error.codes';\nimport type { AuthError } from '../types';\n\nexport type AuthErrorContent = {\n title: string;\n description: string;\n};\n\n// Translator function type\ntype TranslatorFunction = (\n key: string,\n params?: Record<string, string | number>,\n) => string;\n\n// Type guard to check if error is an AuthError\nfunction isAuthError(err: unknown): err is AuthError {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'message' in err &&\n typeof (err as { message: unknown }).message === 'string'\n );\n}\n\nfunction extractErrorCode(err: AuthError): string {\n if (err.code && validCodes.includes(err.code)) {\n return err.code;\n }\n if (err.message) {\n const messageUpper = err.message.toUpperCase().trim();\n if (validCodes.includes(messageUpper)) {\n return messageUpper;\n }\n }\n return '';\n}\n\nfunction sanitizeErrorMessage(message: string): string {\n const lowerMessage = message.toLowerCase();\n const isDatabaseError =\n lowerMessage.includes('failed query') ||\n lowerMessage.includes('select') ||\n lowerMessage.includes('insert') ||\n lowerMessage.includes('update') ||\n lowerMessage.includes('delete') ||\n lowerMessage.includes('from') ||\n lowerMessage.includes('where') ||\n lowerMessage.includes('limit') ||\n lowerMessage.includes('params:') ||\n lowerMessage.includes('query') ||\n message.includes('\"iam\".') ||\n message.includes('\"tenants\"') ||\n message.includes('\"users\"') ||\n message.includes('\"sessions\"') ||\n message.includes('\"accounts\"') ||\n lowerMessage.includes('relation') ||\n lowerMessage.includes('column') ||\n lowerMessage.includes('syntax error') ||\n lowerMessage.includes('database') ||\n lowerMessage.includes('postgres') ||\n lowerMessage.includes('sql');\n\n if (isDatabaseError) {\n return 'An error occurred while processing your request';\n }\n\n return message;\n}\n\nfunction handleAuthError(\n err: AuthError,\n setError: (error: AuthErrorContent | null) => void,\n t: TranslatorFunction,\n) {\n const errorCode = extractErrorCode(err);\n\n if (errorCode && AUTH_ERROR_MAPPING[errorCode]) {\n const mapping = AUTH_ERROR_MAPPING[errorCode];\n setError({\n title: mapping.title,\n description: mapping.description,\n });\n return;\n }\n\n const sanitizedMessage = sanitizeErrorMessage(\n err.message || t('errors.fallback'),\n );\n setError({\n title: t('errors.fallback'),\n description: sanitizedMessage,\n });\n}\n\nfunction handleGenericError(\n err: unknown,\n setError: (error: AuthErrorContent | null) => void,\n t: TranslatorFunction,\n) {\n const rawMessage = err instanceof Error ? err.message : t('errors.fallback');\n const sanitizedMessage = sanitizeErrorMessage(rawMessage);\n setError({\n title: 'Error',\n description: sanitizedMessage,\n });\n}\n\nexport const handleError = (\n err: unknown,\n setError: (error: AuthErrorContent | null) => void,\n t: TranslatorFunction,\n) => {\n if (isAuthError(err)) {\n handleAuthError(err, setError, t);\n } else {\n handleGenericError(err, setError, t);\n }\n};\n","'use client';\n\nimport type { ReactNode } from 'react';\n\ntype AuthLayoutProps = {\n title: string;\n description?: string;\n children: ReactNode;\n footer?: ReactNode;\n logoImage?: string;\n};\n\nexport const AuthLayout = ({\n title,\n description,\n children,\n footer,\n logoImage,\n}: AuthLayoutProps) => {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex size-8 mb-6 w-full items-center justify-center rounded-md\">\n {/** biome-ignore lint/performance/noImgElement: logo image */}\n <img src={logoImage || ''} alt=\"Mesob\" width={42} height={42} />\n </div>\n <div className=\"text-center\">\n <h1 className=\"text-2xl font-bold tracking-tight\">{title}</h1>\n {description && (\n <p className=\"mt-2 text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n\n {children}\n\n <div className=\"mt-2 w-full\">\n {footer && (\n <div className=\"w-full text-center text-sm text-muted-foreground\">\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n Button,\n Field,\n FieldError,\n FieldGroup,\n FieldLabel,\n Input,\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n Spinner,\n} from '@mesob/ui/components';\nimport { useMesob } from '@mesob/ui/providers';\nimport { IconAlertCircle, IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { AuthLayout } from './auth-layout';\n\ntype ResetPasswordFormValues = {\n code: string;\n password: string;\n confirmPassword: string;\n};\n\ntype ResetPasswordFormProps = {\n verificationId: string;\n redirectUrl?: string;\n};\n\nconst resetPasswordSchema = (t: (key: string) => string) =>\n z\n .object({\n code: z.string().length(6, t('errors.codeLength')),\n password: z.string().min(8, t('errors.passwordLength')),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: t('errors.passwordsMismatch'),\n path: ['confirmPassword'],\n });\n\nexport const ResetPasswordForm = ({\n verificationId,\n redirectUrl,\n}: ResetPasswordFormProps) => {\n const { hooks, refresh } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const Link = mesob?.navigation?.Link;\n const t = useTranslator('Auth.resetPassword');\n const common = useTranslator('Common');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n const [showPassword, setShowPassword] = useState(false);\n\n const resetPasswordMutation = hooks.useMutation('post', '/password/reset');\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const forgotPasswordLink =\n config.navigation?.links?.forgotPassword || '/auth/forgot-password';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/';\n\n const form = useForm<ResetPasswordFormValues>({\n resolver: zodResolver(resetPasswordSchema(t)),\n defaultValues: {\n code: '',\n password: '',\n confirmPassword: '',\n },\n });\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n if (!verificationId) {\n setError({\n title: t('errors.fallback'),\n description: t('errors.missingVerificationId'),\n });\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await resetPasswordMutation.mutateAsync({\n body: {\n verificationId,\n code: values.code,\n password: values.password,\n },\n });\n await refresh();\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n });\n\n if (!verificationId) {\n return (\n <AuthLayout\n title={common('invalidLinkTitle')}\n description={common('invalidLinkDescription')}\n logoImage={logoImage}\n footer={\n <Link\n href={forgotPasswordLink}\n className=\"text-primary hover:underline\"\n >\n {t('footer.requestNew')}\n </Link>\n }\n >\n <div />\n </AuthLayout>\n );\n }\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n return (\n <AuthLayout\n title={t('title')}\n description={t('description')}\n logoImage={logoImage}\n footer={\n <div className=\"flex items-center justify-between w-full gap-2\">\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {t('footer.backToSignIn')}\n </Link>\n <Link\n href={forgotPasswordLink}\n className=\"text-primary hover:underline\"\n >\n {t('footer.changeAccount')}\n </Link>\n </div>\n }\n >\n <form id=\"reset-password-form\" onSubmit={handleSubmit}>\n <FieldGroup>\n <Controller\n name=\"code\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <div className=\"flex justify-center\">\n <FieldLabel>{t('form.codeLabel')}</FieldLabel>\n </div>\n <div className=\"flex mt-2 justify-center\">\n <InputOTP\n maxLength={6}\n value={field.value}\n onChange={field.onChange}\n onBlur={field.onBlur}\n containerClassName=\"gap-4\"\n aria-invalid={fieldState.invalid}\n >\n <InputOTPGroup className=\"gap-3 *:data-[slot=input-otp-slot]:h-12 *:data-[slot=input-otp-slot]:w-12 *:data-[slot=input-otp-slot]:rounded-md *:data-[slot=input-otp-slot]:border *:data-[slot=input-otp-slot]:text-xl\">\n <InputOTPSlot className=\"h-12\" index={0} />\n <InputOTPSlot className=\"h-12\" index={1} />\n <InputOTPSlot className=\"h-12\" index={2} />\n <InputOTPSlot className=\"h-12\" index={3} />\n <InputOTPSlot className=\"h-12\" index={4} />\n <InputOTPSlot className=\"h-12\" index={5} />\n </InputOTPGroup>\n </InputOTP>\n </div>\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n <Controller\n name=\"password\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"reset-password-password\">\n {t('form.passwordLabel')}\n </FieldLabel>\n <div className=\"relative\">\n <Input\n {...field}\n id=\"reset-password-password\"\n type={showPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n aria-invalid={fieldState.invalid}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n <Controller\n name=\"confirmPassword\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"reset-password-confirmPassword\">\n {t('form.confirmPasswordLabel')}\n </FieldLabel>\n <div className=\"relative\">\n <Input\n {...field}\n id=\"reset-password-confirmPassword\"\n type={showPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n aria-invalid={fieldState.invalid}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n </FieldGroup>\n <div className=\"mt-4\">\n <Button\n type=\"submit\"\n form=\"reset-password-form\"\n className=\"w-full\"\n disabled={isLoading || resetPasswordMutation.isPending}\n >\n {isLoading || (resetPasswordMutation.isPending && <Spinner />)}\n {isLoading || resetPasswordMutation.isPending\n ? t('form.submitting')\n : t('form.submit')}\n </Button>\n </div>\n </form>\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n Button,\n Field,\n FieldError,\n FieldGroup,\n FieldLabel,\n Input,\n Spinner,\n} from '@mesob/ui/components';\nimport { useMesob } from '@mesob/ui/providers';\nimport { IconAlertCircle, IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { normalizePhone } from '../../utils/normalize-phone';\nimport { AuthLayout } from './auth-layout';\n\nconst isPhone = (s: string) => /^\\+?[0-9()[\\]\\s-]{6,}$/.test(s);\n\ntype SignInProps = {\n redirectUrl?: string;\n};\n\nconst usernameSchema = (t: (key: string) => string, phoneRegex: RegExp) =>\n z.object({\n username: z\n .string()\n .trim()\n .min(1, { message: t('errors.requiredField') })\n .refine(\n (val) => {\n const isEmail = z.email().safeParse(val).success;\n const isPhone = phoneRegex.test(val);\n return isEmail || isPhone;\n },\n {\n message: t('errors.invalidEmailOrPhone'),\n },\n ),\n });\n\nconst passwordSchema = (t: (key: string) => string) =>\n z.object({\n password: z\n .string()\n .min(8, t('errors.passwordLength'))\n .max(128, t('errors.longPasswordError')),\n });\n\nexport const SignIn = ({ redirectUrl }: SignInProps = {}) => {\n const { hooks, setAuth } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const t = useTranslator('Auth.signIn');\n const Link = mesob?.navigation?.Link;\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n const [showPasswordField, setShowPasswordField] = useState(false);\n const [showPassword, setShowPassword] = useState(false);\n const [username, setUsername] = useState('');\n const [isChecking, setIsChecking] = useState(false);\n\n const checkUserMutation = hooks.useMutation('post', '/check-account');\n const signInMutation = hooks.useMutation('post', '/sign-in');\n\n const phoneRegex =\n typeof config.phoneRegex === 'string'\n ? new RegExp(config.phoneRegex)\n : config.phoneRegex || /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/;\n\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/dashboard';\n const forgotPasswordLink =\n config.navigation?.links?.forgotPassword || '/auth/forgot-password';\n const signUpLink = config.navigation?.links?.signUp || '/auth/sign-up';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n\n const usernameForm = useForm<{ username: string }>({\n resolver: zodResolver(usernameSchema(t, phoneRegex)),\n defaultValues: { username: '' },\n mode: 'onChange',\n });\n\n const passwordForm = useForm<{ password: string }>({\n resolver: zodResolver(passwordSchema(t)),\n defaultValues: { password: '' },\n mode: 'onChange',\n });\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleCheckAccount = async (usernameValue: string) => {\n setIsChecking(true);\n try {\n const normalizedUsername = phoneRegex.test(usernameValue)\n ? normalizePhone(usernameValue)\n : usernameValue;\n\n const result = await checkUserMutation.mutateAsync({\n body: {\n username: normalizedUsername,\n },\n });\n\n if (result.exists) {\n setUsername(normalizedUsername);\n setShowPasswordField(true);\n } else {\n const email = isPhone(normalizedUsername) ? '' : normalizedUsername;\n if (email) {\n onNavigate(`${signUpLink}?email=${encodeURIComponent(email)}`);\n } else {\n onNavigate(\n `${signUpLink}?phone=${encodeURIComponent(normalizedUsername)}`,\n );\n }\n }\n } catch {\n usernameForm.setError('username', {\n message: t('errors.checkAccountFailed'),\n });\n } finally {\n setIsChecking(false);\n }\n };\n\n const handleUsernameSubmit = async (values: { username: string }) => {\n await handleCheckAccount(values.username);\n };\n\n const handlePasswordSubmit = async (values: { password: string }) => {\n setIsLoading(true);\n setError(null);\n\n try {\n const res = await signInMutation.mutateAsync({\n body: {\n identifier: username,\n password: values.password,\n },\n });\n\n if ('verificationId' in res && res.verificationId) {\n const verifyPath = isPhone(username)\n ? `/auth/verify-phone?context=sign-in&verificationId=${res.verificationId}&identifier=${encodeURIComponent(username)}`\n : `/auth/verify-email?verificationId=${res.verificationId}`;\n onNavigate(verifyPath);\n return;\n }\n\n if ('user' in res && 'session' in res) {\n setAuth(res);\n }\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleBack = () => {\n setShowPasswordField(false);\n setUsername('');\n passwordForm.reset();\n };\n\n const isSubmitting =\n isLoading ||\n checkUserMutation.isPending ||\n signInMutation.isPending ||\n isChecking;\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n const formContent = showPasswordField ? (\n <form\n id=\"sign-in-form\"\n onSubmit={passwordForm.handleSubmit(handlePasswordSubmit)}\n >\n <FieldGroup>\n <div className=\"text-center mb-4\">\n <p className=\"text-sm text-muted-foreground mb-1\">\n {t('form.enterPasswordFor')}\n </p>\n <p className=\"font-medium text-foreground\">{username}</p>\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"text-sm text-primary hover:underline mt-2\"\n >\n {t('changeAccount')}\n </button>\n </div>\n <Controller\n name=\"password\"\n control={passwordForm.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"sign-in-password\">\n {t('form.passwordLabel')}\n </FieldLabel>\n <div className=\"relative\">\n <Input\n {...field}\n id=\"sign-in-password\"\n type={showPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n autoComplete=\"current-password\"\n aria-invalid={fieldState.invalid}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {fieldState.invalid && <FieldError errors={[fieldState.error]} />}\n </Field>\n )}\n />\n </FieldGroup>\n <div className=\"mt-4\">\n <Button type=\"submit\" className=\"w-full\" disabled={isSubmitting}>\n {isSubmitting && <Spinner />}\n {isSubmitting ? t('form.submitting') : t('form.submit')}\n </Button>\n </div>\n </form>\n ) : (\n <form\n id=\"sign-in-form\"\n onSubmit={usernameForm.handleSubmit(handleUsernameSubmit)}\n >\n <FieldGroup>\n <Controller\n name=\"username\"\n control={usernameForm.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"sign-in-username\">\n {t('form.accountLabel')}\n </FieldLabel>\n <Input\n {...field}\n id=\"sign-in-username\"\n type=\"text\"\n placeholder={t('form.accountPlaceholder')}\n autoComplete=\"username\"\n aria-invalid={fieldState.invalid}\n />\n {fieldState.invalid && <FieldError errors={[fieldState.error]} />}\n </Field>\n )}\n />\n </FieldGroup>\n <div className=\"mt-4\">\n <Button type=\"submit\" className=\"w-full\" disabled={isSubmitting}>\n {isSubmitting && <Spinner />}\n {isSubmitting ? t('form.submitting') : t('form.continue')}\n </Button>\n </div>\n </form>\n );\n\n return (\n <div className=\"space-y-4\">\n <AuthLayout\n title={t('title')}\n description={t('description')}\n logoImage={logoImage}\n footer={\n showPasswordField ? (\n <div className=\"flex items-center justify-center w-full\">\n {Link ? (\n <Link\n href={forgotPasswordLink}\n className=\"text-primary inline-block hover:underline\"\n >\n {t('footer.forgotPassword')}\n </Link>\n ) : (\n <a\n href={forgotPasswordLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(forgotPasswordLink);\n }}\n className=\"text-primary inline-block hover:underline\"\n >\n {t('footer.forgotPassword')}\n </a>\n )}\n </div>\n ) : undefined\n }\n >\n {formContent}\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n </div>\n );\n};\n","export function normalizePhone(phone: string): string {\n const cleaned = phone.trim().replace(/\\s/g, '');\n if (cleaned.startsWith('+2519') || cleaned.startsWith('+2517')) {\n return cleaned;\n }\n if (cleaned.startsWith('2519') || cleaned.startsWith('2517')) {\n return `+${cleaned}`;\n }\n if (cleaned.startsWith('09') || cleaned.startsWith('07')) {\n return `+251${cleaned.slice(1)}`;\n }\n if (\n (cleaned.startsWith('9') || cleaned.startsWith('7')) &&\n cleaned.length === 9\n ) {\n return `+251${cleaned}`;\n }\n return cleaned;\n}\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n Button,\n Field,\n FieldError,\n FieldGroup,\n FieldLabel,\n Input,\n} from '@mesob/ui/components';\nimport { useMesob } from '@mesob/ui/providers';\nimport { IconAlertCircle, IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { AuthLayout } from './auth-layout';\n\nconst isPhone = (s: string) => /^\\+?[0-9()[\\]\\s-]{6,}$/.test(s);\n\ntype SignUpFormValues = {\n fullName: string;\n identifier: string;\n handle?: string;\n password: string;\n confirmPassword: string;\n};\n\ntype SignUpProps = {\n redirectUrl?: string;\n initialIdentifier?: string;\n};\n\nconst signUpSchema = (t: (key: string) => string) =>\n z\n .object({\n fullName: z.string().min(1, t('errors.fullNameRequired')),\n identifier: z\n .string()\n .min(1, t('errors.contactRequired'))\n .refine(\n (val) => {\n if (!val) {\n return false;\n }\n return val.includes('@') || isPhone(val);\n },\n {\n message: t('errors.invalidEmailOrPhone'),\n },\n ),\n password: z\n .string()\n .min(8, t('errors.passwordLength'))\n .max(128, t('errors.longPasswordError')),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: t('errors.passwordsMismatch'),\n path: ['confirmPassword'],\n });\n\nexport const SignUp = ({\n redirectUrl,\n initialIdentifier,\n}: SignUpProps = {}) => {\n const { hooks, setAuth } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const t = useTranslator('Auth.signUp');\n const Link = mesob?.navigation?.Link;\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n\n const signUpMutation = hooks.useMutation('post', '/sign-up');\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/';\n\n const hasInitialIdentifier = !!initialIdentifier;\n\n const form = useForm<SignUpFormValues>({\n resolver: zodResolver(signUpSchema(t)),\n defaultValues: {\n fullName: '',\n identifier: initialIdentifier || '',\n password: '',\n confirmPassword: '',\n },\n });\n\n useEffect(() => {\n if (initialIdentifier) {\n form.setValue('identifier', initialIdentifier);\n }\n }, [initialIdentifier, form]);\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = form.handleSubmit(async (values) => {\n setIsLoading(true);\n setError(null);\n\n try {\n const identifier = values.identifier;\n const usingPhone = isPhone(identifier);\n\n const res = await signUpMutation.mutateAsync({\n body: usingPhone\n ? {\n phone: identifier,\n password: values.password,\n fullName: values.fullName,\n handle: values.handle,\n }\n : {\n email: identifier,\n password: values.password,\n fullName: values.fullName,\n handle: values.handle,\n },\n });\n\n if ('verificationId' in res && res.verificationId) {\n if (usingPhone) {\n onNavigate(\n `/auth/verify-phone?context=sign-up&verificationId=${res.verificationId}&phone=${encodeURIComponent(identifier)}`,\n );\n } else {\n onNavigate(\n `/auth/verify-email?verificationId=${res.verificationId}&email=${encodeURIComponent(identifier)}`,\n );\n }\n return;\n }\n\n if ('user' in res && 'session' in res) {\n setAuth(res);\n }\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n });\n\n const getIdentifierLabel = () => {\n if (!hasInitialIdentifier) {\n return t('form.accountLabel') || 'Email/Phone';\n }\n if (initialIdentifier?.includes('@')) {\n return t('form.emailLabel');\n }\n return t('form.phoneLabel');\n };\n const identifierLabel = getIdentifierLabel();\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n return (\n <AuthLayout\n title={t('title')}\n description={t('description')}\n logoImage={logoImage}\n footer={\n <p>\n {t('footer.hasAccount')}{' '}\n {Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {t('footer.signInCta')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {t('footer.signInCta')}\n </a>\n )}\n </p>\n }\n >\n <form id=\"sign-up-form\" onSubmit={handleSubmit}>\n <FieldGroup>\n <Controller\n name=\"fullName\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"sign-up-fullName\">\n {t('form.fullNameLabel')}\n </FieldLabel>\n <Input\n {...field}\n id=\"sign-up-fullName\"\n placeholder={t('form.fullNamePlaceholder')}\n aria-invalid={fieldState.invalid}\n />\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n <Controller\n name=\"identifier\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel\n htmlFor=\"sign-up-identifier\"\n className={hasInitialIdentifier ? 'block' : undefined}\n >\n {identifierLabel}\n </FieldLabel>\n <Input\n {...field}\n id=\"sign-up-identifier\"\n type={field.value.includes('@') ? 'email' : 'tel'}\n placeholder={\n hasInitialIdentifier\n ? undefined\n : t('form.accountPlaceholder') || 'Email or phone number'\n }\n disabled={hasInitialIdentifier}\n aria-invalid={fieldState.invalid}\n />\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n <Controller\n name=\"password\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"sign-up-password\">\n {t('form.passwordLabel')}\n </FieldLabel>\n <div className=\"relative\">\n <Input\n {...field}\n id=\"sign-up-password\"\n type={showPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n aria-invalid={fieldState.invalid}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n <Controller\n name=\"confirmPassword\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"sign-up-confirmPassword\">\n {t('form.confirmPasswordLabel')}\n </FieldLabel>\n <div className=\"relative\">\n <Input\n {...field}\n id=\"sign-up-confirmPassword\"\n type={showConfirmPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n aria-invalid={fieldState.invalid}\n />\n <button\n type=\"button\"\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showConfirmPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {fieldState.invalid && (\n <FieldError errors={[fieldState.error]} />\n )}\n </Field>\n )}\n />\n </FieldGroup>\n <div className=\"mt-4\">\n <Button\n type=\"submit\"\n form=\"sign-up-form\"\n className=\"w-full\"\n disabled={isLoading || signUpMutation.isPending}\n >\n {isLoading || signUpMutation.isPending\n ? t('form.submitting')\n : t('form.submit')}\n </Button>\n </div>\n </form>\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Button,\n Field,\n FieldError,\n FieldGroup,\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n Spinner,\n} from '@mesob/ui/components';\nimport { Controller, useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { Countdown } from './countdown';\n\ntype VerificationFormValues = {\n code: string;\n};\n\ntype VerificationFormProps = {\n verificationId: string;\n onSubmit: (values: VerificationFormValues) => Promise<void> | void;\n onResend: () => Promise<void> | void;\n isLoading?: boolean;\n error?: AuthErrorContent | string | null;\n};\n\nconst verificationSchema = (t: (key: string) => string) =>\n z.object({\n code: z.string().length(6, t('form.codeLength')),\n });\n\nexport const VerificationForm = ({\n onSubmit,\n onResend,\n isLoading = false,\n}: VerificationFormProps) => {\n const t = useTranslator('Auth.verification');\n const form = useForm<VerificationFormValues>({\n resolver: zodResolver(verificationSchema(t)),\n defaultValues: {\n code: '',\n },\n });\n\n const handleSubmit = form.handleSubmit(async (values) => {\n await onSubmit(values);\n });\n\n return (\n <form id=\"verification-form\" onSubmit={handleSubmit}>\n <FieldGroup>\n <Controller\n name=\"code\"\n control={form.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <div className=\"flex justify-center\">\n <InputOTP\n maxLength={6}\n id=\"otp\"\n required\n value={field.value ?? ''}\n onChange={field.onChange}\n onBlur={field.onBlur}\n containerClassName=\"gap-4 justify-center mb-2 flex items-center\"\n aria-invalid={fieldState.invalid}\n >\n <InputOTPGroup className=\"gap-3 *:data-[slot=input-otp-slot]:h-12 *:data-[slot=input-otp-slot]:w-12 *:data-[slot=input-otp-slot]:rounded-md *:data-[slot=input-otp-slot]:border *:data-[slot=input-otp-slot]:text-xl\">\n <InputOTPSlot className=\"h-12\" index={0} />\n <InputOTPSlot className=\"h-12\" index={1} />\n <InputOTPSlot className=\"h-12\" index={2} />\n <InputOTPSlot className=\"h-12\" index={3} />\n <InputOTPSlot className=\"h-12\" index={4} />\n <InputOTPSlot className=\"h-12\" index={5} />\n </InputOTPGroup>\n </InputOTP>\n </div>\n {fieldState.invalid && <FieldError errors={[fieldState.error]} />}\n </Field>\n )}\n />\n </FieldGroup>\n <div className=\"flex justify-between items-center mt-4\">\n <Countdown onResend={onResend} resending={isLoading} />\n <Button\n type=\"submit\"\n form=\"verification-form\"\n disabled={isLoading || form.watch('code').length !== 6}\n >\n {isLoading && <Spinner />}\n {t('form.confirm')}\n </Button>\n </div>\n </form>\n );\n};\n","'use client';\n\nimport { Button, Spinner } from '@mesob/ui/components';\nimport { useEffect, useState } from 'react';\nimport { useTranslator } from '../../hooks/use-translator';\n\ntype CountdownProps = {\n initialSeconds?: number;\n onResend: () => Promise<void> | void;\n resending?: boolean;\n};\n\nexport const Countdown = ({\n initialSeconds = 60,\n onResend,\n resending = false,\n}: CountdownProps) => {\n const t = useTranslator('Common');\n const [seconds, setSeconds] = useState(initialSeconds);\n const [isResending, setIsResending] = useState(false);\n\n useEffect(() => {\n if (seconds <= 0) {\n return;\n }\n\n const timer = setInterval(() => {\n setSeconds((prev) => {\n if (prev <= 1) {\n clearInterval(timer);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [seconds]);\n\n const handleResend = async () => {\n setIsResending(true);\n try {\n await onResend();\n setSeconds(initialSeconds);\n } catch (_error) {\n // Error handling is done by parent\n } finally {\n setIsResending(false);\n }\n };\n\n if (seconds > 0) {\n return (\n <Button variant=\"ghost\" disabled>\n {t('resendIn', { seconds })}\n </Button>\n );\n }\n\n return (\n <Button\n variant=\"ghost\"\n onClick={handleResend}\n disabled={isResending || resending}\n >\n {isResending || (resending && <Spinner />)}\n {t('resend')}\n </Button>\n );\n};\n","'use client';\n\nimport { Alert, AlertDescription, AlertTitle } from '@mesob/ui/components';\nimport { useMesob } from '@mesob/ui/providers';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { toast } from 'sonner';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { AuthLayout } from './auth-layout';\nimport { VerificationForm } from './verification-form';\n\ntype VerifyEmailProps = {\n verificationId: string;\n email: string;\n redirectUrl?: string;\n};\n\nexport const VerifyEmail = ({\n verificationId,\n email,\n redirectUrl,\n}: VerifyEmailProps) => {\n const { hooks, setAuth } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const t = useTranslator('Auth.verification');\n const common = useTranslator('Common');\n const footer = useTranslator('Auth.forgotPassword.footer');\n const Link = mesob?.navigation?.Link;\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const verifyEmailMutation = hooks.useMutation(\n 'post',\n '/email/verification/confirm',\n );\n const requestEmailMutation = hooks.useMutation(\n 'post',\n '/email/verification/request',\n );\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/';\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = async (values: { code: string }) => {\n if (!verificationId) {\n setError({\n title: t('errors.fallback'),\n description: t('errors.missingVerificationId'),\n });\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const res = await verifyEmailMutation.mutateAsync({\n body: {\n verificationId,\n code: values.code,\n },\n });\n if ('user' in res && 'session' in res) {\n setAuth(res);\n }\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleResend = async () => {\n setError(null);\n try {\n const res = await requestEmailMutation.mutateAsync({\n body: {\n email,\n },\n });\n if (res.verificationId) {\n onNavigate(\n `/auth/verify-email?verificationId=${res.verificationId}&email=${encodeURIComponent(email)}`,\n );\n } else {\n setError({\n title: t('errors.fallback'),\n description: t('errors.resendFailed'),\n });\n }\n } catch (err) {\n handleError(err, setError, t);\n }\n };\n\n if (!verificationId) {\n return (\n <AuthLayout\n title={common('invalidLinkTitle')}\n description={common('invalidLinkDescription')}\n footer={\n Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {footer('backToSignIn')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {footer('backToSignIn')}\n </a>\n )\n }\n >\n <div />\n </AuthLayout>\n );\n }\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n return (\n <AuthLayout\n title={t('email.title')}\n description={t('email.description')}\n logoImage={logoImage}\n footer={\n Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {footer('backToSignIn')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {footer('backToSignIn')}\n </a>\n )\n }\n >\n <VerificationForm\n verificationId={verificationId}\n onSubmit={handleSubmit}\n onResend={handleResend}\n isLoading={\n isLoading ||\n verifyEmailMutation.isPending ||\n requestEmailMutation.isPending\n }\n error={error}\n />\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n );\n};\n","'use client';\n\nimport { Alert, AlertDescription, AlertTitle } from '@mesob/ui/components';\nimport { useMesob } from '@mesob/ui/providers';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { toast } from 'sonner';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi, useConfig } from '../../provider';\nimport type { AuthResponse } from '../../types';\nimport type { AuthErrorContent } from '../../utils/handle-error';\nimport { handleError } from '../../utils/handle-error';\nimport { AuthLayout } from './auth-layout';\nimport { VerificationForm } from './verification-form';\n\ntype VerifyPhoneProps = {\n verificationId: string;\n context: 'sign-in' | 'sign-up';\n phone?: string;\n redirectUrl?: string;\n};\n\nexport const VerifyPhone = ({\n verificationId,\n context,\n phone = '',\n redirectUrl,\n}: VerifyPhoneProps) => {\n const { hooks, refresh, setAuth } = useApi();\n const { config } = useConfig();\n const mesob = useMesob();\n const Link = mesob?.navigation?.Link;\n const t = useTranslator('Auth.verification');\n const common = useTranslator('Common');\n const footer = useTranslator('Auth.forgotPassword.footer');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const verifyPhoneMutation = hooks.useMutation(\n 'post',\n '/phone/verification/confirm',\n );\n const requestPhoneMutation = hooks.useMutation(\n 'post',\n '/phone/verification/request',\n );\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const onNavigate =\n config.navigation?.onNavigate ||\n ((path: string) => {\n if (typeof window !== 'undefined') {\n window.location.href = path;\n }\n });\n const logoImage = config.ui.logoImage;\n const defaultRedirect =\n redirectUrl || config.navigation?.defaultRedirectUrl || '/';\n\n useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = async (values: { code: string }) => {\n if (!verificationId) {\n setError({\n title: t('errors.fallback'),\n description: t('errors.fallback'),\n });\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const res = await verifyPhoneMutation.mutateAsync({\n body: {\n verificationId,\n code: values.code,\n context,\n },\n });\n if (res && 'user' in res && 'session' in res && res.session) {\n setAuth(res as AuthResponse);\n onNavigate(defaultRedirect);\n return;\n }\n await refresh();\n onNavigate(defaultRedirect);\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleResend = async () => {\n setError(null);\n try {\n const targetPhone = context === 'sign-up' ? phone : null;\n if (!targetPhone) {\n setError({\n title: t('errors.fallback'),\n description: t('phone.missingPhone'),\n });\n return;\n }\n const res = await requestPhoneMutation.mutateAsync({\n body: {\n phone: targetPhone,\n context,\n },\n });\n if (res && 'verificationId' in res && res.verificationId) {\n onNavigate(\n `/auth/verify-phone?context=${context}&verificationId=${res.verificationId}&phone=${targetPhone}`,\n );\n return;\n }\n setError({\n title: t('errors.fallback'),\n description: t('phone.resendFailed'),\n });\n } catch (err) {\n handleError(err, setError, t);\n }\n };\n\n if (!verificationId) {\n return (\n <AuthLayout\n title={common('invalidLinkTitle')}\n description={common('invalidLinkDescription')}\n footer={\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {footer('backToSignIn')}\n </Link>\n }\n >\n <div />\n </AuthLayout>\n );\n }\n\n let errorContent: AuthErrorContent | null = null;\n if (error) {\n if (typeof error === 'string') {\n errorContent = { title: 'Error', description: error };\n } else {\n errorContent = error;\n }\n }\n\n return (\n <AuthLayout\n title={t('phone.title')}\n description={t('phone.description', {\n target: phone || t('phone.missingPhone'),\n })}\n logoImage={logoImage}\n footer={\n Link ? (\n <Link href={signInLink} className=\"text-primary hover:underline\">\n {footer('backToSignIn')}\n </Link>\n ) : (\n <a\n href={signInLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(signInLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {footer('backToSignIn')}\n </a>\n )\n }\n >\n <VerificationForm\n verificationId={verificationId}\n onSubmit={handleSubmit}\n onResend={handleResend}\n isLoading={\n isLoading ||\n verifyPhoneMutation.isPending ||\n requestPhoneMutation.isPending\n }\n error={error}\n />\n {errorContent && (\n <Alert variant=\"destructive\" className=\"mt-4\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\n )}\n </AuthLayout>\n );\n};\n","'use client';\n\nimport { Button } from '@mesob/ui/components';\nimport { Component, type ErrorInfo, type ReactNode } from 'react';\n\ntype ErrorBoundaryProps = {\n children: ReactNode;\n fallback?: (props: { error: Error; reset: () => void }) => ReactNode;\n};\n\ntype ErrorBoundaryState = {\n hasError: boolean;\n error: Error | null;\n};\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(_error: Error, _errorInfo: ErrorInfo) {\n // Error logged via getDerivedStateFromError\n }\n\n reset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render() {\n if (this.state.hasError && this.state.error) {\n if (this.props.fallback) {\n return this.props.fallback({\n error: this.state.error,\n reset: this.reset,\n });\n }\n return <ErrorFallback error={this.state.error} reset={this.reset} />;\n }\n\n return this.props.children;\n }\n}\n\nfunction ErrorFallback({ error, reset }: { error: Error; reset: () => void }) {\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[400px] p-6\">\n <div className=\"max-w-md w-full space-y-4 text-center\">\n <div className=\"space-y-2\">\n <h2 className=\"text-2xl font-bold text-destructive\">\n Something went wrong\n </h2>\n <p className=\"text-muted-foreground\">\n {error.message || 'An unexpected error occurred'}\n </p>\n </div>\n <Button onClick={reset} variant=\"outline\">\n Try again\n </Button>\n </div>\n </div>\n );\n}\n\nexport function AuthErrorBoundary({ children }: { children: ReactNode }) {\n return <ErrorBoundary>{children}</ErrorBoundary>;\n}\n","'use client';\n\nimport { Badge, Button } from '@mesob/ui/components';\nimport { useLocale } from 'next-intl';\nimport { useState } from 'react';\nimport { useApi } from '../../provider';\nimport { DataTable, type DataTableColumn } from '../shared/data-table';\n\n// Permission type from OpenAPI schema\ntype Permission = {\n id: string;\n code: string;\n name: string | { am?: string; en?: string };\n description: string | { am?: string; en?: string };\n resource: string;\n action: string;\n createdAt: string;\n};\n\nfunction getTranslation(\n value: string | { am?: string; en?: string } | null | undefined,\n locale: string,\n): string {\n if (!value) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'object') {\n return value[locale as 'am' | 'en'] ?? value.en ?? value.am ?? '';\n }\n return '';\n}\n\nexport function Permissions() {\n const { hooks } = useApi();\n const locale = useLocale();\n const [page, setPage] = useState(1);\n const limit = 20;\n\n // Use openapi-react-query hooks\n const { data, isLoading, error } = hooks.useQuery('get', '/permissions', {\n params: {\n query: {\n page: String(page),\n limit: String(limit),\n },\n },\n });\n\n const columns: DataTableColumn<Permission>[] = [\n {\n key: 'name',\n header: 'Permission',\n cell: (permission) => (\n <div>\n <p className=\"font-medium\">\n {getTranslation(permission.name, locale)}\n </p>\n <Badge variant=\"outline\" className=\"mt-1 font-mono text-xs\">\n {permission.code}\n </Badge>\n </div>\n ),\n },\n {\n key: 'resource',\n header: 'Resource',\n cell: (permission) => (\n <Badge variant=\"secondary\">{permission.resource}</Badge>\n ),\n },\n {\n key: 'action',\n header: 'Action',\n cell: (permission) => (\n <Badge variant=\"outline\">{permission.action}</Badge>\n ),\n },\n {\n key: 'description',\n header: 'Description',\n cell: (permission) => (\n <p className=\"text-sm text-muted-foreground max-w-xs truncate\">\n {getTranslation(permission.description, locale)}\n </p>\n ),\n },\n {\n key: 'actions',\n header: 'Actions',\n cell: (_permission) => (\n <Button variant=\"outline\" size=\"sm\">\n Edit\n </Button>\n ),\n },\n ];\n\n if (error) {\n return (\n <div className=\"p-6 text-center\">\n <p className=\"text-destructive\">Error loading permissions</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-6 space-y-4\">\n <div className=\"flex justify-between items-center\">\n <div>\n <h1 className=\"text-3xl font-bold\">Permissions</h1>\n <p className=\"text-muted-foreground\">Manage system permissions</p>\n </div>\n <Button>Create Permission</Button>\n </div>\n\n <DataTable\n data={(data as { permissions: Permission[] })?.permissions || []}\n columns={columns}\n isLoading={isLoading}\n emptyMessage=\"No permissions found\"\n />\n\n {data &&\n 'permissions' in data &&\n data.permissions &&\n (data.permissions as Permission[]).length >= limit && (\n <div className=\"flex justify-between items-center\">\n <Button\n variant=\"outline\"\n disabled={page === 1}\n onClick={() => setPage(page - 1)}\n >\n Previous\n </Button>\n <span className=\"text-sm text-muted-foreground\">Page {page}</span>\n <Button variant=\"outline\" onClick={() => setPage(page + 1)}>\n Next\n </Button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@mesob/ui/components';\nimport type { ReactNode } from 'react';\nimport { TableSkeleton } from '../skeletons/table-skeleton';\n\nexport type DataTableColumn<T> = {\n key: string;\n header: string;\n cell: (row: T) => ReactNode;\n sortable?: boolean;\n};\n\ntype DataTableProps<T> = {\n data: T[];\n columns: DataTableColumn<T>[];\n isLoading?: boolean;\n onRowClick?: (row: T) => void;\n emptyMessage?: string;\n actions?: ReactNode;\n};\n\nexport function DataTable<T extends { id: string }>({\n data,\n columns,\n isLoading,\n onRowClick,\n emptyMessage = 'No data available',\n actions,\n}: DataTableProps<T>) {\n if (isLoading) {\n return <TableSkeleton columns={columns.length} rows={5} />;\n }\n\n if (data.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[400px] p-6\">\n <p className=\"text-muted-foreground\">{emptyMessage}</p>\n {actions && <div className=\"mt-4\">{actions}</div>}\n </div>\n );\n }\n\n return (\n <div className=\"w-full space-y-4\">\n {actions && <div className=\"flex justify-end\">{actions}</div>}\n\n <div className=\"border rounded-lg overflow-hidden\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead key={column.key}>{column.header}</TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.map((row) => (\n <TableRow\n key={row.id}\n onClick={() => onRowClick?.(row)}\n className={onRowClick ? 'cursor-pointer hover:bg-muted/50' : ''}\n >\n {columns.map((column) => (\n <TableCell key={`${row.id}-${column.key}`}>\n {column.cell(row)}\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Skeleton } from '@mesob/ui/components';\n\ntype TableSkeletonProps = {\n columns?: number;\n rows?: number;\n};\n\nexport function TableSkeleton({ columns = 5, rows = 10 }: TableSkeletonProps) {\n const headerKeys = Array.from({ length: columns }, (_, i) => `header-${i}`);\n const rowKeys = Array.from({ length: rows }, (_, i) => `row-${i}`);\n const cellKeys = Array.from({ length: rows }, (_, rowIdx) =>\n Array.from({ length: columns }, (_, colIdx) => `cell-${rowIdx}-${colIdx}`),\n );\n\n return (\n <div className=\"w-full space-y-4\">\n {/* Header */}\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-8 w-48\" />\n <Skeleton className=\"h-10 w-32\" />\n </div>\n\n {/* Search/filters */}\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-10 flex-1 max-w-sm\" />\n <Skeleton className=\"h-10 w-24\" />\n <Skeleton className=\"h-10 w-24\" />\n </div>\n\n {/* Table */}\n <div className=\"border rounded-lg overflow-hidden\">\n {/* Table header */}\n <div className=\"flex gap-4 p-4 bg-muted\">\n {headerKeys.map((key) => (\n <Skeleton key={key} className=\"h-4 flex-1\" />\n ))}\n </div>\n\n {/* Table rows */}\n {rowKeys.map((rowKey, rowIdx) => (\n <div key={rowKey} className=\"flex gap-4 p-4 border-t\">\n {cellKeys[rowIdx]?.map((cellKey) => (\n <Skeleton key={cellKey} className=\"h-4 flex-1\" />\n ))}\n </div>\n ))}\n </div>\n\n {/* Pagination */}\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-4 w-32\" />\n <div className=\"flex gap-2\">\n <Skeleton className=\"h-10 w-20\" />\n <Skeleton className=\"h-10 w-20\" />\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Badge, Button } from '@mesob/ui/components';\nimport { useLocale } from 'next-intl';\nimport { useState } from 'react';\nimport { useApi } from '../../provider';\nimport { DataTable, type DataTableColumn } from '../shared/data-table';\n\n// Role type from OpenAPI schema\ntype Role = {\n id: string;\n code: string;\n name: string | { am?: string; en?: string };\n description: string | { am?: string; en?: string };\n createdAt: string;\n};\n\nfunction getTranslation(\n value: string | { am?: string; en?: string } | null | undefined,\n locale: string,\n): string {\n if (!value) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'object') {\n return value[locale as 'am' | 'en'] ?? value.en ?? value.am ?? '';\n }\n return '';\n}\n\nexport function Roles() {\n const { hooks } = useApi();\n const locale = useLocale();\n const [page, setPage] = useState(1);\n const limit = 20;\n\n // Use openapi-react-query hooks\n const { data, isLoading, error } = hooks.useQuery('get', '/roles', {\n params: {\n query: {\n page: String(page),\n limit: String(limit),\n },\n },\n });\n\n const columns: DataTableColumn<Role>[] = [\n {\n key: 'name',\n header: 'Role',\n cell: (role) => (\n <div>\n <p className=\"font-medium\">{getTranslation(role.name, locale)}</p>\n <Badge variant=\"outline\" className=\"mt-1\">\n {role.code}\n </Badge>\n </div>\n ),\n },\n {\n key: 'description',\n header: 'Description',\n cell: (role) => (\n <p className=\"text-sm text-muted-foreground\">\n {getTranslation(role.description, locale)}\n </p>\n ),\n },\n {\n key: 'createdAt',\n header: 'Created',\n cell: (role) => (\n <p className=\"text-sm\">\n {new Date(role.createdAt).toLocaleDateString()}\n </p>\n ),\n },\n {\n key: 'actions',\n header: 'Actions',\n cell: (_role) => (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n Permissions\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n Edit\n </Button>\n </div>\n ),\n },\n ];\n\n if (error) {\n return (\n <div className=\"p-6 text-center\">\n <p className=\"text-destructive\">Error loading roles</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-6 space-y-4\">\n <div className=\"flex justify-between items-center\">\n <div>\n <h1 className=\"text-3xl font-bold\">Roles</h1>\n <p className=\"text-muted-foreground\">Manage user roles</p>\n </div>\n <Button>Create Role</Button>\n </div>\n\n <DataTable\n data={(data as { roles: Role[] })?.roles || []}\n columns={columns}\n isLoading={isLoading}\n emptyMessage=\"No roles found\"\n />\n\n {data &&\n 'roles' in data &&\n data.roles &&\n (data.roles as Role[]).length >= limit && (\n <div className=\"flex justify-between items-center\">\n <Button\n variant=\"outline\"\n disabled={page === 1}\n onClick={() => setPage(page - 1)}\n >\n Previous\n </Button>\n <span className=\"text-sm text-muted-foreground\">Page {page}</span>\n <Button variant=\"outline\" onClick={() => setPage(page + 1)}>\n Next\n </Button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { Button } from '@mesob/ui/components';\nimport { useState } from 'react';\nimport { useApi } from '../../provider';\nimport { DataTable, type DataTableColumn } from '../shared/data-table';\n\n// Session type from OpenAPI schema\ntype Session = {\n id: string;\n userId: string;\n expiresAt: string;\n createdAt: string;\n userAgent: string | null;\n ip: string | null;\n};\n\nexport function Sessions() {\n const { hooks } = useApi();\n const [selectedSessionId] = useState<string | null>(null);\n\n // Fetch sessions\n const { data, isLoading, error, refetch } = hooks.useQuery(\n 'get',\n '/sessions',\n );\n\n // Delete session mutation\n const deleteMutation = hooks.useMutation('delete', '/sessions/{id}', {\n onSuccess: () => {\n // Refetch sessions after deletion\n refetch();\n },\n });\n\n const handleDeleteSession = async (sessionId: string) => {\n if (confirm('Are you sure you want to revoke this session?')) {\n try {\n await deleteMutation.mutateAsync({\n params: {\n path: { id: sessionId },\n },\n });\n } catch (_err) {\n // Error handled by mutation error state\n }\n }\n };\n\n const columns: DataTableColumn<Session>[] = [\n {\n key: 'createdAt',\n header: 'Created',\n cell: (session) => (\n <div>\n <p className=\"text-sm font-medium\">\n {new Date(session.createdAt).toLocaleDateString()}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {new Date(session.createdAt).toLocaleTimeString()}\n </p>\n </div>\n ),\n },\n {\n key: 'expiresAt',\n header: 'Expires',\n cell: (session) => (\n <p className=\"text-sm\">\n {new Date(session.expiresAt).toLocaleDateString()}\n </p>\n ),\n },\n {\n key: 'userAgent',\n header: 'Device',\n cell: (session) => (\n <p className=\"text-sm truncate max-w-xs\">\n {session.userAgent || 'Unknown'}\n </p>\n ),\n },\n {\n key: 'ip',\n header: 'IP Address',\n cell: (session) => (\n <p className=\"text-sm font-mono\">{session.ip || 'Unknown'}</p>\n ),\n },\n {\n key: 'actions',\n header: 'Actions',\n cell: (session) => (\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => handleDeleteSession(session.id)}\n disabled={\n deleteMutation.isPending && selectedSessionId === session.id\n }\n >\n {deleteMutation.isPending && selectedSessionId === session.id\n ? 'Revoking...'\n : 'Revoke'}\n </Button>\n ),\n },\n ];\n\n if (error) {\n return (\n <div className=\"p-6 text-center\">\n <p className=\"text-destructive\">Error loading sessions</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-6 space-y-4\">\n <div>\n <h1 className=\"text-3xl font-bold\">Sessions</h1>\n <p className=\"text-muted-foreground\">View and manage active sessions</p>\n </div>\n\n <DataTable\n data={(data as { sessions: Session[] })?.sessions || []}\n columns={columns}\n isLoading={isLoading}\n emptyMessage=\"No active sessions\"\n />\n </div>\n );\n}\n","'use client';\n\nimport { Badge, Button } from '@mesob/ui/components';\nimport { useState } from 'react';\nimport { useApi } from '../../provider';\nimport { DataTable, type DataTableColumn } from '../shared/data-table';\n\n// Tenant type from OpenAPI schema\ntype Tenant = {\n id: string;\n name: string;\n slug: string;\n status: string;\n createdAt: string;\n};\n\nexport function Tenants() {\n const { hooks } = useApi();\n const [page, setPage] = useState(1);\n const limit = 20;\n\n // Use openapi-react-query hooks\n const { data, isLoading, error } = hooks.useQuery('get', '/tenants', {\n params: {\n query: {\n page: String(page),\n limit: String(limit),\n },\n },\n });\n\n const columns: DataTableColumn<Tenant>[] = [\n {\n key: 'name',\n header: 'Tenant',\n cell: (tenant) => (\n <div>\n <p className=\"font-medium\">{tenant.name}</p>\n <p className=\"text-sm text-muted-foreground\">/{tenant.slug}</p>\n </div>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n cell: (tenant) => (\n <Badge variant={tenant.status === 'active' ? 'default' : 'secondary'}>\n {tenant.status}\n </Badge>\n ),\n },\n {\n key: 'createdAt',\n header: 'Created',\n cell: (tenant) => (\n <p className=\"text-sm\">\n {new Date(tenant.createdAt).toLocaleDateString()}\n </p>\n ),\n },\n {\n key: 'actions',\n header: 'Actions',\n cell: (_tenant) => (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n Domains\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n Edit\n </Button>\n </div>\n ),\n },\n ];\n\n if (error) {\n return (\n <div className=\"p-6 text-center\">\n <p className=\"text-destructive\">Error loading tenants</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-6 space-y-4\">\n <div className=\"flex justify-between items-center\">\n <div>\n <h1 className=\"text-3xl font-bold\">Tenants</h1>\n <p className=\"text-muted-foreground\">Manage tenant organizations</p>\n </div>\n <Button>Create Tenant</Button>\n </div>\n\n <DataTable\n data={(data as { tenants: Tenant[] })?.tenants || []}\n columns={columns}\n isLoading={isLoading}\n emptyMessage=\"No tenants found\"\n />\n\n {data &&\n 'tenants' in data &&\n data.tenants &&\n (data.tenants as Tenant[]).length >= limit && (\n <div className=\"flex justify-between items-center\">\n <Button\n variant=\"outline\"\n disabled={page === 1}\n onClick={() => setPage(page - 1)}\n >\n Previous\n </Button>\n <span className=\"text-sm text-muted-foreground\">Page {page}</span>\n <Button variant=\"outline\" onClick={() => setPage(page + 1)}>\n Next\n </Button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { Badge, Button } from '@mesob/ui/components';\nimport { useState } from 'react';\nimport { useApi } from '../../provider';\nimport { DataTable, type DataTableColumn } from '../shared/data-table';\n\n// User type from OpenAPI schema\ntype User = {\n id: string;\n fullName: string;\n email: string | null;\n phone: string | null;\n handle: string;\n emailVerified: boolean;\n phoneVerified: boolean;\n lastSignInAt: string | null;\n};\n\nexport function Users() {\n const { hooks } = useApi();\n const [page, setPage] = useState(1);\n const limit = 20;\n\n // Use openapi-react-query hooks\n const { data, isLoading, error } = hooks.useQuery('get', '/users', {\n params: {\n query: {\n page: String(page),\n limit: String(limit),\n },\n },\n });\n\n const columns: DataTableColumn<User>[] = [\n {\n key: 'fullName',\n header: 'Name',\n cell: (user) => (\n <div>\n <p className=\"font-medium\">{user.fullName}</p>\n <p className=\"text-sm text-muted-foreground\">@{user.handle}</p>\n </div>\n ),\n },\n {\n key: 'contact',\n header: 'Contact',\n cell: (user) => (\n <div className=\"space-y-1\">\n {user.email && (\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm\">{user.email}</p>\n {user.emailVerified && (\n <Badge variant=\"outline\" className=\"text-xs\">\n Verified\n </Badge>\n )}\n </div>\n )}\n {user.phone && (\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm\">{user.phone}</p>\n {user.phoneVerified && (\n <Badge variant=\"outline\" className=\"text-xs\">\n Verified\n </Badge>\n )}\n </div>\n )}\n </div>\n ),\n },\n {\n key: 'lastSignIn',\n header: 'Last Sign In',\n cell: (user) => (\n <p className=\"text-sm\">\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'Never'}\n </p>\n ),\n },\n {\n key: 'actions',\n header: 'Actions',\n cell: (_user) => (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n View\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n Edit\n </Button>\n </div>\n ),\n },\n ];\n\n if (error) {\n return (\n <div className=\"p-6 text-center\">\n <p className=\"text-destructive\">Error loading users</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full p-6 space-y-4\">\n <div className=\"flex justify-between items-center\">\n <div>\n <h1 className=\"text-3xl font-bold\">Users</h1>\n <p className=\"text-muted-foreground\">Manage user accounts</p>\n </div>\n <Button>Create User</Button>\n </div>\n\n <DataTable\n data={(data as { users: User[] })?.users || []}\n columns={columns}\n isLoading={isLoading}\n emptyMessage=\"No users found\"\n />\n\n {data &&\n 'users' in data &&\n data.users &&\n (data.users as User[]).length >= limit && (\n <div className=\"flex justify-between items-center\">\n <Button\n variant=\"outline\"\n disabled={page === 1}\n onClick={() => setPage(page - 1)}\n >\n Previous\n </Button>\n <span className=\"text-sm text-muted-foreground\">Page {page}</span>\n <Button variant=\"outline\" onClick={() => setPage(page + 1)}>\n Next\n </Button>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { Separator } from '@mesob/ui/components';\nimport { useSession } from '../../provider';\n\nexport function Account() {\n const { user, isAuthenticated } = useSession();\n\n if (!(isAuthenticated && user)) {\n return <div>Sign in required</div>;\n }\n\n return (\n <div className=\"p-6 max-w-4xl\">\n <div className=\"mb-6\">\n <h2 className=\"text-lg font-semibold mb-4\">Profile details</h2>\n <Separator />\n </div>\n\n <div className=\"space-y-6 transition-all duration-300 ease-in-out\">\n {/* Profile Section */}\n <div className=\"flex flex-col md:flex-row items-start gap-4 md:gap-12 min-h-[3rem]\">\n <div className=\"w-full md:w-48 mt-4 shrink-0 h-fit\">\n <span className=\"font-medium text-sm\">Profile</span>\n </div>\n </div>\n\n <Separator />\n\n {/* Email addresses Section */}\n <div className=\"flex flex-col md:flex-row gap-4 md:gap-12 py-2\">\n <div className=\"w-full md:w-48 shrink-0\">\n <span className=\"font-medium text-sm\">Email addresses</span>\n </div>\n <div className=\"flex-1 space-y-4\">\n <div className=\"flex items-center justify-between group\">\n {user.email ? (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm\">{user.email}</span>\n </div>\n ) : (\n <span className=\"text-sm text-muted-foreground\">\n No email address\n </span>\n )}\n </div>\n </div>\n </div>\n\n <Separator />\n\n {/* Phone numbers Section */}\n <div className=\"flex flex-col md:flex-row gap-4 md:gap-12 py-2\">\n <div className=\"w-full md:w-48 shrink-0\">\n <span className=\"font-medium text-sm\">Phone numbers</span>\n </div>\n <div className=\"flex-1 space-y-4\">\n {user.phone ? (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm\">{user.phone}</span>\n </div>\n ) : (\n <span className=\"text-sm text-muted-foreground\">\n No phone number\n </span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport {\n Button,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '@mesob/ui/components';\nimport { IconChevronDown } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { useSession } from '../../provider';\nimport { RequestChangeEmailForm } from './request-change-email-form';\nimport { VerifyChangeEmailForm } from './verify-change-email-form';\n\nexport function ChangeEmailForm() {\n const { user } = useSession();\n const [isOpen, setIsOpen] = useState(false);\n const [showOtp, setShowOtp] = useState(false);\n const [verificationId, setVerificationId] = useState<string | null>(null);\n const [newEmail, setNewEmail] = useState<string>('');\n\n const resetForms = () => {\n setShowOtp(false);\n setVerificationId(null);\n setNewEmail('');\n };\n\n const handleRequestSuccess = (id: string, email: string) => {\n setVerificationId(id);\n setNewEmail(email);\n setShowOtp(true);\n };\n\n const handleVerifySuccess = () => {\n resetForms();\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n resetForms();\n setIsOpen(false);\n };\n\n const title = user?.email ? 'Change Email' : 'Add Email';\n const description = user?.email\n ? 'Update your email address'\n : 'Add an email address to your account';\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen}>\n <div className=\"border rounded-lg\">\n <CollapsibleTrigger asChild>\n <Button variant=\"ghost\" className=\"w-full justify-between p-4 h-auto\">\n <div className=\"flex flex-col items-start\">\n <span className=\"font-medium\">{title}</span>\n <span className=\"text-sm text-muted-foreground\">\n {description}\n </span>\n </div>\n <IconChevronDown\n className={`h-4 w-4 transition-transform ${\n isOpen ? 'rotate-180' : ''\n }`}\n />\n </Button>\n </CollapsibleTrigger>\n\n <CollapsibleContent>\n {showOtp ? (\n <VerifyChangeEmailForm\n email={newEmail}\n verificationId={verificationId}\n onSuccess={handleVerifySuccess}\n onCancel={handleCancel}\n />\n ) : (\n <RequestChangeEmailForm\n onSuccess={handleRequestSuccess}\n onCancel={handleCancel}\n buttonText={title}\n />\n )}\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Button, Input, Label, Spinner } from '@mesob/ui/components';\nimport { IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useApi, useSession } from '../../provider';\n\nconst emailPasswordSchema = z.object({\n email: z.string().email('Invalid email address'),\n password: z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .max(128, 'Password too long'),\n});\n\ntype EmailPasswordFormData = z.infer<typeof emailPasswordSchema>;\n\ntype AuthErrorLike = {\n code?: string;\n message?: string;\n name?: string;\n};\n\nfunction isAuthError(error: unknown): error is AuthErrorLike {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('code' in error || 'message' in error || 'name' in error)\n );\n}\n\nfunction getErrorCode(error: AuthErrorLike): string | undefined {\n if (error.code) {\n return error.code;\n }\n if (error.message) {\n const upperMessage = error.message.toUpperCase().trim();\n const validCodes = [\n 'USER_NOT_FOUND',\n 'USER_EXISTS',\n 'INVALID_PASSWORD',\n 'VERIFICATION_EXPIRED',\n 'VERIFICATION_MISMATCH',\n 'VERIFICATION_NOT_FOUND',\n 'TOO_MANY_ATTEMPTS',\n 'UNAUTHORIZED',\n ];\n if (validCodes.includes(upperMessage)) {\n return upperMessage;\n }\n }\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n switch (errorCode) {\n case 'USER_EXISTS':\n return 'This email is already taken. Please use a different email.';\n case 'VERIFICATION_EXPIRED':\n return 'Verification code has expired. Please request a new one.';\n case 'VERIFICATION_MISMATCH':\n return 'Invalid verification code. Please try again.';\n case 'VERIFICATION_NOT_FOUND':\n return 'Verification not found. Please request a new code.';\n default:\n return error.message || 'An error occurred. Please try again.';\n }\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An error occurred. Please try again.';\n}\n\ninterface RequestChangeEmailFormProps {\n onSuccess: (verificationId: string, email: string) => void;\n onCancel: () => void;\n buttonText: string;\n}\n\nexport function RequestChangeEmailForm({\n onSuccess,\n onCancel,\n buttonText,\n}: RequestChangeEmailFormProps) {\n const { user } = useSession();\n const { hooks } = useApi();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isChecking, setIsChecking] = useState(true);\n const [showPassword, setShowPassword] = useState(false);\n\n const getPendingAccountChangeQuery = hooks.useQuery(\n 'get',\n '/account-change/pending',\n {},\n { enabled: false },\n );\n const verifyPasswordMutation = hooks.useMutation('post', '/password/verify');\n const checkUserMutation = hooks.useMutation('post', '/check-account');\n const requestEmailVerificationMutation = hooks.useMutation(\n 'post',\n '/email/verification/request',\n );\n\n const emailPasswordForm = useForm<EmailPasswordFormData>({\n resolver: zodResolver(emailPasswordSchema),\n defaultValues: {\n email: '',\n password: '',\n },\n });\n\n const {\n register,\n handleSubmit,\n getValues,\n setValue,\n formState: { errors },\n } = emailPasswordForm;\n\n useEffect(() => {\n let active = true;\n const run = async () => {\n try {\n const data = await getPendingAccountChangeQuery.refetch();\n if (!active) {\n return;\n }\n const accountChange = data.data?.accountChange;\n const verificationId = data.data?.verificationId;\n if (accountChange?.changeType !== 'email') {\n setIsChecking(false);\n return;\n }\n if (!accountChange.newEmail) {\n setIsChecking(false);\n return;\n }\n if (getValues('email')) {\n setIsChecking(false);\n return;\n }\n setValue('email', accountChange.newEmail, { shouldValidate: true });\n\n if (verificationId) {\n toast.message('Resuming verification…');\n onSuccess(verificationId, accountChange.newEmail);\n return;\n }\n\n setIsChecking(false);\n } catch {\n setIsChecking(false);\n }\n };\n run().catch(() => undefined);\n return () => {\n active = false;\n };\n }, [getPendingAccountChangeQuery.refetch, getValues, onSuccess, setValue]);\n\n const onEmailPasswordSubmit = async (data: EmailPasswordFormData) => {\n if (!user) {\n toast.error('User not found');\n return;\n }\n\n try {\n setIsSubmitting(true);\n\n // Verify password first\n await verifyPasswordMutation.mutateAsync({\n body: { password: data.password },\n });\n\n // Check if email exists\n const checkResult = await checkUserMutation.mutateAsync({\n body: { identifier: data.email },\n });\n if (checkResult.data?.exists) {\n // Check if it belongs to current user\n if (user?.email?.toLowerCase() === data.email.toLowerCase()) {\n toast.error('This is already your current email address.');\n return;\n }\n toast.error(\n 'This email is already taken. Please use a different email.',\n );\n return;\n }\n\n // Request verification\n const verification = await requestEmailVerificationMutation.mutateAsync({\n body: { email: data.email },\n });\n\n toast.success('Verification code sent to your email');\n onSuccess(verification.data?.verificationId ?? '', data.email);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n if (\n errorCode === 'INVALID_PASSWORD' ||\n errorCode === 'USER_NOT_FOUND'\n ) {\n toast.error('Incorrect password. Please try again.');\n return;\n }\n }\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const isLoading = isSubmitting || isChecking;\n\n return (\n <form\n onSubmit={handleSubmit(onEmailPasswordSubmit)}\n className=\"p-4 space-y-4 border-t\"\n >\n <div className=\"space-y-4 w-full md:w-1/2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\">New Email Address</Label>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"Enter your new email\"\n {...register('email')}\n disabled={isLoading}\n />\n {errors.email && (\n <p className=\"text-sm text-destructive\">{errors.email.message}</p>\n )}\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"password\">Password</Label>\n <div className=\"relative\">\n <Input\n id=\"password\"\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"current-password\"\n placeholder=\"Enter your password\"\n {...register('password')}\n disabled={isLoading}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n disabled={isLoading}\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {errors.password && (\n <p className=\"text-sm text-destructive\">\n {errors.password.message}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isLoading}>\n {isLoading && <Spinner className=\"mr-2 h-4 w-4\" />}\n {isChecking ? 'Checking…' : buttonText}\n </Button>\n </div>\n </form>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useApi, useSession } from '../../provider';\nimport { OtpVerificationModal } from './otp-verification-modal';\n\ntype AuthErrorLike = {\n code?: string;\n message?: string;\n name?: string;\n};\n\nfunction isAuthError(error: unknown): error is AuthErrorLike {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('code' in error || 'message' in error || 'name' in error)\n );\n}\n\nfunction getErrorCode(error: AuthErrorLike): string | undefined {\n if (error.code) {\n return error.code;\n }\n if (error.message) {\n const upperMessage = error.message.toUpperCase().trim();\n const validCodes = [\n 'USER_NOT_FOUND',\n 'USER_EXISTS',\n 'INVALID_PASSWORD',\n 'VERIFICATION_EXPIRED',\n 'VERIFICATION_MISMATCH',\n 'VERIFICATION_NOT_FOUND',\n 'TOO_MANY_ATTEMPTS',\n 'UNAUTHORIZED',\n ];\n if (validCodes.includes(upperMessage)) {\n return upperMessage;\n }\n }\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n switch (errorCode) {\n case 'USER_EXISTS':\n return 'This email is already taken. Please use a different email.';\n case 'VERIFICATION_EXPIRED':\n return 'Verification code has expired. Please request a new one.';\n case 'VERIFICATION_MISMATCH':\n return 'Invalid verification code. Please try again.';\n case 'VERIFICATION_NOT_FOUND':\n return 'Verification not found. Please request a new code.';\n default:\n return error.message || 'An error occurred. Please try again.';\n }\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An error occurred. Please try again.';\n}\n\ntype VerifyChangeEmailFormProps = {\n email: string;\n verificationId: string | null;\n onSuccess: () => void;\n onCancel: () => void;\n};\n\nexport function VerifyChangeEmailForm({\n email,\n verificationId,\n onSuccess,\n onCancel,\n}: VerifyChangeEmailFormProps) {\n const { refresh } = useSession();\n const { hooks } = useApi();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [currentVerificationId, setCurrentVerificationId] =\n useState(verificationId);\n\n const verifyEmailMutation = hooks.useMutation(\n 'post',\n '/email/verification/confirm',\n );\n const updateEmailMutation = hooks.useMutation('put', '/profile/email');\n const requestEmailVerificationMutation = hooks.useMutation(\n 'post',\n '/email/verification/request',\n );\n\n const onOtpSubmit = async (code: string) => {\n if (!currentVerificationId) {\n toast.error('Verification not found. Please request a new code.');\n return;\n }\n try {\n setIsSubmitting(true);\n\n // Verify email\n await verifyEmailMutation.mutateAsync({\n body: {\n verificationId: currentVerificationId,\n code,\n },\n });\n\n // Update email via auth client\n await updateEmailMutation.mutateAsync({\n body: { email },\n });\n\n toast.success('Email updated successfully');\n await refresh();\n onSuccess();\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n if (!currentVerificationId) {\n toast.error('Verification not found. Please request a new code.');\n return null;\n }\n\n return (\n <OtpVerificationModal\n open\n title=\"Verify email\"\n description={`Enter the verification code sent to ${email}`}\n verificationId={currentVerificationId}\n isLoading={isSubmitting}\n onSubmit={onOtpSubmit}\n onResend={async () => {\n try {\n setIsSubmitting(true);\n const next = await requestEmailVerificationMutation.mutateAsync({\n body: { email },\n });\n setCurrentVerificationId(next.data?.verificationId ?? null);\n toast.success('Verification code resent');\n } catch (error) {\n toast.error(getErrorMessage(error));\n } finally {\n setIsSubmitting(false);\n }\n }}\n onCancel={onCancel}\n />\n );\n}\n","'use client';\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@mesob/ui/components';\nimport { VerificationForm } from '../auth/verification-form';\n\ntype OtpVerificationModalProps = {\n open: boolean;\n title: string;\n description?: string;\n verificationId: string;\n isLoading?: boolean;\n onSubmit: (code: string) => Promise<void> | void;\n onResend?: () => Promise<void> | void;\n onCancel?: () => void;\n};\n\nexport function OtpVerificationModal({\n open,\n title,\n description,\n verificationId,\n isLoading,\n onSubmit,\n onResend,\n onCancel,\n}: OtpVerificationModalProps) {\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen: boolean) => {\n if (!nextOpen) {\n onCancel?.();\n }\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n\n <VerificationForm\n verificationId={verificationId}\n isLoading={isLoading}\n onSubmit={async ({ code }: { code: string }) => onSubmit(code)}\n onResend={onResend ?? (() => undefined)}\n />\n </DialogContent>\n </Dialog>\n );\n}\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n Button,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Input,\n Label,\n Spinner,\n} from '@mesob/ui/components';\nimport { IconChevronDown, IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useSession } from '../../provider';\n\nconst changePasswordSchema = z\n .object({\n currentPassword: z\n .string()\n .min(8, 'Password must be at least 8 characters'),\n newPassword: z.string().min(8, 'Password must be at least 8 characters'),\n confirmPassword: z\n .string()\n .min(8, 'Password must be at least 8 characters'),\n })\n .refine((data) => data.newPassword === data.confirmPassword, {\n message: \"Passwords don't match\",\n path: ['confirmPassword'],\n });\n\ntype ChangePasswordFormData = z.infer<typeof changePasswordSchema>;\n\ntype AuthErrorLike = {\n code?: string;\n message?: string;\n name?: string;\n};\n\nfunction isAuthError(error: unknown): error is AuthErrorLike {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('code' in error || 'message' in error || 'name' in error)\n );\n}\n\nfunction getErrorCode(error: AuthErrorLike): string | undefined {\n if (error.code) {\n return error.code;\n }\n if (error.message) {\n const upperMessage = error.message.toUpperCase().trim();\n const validCodes = [\n 'INVALID_PASSWORD',\n 'UNAUTHORIZED',\n 'HAS_NO_PASSWORD',\n 'USER_NOT_FOUND',\n 'USER_EXISTS',\n 'VERIFICATION_EXPIRED',\n 'VERIFICATION_MISMATCH',\n 'VERIFICATION_NOT_FOUND',\n 'TOO_MANY_ATTEMPTS',\n 'REQUIRES_VERIFICATION',\n 'ACCESS_DENIED',\n ];\n if (validCodes.includes(upperMessage)) {\n return upperMessage;\n }\n }\n return undefined;\n}\n\nfunction getPasswordChangeErrorMessage(error: unknown): string {\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n switch (errorCode) {\n case 'INVALID_PASSWORD':\n return 'The current password you entered is incorrect. Please try again.';\n case 'UNAUTHORIZED':\n return 'You are not authorized to perform this action. Please sign in again.';\n case 'HAS_NO_PASSWORD':\n return 'Your account does not have a password set. Please use password reset instead.';\n default:\n return error.message || 'Failed to change password. Please try again.';\n }\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'Failed to change password. Please try again.';\n}\n\nexport function ChangePasswordForm() {\n const { user: _user } = useSession();\n const [isOpen, setIsOpen] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [showPassword, setShowPassword] = useState(false);\n const [showNewPassword, setShowNewPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n\n const form = useForm<ChangePasswordFormData>({\n resolver: zodResolver(changePasswordSchema),\n defaultValues: {\n currentPassword: '',\n newPassword: '',\n confirmPassword: '',\n },\n });\n\n const { register, handleSubmit, formState, reset } = form;\n\n const onSubmit = (_data: ChangePasswordFormData) => {\n try {\n setIsSubmitting(true);\n toast.error('Password change unavailable');\n setIsOpen(false);\n } catch (error) {\n const errorMessage = getPasswordChangeErrorMessage(error);\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen}>\n <div className=\"border rounded-lg\">\n <CollapsibleTrigger asChild>\n <Button variant=\"ghost\" className=\"w-full justify-between p-4 h-auto\">\n <div className=\"flex flex-col items-start\">\n <span className=\"font-medium\">Change Password</span>\n <span className=\"text-sm text-muted-foreground\">\n Update your account password\n </span>\n </div>\n <IconChevronDown\n className={`h-4 w-4 transition-transform ${\n isOpen ? 'rotate-180' : ''\n }`}\n />\n </Button>\n </CollapsibleTrigger>\n\n <CollapsibleContent>\n <form\n onSubmit={handleSubmit(onSubmit)}\n className=\"p-4 space-y-4 border-t\"\n >\n <div className=\"space-y-2 w-full md:w-1/2\">\n <Label htmlFor=\"currentPassword\">Old Password</Label>\n <div className=\"relative\">\n <Input\n id=\"currentPassword\"\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"current-password\"\n placeholder=\"Enter your current password\"\n {...register('currentPassword')}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {formState.errors.currentPassword && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.currentPassword.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2 w-full md:w-1/2\">\n <Label htmlFor=\"newPassword\">New Password</Label>\n <div className=\"relative\">\n <Input\n id=\"newPassword\"\n type={showNewPassword ? 'text' : 'password'}\n placeholder=\"Enter your new password\"\n autoComplete=\"new-password\"\n {...register('newPassword')}\n />\n\n <button\n type=\"button\"\n onClick={() => setShowNewPassword(!showNewPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showNewPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {formState.errors.newPassword && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.newPassword.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2 w-full md:w-1/2\">\n <Label htmlFor=\"confirmPassword\">Confirm New Password</Label>\n <div className=\"relative\">\n <Input\n id=\"confirmPassword\"\n type={showConfirmPassword ? 'text' : 'password'}\n placeholder=\"Confirm your new password\"\n autoComplete=\"new-password\"\n {...register('confirmPassword')}\n />\n\n <button\n type=\"button\"\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showConfirmPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {formState.errors.confirmPassword && (\n <p className=\"text-sm text-destructive\">\n {formState.errors.confirmPassword.message}\n </p>\n )}\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n reset();\n setIsOpen(false);\n }}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting && <Spinner className=\"mr-2 h-4 w-4\" />}\n Change Password\n </Button>\n </div>\n </form>\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n","'use client';\n\nimport {\n Button,\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '@mesob/ui/components';\nimport { IconChevronDown } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { useSession } from '../../provider';\nimport { RequestChangePhoneForm } from './request-change-phone-form';\nimport { VerifyChangePhoneForm } from './verify-change-phone-form';\n\nexport function ChangePhoneForm() {\n const { user } = useSession();\n const [isOpen, setIsOpen] = useState(false);\n const [showOtp, setShowOtp] = useState(false);\n const [verificationId, setVerificationId] = useState<string | null>(null);\n const [newPhone, setNewPhone] = useState<string>('');\n\n const resetForms = () => {\n setShowOtp(false);\n setVerificationId(null);\n setNewPhone('');\n };\n\n const handleRequestSuccess = (id: string, phone: string) => {\n setVerificationId(id);\n setNewPhone(phone);\n setShowOtp(true);\n };\n\n const handleVerifySuccess = () => {\n resetForms();\n setIsOpen(false);\n };\n\n const handleCancel = () => {\n resetForms();\n setIsOpen(false);\n };\n\n const title = user?.phone ? 'Change Phone' : 'Add Phone';\n const description = user?.phone\n ? 'Update your phone number'\n : 'Add a phone number to your account';\n\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen}>\n <div className=\"border rounded-lg\">\n <CollapsibleTrigger asChild>\n <Button variant=\"ghost\" className=\"w-full justify-between p-4 h-auto\">\n <div className=\"flex flex-col items-start\">\n <span className=\"font-medium\">{title}</span>\n <span className=\"text-sm text-muted-foreground\">\n {description}\n </span>\n </div>\n <IconChevronDown\n className={`h-4 w-4 transition-transform ${\n isOpen ? 'rotate-180' : ''\n }`}\n />\n </Button>\n </CollapsibleTrigger>\n\n <CollapsibleContent>\n {showOtp ? (\n <VerifyChangePhoneForm\n phone={newPhone}\n verificationId={verificationId}\n onSuccess={handleVerifySuccess}\n onCancel={handleCancel}\n />\n ) : (\n <RequestChangePhoneForm\n onSuccess={handleRequestSuccess}\n onCancel={handleCancel}\n buttonText={title}\n />\n )}\n </CollapsibleContent>\n </div>\n </Collapsible>\n );\n}\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Button, Input, Label, Spinner } from '@mesob/ui/components';\nimport { IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useApi, useConfig, useSession } from '../../provider';\nimport { normalizePhone } from '../../utils/normalize-phone';\n\nconst phonePasswordSchema = (phoneRegex: RegExp) =>\n z.object({\n phone: z\n .string()\n .trim()\n .min(1, { message: 'Phone number is required' })\n .refine(\n (val) => {\n const isPhone = phoneRegex.test(val);\n return isPhone;\n },\n {\n message: 'Invalid phone number',\n },\n ),\n password: z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .max(128, 'Password too long'),\n });\n\ntype PhonePasswordFormData = z.infer<ReturnType<typeof phonePasswordSchema>>;\n\ntype AuthErrorLike = {\n code?: string;\n message?: string;\n name?: string;\n};\n\nfunction isAuthError(error: unknown): error is AuthErrorLike {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('code' in error || 'message' in error || 'name' in error)\n );\n}\n\nfunction getErrorCode(error: AuthErrorLike): string | undefined {\n if (error.code) {\n return error.code;\n }\n if (error.message) {\n const upperMessage = error.message.toUpperCase().trim();\n const validCodes = [\n 'USER_NOT_FOUND',\n 'USER_EXISTS',\n 'INVALID_PASSWORD',\n 'VERIFICATION_EXPIRED',\n 'VERIFICATION_MISMATCH',\n 'VERIFICATION_NOT_FOUND',\n 'TOO_MANY_ATTEMPTS',\n 'UNAUTHORIZED',\n ];\n if (validCodes.includes(upperMessage)) {\n return upperMessage;\n }\n }\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n switch (errorCode) {\n case 'USER_EXISTS':\n return 'This phone number is already taken. Please use a different number.';\n case 'VERIFICATION_EXPIRED':\n return 'Verification code has expired. Please request a new one.';\n case 'VERIFICATION_MISMATCH':\n return 'Invalid verification code. Please try again.';\n case 'VERIFICATION_NOT_FOUND':\n return 'Verification not found. Please request a new code.';\n default:\n return error.message || 'An error occurred. Please try again.';\n }\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An error occurred. Please try again.';\n}\n\ninterface RequestChangePhoneFormProps {\n onSuccess: (verificationId: string, phone: string) => void;\n onCancel: () => void;\n buttonText: string;\n}\n\nexport function RequestChangePhoneForm({\n onSuccess,\n onCancel,\n buttonText,\n}: RequestChangePhoneFormProps) {\n const { user } = useSession();\n const { hooks } = useApi();\n const { config } = useConfig();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isChecking, setIsChecking] = useState(true);\n const [showPassword, setShowPassword] = useState(false);\n\n const phoneRegex =\n typeof config.phoneRegex === 'string'\n ? new RegExp(config.phoneRegex)\n : config.phoneRegex || /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/;\n\n const getPendingAccountChangeQuery = hooks.useQuery(\n 'get',\n '/account-change/pending',\n {},\n { enabled: false },\n );\n const verifyPasswordMutation = hooks.useMutation('post', '/password/verify');\n const checkUserMutation = hooks.useMutation('post', '/check-account');\n const requestPhoneOtpMutation = hooks.useMutation(\n 'post',\n '/phone/verification/request',\n );\n\n const phonePasswordForm = useForm<PhonePasswordFormData>({\n resolver: zodResolver(phonePasswordSchema(phoneRegex)),\n defaultValues: {\n phone: '',\n password: '',\n },\n });\n\n const {\n register,\n handleSubmit,\n getValues,\n setValue,\n formState: { errors },\n } = phonePasswordForm;\n\n useEffect(() => {\n let active = true;\n const run = async () => {\n try {\n const data = await getPendingAccountChangeQuery.refetch();\n if (!active) {\n return;\n }\n const accountChange = data.data?.accountChange;\n const verificationId = data.data?.verificationId;\n if (accountChange?.changeType !== 'phone') {\n setIsChecking(false);\n return;\n }\n if (!accountChange.newPhone) {\n setIsChecking(false);\n return;\n }\n if (getValues('phone')) {\n setIsChecking(false);\n return;\n }\n setValue('phone', accountChange.newPhone, { shouldValidate: true });\n\n if (verificationId) {\n toast.message('Resuming verification…');\n onSuccess(verificationId, accountChange.newPhone);\n return;\n }\n\n setIsChecking(false);\n } catch {\n setIsChecking(false);\n }\n };\n run().catch(() => undefined);\n return () => {\n active = false;\n };\n }, [getPendingAccountChangeQuery.refetch, getValues, onSuccess, setValue]);\n\n const onPhonePasswordSubmit = async (data: PhonePasswordFormData) => {\n if (!user) {\n toast.error('User not found');\n return;\n }\n\n try {\n setIsSubmitting(true);\n\n const normalizedPhone = normalizePhone(data.phone);\n\n // Verify password first\n await verifyPasswordMutation.mutateAsync({\n body: { password: data.password },\n });\n\n // Check if phone exists\n const checkResult = await checkUserMutation.mutateAsync({\n body: { identifier: normalizedPhone },\n });\n if (checkResult.data?.exists) {\n // Check if it belongs to current user\n if (\n user?.phone?.replace(/\\s/g, '') === normalizedPhone.replace(/\\s/g, '')\n ) {\n toast.error('This is already your current phone number.');\n return;\n }\n toast.error(\n 'This phone number is already taken. Please use a different number.',\n );\n return;\n }\n\n // Request OTP\n const verification = await requestPhoneOtpMutation.mutateAsync({\n body: {\n phone: normalizedPhone,\n context: 'change-phone',\n },\n });\n\n toast.success('Verification code sent to your phone');\n onSuccess(verification.data?.verificationId ?? '', normalizedPhone);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n if (\n errorCode === 'INVALID_PASSWORD' ||\n errorCode === 'USER_NOT_FOUND'\n ) {\n toast.error('Incorrect password. Please try again.');\n return;\n }\n }\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const isLoading = isSubmitting || isChecking;\n\n return (\n <form\n onSubmit={handleSubmit(onPhonePasswordSubmit)}\n className=\"p-4 space-y-4 border-t\"\n >\n <div className=\"space-y-4 w-full md:w-1/2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"phone\">Phone Number</Label>\n <Input\n id=\"phone\"\n type=\"tel\"\n placeholder=\"Enter your new phone number\"\n {...register('phone')}\n disabled={isLoading}\n />\n {errors.phone && (\n <p className=\"text-sm text-destructive\">{errors.phone.message}</p>\n )}\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"password\">Password</Label>\n <div className=\"relative\">\n <Input\n id=\"password\"\n type={showPassword ? 'text' : 'password'}\n autoComplete=\"current-password\"\n placeholder=\"Enter your password\"\n {...register('password')}\n disabled={isLoading}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n >\n {showPassword ? (\n <IconEyeOff className=\"h-4 w-4\" />\n ) : (\n <IconEye className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n {errors.password && (\n <p className=\"text-sm text-destructive\">\n {errors.password.message}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onCancel}\n disabled={isLoading}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={isLoading}>\n {isLoading && <Spinner className=\"mr-2 h-4 w-4\" />}\n {isChecking ? 'Checking…' : buttonText}\n </Button>\n </div>\n </form>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useApi, useSession } from '../../provider';\nimport { OtpVerificationModal } from './otp-verification-modal';\n\ntype AuthErrorLike = {\n code?: string;\n message?: string;\n name?: string;\n};\n\nfunction isAuthError(error: unknown): error is AuthErrorLike {\n return (\n typeof error === 'object' &&\n error !== null &&\n ('code' in error || 'message' in error || 'name' in error)\n );\n}\n\nfunction getErrorCode(error: AuthErrorLike): string | undefined {\n if (error.code) {\n return error.code;\n }\n if (error.message) {\n const upperMessage = error.message.toUpperCase().trim();\n const validCodes = [\n 'USER_NOT_FOUND',\n 'USER_EXISTS',\n 'INVALID_PASSWORD',\n 'VERIFICATION_EXPIRED',\n 'VERIFICATION_MISMATCH',\n 'VERIFICATION_NOT_FOUND',\n 'TOO_MANY_ATTEMPTS',\n 'UNAUTHORIZED',\n ];\n if (validCodes.includes(upperMessage)) {\n return upperMessage;\n }\n }\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (isAuthError(error)) {\n const errorCode = getErrorCode(error);\n switch (errorCode) {\n case 'USER_EXISTS':\n return 'This phone number is already taken. Please use a different number.';\n case 'VERIFICATION_EXPIRED':\n return 'Verification code has expired. Please request a new one.';\n case 'VERIFICATION_MISMATCH':\n return 'Invalid verification code. Please try again.';\n case 'VERIFICATION_NOT_FOUND':\n return 'Verification not found. Please request a new code.';\n default:\n return error.message || 'An error occurred. Please try again.';\n }\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'An error occurred. Please try again.';\n}\n\ntype VerifyChangePhoneFormProps = {\n phone: string;\n verificationId: string | null;\n onSuccess: () => void;\n onCancel: () => void;\n};\n\nexport function VerifyChangePhoneForm({\n phone,\n verificationId,\n onSuccess,\n onCancel,\n}: VerifyChangePhoneFormProps) {\n const { refresh } = useSession();\n const { hooks } = useApi();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [currentVerificationId, setCurrentVerificationId] =\n useState(verificationId);\n\n const verifyPhoneOtpMutation = hooks.useMutation(\n 'post',\n '/phone/verification/confirm',\n );\n const updatePhoneMutation = hooks.useMutation('put', '/profile/phone');\n const requestPhoneOtpMutation = hooks.useMutation(\n 'post',\n '/phone/verification/request',\n );\n\n const onOtpSubmit = async (code: string) => {\n if (!currentVerificationId) {\n toast.error('Verification not found. Please request a new code.');\n return;\n }\n try {\n setIsSubmitting(true);\n\n // Verify phone\n await verifyPhoneOtpMutation.mutateAsync({\n body: {\n verificationId: currentVerificationId,\n code,\n context: 'change-phone',\n },\n });\n\n // Update phone via auth client\n await updatePhoneMutation.mutateAsync({\n body: { phone },\n });\n\n toast.success('Phone number updated successfully');\n await refresh();\n onSuccess();\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n if (!currentVerificationId) {\n toast.error('Verification not found. Please request a new code.');\n return null;\n }\n\n return (\n <OtpVerificationModal\n open\n title=\"Verify phone\"\n description={`Enter the verification code sent to ${phone}`}\n verificationId={currentVerificationId}\n isLoading={isSubmitting}\n onSubmit={onOtpSubmit}\n onResend={async () => {\n try {\n setIsSubmitting(true);\n const next = await requestPhoneOtpMutation.mutateAsync({\n body: {\n phone,\n context: 'change-phone',\n },\n });\n setCurrentVerificationId(next.data?.verificationId ?? null);\n toast.success('Verification code resent');\n } catch (error) {\n toast.error(getErrorMessage(error));\n } finally {\n setIsSubmitting(false);\n }\n }}\n onCancel={onCancel}\n />\n );\n}\n","'use client';\n\nimport { ChangeEmailForm } from './change-email-form';\nimport { ChangePasswordForm } from './change-password-form';\nimport { ChangePhoneForm } from './change-phone-form';\n\nexport function Security() {\n return (\n <div className=\"p-6 space-y-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Security</h1>\n <p className=\"text-muted-foreground\">Manage your security settings</p>\n </div>\n\n <div className=\"space-y-4\">\n <ChangePasswordForm />\n <ChangeEmailForm />\n <ChangePhoneForm />\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Skeleton } from '@mesob/ui/components';\n\nexport function AuthFormSkeleton() {\n return (\n <div className=\"w-full max-w-md space-y-6 p-6\">\n <div className=\"space-y-2 text-center\">\n <Skeleton className=\"h-8 w-48 mx-auto\" />\n <Skeleton className=\"h-4 w-64 mx-auto\" />\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n\n <Skeleton className=\"h-10 w-full\" />\n </div>\n\n <div className=\"space-y-2\">\n <Skeleton className=\"h-px w-full\" />\n <Skeleton className=\"h-4 w-32 mx-auto\" />\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Skeleton } from '@mesob/ui/components';\n\nexport function ProfileSkeleton() {\n return (\n <div className=\"w-full max-w-4xl space-y-8 p-6\">\n {/* Header */}\n <div className=\"flex items-center gap-6\">\n <Skeleton className=\"h-24 w-24 rounded-full\" />\n <div className=\"space-y-2 flex-1\">\n <Skeleton className=\"h-8 w-48\" />\n <Skeleton className=\"h-4 w-64\" />\n </div>\n </div>\n\n {/* Profile sections */}\n <div className=\"space-y-6\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"space-y-4\">\n <Skeleton className=\"h-6 w-32\" />\n <div className=\"space-y-3\">\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-32\" />\n </div>\n <div className=\"flex justify-between items-center\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-40\" />\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useConfig } from '../provider';\nimport { getSessionCookieName } from '../utils/cookie';\n\nexport function useSessionCookieName(): string {\n const { config } = useConfig();\n return getSessionCookieName(config);\n}\n"],"mappings":"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","names":["useMesob","useState","jsx","error","jsx","jsx","jsxs","useMesob","useState","zodResolver","Alert","AlertDescription","AlertTitle","Button","Field","FieldError","FieldGroup","FieldLabel","Input","Spinner","useMesob","IconAlertCircle","useEffect","useState","Controller","useForm","toast","z","jsx","jsxs","z","useMesob","useState","useForm","zodResolver","useEffect","toast","FieldGroup","Controller","Field","FieldLabel","FieldError","Input","Button","Spinner","Alert","IconAlertCircle","AlertTitle","AlertDescription","zodResolver","Alert","AlertDescription","AlertTitle","Button","Field","FieldError","FieldGroup","FieldLabel","Input","Spinner","useMesob","IconAlertCircle","IconEye","IconEyeOff","useEffect","useState","Controller","useForm","toast","z","jsx","jsxs","z","isPhone","useMesob","useState","useForm","zodResolver","useEffect","toast","FieldGroup","Controller","Field","FieldLabel","Input","IconEyeOff","IconEye","FieldError","Button","Spinner","Alert","IconAlertCircle","AlertTitle","AlertDescription","zodResolver","Alert","AlertDescription","AlertTitle","Button","Field","FieldError","FieldGroup","FieldLabel","Input","useMesob","IconAlertCircle","IconEye","IconEyeOff","useEffect","useState","Controller","useForm","toast","z","jsx","jsxs","isPhone","z","useMesob","useState","useForm","zodResolver","useEffect","toast","FieldGroup","Controller","Field","FieldLabel","Input","FieldError","IconEyeOff","IconEye","Button","Alert","IconAlertCircle","AlertTitle","AlertDescription","zodResolver","Button","Field","FieldError","FieldGroup","InputOTP","InputOTPGroup","InputOTPSlot","Spinner","Controller","useForm","z","Button","Spinner","useEffect","useState","jsx","jsxs","useState","useEffect","Button","Spinner","jsx","jsxs","z","useForm","zodResolver","FieldGroup","Controller","Field","InputOTP","InputOTPGroup","InputOTPSlot","FieldError","Button","Spinner","Alert","AlertDescription","AlertTitle","useMesob","IconAlertCircle","useEffect","useState","toast","jsx","jsxs","useMesob","useState","useEffect","toast","Alert","IconAlertCircle","AlertTitle","AlertDescription","Alert","AlertDescription","AlertTitle","useMesob","IconAlertCircle","useEffect","useState","toast","jsx","jsxs","useMesob","useState","useEffect","toast","Alert","IconAlertCircle","AlertTitle","AlertDescription","Button","jsx","jsxs","Button","useState","jsx","jsxs","_","jsx","jsxs","jsx","jsxs","useState","Button","Badge","Button","useLocale","useState","jsx","jsxs","getTranslation","useLocale","useState","Badge","Button","Button","useState","jsx","jsxs","useState","Button","Badge","Button","useState","jsx","jsxs","useState","Badge","Button","Badge","Button","useState","jsx","jsxs","useState","Badge","Button","jsx","jsxs","Button","useState","zodResolver","Button","Input","Spinner","IconEye","IconEyeOff","useEffect","useState","useForm","toast","z","jsx","jsxs","z","isAuthError","validCodes","useState","useForm","zodResolver","useEffect","toast","Input","IconEyeOff","IconEye","Button","Spinner","useState","toast","jsx","jsxs","jsx","isAuthError","getErrorCode","validCodes","getErrorMessage","useState","toast","jsx","jsxs","useState","Button","zodResolver","Button","Collapsible","CollapsibleContent","CollapsibleTrigger","Input","Label","Spinner","IconChevronDown","IconEye","IconEyeOff","useState","useForm","toast","z","jsx","jsxs","z","isAuthError","getErrorCode","validCodes","useState","useForm","zodResolver","toast","Collapsible","CollapsibleTrigger","Button","IconChevronDown","CollapsibleContent","Label","Input","IconEyeOff","IconEye","Spinner","Button","Collapsible","CollapsibleContent","CollapsibleTrigger","IconChevronDown","useState","zodResolver","Button","Input","Label","Spinner","IconEye","IconEyeOff","useEffect","useState","useForm","toast","z","jsx","jsxs","z","isPhone","isAuthError","getErrorCode","validCodes","getErrorMessage","useState","useForm","zodResolver","useEffect","toast","Label","Input","IconEyeOff","IconEye","Button","Spinner","useState","toast","jsx","isAuthError","getErrorCode","validCodes","getErrorMessage","useState","toast","jsx","jsxs","useState","Collapsible","CollapsibleTrigger","Button","IconChevronDown","CollapsibleContent","jsx","jsxs","Skeleton","jsx","jsxs","Skeleton","jsx","jsxs"]}
|