@mesob/auth-react 0.0.8 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/auth/auth-page-layout.d.ts +1 -3
- package/dist/components/auth/auth-page-layout.js +1 -17
- package/dist/components/auth/auth-page-layout.js.map +1 -1
- package/dist/components/auth/countdown.js +70 -9
- package/dist/components/auth/countdown.js.map +1 -1
- package/dist/components/auth/forgot-password.js +101 -35
- package/dist/components/auth/forgot-password.js.map +1 -1
- package/dist/components/auth/pages/forgot-password-page.d.ts +2 -13
- package/dist/components/auth/pages/forgot-password-page.js +198 -126
- package/dist/components/auth/pages/forgot-password-page.js.map +1 -1
- package/dist/components/auth/pages/reset-password-page.d.ts +1 -12
- package/dist/components/auth/pages/reset-password-page.js +288 -200
- package/dist/components/auth/pages/reset-password-page.js.map +1 -1
- package/dist/components/auth/pages/sign-in-page.d.ts +1 -12
- package/dist/components/auth/pages/sign-in-page.js +352 -230
- package/dist/components/auth/pages/sign-in-page.js.map +1 -1
- package/dist/components/auth/pages/sign-up-page.d.ts +1 -11
- package/dist/components/auth/pages/sign-up-page.js +310 -216
- package/dist/components/auth/pages/sign-up-page.js.map +1 -1
- package/dist/components/auth/pages/verify-email-page.d.ts +2 -12
- package/dist/components/auth/pages/verify-email-page.js +203 -135
- package/dist/components/auth/pages/verify-email-page.js.map +1 -1
- package/dist/components/auth/pages/verify-phone-page.d.ts +1 -11
- package/dist/components/auth/pages/verify-phone-page.js +206 -137
- package/dist/components/auth/pages/verify-phone-page.js.map +1 -1
- package/dist/components/auth/reset-password-form.d.ts +1 -1
- package/dist/components/auth/reset-password-form.js +188 -106
- package/dist/components/auth/reset-password-form.js.map +1 -1
- package/dist/components/auth/sign-in.d.ts +3 -3
- package/dist/components/auth/sign-in.js +228 -109
- package/dist/components/auth/sign-in.js.map +1 -1
- package/dist/components/auth/sign-up.js +210 -122
- package/dist/components/auth/sign-up.js.map +1 -1
- package/dist/components/auth/verification-form.d.ts +1 -1
- package/dist/components/auth/verification-form.js +101 -53
- package/dist/components/auth/verification-form.js.map +1 -1
- package/dist/components/error-boundary.d.ts +27 -0
- package/dist/components/error-boundary.js +49 -0
- package/dist/components/error-boundary.js.map +1 -0
- package/dist/components/iam/permissions/permissions-page.d.ts +5 -0
- package/dist/components/iam/permissions/permissions-page.js +201 -0
- package/dist/components/iam/permissions/permissions-page.js.map +1 -0
- package/dist/components/iam/roles/roles-page.d.ts +5 -0
- package/dist/components/iam/roles/roles-page.js +199 -0
- package/dist/components/iam/roles/roles-page.js.map +1 -0
- package/dist/components/iam/sessions/sessions-page.d.ts +5 -0
- package/dist/components/iam/sessions/sessions-page.js +202 -0
- package/dist/components/iam/sessions/sessions-page.js.map +1 -0
- package/dist/components/iam/tenants/tenants-page.d.ts +5 -0
- package/dist/components/iam/tenants/tenants-page.js +202 -0
- package/dist/components/iam/tenants/tenants-page.js.map +1 -0
- package/dist/components/iam/users/users-page.d.ts +5 -0
- package/dist/components/iam/users/users-page.js +211 -0
- package/dist/components/iam/users/users-page.js.map +1 -0
- package/dist/components/profile/profile-page.d.ts +8 -0
- package/dist/components/profile/profile-page.js +163 -0
- package/dist/components/profile/profile-page.js.map +1 -0
- package/dist/components/shared/data-table/data-table.d.ts +22 -0
- package/dist/components/shared/data-table/data-table.js +85 -0
- package/dist/components/shared/data-table/data-table.js.map +1 -0
- package/dist/components/skeletons/auth-form-skeleton.d.ts +5 -0
- package/dist/components/skeletons/auth-form-skeleton.js +32 -0
- package/dist/components/skeletons/auth-form-skeleton.js.map +1 -0
- package/dist/components/skeletons/profile-skeleton.d.ts +5 -0
- package/dist/components/skeletons/profile-skeleton.js +33 -0
- package/dist/components/skeletons/profile-skeleton.js.map +1 -0
- package/dist/components/skeletons/table-skeleton.d.ts +9 -0
- package/dist/components/skeletons/table-skeleton.js +39 -0
- package/dist/components/skeletons/table-skeleton.js.map +1 -0
- package/dist/handle-error-BqDMxnQZ.d.ts +8 -0
- package/dist/index.d.ts +75 -208
- package/dist/index.js +2091 -1057
- package/dist/index.js.map +1 -1
- package/package.json +9 -3
- package/dist/handle-error-H0iqQxJ5.d.ts +0 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/components/auth/auth-card.tsx","../src/components/auth/auth-page-layout.tsx","../src/components/auth/countdown.tsx","../src/components/auth/forgot-password.tsx","../src/components/auth/pages/forgot-password-page.tsx","../src/context/auth-provider.tsx","../src/constants/auth.error.codes.ts","../src/utils/handle-error.ts","../src/components/auth/pages/reset-password-page.tsx","../src/components/auth/reset-password-form.tsx","../src/components/auth/pages/sign-in-page.tsx","../src/components/auth/sign-in.tsx","../src/utils/normalize-phone.ts","../src/components/auth/pages/sign-up-page.tsx","../src/components/auth/sign-up.tsx","../src/components/auth/pages/verify-email-page.tsx","../src/components/auth/verification-form.tsx","../src/components/auth/pages/verify-phone-page.tsx","../src/factory.ts","../src/hooks/use-session.ts"],"sourcesContent":["import type {\n AuthErrorCode,\n AuthErrorResponse,\n AuthResponse,\n PendingAccountChangeResponse,\n SessionResponse,\n User,\n VerificationResponse,\n} from './types';\n\n// Backend returns error code in 'error' field (AUTH_ERRORS values)\n// or in 'code' field, message in 'message' or 'error' field\nconst validErrorCodes: readonly 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] as const;\n\nexport class AuthError extends Error {\n code?: AuthErrorCode;\n status?: number;\n details?: Record<string, unknown>;\n\n constructor(\n message: string,\n code?: AuthErrorCode,\n status?: number,\n details?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'AuthError';\n this.code = code;\n this.status = status;\n this.details = details;\n }\n}\n\nexport type AuthClientConfig = {\n baseURL: string;\n};\n\nexport class AuthClient {\n private baseURL: string;\n\n constructor(config: AuthClientConfig) {\n this.baseURL = config.baseURL.replace(/\\/$/, '');\n }\n\n private async request<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const url = `${this.baseURL}${endpoint}`;\n const response = await fetch(url, {\n ...options,\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n if (!response.ok) {\n const text = await response.text();\n let errorData: AuthErrorResponse;\n try {\n errorData = JSON.parse(text);\n } catch {\n errorData = { error: 'Unknown error', message: text };\n }\n\n // Extract error code from code, error, or message field\n // Backend returns error codes in 'error' field (e.g., { error: 'INVALID_PASSWORD' })\n const potentialCode =\n errorData.code ||\n (typeof errorData.error === 'string' ? errorData.error : null) ||\n (typeof errorData.message === 'string' ? errorData.message : null);\n const upperCode = potentialCode?.toUpperCase().trim();\n const errorCode =\n upperCode && validErrorCodes.includes(upperCode as AuthErrorCode)\n ? (upperCode as AuthErrorCode)\n : undefined;\n const errorMessage =\n errorData.message || errorData.error || 'Request failed';\n\n throw new AuthError(\n errorMessage,\n errorCode as AuthErrorCode | undefined,\n response.status,\n errorData.details,\n );\n }\n\n const data = await response.json();\n return data;\n }\n\n signUpWithEmail(data: {\n email: string;\n password: string;\n fullName: string;\n handle?: string;\n }): Promise<AuthResponse | VerificationResponse> {\n return this.request<AuthResponse | VerificationResponse>('/sign-up', {\n method: 'POST',\n body: JSON.stringify({\n email: data.email,\n password: data.password,\n fullName: data.fullName,\n handle: data.handle,\n }),\n });\n }\n\n signUpWithPhone(data: {\n phone: string;\n password: string;\n fullName: string;\n handle?: string;\n }): Promise<AuthResponse | VerificationResponse> {\n return this.request<AuthResponse | VerificationResponse>('/sign-up', {\n method: 'POST',\n body: JSON.stringify({\n phone: data.phone,\n password: data.password,\n fullName: data.fullName,\n handle: data.handle,\n }),\n });\n }\n\n checkUser(data: { identifier: string }): Promise<{ exists: boolean }> {\n return this.request<{ exists: boolean }>('/check-user', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n signInWithPassword(data: {\n identifier: string;\n password: string;\n }): Promise<AuthResponse | VerificationResponse> {\n return this.request<AuthResponse | VerificationResponse>('/sign-in', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n signOut(): Promise<{ message: string }> {\n return this.request<{ message: string }>('/sign-out', {\n method: 'POST',\n });\n }\n\n requestEmailVerification(data?: {\n email?: string;\n }): Promise<{ verificationId: string }> {\n return this.request<{ verificationId: string }>(\n '/email/verification/request',\n {\n method: 'POST',\n body: JSON.stringify(data || {}),\n },\n );\n }\n\n verifyEmail(data: {\n verificationId: string;\n code: string;\n }): Promise<AuthResponse> {\n return this.request<AuthResponse>('/email/verification/confirm', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n resendVerification(_verificationId: string): Promise<{\n verificationId: string;\n }> {\n // For email, request new verification\n return this.requestEmailVerification();\n }\n\n requestPhoneOtp(data: {\n phone: string;\n context: 'sign-up' | 'sign-in' | 'change-phone';\n }): Promise<{ verificationId: string }> {\n return this.request<{ verificationId: string }>(\n '/phone/verification/request',\n {\n method: 'POST',\n body: JSON.stringify(data),\n },\n );\n }\n\n verifyPhoneOtp(data: {\n verificationId: string;\n code: string;\n context: 'sign-up' | 'sign-in' | 'change-phone';\n }): Promise<\n AuthResponse | { user: User | null; session: null; verified: boolean }\n > {\n return this.request('/phone/verification/confirm', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n forgotPassword(data: { identifier: string }): Promise<{\n message: string;\n }> {\n return this.request<{ message: string }>('/password/forgot', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n resetPassword(data: {\n verificationId: string;\n code: string;\n password: string;\n }): Promise<AuthResponse> {\n return this.request<AuthResponse>('/password/reset', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n verifyPassword(data: { password: string }): Promise<{ message: string }> {\n return this.request<{ message: string }>('/password/verify', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n changePassword(data: {\n currentPassword: string;\n newPassword: string;\n }): Promise<{ message: string }> {\n return this.request<{ message: string }>('/password/change', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n getSession(): Promise<SessionResponse> {\n return this.request<SessionResponse>('/session', {\n method: 'GET',\n });\n }\n\n getPendingAccountChange(): Promise<PendingAccountChangeResponse> {\n return this.request<PendingAccountChangeResponse>(\n '/account-change/pending',\n {\n method: 'GET',\n },\n );\n }\n\n updateProfile(data: { fullName?: string }): Promise<{ user: User }> {\n return this.request<{ user: User }>('/profile', {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n updateEmail(data: { email: string }): Promise<{ user: User }> {\n return this.request<{ user: User }>('/profile/email', {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n updatePhone(data: { phone: string }): Promise<{ user: User }> {\n return this.request<{ user: User }>('/profile/phone', {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n}\n","'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 p-4 items-center justify-center\">\n <div className=\"w-full max-w-md\">\n <div className=\"rounded-xl border bg-card p-8 shadow-lg\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n","'use client';\n\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from '@mesob/ui/components/alert';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport type { ReactNode } from 'react';\nimport type { AuthErrorContent } from '../../utils/handle-error';\n\ntype AuthPageLayoutProps = {\n title: string;\n description?: string;\n children: ReactNode;\n error?: AuthErrorContent | string | null;\n footer?: ReactNode;\n logoImage?: string;\n};\n\nexport const AuthPageLayout = ({\n title,\n description,\n children,\n error,\n footer,\n logoImage,\n}: AuthPageLayoutProps) => {\n const errorContent: AuthErrorContent | null = error\n ? // biome-ignore lint/style/noNestedTernary: <explanation>\n typeof error === 'string'\n ? { title: 'Error', description: error }\n : error\n : null;\n\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=\"Jiret\" 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 {errorContent && (\n <Alert variant=\"destructive\">\n <IconAlertCircle className=\"h-4 w-4\" />\n <AlertTitle>{errorContent.title}</AlertTitle>\n <AlertDescription>{errorContent.description}</AlertDescription>\n </Alert>\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 { Button } from '@mesob/ui/components/button';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { useTranslations } from 'next-intl';\nimport { useEffect, useState } from 'react';\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 = useTranslations('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 { zodResolver } from '@hookform/resolvers/zod';\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@mesob/ui/components/form';\nimport { Input } from '@mesob/ui/components/input';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { useTranslations } from 'next-intl';\nimport { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\n\ntype ForgotPasswordFormValues = {\n account: string;\n};\n\ntype ForgotPasswordProps = {\n onSubmit: (values: ForgotPasswordFormValues) => Promise<void> | void;\n isLoading?: boolean;\n onBack?: () => void;\n};\n\nexport const ForgotPassword = ({\n onSubmit,\n isLoading = false,\n}: ForgotPasswordProps) => {\n const t = useTranslations('Auth.forgotPassword');\n const forgotPasswordSchema = useMemo(\n () =>\n z.object({\n account: z.string().min(1, t('errors.accountRequired')),\n }),\n [t],\n );\n\n const form = useForm<ForgotPasswordFormValues>({\n resolver: zodResolver(forgotPasswordSchema),\n defaultValues: {\n account: '',\n },\n });\n\n const handleSubmit = form.handleSubmit(async (values) => {\n await onSubmit(values);\n });\n\n return (\n <Form {...form}>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <FormField\n control={form.control}\n name=\"account\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.accountLabel')}</FormLabel>\n <FormControl>\n <Input\n type=\"text\"\n placeholder={t('form.accountPlaceholder')}\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Button type=\"submit\" className=\"w-full\" disabled={isLoading}>\n {isLoading && <Spinner />}\n {isLoading ? t('form.submitting') : t('form.submit')}\n </Button>\n </form>\n </Form>\n );\n};\n","'use client';\n\nimport { useTranslations } from 'next-intl';\nimport type { ComponentProps } from 'react';\nimport { useState } from 'react';\nimport { useAuth } from '../../../context/auth-provider';\nimport type { AuthErrorContent } from '../../../utils/handle-error';\nimport { handleError } from '../../../utils/handle-error';\n\nimport { AuthPageLayout } from '../auth-page-layout';\nimport { ForgotPassword } from '../forgot-password';\n\ntype ForgotPasswordPageProps = {\n locale?: string;\n onNavigate: (path: string) => void;\n linkComponent?: React.ComponentType<ComponentProps<'a'> & { href: string }>;\n links?: {\n signIn?: string;\n };\n logoImage?: string;\n};\n\nexport const ForgotPasswordPage = ({\n onNavigate,\n linkComponent: Link,\n links,\n logoImage,\n}: ForgotPasswordPageProps) => {\n const t = useTranslations('Auth.forgotPassword');\n const { client } = useAuth();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const signInLink = links?.signIn || '/auth/sign-in';\n\n const handleSubmit = async (values: { account: string }) => {\n setIsLoading(true);\n setError(null);\n\n try {\n const res = await client.forgotPassword({ identifier: values.account });\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 const handleBack = () => {\n onNavigate(signInLink);\n };\n\n return (\n <AuthPageLayout\n title={t('title')}\n description={t('description')}\n error={error}\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 <ForgotPassword\n onSubmit={handleSubmit}\n isLoading={isLoading}\n onBack={handleBack}\n />\n </AuthPageLayout>\n );\n};\n","'use client';\n\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport type { AuthClient } from '../client';\nimport type { AuthResponse, Session, User } from '../types';\n\ntype AuthContextValue = {\n user: User | null;\n session: Session | null;\n loading: boolean;\n error: Error | null;\n client: AuthClient;\n refresh: () => Promise<void>;\n setAuth: (data: AuthResponse) => void;\n};\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nexport const useAuth = () => {\n const context = useContext(AuthContext);\n if (!context) {\n throw new Error('useAuth must be used within AuthProvider');\n }\n return context;\n};\n\ntype AuthProviderProps = {\n client: AuthClient;\n children: ReactNode;\n};\n\nexport const AuthProvider = ({ client, children }: AuthProviderProps) => {\n const [user, setUser] = useState<User | null>(null);\n const [session, setSession] = useState<Session | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const refresh = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n const data = await client.getSession();\n setUser(data.user);\n setSession(data.session);\n } catch (err) {\n setError(\n err instanceof Error ? err : new Error('Failed to fetch session'),\n );\n setUser(null);\n setSession(null);\n } finally {\n setLoading(false);\n }\n }, [client]);\n\n const setAuth = useCallback((data: AuthResponse) => {\n setUser(data.user);\n setSession(data.session);\n setError(null);\n setLoading(false);\n }, []);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return (\n <AuthContext.Provider\n value={{\n user,\n session,\n loading,\n error,\n client,\n refresh,\n setAuth,\n }}\n >\n {children}\n </AuthContext.Provider>\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 type { _Translator } from 'next-intl';\nimport { AuthError } from '../client';\nimport { AUTH_ERROR_MAPPING, validCodes } from '../constants/auth.error.codes';\n\nexport type AuthErrorContent = {\n title: string;\n description: string;\n};\n\nexport const handleError = (\n err: any,\n setError: (error: AuthErrorContent | null) => void,\n t: _Translator<Record<string, any>, string>,\n) => {\n if (err instanceof AuthError) {\n let errorCode = '';\n\n if (err.code && validCodes.includes(err.code)) {\n errorCode = err.code;\n } else if (err.message) {\n const messageUpper = err.message.toUpperCase().trim();\n if (validCodes.includes(messageUpper)) {\n errorCode = messageUpper;\n }\n }\n\n if (errorCode && AUTH_ERROR_MAPPING[errorCode]) {\n const mapping = AUTH_ERROR_MAPPING[errorCode];\n // Try to translate the description if a key exists, otherwise use English fallback\n // Since mapping.description is English text, we might want to check if there is a translation key\n // But for now, let's use the provided English mapping or try to find a translation if the key matches 'errors.code'\n\n // We can try to lookup translation, if it returns the key (or fallback), we might prefer the mapping text (which is nice English).\n // However, usually we prefer translation.\n // Let's rely on the mapping text primarily as per the request to \"Generate a description and title...\".\n // But if we want i18n support, we should probably add keys.\n // Given the prompt \"Generate a description... for each error code... and display\",\n // I will prioritize the static mapping I just created, but allows future i18n improvement.\n\n setError({\n title: mapping.title,\n description: mapping.description,\n });\n return;\n }\n\n // Fallback for AuthError without known code\n setError({\n title: t('errors.fallback'), // or 'Error'\n description: err.message || t('errors.fallback'),\n });\n } else {\n // Generic error\n const message = err instanceof Error ? err.message : t('errors.fallback');\n setError({\n title: 'Error',\n description: message,\n });\n }\n};\n","'use client';\n\nimport { useTranslations } from 'next-intl';\nimport type { ComponentProps } from 'react';\nimport { useState } from 'react';\nimport { useAuth } from '../../../context/auth-provider';\nimport type { AuthErrorContent } from '../../../utils/handle-error';\nimport { handleError } from '../../../utils/handle-error';\n\nimport { AuthPageLayout } from '../auth-page-layout';\nimport { ResetPasswordForm } from '../reset-password-form';\n\ntype ResetPasswordPageProps = {\n locale?: string;\n verificationId: string;\n onNavigate: (path: string) => void;\n linkComponent?: React.ComponentType<ComponentProps<'a'> & { href: string }>;\n links?: {\n signIn?: string;\n forgotPassword?: string;\n };\n logoImage?: string;\n redirectUrl?: string;\n};\n\nexport const ResetPasswordPage = ({\n verificationId,\n onNavigate,\n linkComponent: Link,\n links,\n logoImage,\n redirectUrl,\n}: ResetPasswordPageProps) => {\n const t = useTranslations('Auth.resetPassword');\n const common = useTranslations('Common');\n const { client, refresh } = useAuth();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const signInLink = links?.signIn || '/auth/sign-in';\n const forgotPasswordLink = links?.forgotPassword || '/auth/forgot-password';\n\n const handleSubmit = async (values: {\n code: string;\n password: string;\n confirmPassword: string;\n }) => {\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 client.resetPassword({\n verificationId,\n code: values.code,\n password: values.password,\n });\n await refresh();\n onNavigate(redirectUrl || '/');\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n };\n\n if (!verificationId) {\n return (\n <AuthPageLayout\n title={common('invalidLinkTitle')}\n description={common('invalidLinkDescription')}\n logoImage={logoImage}\n footer={\n Link ? (\n <Link\n href={forgotPasswordLink}\n className=\"text-primary hover:underline\"\n >\n {t('footer.requestNew')}\n </Link>\n ) : (\n <a\n href={forgotPasswordLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(forgotPasswordLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {t('footer.requestNew')}\n </a>\n )\n }\n >\n <div />\n </AuthPageLayout>\n );\n }\n\n return (\n <AuthPageLayout\n title={t('title')}\n description={t('description')}\n error={error}\n logoImage={logoImage}\n footer={\n Link ? (\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 <div className=\"flex items-center justify-between w-full gap-2\">\n <a\n href={forgotPasswordLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(forgotPasswordLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {t('footer.backToSignIn')}\n </a>\n <a\n href={forgotPasswordLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(forgotPasswordLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {t('footer.changeAccount')}\n </a>\n </div>\n )\n }\n >\n <ResetPasswordForm\n verificationId={verificationId}\n onSubmit={handleSubmit}\n isLoading={isLoading}\n error={error}\n />\n </AuthPageLayout>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@mesob/ui/components/form';\nimport { Input } from '@mesob/ui/components/input';\nimport {\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n} from '@mesob/ui/components/input-otp';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useTranslations } from 'next-intl';\nimport { useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport type { AuthErrorContent } from '../../utils/handle-error';\n\ntype ResetPasswordFormValues = {\n code: string;\n password: string;\n confirmPassword: string;\n};\n\ntype ResetPasswordFormProps = {\n verificationId: string;\n onSubmit: (values: ResetPasswordFormValues) => Promise<void> | void;\n isLoading?: boolean;\n error?: AuthErrorContent | string | null;\n};\n\nexport const ResetPasswordForm = ({\n onSubmit,\n isLoading = false,\n}: ResetPasswordFormProps) => {\n const t = useTranslations('Auth.resetPassword');\n const [showPassword, setShowPassword] = useState(false);\n const resetPasswordSchema = useMemo(\n () =>\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 [t],\n );\n\n const form = useForm<ResetPasswordFormValues>({\n resolver: zodResolver(resetPasswordSchema),\n defaultValues: {\n code: '',\n password: '',\n confirmPassword: '',\n },\n });\n\n const handleSubmit = form.handleSubmit(async (values) => {\n await onSubmit(values);\n });\n\n return (\n <Form {...form}>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <FormField\n control={form.control}\n name=\"code\"\n render={({ field }) => (\n <FormItem>\n <div className=\"flex justify-center\">\n <FormLabel>{t('form.codeLabel')}</FormLabel>\n </div>\n <FormControl>\n <div className=\"flex mt-2 justify-center\">\n <InputOTP maxLength={6} {...field} containerClassName=\"gap-4\">\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 </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n <FormField\n control={form.control}\n name=\"password\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.passwordLabel')}</FormLabel>\n <FormControl>\n <div className=\"relative\">\n <Input\n type={showPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n {...field}\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 </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n <FormField\n control={form.control}\n name=\"confirmPassword\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.confirmPasswordLabel')}</FormLabel>\n <FormControl>\n <div className=\"relative\">\n <Input\n type={showPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n {...field}\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 </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n <Button type=\"submit\" className=\"w-full\" disabled={isLoading}>\n {isLoading && <Spinner />}\n {isLoading ? t('form.submitting') : t('form.submit')}\n </Button>\n </form>\n </Form>\n );\n};\n","'use client';\n\nimport { useTranslations } from 'next-intl';\nimport type { ComponentProps } from 'react';\nimport { useState } from 'react';\nimport { useAuth } from '../../../context/auth-provider';\nimport type { AuthErrorContent } from '../../../utils/handle-error';\nimport { handleError } from '../../../utils/handle-error';\n\nimport { AuthPageLayout } from '../auth-page-layout';\nimport { SignIn } from '../sign-in';\n\nconst isPhone = (s: string) => /^\\+?[0-9()[\\]\\s-]{6,}$/.test(s);\n\ntype SignInPageProps = {\n locale?: string;\n redirectUrl?: string;\n onNavigate: (path: string) => void;\n linkComponent?: React.ComponentType<ComponentProps<'a'> & { href: string }>;\n links?: {\n forgotPassword?: string;\n signUp?: string;\n };\n logoImage?: string;\n};\n\nexport const SignInPage = ({\n redirectUrl,\n onNavigate,\n linkComponent: Link,\n links,\n logoImage,\n}: SignInPageProps) => {\n const t = useTranslations('Auth.signIn');\n const { client, setAuth } = useAuth();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n const [step, setStep] = useState<'identifier' | 'password'>('identifier');\n const [identifier, setIdentifier] = useState<string>('');\n\n const defaultRedirect = redirectUrl || '/dashboard';\n const forgotPasswordLink = links?.forgotPassword || '/auth/forgot-password';\n const signUpLink = links?.signUp || '/auth/sign-up';\n\n const handleSubmit = async (\n values: { account: string; password: string },\n currentStep: 'identifier' | 'password',\n ) => {\n setIsLoading(true);\n setError(null);\n\n try {\n if (currentStep === 'identifier') {\n const checkResult = await client.checkUser({\n identifier: values.account,\n });\n\n if (checkResult.exists) {\n setIdentifier(values.account);\n setStep('password');\n } else {\n const email = isPhone(values.account) ? '' : values.account;\n if (email) {\n onNavigate(`${signUpLink}?email=${encodeURIComponent(email)}`);\n } else {\n onNavigate(\n `${signUpLink}?phone=${encodeURIComponent(values.account)}`,\n );\n }\n return;\n }\n } else {\n const res = await client.signInWithPassword({\n identifier,\n password: values.password,\n });\n\n if ('verificationId' in res && res.verificationId) {\n const verifyPath = isPhone(identifier)\n ? `/auth/verify-phone?context=sign-in&verificationId=${res.verificationId}&identifier=${encodeURIComponent(identifier)}`\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 }\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleBack = () => {\n setStep('identifier');\n setIdentifier('');\n setError(null);\n };\n\n const isStepPassword = step === 'password';\n\n return (\n <div className=\"space-y-4\">\n <AuthPageLayout\n title={t('title')}\n description={isStepPassword ? undefined : t('description')}\n error={error}\n logoImage={logoImage}\n footer={\n <div\n className=\"flex items-center justify-center w-full gap-2\"\n style={{\n justifyContent: isStepPassword ? 'space-between' : 'center',\n }}\n >\n {isStepPassword && (\n // biome-ignore lint/a11y/useKeyWithClickEvents: change account\n <p\n className=\"text-primary inline-block cursor-pointer hover:underline\"\n onClick={handleBack}\n >\n {t('changeAccount')}\n </p>\n )}\n\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 className=\"text-primary inline-block hover:underline\"\n >\n {t('footer.forgotPassword')}\n </a>\n )}\n </div>\n }\n >\n <SignIn\n onSubmit={handleSubmit}\n isLoading={isLoading}\n identifier={identifier}\n step={step}\n />\n </AuthPageLayout>\n </div>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@mesob/ui/components/form';\nimport { Input } from '@mesob/ui/components/input';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useTranslations } from 'next-intl';\nimport { useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport { normalizePhone } from '../../utils/normalize-phone';\n\ntype SignInFormValues = {\n account: string;\n password: string;\n};\n\ntype SignInProps = {\n onSubmit: (\n values: SignInFormValues,\n step: 'identifier' | 'password',\n ) => Promise<void> | void;\n isLoading?: boolean;\n identifier?: string;\n step?: 'identifier' | 'password';\n onBack?: () => void;\n};\n\nexport const SignIn = ({\n onSubmit,\n isLoading = false,\n identifier = '',\n step = 'identifier',\n onBack: _onBack,\n}: SignInProps) => {\n const t = useTranslations('Auth.signIn');\n const [showPassword, setShowPassword] = useState(false);\n\n const identifierSchema = useMemo(\n () =>\n z.object({\n account: z\n .string()\n .trim()\n .min(1, { message: t('errors.requiredField') })\n .refine(\n (val) => {\n const isEmail = z.string().email().safeParse(val).success;\n const phoneRegex = /^(\\+2519|2519|09)\\d{8}$/;\n const isPhone = phoneRegex.test(val);\n return isEmail || isPhone;\n },\n {\n message: t('errors.invalidEmailOrPhone'),\n },\n ),\n }),\n [t],\n );\n\n const passwordSchema = useMemo(\n () =>\n z.object({\n password: z\n .string()\n .min(8, t('errors.passwordLength'))\n .max(128, t('errors.longPasswordError')),\n }),\n [t],\n );\n\n const identifierForm = useForm<{ account: string }>({\n resolver: zodResolver(identifierSchema),\n defaultValues: {\n account: identifier,\n },\n });\n\n const passwordForm = useForm<{ password: string }>({\n resolver: zodResolver(passwordSchema),\n defaultValues: {\n password: '',\n },\n });\n\n const handleIdentifierSubmit = identifierForm.handleSubmit(async (values) => {\n const phoneRegex = /^(\\+2519|2519|09)\\d{8}$/;\n const normalizedAccount = phoneRegex.test(values.account)\n ? normalizePhone(values.account)\n : values.account;\n await onSubmit({ account: normalizedAccount, password: '' }, 'identifier');\n });\n\n const handlePasswordSubmit = passwordForm.handleSubmit(async (values) => {\n await onSubmit(\n { account: identifier, password: values.password },\n 'password',\n );\n });\n\n if (step === 'password') {\n return (\n <Form {...passwordForm}>\n <form onSubmit={handlePasswordSubmit} className=\"space-y-4\">\n <div className=\"text-center\">\n <p className=\"text-sm text-muted-foreground mb-2\">\n {t('form.enterPasswordFor')}\n </p>\n <p className=\"font-bold\">{identifier}</p>\n </div>\n <FormField\n control={passwordForm.control}\n name=\"password\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.passwordLabel')}</FormLabel>\n <FormControl>\n <div className=\"relative\">\n <Input\n type={showPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n autoComplete=\"current-password\"\n {...field}\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 </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Button type=\"submit\" className=\"w-full\" disabled={isLoading}>\n {isLoading ? t('form.submitting') : t('form.submit')}\n </Button>\n </form>\n </Form>\n );\n }\n\n return (\n <Form {...identifierForm}>\n <form onSubmit={handleIdentifierSubmit} className=\"space-y-4\">\n <FormField\n control={identifierForm.control}\n name=\"account\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.accountLabel')}</FormLabel>\n <FormControl>\n <Input\n type=\"text\"\n placeholder={t('form.accountPlaceholder')}\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Button type=\"submit\" className=\"w-full\" disabled={isLoading}>\n {isLoading && <Spinner />}\n {isLoading ? t('form.submitting') : t('form.continue')}\n </Button>\n </form>\n </Form>\n );\n};\n","export function normalizePhone(phone: string): string {\n const cleaned = phone.trim().replace(/\\s/g, '');\n if (cleaned.startsWith('+2519')) {\n return cleaned;\n }\n if (cleaned.startsWith('2519')) {\n return `+${cleaned}`;\n }\n if (cleaned.startsWith('09')) {\n return `+251${cleaned.slice(1)}`;\n }\n if (cleaned.startsWith('9') && cleaned.length === 9) {\n return `+251${cleaned}`;\n }\n return cleaned;\n}\n","'use client';\n\nimport { useTranslations } from 'next-intl';\nimport type { ComponentProps } from 'react';\nimport { useState } from 'react';\nimport { useAuth } from '../../../context/auth-provider';\nimport type { AuthErrorContent } from '../../../utils/handle-error';\nimport { handleError } from '../../../utils/handle-error';\n\nimport { AuthPageLayout } from '../auth-page-layout';\nimport { SignUp } from '../sign-up';\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 SignUpPageProps = {\n locale?: string;\n redirectUrl?: string;\n onNavigate: (path: string) => void;\n linkComponent?: React.ComponentType<ComponentProps<'a'> & { href: string }>;\n links?: {\n signIn?: string;\n };\n initialIdentifier?: string;\n logoImage?: string;\n};\n\nexport const SignUpPage = ({\n redirectUrl,\n onNavigate,\n linkComponent: Link,\n links,\n initialIdentifier,\n logoImage,\n}: SignUpPageProps) => {\n const t = useTranslations('Auth.signUp');\n const { client, setAuth } = useAuth();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const signInLink = links?.signIn || '/auth/sign-in';\n\n const handleSubmit = async (values: SignUpFormValues) => {\n setIsLoading(true);\n setError(null);\n\n try {\n const identifier = values.identifier;\n const usingPhone = isPhone(identifier);\n\n const res = usingPhone\n ? await client.signUpWithPhone({\n phone: identifier,\n password: values.password,\n fullName: values.fullName,\n handle: values.handle,\n })\n : await client.signUpWithEmail({\n email: identifier,\n password: values.password,\n fullName: values.fullName,\n handle: values.handle,\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(redirectUrl || '/');\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <AuthPageLayout\n title={t('title')}\n description={t('description')}\n error={error}\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 <SignUp\n onSubmit={handleSubmit}\n isLoading={isLoading}\n initialIdentifier={initialIdentifier}\n />\n </AuthPageLayout>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@mesob/ui/components/form';\nimport { Input } from '@mesob/ui/components/input';\nimport { IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useTranslations } from 'next-intl';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\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 onSubmit: (values: SignUpFormValues) => Promise<void> | void;\n isLoading?: boolean;\n initialIdentifier?: string;\n};\n\nexport const SignUp = ({\n onSubmit,\n isLoading = false,\n initialIdentifier,\n}: SignUpProps) => {\n const t = useTranslations('Auth.signUp');\n const hasInitialIdentifier = !!initialIdentifier;\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n\n const signUpSchema = useMemo(\n () =>\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 [t],\n );\n\n const form = useForm<SignUpFormValues>({\n resolver: zodResolver(signUpSchema),\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 const handleSubmit = form.handleSubmit(async (values) => {\n await onSubmit(values);\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 return (\n <Form {...form}>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <FormField\n control={form.control}\n name=\"fullName\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.fullNameLabel')}</FormLabel>\n <FormControl>\n <Input placeholder={t('form.fullNamePlaceholder')} {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"identifier\"\n render={({ field }) => (\n <FormItem>\n <FormLabel className={hasInitialIdentifier ? 'block' : undefined}>\n {identifierLabel}\n </FormLabel>\n <FormControl>\n <Input\n type={field.value.includes('@') ? 'email' : 'tel'}\n placeholder={\n hasInitialIdentifier\n ? undefined\n : t('form.accountPlaceholder') || 'Email or phone number'\n }\n {...field}\n disabled={hasInitialIdentifier}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"password\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.passwordLabel')}</FormLabel>\n <FormControl>\n <div className=\"relative\">\n <Input\n type={showPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n {...field}\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 </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"confirmPassword\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('form.confirmPasswordLabel')}</FormLabel>\n <FormControl>\n <div className=\"relative\">\n <Input\n type={showConfirmPassword ? 'text' : 'password'}\n placeholder={t('form.passwordPlaceholder')}\n {...field}\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 </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <Button type=\"submit\" className=\"w-full\" disabled={isLoading}>\n {isLoading ? t('form.submitting') : t('form.submit')}\n </Button>\n </form>\n </Form>\n );\n};\n","'use client';\n\nimport { useTranslations } from 'next-intl';\nimport type { ComponentProps } from 'react';\nimport { useState } from 'react';\nimport { useAuth } from '../../../context/auth-provider';\nimport type { AuthErrorContent } from '../../../utils/handle-error';\nimport { handleError } from '../../../utils/handle-error';\n\nimport { AuthPageLayout } from '../auth-page-layout';\nimport { VerificationForm } from '../verification-form';\n\ntype VerifyEmailPageProps = {\n locale?: string;\n verificationId: string;\n email: string;\n onNavigate: (path: string) => void;\n linkComponent?: React.ComponentType<ComponentProps<'a'> & { href: string }>;\n links?: {\n signIn?: string;\n };\n logoImage?: string;\n redirectUrl: string;\n};\n\nexport const VerifyEmailPage = ({\n verificationId,\n onNavigate,\n linkComponent: Link,\n links,\n email,\n logoImage,\n redirectUrl,\n}: VerifyEmailPageProps) => {\n const t = useTranslations('Auth.verification');\n const common = useTranslations('Common');\n const footer = useTranslations('Auth.forgotPassword.footer');\n const { client, setAuth } = useAuth();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const signInLink = links?.signIn || '/auth/sign-in';\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 client.verifyEmail({\n verificationId,\n code: values.code,\n });\n if ('user' in res && 'session' in res) {\n setAuth(res);\n }\n onNavigate(redirectUrl || '/');\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 client.requestEmailVerification({ email });\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 <AuthPageLayout\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 </AuthPageLayout>\n );\n }\n\n return (\n <AuthPageLayout\n title={t('email.title')}\n description={t('email.description')}\n error={error}\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={isLoading}\n error={error}\n />\n </AuthPageLayout>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Button } from '@mesob/ui/components/button';\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormMessage,\n} from '@mesob/ui/components/form';\nimport {\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n} from '@mesob/ui/components/input-otp';\nimport { Spinner } from '@mesob/ui/components/spinner';\nimport { useTranslations } from 'next-intl';\nimport { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\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\nexport const VerificationForm = ({\n onSubmit,\n onResend,\n isLoading = false,\n}: VerificationFormProps) => {\n const t = useTranslations('Auth.verification');\n const verificationSchema = useMemo(\n () =>\n z.object({\n code: z.string().length(6, t('form.codeLength')),\n }),\n [t],\n );\n const form = useForm<VerificationFormValues>({\n resolver: zodResolver(verificationSchema),\n defaultValues: {\n code: '',\n },\n });\n\n return (\n <Form {...form}>\n <form className=\"space-y-4\">\n <FormField\n control={form.control}\n name=\"code\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\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 >\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 </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n <div className=\"flex justify-between items-center\">\n <Countdown onResend={onResend} resending={isLoading} />\n <Button\n type=\"button\"\n onClick={() => {\n form.handleSubmit(async (values) => {\n await onSubmit(values);\n })();\n }}\n disabled={isLoading || form.watch('code').length !== 6}\n >\n {isLoading && <Spinner />}\n {t('form.confirm')}\n </Button>\n </div>\n </form>\n </Form>\n );\n};\n","'use client';\n\nimport { useTranslations } from 'next-intl';\nimport type { ComponentProps } from 'react';\nimport { useState } from 'react';\nimport { useAuth } from '../../../context/auth-provider';\nimport type { AuthResponse } from '../../../types';\nimport type { AuthErrorContent } from '../../../utils/handle-error';\nimport { handleError } from '../../../utils/handle-error';\n\nimport { AuthPageLayout } from '../auth-page-layout';\nimport { VerificationForm } from '../verification-form';\n\ntype VerifyPhonePageProps = {\n locale?: string;\n verificationId: string;\n context: 'sign-in' | 'sign-up';\n phone?: string;\n onNavigate: (path: string) => void;\n linkComponent?: React.ComponentType<ComponentProps<'a'> & { href: string }>;\n links?: {\n signIn?: string;\n };\n logoImage?: string;\n redirectUrl?: string;\n};\nexport const VerifyPhonePage = ({\n verificationId,\n context,\n phone = '',\n onNavigate,\n linkComponent: Link,\n links,\n logoImage,\n redirectUrl,\n}: VerifyPhonePageProps) => {\n const t = useTranslations('Auth.verification');\n const common = useTranslations('Common');\n const footer = useTranslations('Auth.forgotPassword.footer');\n const { client, refresh, setAuth } = useAuth();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const signInLink = links?.signIn || '/auth/sign-in';\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 client.verifyPhoneOtp({\n verificationId,\n code: values.code,\n context,\n });\n if (res && 'user' in res && 'session' in res && res.session) {\n setAuth(res as AuthResponse);\n onNavigate(redirectUrl || '/');\n return;\n }\n await refresh();\n onNavigate(redirectUrl || '/');\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 client.requestPhoneOtp({ phone: targetPhone, context });\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 <AuthPageLayout\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 </AuthPageLayout>\n );\n }\n\n return (\n <AuthPageLayout\n title={t('phone.title')}\n description={t('phone.description', {\n target: phone || t('phone.missingPhone'),\n })}\n error={error}\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={isLoading}\n error={error}\n />\n </AuthPageLayout>\n );\n};\n","import type { AuthClientConfig } from './client';\nimport { AuthClient } from './client';\n\nexport const createAuthClient = (config: AuthClientConfig) => {\n const client = new AuthClient(config);\n\n return {\n signUpWithEmail: client.signUpWithEmail.bind(client),\n signUpWithPhone: client.signUpWithPhone.bind(client),\n signInWithPassword: client.signInWithPassword.bind(client),\n signOut: client.signOut.bind(client),\n requestEmailVerification: client.requestEmailVerification.bind(client),\n verifyEmail: client.verifyEmail.bind(client),\n resendVerification: client.resendVerification.bind(client),\n requestPhoneOtp: client.requestPhoneOtp.bind(client),\n verifyPhoneOtp: client.verifyPhoneOtp.bind(client),\n forgotPassword: client.forgotPassword.bind(client),\n resetPassword: client.resetPassword.bind(client),\n changePassword: client.changePassword.bind(client),\n getSession: client.getSession.bind(client),\n useSession: () => {\n // This will be used via AuthProvider context\n throw new Error('useSession must be used within AuthProvider');\n },\n };\n};\n","'use client';\n\nimport { useAuth } from '../context/auth-provider';\n\nexport const useSession = () => {\n const { user, session, loading, error, refresh } = useAuth();\n\n return {\n user,\n session,\n isLoading: loading,\n isAuthenticated: !!user && !!session,\n error,\n refresh,\n };\n};\n"],"mappings":"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","names":["jsx","jsx","jsxs","Button","Spinner","useTranslations","jsx","jsxs","useTranslations","useState","useEffect","useState","jsx","jsx","useTranslations","useState","useTranslations","useState","zodResolver","Button","Form","FormControl","FormField","FormItem","FormLabel","FormMessage","Input","Spinner","useTranslations","useMemo","useState","useForm","z","jsx","jsxs","jsx","jsxs","useTranslations","useState","useTranslations","useState","zodResolver","Button","Form","FormControl","FormField","FormItem","FormLabel","FormMessage","Input","Spinner","IconEye","IconEyeOff","useTranslations","useMemo","useState","useForm","z","jsx","jsxs","useTranslations","useState","useMemo","z","isPhone","useForm","zodResolver","Form","FormField","FormItem","FormLabel","FormControl","Input","IconEyeOff","IconEye","FormMessage","Button","Spinner","jsx","jsxs","useTranslations","useState","useTranslations","useState","zodResolver","Button","Form","FormControl","FormField","FormItem","FormLabel","FormMessage","Input","IconEye","IconEyeOff","useTranslations","useEffect","useMemo","useState","useForm","z","jsx","jsxs","isPhone","jsx","jsxs","isPhone","useTranslations","useState","useTranslations","useState","zodResolver","Button","Form","FormControl","FormField","FormItem","FormMessage","InputOTP","InputOTPGroup","InputOTPSlot","Spinner","useTranslations","useMemo","useForm","z","jsx","jsxs","useTranslations","useMemo","z","useForm","zodResolver","Form","FormField","FormItem","FormControl","InputOTP","InputOTPGroup","InputOTPSlot","FormMessage","Button","Spinner","jsx","useTranslations","useState","useTranslations","useState","jsx","useTranslations","useState"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/auth/auth-card.tsx","../src/components/auth/pages/forgot-password-page.tsx","../src/lib/translations.ts","../src/provider.tsx","../src/types.ts","../src/utils/custom-fetch.ts","../src/constants/auth.error.codes.ts","../src/utils/handle-error.ts","../src/components/auth/auth-page-layout.tsx","../src/components/auth/forgot-password.tsx","../src/hooks/use-translator.ts","../src/components/auth/pages/reset-password-page.tsx","../src/components/auth/reset-password-form.tsx","../src/components/auth/pages/sign-in-page.tsx","../src/components/auth/sign-in.tsx","../src/utils/normalize-phone.ts","../src/components/auth/pages/sign-up-page.tsx","../src/components/auth/sign-up.tsx","../src/components/auth/pages/verify-email-page.tsx","../src/components/auth/verification-form.tsx","../src/components/auth/countdown.tsx","../src/components/auth/pages/verify-phone-page.tsx","../src/components/error-boundary.tsx","../src/components/iam/permissions/permissions-page.tsx","../src/components/shared/data-table/data-table.tsx","../src/components/skeletons/table-skeleton.tsx","../src/components/iam/roles/roles-page.tsx","../src/components/iam/sessions/sessions-page.tsx","../src/components/iam/tenants/tenants-page.tsx","../src/components/iam/users/users-page.tsx","../src/components/profile/profile-page.tsx","../src/components/skeletons/profile-skeleton.tsx","../src/components/skeletons/auth-form-skeleton.tsx","../src/utils/cookie.ts","../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 p-4 items-center justify-center\">\n <div className=\"w-full max-w-md\">\n <div className=\"rounded-xl border bg-card p-8 shadow-lg\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n","'use client';\n\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from '@mesob/ui/components/alert';\nimport { toast } from '@mesob/ui/components/sonner';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { createTranslator } from '../../../lib/translations';\nimport { useApi, useConfig } from '../../../provider';\nimport type { AuthErrorContent } from '../../../utils/handle-error';\nimport { handleError } from '../../../utils/handle-error';\n\nimport { AuthPageLayout } from '../auth-page-layout';\nimport { ForgotPassword } from '../forgot-password';\n\ntype ForgotPasswordPageProps = Record<string, never>;\n\nexport const ForgotPasswordPage = (_props: ForgotPasswordPageProps = {}) => {\n const { hooks } = useApi();\n const { config } = useConfig();\n const t = createTranslator(config.messages || {}, 'Auth.forgotPassword');\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 Link = config.navigation?.linkComponent;\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 useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleSubmit = async (values: { account: string }) => {\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 const handleBack = () => {\n onNavigate(signInLink);\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 <AuthPageLayout\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 <ForgotPassword\n onSubmit={handleSubmit}\n isLoading={isLoading || forgotPasswordMutation.isPending}\n onBack={handleBack}\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 </AuthPageLayout>\n );\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, useEffect, 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 { createCustomFetch } from './utils/custom-fetch';\n\ntype OpenApiHooks = any;\n\ntype SessionState = {\n user: User | null;\n session: Session | null;\n isLoading: boolean;\n isAuthenticated: boolean;\n error: Error | null;\n};\n\ntype SessionContextValue = SessionState & {\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 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 staleTime: 1000 * 60 * 5,\n gcTime: 1000 * 60 * 10,\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n});\n\nexport function useSession() {\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() {\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() {\n const context = useContext(ConfigContext);\n if (!context) {\n throw new Error('useConfig must be used within MesobAuthProvider');\n }\n return context;\n}\n\ntype MesobAuthProviderProps = {\n config: AuthClientConfig;\n children: ReactNode;\n};\n\nexport function MesobAuthProvider({\n config,\n children,\n}: MesobAuthProviderProps) {\n const mergedConfig = deepmerge(\n { ...defaultAuthClientConfig } as Partial<AuthClientConfig>,\n config,\n ) as AuthClientConfig;\n\n const api = createFetchClient<paths>({\n baseUrl: mergedConfig.baseURL,\n fetch: createCustomFetch(mergedConfig),\n });\n\n const hooks = createClient(api);\n\n return (\n <QueryClientProvider client={queryClient}>\n <AuthStateProvider config={mergedConfig} hooks={hooks}>\n {children}\n </AuthStateProvider>\n </QueryClientProvider>\n );\n}\n\ntype AuthStateProviderProps = {\n config: AuthClientConfig;\n hooks: OpenApiHooks;\n children: ReactNode;\n};\n\nfunction AuthStateProvider({\n config,\n hooks,\n children,\n}: AuthStateProviderProps) {\n const [authState, setAuthState] = useState<{\n user: User | null;\n session: Session | null;\n isLoading: boolean;\n error: Error | null;\n }>({\n user: null,\n session: null,\n isLoading: false,\n error: null,\n });\n\n const {\n data: sessionData,\n isLoading: sessionLoading,\n error: sessionError,\n refetch,\n } = hooks.useQuery(\n 'get',\n '/session',\n {},\n {\n enabled: true,\n refetchOnMount: true,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n retry: false,\n },\n );\n\n useEffect(() => {\n if (sessionLoading) {\n setAuthState((prev) => ({ ...prev, isLoading: true }));\n return;\n }\n\n if (sessionError) {\n setAuthState({\n user: null,\n session: null,\n isLoading: false,\n error: sessionError as Error,\n });\n return;\n }\n\n if (sessionData) {\n setAuthState({\n user: sessionData.user,\n session: sessionData.session,\n isLoading: false,\n error: null,\n });\n return;\n }\n\n setAuthState({\n user: null,\n session: null,\n isLoading: false,\n error: null,\n });\n }, [sessionData, sessionLoading, sessionError]);\n\n const refresh = async () => {\n await refetch();\n };\n\n const setAuth = (auth: AuthResponse) => {\n setAuthState({\n user: auth.user,\n session: auth.session,\n isLoading: false,\n error: null,\n });\n };\n\n const clearAuth = () => {\n setAuthState({\n user: null,\n session: null,\n isLoading: false,\n error: null,\n });\n };\n\n const signOutMutation = hooks.useMutation('post', '/sign-out');\n\n const signOut = async () => {\n try {\n await signOutMutation.mutateAsync({});\n } finally {\n clearAuth();\n }\n };\n\n const t = createTranslator(config.messages || {});\n\n return (\n <ConfigContext.Provider value={{ config, t }}>\n <ApiContext.Provider value={{ hooks, setAuth, clearAuth, refresh }}>\n <SessionContext.Provider\n value={{\n user: authState.user,\n session: authState.session,\n isLoading: authState.isLoading,\n isAuthenticated: !!authState.user && !!authState.session,\n error: authState.error,\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 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 navigation?: NavigationConfig;\n messages?: Record<string, unknown>;\n cookiePrefix?: 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};\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} 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\nexport const createCustomFetch = (config: AuthClientConfig) => {\n return (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const baseUrl = config.baseURL;\n\n // Handle Request object vs string URL\n if (input instanceof Request) {\n // openapi-fetch passes a Request object with all options baked in\n const originalUrl = input.url;\n const fullUrl = originalUrl.startsWith('http')\n ? originalUrl\n : `${baseUrl}${originalUrl}`;\n\n // If URL already matches, just add credentials via fetch options\n if (originalUrl === fullUrl) {\n return fetch(input, {\n credentials: 'include',\n });\n }\n\n // Clone request to get fresh body stream (body can only be read once)\n const clonedRequest = input.clone();\n\n // Create new request with updated URL and credentials\n const requestInit: RequestInit & { duplex?: 'half' } = {\n method: clonedRequest.method,\n headers: clonedRequest.headers,\n credentials: 'include',\n };\n\n // Add body with duplex if present (required for streaming body)\n if (clonedRequest.body !== null) {\n requestInit.body = clonedRequest.body;\n requestInit.duplex = 'half';\n }\n\n return fetch(fullUrl, requestInit);\n }\n\n // Handle string URL (fallback)\n const urlString = typeof input === 'string' ? input : input.toString();\n const fullUrl = urlString.startsWith('http')\n ? urlString\n : `${baseUrl}${urlString}`;\n\n return fetch(fullUrl, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n credentials: 'include',\n });\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 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 setError({\n title: t('errors.fallback'),\n description: err.message || t('errors.fallback'),\n });\n}\n\nfunction handleGenericError(\n err: unknown,\n setError: (error: AuthErrorContent | null) => void,\n t: TranslatorFunction,\n) {\n const message = err instanceof Error ? err.message : t('errors.fallback');\n setError({\n title: 'Error',\n description: message,\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 AuthPageLayoutProps = {\n title: string;\n description?: string;\n children: ReactNode;\n footer?: ReactNode;\n logoImage?: string;\n};\n\nexport const AuthPageLayout = ({\n title,\n description,\n children,\n footer,\n logoImage,\n}: AuthPageLayoutProps) => {\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 { 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 { Spinner } from '@mesob/ui/components/spinner';\nimport { Controller, useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\n\ntype ForgotPasswordFormValues = {\n account: string;\n};\n\ntype ForgotPasswordProps = {\n onSubmit: (values: ForgotPasswordFormValues) => Promise<void> | void;\n isLoading?: boolean;\n onBack?: () => void;\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 onSubmit,\n isLoading = false,\n}: ForgotPasswordProps) => {\n const t = useTranslator('Auth.forgotPassword');\n\n const form = useForm<ForgotPasswordFormValues>({\n resolver: zodResolver(forgotPasswordSchema(t)),\n defaultValues: {\n account: '',\n },\n });\n\n const handleSubmit = form.handleSubmit(async (values) => {\n await onSubmit(values);\n });\n\n return (\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 && <FieldError errors={[fieldState.error]} />}\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}\n >\n {isLoading && <Spinner />}\n {isLoading ? t('form.submitting') : t('form.submit')}\n </Button>\n </div>\n </form>\n );\n};\n","import { createTranslator } from '../lib/translations';\nimport { useConfig } from '../provider';\n\nexport function useTranslator(namespace?: string) {\n const { config } = useConfig();\n return createTranslator(config.messages || {}, namespace);\n}\n","'use client';\n\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from '@mesob/ui/components/alert';\nimport { toast } from '@mesob/ui/components/sonner';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { createTranslator } from '../../../lib/translations';\nimport { useApi, useConfig } from '../../../provider';\nimport type { AuthErrorContent } from '../../../utils/handle-error';\nimport { handleError } from '../../../utils/handle-error';\n\nimport { AuthPageLayout } from '../auth-page-layout';\nimport { ResetPasswordForm } from '../reset-password-form';\n\ntype ResetPasswordPageProps = {\n verificationId: string;\n redirectUrl?: string; // Can override defaultRedirectUrl from config\n};\n\nexport const ResetPasswordPage = ({\n verificationId,\n redirectUrl,\n}: ResetPasswordPageProps) => {\n const { hooks, refresh } = useApi();\n const { config } = useConfig();\n const t = createTranslator(config.messages || {}, 'Auth.resetPassword');\n const common = createTranslator(config.messages || {}, 'Common');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\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 Link = config.navigation?.linkComponent;\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: {\n code: string;\n password: string;\n confirmPassword: string;\n }) => {\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 <AuthPageLayout\n title={common('invalidLinkTitle')}\n description={common('invalidLinkDescription')}\n logoImage={logoImage}\n footer={\n Link ? (\n <Link\n href={forgotPasswordLink}\n className=\"text-primary hover:underline\"\n >\n {t('footer.requestNew')}\n </Link>\n ) : (\n <a\n href={forgotPasswordLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(forgotPasswordLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {t('footer.requestNew')}\n </a>\n )\n }\n >\n <div />\n </AuthPageLayout>\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 <AuthPageLayout\n title={t('title')}\n description={t('description')}\n logoImage={logoImage}\n footer={\n Link ? (\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 <div className=\"flex items-center justify-between w-full gap-2\">\n <a\n href={forgotPasswordLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(forgotPasswordLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {t('footer.backToSignIn')}\n </a>\n <a\n href={forgotPasswordLink}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(forgotPasswordLink);\n }}\n className=\"text-primary hover:underline\"\n >\n {t('footer.changeAccount')}\n </a>\n </div>\n )\n }\n >\n <ResetPasswordForm\n verificationId={verificationId}\n onSubmit={handleSubmit}\n isLoading={isLoading || resetPasswordMutation.isPending}\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 </AuthPageLayout>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\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 { Spinner } from '@mesob/ui/components/spinner';\nimport { IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport type { AuthErrorContent } from '../../utils/handle-error';\n\ntype ResetPasswordFormValues = {\n code: string;\n password: string;\n confirmPassword: string;\n};\n\ntype ResetPasswordFormProps = {\n verificationId: string;\n onSubmit: (values: ResetPasswordFormValues) => Promise<void> | void;\n isLoading?: boolean;\n error?: AuthErrorContent | string | null;\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 onSubmit,\n isLoading = false,\n}: ResetPasswordFormProps) => {\n const t = useTranslator('Auth.resetPassword');\n const [showPassword, setShowPassword] = useState(false);\n\n const form = useForm<ResetPasswordFormValues>({\n resolver: zodResolver(resetPasswordSchema(t)),\n defaultValues: {\n code: '',\n password: '',\n confirmPassword: '',\n },\n });\n\n const handleSubmit = form.handleSubmit(async (values) => {\n await onSubmit(values);\n });\n\n return (\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 && <FieldError errors={[fieldState.error]} />}\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 && <FieldError errors={[fieldState.error]} />}\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 && <FieldError errors={[fieldState.error]} />}\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}\n >\n {isLoading && <Spinner />}\n {isLoading ? t('form.submitting') : t('form.submit')}\n </Button>\n </div>\n </form>\n );\n};\n","'use client';\n\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from '@mesob/ui/components/alert';\nimport { toast } from '@mesob/ui/components/sonner';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { createTranslator } from '../../../lib/translations';\nimport { useApi, useConfig } from '../../../provider';\nimport type { AuthErrorContent } from '../../../utils/handle-error';\nimport { handleError } from '../../../utils/handle-error';\n\nimport { AuthPageLayout } from '../auth-page-layout';\nimport { SignIn } from '../sign-in';\n\nconst isPhone = (s: string) => /^\\+?[0-9()[\\]\\s-]{6,}$/.test(s);\n\ntype SignInPageProps = {\n redirectUrl?: string; // Can override defaultRedirectUrl from config\n};\n\nexport const SignInPage = ({ redirectUrl }: SignInPageProps = {}) => {\n const { hooks, setAuth } = useApi();\n const { config } = useConfig();\n const t = createTranslator(config.messages || {}, 'Auth.signIn');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n const [step, setStep] = useState<'identifier' | 'password'>('identifier');\n const [identifier, setIdentifier] = useState<string>('');\n\n const checkUserMutation = hooks.useMutation('post', '/check-user');\n const signInMutation = hooks.useMutation('post', '/sign-in');\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 Link = config.navigation?.linkComponent;\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 useEffect(() => {\n if (error) {\n toast.error(error.title || 'Error', {\n description: error.description,\n });\n }\n }, [error]);\n\n const handleIdentifierStep = async (identifierValue: string) => {\n const checkResult = await checkUserMutation.mutateAsync({\n body: {\n identifier: identifierValue,\n },\n });\n\n if (checkResult.exists) {\n setIdentifier(identifierValue);\n setStep('password');\n return;\n }\n\n const email = isPhone(identifierValue) ? '' : identifierValue;\n if (email) {\n onNavigate(`${signUpLink}?email=${encodeURIComponent(email)}`);\n } else {\n onNavigate(`${signUpLink}?phone=${encodeURIComponent(identifierValue)}`);\n }\n };\n\n const handlePasswordStep = async (passwordValue: string) => {\n const res = await signInMutation.mutateAsync({\n body: {\n identifier,\n password: passwordValue,\n },\n });\n\n if ('verificationId' in res && res.verificationId) {\n const verifyPath = isPhone(identifier)\n ? `/auth/verify-phone?context=sign-in&verificationId=${res.verificationId}&identifier=${encodeURIComponent(identifier)}`\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 };\n\n const handleSubmit = async (\n values: { identifier: string; password?: string },\n currentStep: 'identifier' | 'password',\n ) => {\n setIsLoading(true);\n setError(null);\n\n try {\n if (currentStep === 'identifier') {\n await handleIdentifierStep(values.identifier);\n } else {\n await handlePasswordStep(values.password || '');\n }\n } catch (err) {\n handleError(err, setError, t);\n } finally {\n setIsLoading(false);\n }\n };\n\n const isSubmitting =\n isLoading || checkUserMutation.isPending || signInMutation.isPending;\n\n const handleBack = () => {\n setStep('identifier');\n setIdentifier('');\n setError(null);\n };\n\n const isStepPassword = step === 'password';\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 <div className=\"space-y-4\">\n <AuthPageLayout\n title={t('title')}\n description={isStepPassword ? undefined : t('description')}\n logoImage={logoImage}\n footer={\n <div\n className=\"flex items-center justify-center w-full gap-2\"\n style={{\n justifyContent: isStepPassword ? 'space-between' : 'center',\n }}\n >\n {isStepPassword && (\n // biome-ignore lint/a11y/useKeyWithClickEvents: change account\n <p\n className=\"text-primary inline-block cursor-pointer hover:underline\"\n onClick={handleBack}\n >\n {t('changeAccount')}\n </p>\n )}\n\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 className=\"text-primary inline-block hover:underline\"\n >\n {t('footer.forgotPassword')}\n </a>\n )}\n </div>\n }\n >\n <SignIn\n onSubmit={handleSubmit}\n isLoading={isSubmitting}\n identifier={identifier}\n step={step}\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 </AuthPageLayout>\n </div>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\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 { Spinner } from '@mesob/ui/components/spinner';\nimport { IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\nimport { useApi } from '../../provider';\nimport { normalizePhone } from '../../utils/normalize-phone';\n\ntype SignInFormValues = {\n identifier: string;\n password?: string;\n};\n\ntype SignInProps = {\n onSubmit: (\n values: SignInFormValues,\n step: 'identifier' | 'password',\n ) => Promise<void> | void;\n isLoading?: boolean;\n identifier?: string;\n step?: 'identifier' | 'password';\n onBack?: () => void;\n};\n\nconst identifierSchema = (t: (key: string) => string) =>\n z.object({\n identifier: 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 phoneRegex = /^(\\+2519|2519|09)\\d{8}$/;\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 = ({\n onSubmit,\n isLoading = false,\n identifier: initialIdentifier = '',\n step = 'identifier',\n onBack: _onBack,\n}: SignInProps) => {\n const { hooks } = useApi();\n const t = useTranslator('Auth.signIn');\n const [showPassword, setShowPassword] = useState(false);\n const [currentIdentifier, setCurrentIdentifier] = useState(initialIdentifier);\n\n const identifierForm = useForm<{ identifier: string }>({\n resolver: zodResolver(identifierSchema(t)),\n defaultValues: {\n identifier: initialIdentifier,\n },\n mode: 'onChange',\n });\n\n const passwordForm = useForm<{ password: string }>({\n resolver: zodResolver(passwordSchema(t)),\n defaultValues: {\n password: '',\n },\n mode: 'onChange',\n });\n\n const signInMutation = hooks.useMutation('post', '/sign-in');\n\n useEffect(() => {\n if (initialIdentifier) {\n identifierForm.setValue('identifier', initialIdentifier);\n setCurrentIdentifier(initialIdentifier);\n }\n }, [initialIdentifier, identifierForm]);\n\n const handleIdentifierSubmit = async (values: { identifier: string }) => {\n const phoneRegex = /^(\\+2519|2519|09)\\d{8}$/;\n const normalizedIdentifier = phoneRegex.test(values.identifier)\n ? normalizePhone(values.identifier)\n : values.identifier;\n\n setCurrentIdentifier(normalizedIdentifier);\n identifierForm.setValue('identifier', normalizedIdentifier);\n await onSubmit(\n { identifier: normalizedIdentifier, password: '' },\n 'identifier',\n );\n };\n\n const handlePasswordSubmit = async (values: { password: string }) => {\n try {\n await signInMutation.mutateAsync({\n body: {\n identifier:\n currentIdentifier || identifierForm.getValues('identifier'),\n password: values.password,\n },\n });\n\n await onSubmit(\n {\n identifier:\n currentIdentifier || identifierForm.getValues('identifier'),\n password: values.password,\n },\n 'password',\n );\n } catch {\n await onSubmit(\n {\n identifier:\n currentIdentifier || identifierForm.getValues('identifier'),\n password: values.password,\n },\n 'password',\n );\n }\n };\n\n const isPasswordStep = step === 'password';\n const isSubmitting = isLoading || signInMutation.isPending;\n\n if (isPasswordStep) {\n return (\n <form\n id=\"sign-in-password-form\"\n onSubmit={passwordForm.handleSubmit(handlePasswordSubmit)}\n >\n <FieldGroup>\n <div className=\"text-center\">\n <p className=\"text-sm text-muted-foreground mb-2\">\n {t('form.enterPasswordFor')}\n </p>\n <p className=\"font-bold\">\n {currentIdentifier || identifierForm.getValues('identifier')}\n </p>\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 && (\n <FieldError errors={[fieldState.error]} />\n )}\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 }\n\n return (\n <form\n id=\"sign-in-identifier-form\"\n onSubmit={identifierForm.handleSubmit(handleIdentifierSubmit)}\n >\n <FieldGroup>\n <Controller\n name=\"identifier\"\n control={identifierForm.control}\n render={({ field, fieldState }) => (\n <Field data-invalid={fieldState.invalid}>\n <FieldLabel htmlFor=\"sign-in-identifier\">\n {t('form.accountLabel')}\n </FieldLabel>\n <Input\n {...field}\n id=\"sign-in-identifier\"\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","export function normalizePhone(phone: string): string {\n const cleaned = phone.trim().replace(/\\s/g, '');\n if (cleaned.startsWith('+2519')) {\n return cleaned;\n }\n if (cleaned.startsWith('2519')) {\n return `+${cleaned}`;\n }\n if (cleaned.startsWith('09')) {\n return `+251${cleaned.slice(1)}`;\n }\n if (cleaned.startsWith('9') && cleaned.length === 9) {\n return `+251${cleaned}`;\n }\n return cleaned;\n}\n","'use client';\n\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from '@mesob/ui/components/alert';\nimport { toast } from '@mesob/ui/components/sonner';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { createTranslator } from '../../../lib/translations';\nimport { useApi, useConfig } from '../../../provider';\nimport type { AuthErrorContent } from '../../../utils/handle-error';\nimport { handleError } from '../../../utils/handle-error';\n\nimport { AuthPageLayout } from '../auth-page-layout';\nimport { SignUp } from '../sign-up';\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 SignUpPageProps = {\n redirectUrl?: string; // Can override defaultRedirectUrl from config\n initialIdentifier?: string;\n};\n\nexport const SignUpPage = ({\n redirectUrl,\n initialIdentifier,\n}: SignUpPageProps = {}) => {\n const { hooks, setAuth } = useApi();\n const { config } = useConfig();\n const t = createTranslator(config.messages || {}, 'Auth.signUp');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthErrorContent | null>(null);\n\n const signUpMutation = hooks.useMutation('post', '/sign-up');\n\n const signInLink = config.navigation?.links?.signIn || '/auth/sign-in';\n const Link = config.navigation?.linkComponent;\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: SignUpFormValues) => {\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 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 <AuthPageLayout\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 <SignUp\n onSubmit={handleSubmit}\n isLoading={isLoading || signUpMutation.isPending}\n initialIdentifier={initialIdentifier}\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 </AuthPageLayout>\n );\n};\n","'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\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 { IconEye, IconEyeOff } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport { useTranslator } from '../../hooks/use-translator';\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 onSubmit: (values: SignUpFormValues) => Promise<void> | void;\n isLoading?: boolean;\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 onSubmit,\n isLoading = false,\n initialIdentifier,\n}: SignUpProps) => {\n const t = useTranslator('Auth.signUp');\n const hasInitialIdentifier = !!initialIdentifier;\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\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 const handleSubmit = form.handleSubmit(async (values) => {\n await onSubmit(values);\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 return (\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 && <FieldError errors={[fieldState.error]} />}\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 && <FieldError errors={[fieldState.error]} />}\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 && <FieldError errors={[fieldState.error]} />}\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 && <FieldError errors={[fieldState.error]} />}\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}\n >\n {isLoading ? t('form.submitting') : t('form.submit')}\n </Button>\n </div>\n </form>\n );\n};\n","'use client';\n\nimport {\n Alert,\n AlertDescription,\n AlertTitle,\n} from '@mesob/ui/components/alert';\nimport { toast } from '@mesob/ui/components/sonner';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { createTranslator } from '../../../lib/translations';\nimport { useApi, useConfig } from '../../../provider';\nimport type { AuthErrorContent } from '../../../utils/handle-error';\nimport { handleError } from '../../../utils/handle-error';\n\nimport { AuthPageLayout } from '../auth-page-layout';\nimport { VerificationForm } from '../verification-form';\n\ntype VerifyEmailPageProps = {\n verificationId: string;\n email: string;\n redirectUrl?: string; // Can override defaultRedirectUrl from config\n};\n\nexport const VerifyEmailPage = ({\n verificationId,\n email,\n redirectUrl,\n}: VerifyEmailPageProps) => {\n const { hooks, setAuth } = useApi();\n const { config } = useConfig();\n const t = createTranslator(config.messages || {}, 'Auth.verification');\n const common = createTranslator(config.messages || {}, 'Common');\n const footer = createTranslator(\n config.messages || {},\n 'Auth.forgotPassword.footer',\n );\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 Link = config.navigation?.linkComponent;\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 <AuthPageLayout\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 </AuthPageLayout>\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 <AuthPageLayout\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 </AuthPageLayout>\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 { toast } from '@mesob/ui/components/sonner';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useEffect, useState } from 'react';\nimport { createTranslator } from '../../../lib/translations';\nimport { useApi, useConfig } from '../../../provider';\nimport type { AuthResponse } from '../../../types';\nimport type { AuthErrorContent } from '../../../utils/handle-error';\nimport { handleError } from '../../../utils/handle-error';\n\nimport { AuthPageLayout } from '../auth-page-layout';\nimport { VerificationForm } from '../verification-form';\n\ntype VerifyPhonePageProps = {\n verificationId: string;\n context: 'sign-in' | 'sign-up';\n phone?: string;\n redirectUrl?: string; // Can override defaultRedirectUrl from config\n};\n\nexport const VerifyPhonePage = ({\n verificationId,\n context,\n phone = '',\n redirectUrl,\n}: VerifyPhonePageProps) => {\n const { hooks, refresh, setAuth } = useApi();\n const { config } = useConfig();\n const t = createTranslator(config.messages || {}, 'Auth.verification');\n const common = createTranslator(config.messages || {}, 'Common');\n const footer = createTranslator(\n config.messages || {},\n 'Auth.forgotPassword.footer',\n );\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 Link = config.navigation?.linkComponent;\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 <AuthPageLayout\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 </AuthPageLayout>\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 <AuthPageLayout\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 </AuthPageLayout>\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 { useState } from 'react';\nimport { useApi } from '../../../provider';\nimport {\n DataTable,\n type DataTableColumn,\n} from '../../shared/data-table/data-table';\n\n// Permission type from OpenAPI schema\ntype Permission = {\n id: string;\n code: string;\n name: string;\n description: string;\n resource: string;\n action: string;\n createdAt: string;\n};\n\nexport function PermissionsPage() {\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', '/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\">{permission.name}</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 {permission.description}\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 { useState } from 'react';\nimport { useApi } from '../../../provider';\nimport {\n DataTable,\n type DataTableColumn,\n} from '../../shared/data-table/data-table';\n\n// Role type from OpenAPI schema\ntype Role = {\n id: string;\n code: string;\n name: string;\n description: string;\n createdAt: string;\n};\n\nexport function RolesPage() {\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', '/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\">{role.name}</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\">{role.description}</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 {\n DataTable,\n type DataTableColumn,\n} from '../../shared/data-table/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 SessionsPage() {\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 {\n DataTable,\n type DataTableColumn,\n} from '../../shared/data-table/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 TenantsPage() {\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 {\n DataTable,\n type DataTableColumn,\n} from '../../shared/data-table/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 UsersPage() {\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 { Button } from '@mesob/ui/components/button';\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@mesob/ui/components/card';\nimport { Separator } from '@mesob/ui/components/separator';\nimport { useSession } from '../../provider';\nimport { ProfileSkeleton } from '../skeletons/profile-skeleton';\n\ntype ProfilePageProps = {\n onEditClick?: () => void;\n};\n\nexport function ProfilePage({ onEditClick }: ProfilePageProps) {\n const { user, isLoading } = useSession();\n\n if (isLoading) {\n return <ProfileSkeleton />;\n }\n\n if (!user) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <p className=\"text-muted-foreground\">Not authenticated</p>\n </div>\n );\n }\n\n return (\n <div className=\"w-full max-w-4xl mx-auto space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-3xl font-bold\">{user.fullName}</h1>\n <p className=\"text-muted-foreground\">@{user.handle}</p>\n </div>\n {onEditClick && <Button onClick={onEditClick}>Edit Profile</Button>}\n </div>\n\n <Separator />\n\n <div className=\"grid gap-6 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Contact Information</CardTitle>\n <CardDescription>Your contact details</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">Email</p>\n <p className=\"text-sm\">\n {user.email || 'Not provided'}\n {user.email && (\n <span\n className={\n user.emailVerified\n ? 'text-green-600 ml-2'\n : 'text-yellow-600 ml-2'\n }\n >\n {user.emailVerified ? '(Verified)' : '(Not verified)'}\n </span>\n )}\n </p>\n </div>\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">Phone</p>\n <p className=\"text-sm\">\n {user.phone || 'Not provided'}\n {user.phone && (\n <span\n className={\n user.phoneVerified\n ? 'text-green-600 ml-2'\n : 'text-yellow-600 ml-2'\n }\n >\n {user.phoneVerified ? '(Verified)' : '(Not verified)'}\n </span>\n )}\n </p>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Account Information</CardTitle>\n <CardDescription>Your account details</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n Tenant ID\n </p>\n <p className=\"text-sm font-mono\">{user.tenantId}</p>\n </div>\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n Last Sign In\n </p>\n <p className=\"text-sm\">\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleString()\n : 'Never'}\n </p>\n </div>\n </CardContent>\n </Card>\n\n {user.userRoles && user.userRoles.length > 0 && (\n <Card className=\"md:col-span-2\">\n <CardHeader>\n <CardTitle>Roles</CardTitle>\n <CardDescription>Your assigned roles</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-2\">\n {user.userRoles.map((role) => (\n <div\n key={role.id}\n className=\"px-3 py-1 bg-primary/10 text-primary rounded-full text-sm\"\n >\n {role.name}\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\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","'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","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 { 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":["useEffect","useState","fullUrl","jsx","jsx","jsx","jsxs","jsx","jsxs","useState","useEffect","Alert","AlertDescription","AlertTitle","toast","IconAlertCircle","useEffect","useState","zodResolver","Button","Field","FieldError","FieldGroup","FieldLabel","Input","Spinner","useState","Controller","useForm","z","jsx","jsxs","z","useState","useForm","zodResolver","FieldGroup","Controller","Field","FieldLabel","FieldError","Input","Button","Spinner","jsx","jsxs","useState","useEffect","toast","Alert","IconAlertCircle","AlertTitle","AlertDescription","Alert","AlertDescription","AlertTitle","toast","IconAlertCircle","useEffect","useState","zodResolver","Button","Field","FieldError","FieldGroup","FieldLabel","Input","Spinner","IconEye","IconEyeOff","useEffect","useState","Controller","useForm","z","jsx","jsxs","z","isPhone","useState","useForm","zodResolver","useEffect","FieldGroup","Controller","Field","FieldLabel","Input","IconEyeOff","IconEye","FieldError","Button","Spinner","jsx","jsxs","useState","useEffect","toast","Alert","IconAlertCircle","AlertTitle","AlertDescription","Alert","AlertDescription","AlertTitle","toast","IconAlertCircle","useEffect","useState","zodResolver","Button","Field","FieldError","FieldGroup","FieldLabel","Input","IconEye","IconEyeOff","useEffect","useState","Controller","useForm","z","jsx","jsxs","isPhone","z","useState","useForm","zodResolver","useEffect","FieldGroup","Controller","Field","FieldLabel","Input","FieldError","IconEyeOff","IconEye","Button","jsx","jsxs","isPhone","useState","useEffect","toast","Alert","IconAlertCircle","AlertTitle","AlertDescription","Alert","AlertDescription","AlertTitle","toast","IconAlertCircle","useEffect","useState","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","jsx","jsxs","useState","useEffect","toast","Alert","IconAlertCircle","AlertTitle","AlertDescription","Alert","AlertDescription","AlertTitle","toast","IconAlertCircle","useEffect","useState","jsx","jsxs","useState","useEffect","toast","Alert","IconAlertCircle","AlertTitle","AlertDescription","Button","jsx","jsxs","Button","useState","jsx","jsxs","_","jsx","jsxs","jsx","jsxs","useState","Button","Badge","Button","useState","jsx","jsxs","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","Button","Skeleton","jsx","jsxs","jsx","jsxs","Button","Skeleton","jsx","jsxs"]}
|