sidekick-client 0.1.0 → 0.1.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/lib/nav-menu.ts","../src/config/app-config.ts","../src/lib/utils.ts","../src/hooks/useTheme.ts","../src/components/ui/sonner.tsx","../src/store/AppContext.ts","../src/components/custom/LoadingCmp.tsx","../src/components/custom/FullPageLoading.tsx","../src/lib/toast-helper.ts","../src/lib/axios-utils.ts","../src/app/routes/Subscriptions/utils/subscription-utils.ts","../src/app/routes/Subscriptions/hooks/usePurchasedPlans.ts","../src/app/routes/components/RequireAuth.tsx","../src/app/Routes.tsx","../src/components/ui/dialog.tsx","../src/components/ui/button.tsx","../src/components/custom/DialogWrapper.tsx","../src/hooks/useAlertDialog.ts","../src/components/custom/AlertDialog.tsx","../src/lib/enums.ts","../src/components/ui/table.tsx","../src/components/ui/card.tsx","../src/components/ui/input.tsx","../src/components/ui/label.tsx","../src/components/ui/select.tsx","../src/components/ui/sheet.tsx","../src/components/ui/switch.tsx","../src/components/ui/tooltip.tsx","../src/components/ui/badge.tsx","../src/components/ui/separator.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/textarea.tsx","../src/components/ui/tabs.tsx","../src/components/custom/LoadingMask.tsx","../src/components/custom/Layouts/FlexColsLayout.tsx","../src/hooks/useIsMobile.ts","../src/components/custom/Toolbar.tsx","../src/components/custom/DataTable/DataTableToolbar.tsx","../src/components/ui/pagination.tsx","../src/components/custom/PaginationWrapper.tsx","../src/components/custom/DataTable/DataTablePagination.tsx","../src/components/custom/DataTable/DataTable.tsx","../src/components/custom/Layouts/TabularLayout.tsx","../src/components/custom/Typography/TypographyHeading.tsx","../src/components/custom/Typography/TypographyP.tsx","../src/components/ui/accordion.tsx","../src/components/custom/AccordionWrapper.tsx","../src/components/custom/LinkWrapper.tsx","../src/components/custom/BigSquare.tsx","../src/components/custom/HeaderText.tsx","../src/components/custom/InfoButton.tsx","../src/components/custom/ListPanel.tsx","../src/components/custom/PremiumHighlighter.tsx","../src/components/custom/SelectListWrapper.tsx","../src/components/custom/TooltipWrapper.tsx","../src/components/custom/RichTextEditor.tsx","../src/hooks/useFetchData.ts","../src/app/routes/auth/components/Auth.tsx","../src/app/routes/auth/LoginForm.tsx","../src/app/routes/auth/components/PasswordPolicyIBtn.tsx","../src/app/routes/auth/components/SendOTP.tsx","../src/app/routes/auth/utils/auth-lib.ts","../src/components/ui/input-otp.tsx","../src/app/routes/auth/components/InputOTPField.tsx","../src/hooks/useCountDown.ts","../src/app/routes/auth/RegistrationForm.tsx","../src/components/ui/collapsible.tsx","../src/components/ui/sidebar.tsx","../src/components/side-bar/nav-main.tsx","../src/components/ui/avatar.tsx","../src/app/UserAccount.tsx","../src/components/side-bar/nav-user.tsx","../src/app/routes/Subscriptions/components/PremiumIcon.tsx","../src/components/side-bar/org-switcher.tsx","../src/components/side-bar/app-header.tsx","../src/components/side-bar/app-sidebar.tsx","../src/components/ui/breadcrumb.tsx","../src/hooks/useSelectedNavItem.ts","../src/app/routes/Dashboard/components/AppBreadcrumb.tsx","../src/app/routes/OrgSetup/hooks/useOrgHelper.tsx","../src/app/routes/Subscriptions/components/UpgradeToPro.tsx","../src/app/routes/Dashboard/Dashboard.tsx","../src/app/routes/NotFound.tsx","../src/app/routes/auth/ForgotPasswordForm.tsx","../src/app/routes/OrgSetup/OrgSetup.tsx","../src/app/routes/OrgSetup/components/RolesCmb.tsx","../src/app/routes/OrgSetup/components/IncludedUsers.tsx","../src/app/routes/OrgSetup/CreateOrg.tsx","../src/app/routes/OrgSetup/JoinOrg.tsx","../src/components/ui/button-group.tsx","../src/app/routes/OrgSetup/components/OrgRootLayout.tsx","../src/app/routes/OrgSetup/ManageOrgs.tsx","../src/components/ui/radio-group.tsx","../src/components/billingsdk/pricing-table-four.tsx","../src/app/routes/Subscriptions/PricingPg.tsx","../src/components/billingsdk/cancel-subscription-dialog.tsx","../src/components/ui/toggle.tsx","../src/components/billingsdk/update-plan-dialog.tsx","../src/components/billingsdk/subscription-management.tsx","../src/app/routes/Subscriptions/components/UpcomingPlans.tsx","../src/components/billingsdk/payment-success-dialog.tsx","../src/app/routes/Subscriptions/components/AddMoreUsersDialog.tsx","../src/app/routes/Subscriptions/SubscriptionMgmt.tsx","../src/hooks/useCountries.ts","../src/components/ui/alert.tsx","../src/app/routes/Subscriptions/Checkout.tsx","../src/components/billingsdk/invoice-history.tsx","../src/app/routes/Subscriptions/PaymentHistory.tsx","../src/app/routes/Dashboard/components/Settings/Components/ThemeCmb.tsx","../src/app/routes/Dashboard/components/Settings/GeneralSettingsPg.tsx","../src/components/custom/Layouts/CenterAndMiddle.tsx","../src/components/custom/CopyTextField.tsx","../src/components/custom/DropdownBtn.tsx","../src/components/custom/DropdownLbl.tsx","../src/App.tsx","../src/components/ui/skeleton.tsx","../src/components/custom/TabsWrapper.tsx","../src/components/custom/UrlChangesGuard.tsx"],"sourcesContent":["import { Bookmark, BookOpen, Settings2, SquarePen } from 'lucide-react';\r\nimport type { IVirtualChildOf, NavGroup } from './types';\r\n\r\nexport const navigationItems: {\r\n orgs: Array<{ name: string; description: string }>;\r\n navMain: NavGroup[];\r\n virtualChildOf: IVirtualChildOf[];\r\n} = {\r\n orgs: [\r\n {\r\n name: 'Acme Corp.',\r\n // logo: AudioWaveform,\r\n description: 'Startup',\r\n },\r\n ],\r\n navMain: [\r\n {\r\n title: 'Your Work',\r\n items: [\r\n {\r\n title: 'Sample',\r\n icon: SquarePen,\r\n // isExpanded: true,\r\n url: 'sample-documents',\r\n },\r\n {\r\n title: 'Sample Saved',\r\n icon: Bookmark,\r\n // isExpanded: true,\r\n url: 'sample-saved-documents',\r\n },\r\n ],\r\n },\r\n {\r\n title: 'Settings',\r\n items: [\r\n {\r\n title: 'Documentation',\r\n icon: BookOpen,\r\n items: [\r\n {\r\n title: 'Sample Get Started',\r\n url: 'sample-doc-get-started',\r\n },\r\n {\r\n title: 'Sample Tutorials',\r\n url: 'sample-tutorials',\r\n },\r\n ],\r\n },\r\n {\r\n title: 'Settings',\r\n icon: Settings2,\r\n items: [\r\n {\r\n title: 'Sample General',\r\n url: 'sample-general-settings',\r\n },\r\n {\r\n title: 'Sample Active Plan',\r\n url: 'sample-active-plan-setting',\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n virtualChildOf: [],\r\n};\r\n\r\nconst loadRecursiveChild = (elements: any[], result: any[], parent?: any): void => {\r\n elements.forEach((el: any) => {\r\n const { items, ...otherProps } = el;\r\n otherProps.parent = parent;\r\n result.push(otherProps);\r\n\r\n if (items) loadRecursiveChild(items, result, otherProps);\r\n });\r\n};\r\n\r\nexport const getFlatNavigationItems = () => {\r\n const result: any[] = [];\r\n const navTree = navigationItems.navMain;\r\n\r\n loadRecursiveChild(navTree, result, undefined);\r\n\r\n return result;\r\n};\r\n\r\nexport const setNavigationItems = (navItems: NavGroup[], virtualChildOf: IVirtualChildOf[]) => {\r\n navigationItems.navMain = navItems;\r\n navigationItems.virtualChildOf = virtualChildOf || [];\r\n};\r\n","import { NotebookText } from 'lucide-react';\r\n\r\nexport const APP_INFO_ACCOUNT_TYPE = {\r\n TEAM: 'team',\r\n ORG: 'org',\r\n};\r\n\r\nexport const appInfo = {\r\n appId: 'gamma_tech',\r\n appName: 'Gamma Tech',\r\n appDescription: 'Gamma Tech is a software company that provides a range of services to help businesses grow and succeed.',\r\n logo: NotebookText,\r\n version: '2.0.1',\r\n account_type_txt: {\r\n singular: 'Team',\r\n plural: 'Teams',\r\n value: APP_INFO_ACCOUNT_TYPE.TEAM,\r\n },\r\n supportEmail: 'support@gammatech.com',\r\n cloudFareKey: '',\r\n razorPayKey: '',\r\n themeColor: '#00c950',\r\n serverUrl: 'http://192.168.31.71:6001',\r\n};\r\n\r\nexport const setAppInfo = (info: Partial<typeof appInfo>) => {\r\n Object.assign(appInfo, info);\r\n};\r\n\r\nexport const setAccountType = (type: Partial<typeof APP_INFO_ACCOUNT_TYPE>) => {\r\n Object.assign(APP_INFO_ACCOUNT_TYPE, type);\r\n};\r\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nimport { getFlatNavigationItems, navigationItems } from './nav-menu';\nimport type { EmailProcessingResult, NavItem } from './types';\nimport { appInfo } from '../config/app-config';\nimport type { AlertDialogOptionsProps } from '@/components/custom/AlertDialog';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport const getFormDataByFormEl = (formEl: HTMLFormElement) => {\n const formData = new FormData(formEl);\n return Object.fromEntries(formData.entries());\n};\n\nconst processKey = (key: string) => `${appInfo.appId}_${key}`;\n\nexport const setLocalStorage = (key: string, value: string) => {\n localStorage.setItem(processKey(key), value);\n};\n\nexport const getLocalStorage = (key: string) => {\n return localStorage.getItem(processKey(key));\n};\n\nexport const isSameNavItem = (activeUrl: string, urlPath: string) => {\n if (!activeUrl) return false;\n if (urlPath === activeUrl) return true;\n\n const found = navigationItems.virtualChildOf.find((vc) => {\n return vc.id === activeUrl && vc.parentId === urlPath;\n });\n\n return !!found;\n};\n\nexport const findNavMenu = <K extends keyof NavItem>(moduleName: NavItem[K]): NavItem | undefined => {\n const flatNavMap = getFlatNavigationItems();\n\n const navItem = flatNavMap.find((el) => el['url'] === moduleName);\n if (navItem) return navItem;\n\n //checking in virtualChildOf\n const virtualChild = navigationItems.virtualChildOf.find((vc) => vc.id === moduleName);\n if (virtualChild) {\n return flatNavMap.find((el) => el.url === virtualChild.parentId);\n }\n\n return undefined;\n};\n\nexport const createIndexedArray = (n: number) => {\n return Array.from({ length: n }, (_v, i) => i);\n};\n\nexport const defaultAlertConfig: AlertDialogOptionsProps = {\n open: false,\n type: 'CONFIRM',\n text: '',\n};\n\nexport const validatePassword = (password: string) => {\n // Minimum 8 characters, at least 1 uppercase, 1 lowercase, 1 digit, and 1 special character\n const minLength = 8;\n const hasUpperCase = /[A-Z]/.test(password);\n const hasLowerCase = /[a-z]/.test(password);\n const hasNumber = /[0-9]/.test(password);\n const hasSpecialChar = /[!@#$%^&*(),.?\":{}|<>]/.test(password);\n\n if (password.length < minLength) {\n return {\n valid: false,\n message: 'Password must be at least 8 characters long.',\n };\n }\n if (!hasUpperCase) {\n return {\n valid: false,\n message: 'Password must contain at least one uppercase letter.',\n };\n }\n if (!hasLowerCase) {\n return {\n valid: false,\n message: 'Password must contain at least one lowercase letter.',\n };\n }\n if (!hasNumber) {\n return {\n valid: false,\n message: 'Password must contain at least one number.',\n };\n }\n if (!hasSpecialChar) {\n return {\n valid: false,\n message: 'Password must contain at least one special character.',\n };\n }\n\n return { valid: true, message: 'Password is valid.' };\n};\n\nexport const errorLogger = (error: unknown) => {\n console.error(error);\n};\n\n/**\n * Check weather the email is valid or not.\n *\n * @param email - An email id\n * @returns Boolean\n */\nexport const isEmailValid = (email: string) => {\n if (!email) {\n return false;\n }\n\n const arrayEmail = String(email)\n .toLowerCase()\n .match(\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\n );\n return Array.isArray(arrayEmail) && arrayEmail.length > 0;\n};\n\nexport const processEmailsWithValidation = (textareaValue: string): EmailProcessingResult => {\n if (!textareaValue || typeof textareaValue !== 'string') {\n return {\n validEmails: [],\n invalidEmails: [],\n totalProcessed: 0,\n };\n }\n\n // Remove newline characters and split by comma\n const emailList = textareaValue\n .replace(/\\n/g, '') // Remove all newline characters\n .split(',') // Split by comma\n .map((email) => email.trim()) // Remove whitespace from each email\n .filter((email) => email.length > 0); // Remove empty strings\n\n const validEmails: string[] = [];\n const invalidEmails: string[] = [];\n\n emailList.forEach((email) => {\n if (isEmailValid(email)) {\n validEmails.push(email);\n } else {\n invalidEmails.push(email);\n }\n });\n\n return {\n validEmails,\n invalidEmails,\n totalProcessed: emailList.length,\n };\n};\n\nexport const waitTill = (millSecs: number = 3000) => {\n return new Promise((resolve) => setTimeout(resolve, millSecs));\n};\n\nexport const convertServerDateToJS = (serverDateStr: string) => new Date(serverDateStr);\n\nexport const formatISODateWithTime24H = (isoString: string | Date, use12hr: boolean = true) => {\n if (!isoString) return '';\n\n const date = isoString instanceof Date ? isoString : convertServerDateToJS(isoString);\n const day = String(date.getDate()).padStart(2, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const year = date.getFullYear();\n\n let hours = date.getHours();\n const minutes = String(date.getMinutes()).padStart(2, '0');\n\n let ampm = '';\n if (use12hr) {\n ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12 || 12; // convert to 12-hour format\n }\n\n const hoursStr = String(hours).padStart(2, '0');\n\n return use12hr ? `${day}/${month}/${year}, ${hoursStr}:${minutes} ${ampm}` : `${day}/${month}/${year}, ${hoursStr}:${minutes}`;\n};\n\nexport const formatElapsedTime = (date: Date) => {\n const now = new Date();\n const diffInMs = now.getTime() - date.getTime();\n const diffInHours = diffInMs / (1000 * 60 * 60);\n const diffInDays = diffInMs / (1000 * 60 * 60 * 24);\n\n if (diffInMs < 5 * 60 * 1000) {\n return 'Just now'; //less than 5 minutes\n } else if (diffInHours < 1) {\n return `${Math.floor(diffInMs / (1000 * 60))} minutes ago`;\n } else if (diffInHours < 24) {\n return `${Math.floor(diffInHours)} hours ago`;\n } else if (diffInDays < 7) {\n return `${Math.floor(diffInDays)} days ago`;\n } else {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n }\n};\n\nconst MULTIPLIER = 729444;\nexport const generatePublicId = (privateId: number) => privateId * MULTIPLIER;\nexport const undoPublicId = (publicId: number) => Math.floor(publicId / MULTIPLIER);\n\nexport const mapIncrementBy2 = <T, R>(arr: T[], callback: (firstEl: T, secondEl: T | undefined, i: number) => R): R[] => {\n const result: R[] = [];\n for (let i = 0; i < arr.length; i += 2) {\n const firstEl = arr[i];\n const secondEl = arr[i + 1];\n result.push(callback(firstEl, secondEl, i));\n }\n return result;\n};\n\nexport const generateRandom4Digits = (): string => {\n return Math.floor(1000 + Math.random() * 9000).toString();\n};\n\nexport const isFunction = (value: unknown) => {\n return typeof value === 'function';\n};\n\nexport const isTruthyValue = (value: 1 | '1' | boolean | 0 | '0') => value === 1 || value === '1' || value === true;\n\nexport const INVITATION_ENUMS = Object.freeze({\n NOT_SAVED: 10,\n INVITED: 0,\n ACCEPTED: 1,\n REJECTED: 2,\n LEFT: 3,\n text: {\n 10: 'Not Saved',\n 0: 'Invited',\n 1: 'Active (Accepted)',\n 2: 'Rejected',\n 3: 'Left',\n },\n getDisplay(statusCode: number) {\n return this.text[statusCode as keyof typeof this.text] as string;\n },\n});\n\nexport const isObjectEmpty = (obj: Record<string, unknown>): boolean => {\n return obj && Object.keys(obj).length === 0;\n};\n\nexport const isValidId = (id: string | number) => {\n const intId = parseInt(id as string, 10);\n return intId > 0;\n};\n\nexport const getModuleNameFromUrl = (pathName: string) => {\n const moduleName = pathName.split('/')[2];\n return moduleName;\n};\n\nexport function debounce<T extends (...args: unknown[]) => void>(func: T, delay: number) {\n let timeout: ReturnType<typeof setTimeout>;\n\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, delay);\n };\n}\n","import { getLocalStorage, setLocalStorage } from \"@/lib/utils\";\r\nimport { useEffect, useState } from \"react\";\r\n\r\nconst localStorageKey = \"active-theme\";\r\nconst getDefaultThemeSelected = () =>\r\n getLocalStorage(localStorageKey) || \"system\";\r\n\r\nconst useTheme = (defaultTheme = getDefaultThemeSelected()) => {\r\n const [theme, setTheme] = useState(defaultTheme); //here theme value can be light / dark / system\r\n\r\n useEffect(() => {\r\n const root = window.document.documentElement;\r\n\r\n root.classList.remove(\"light\", \"dark\");\r\n\r\n let newTheme = theme;\r\n\r\n if (theme === \"system\") {\r\n newTheme = window.matchMedia(\"(prefers-color-scheme: dark)\").matches\r\n ? \"dark\"\r\n : \"light\";\r\n }\r\n\r\n root.classList.add(newTheme);\r\n setLocalStorage(localStorageKey, newTheme);\r\n }, [theme]);\r\n\r\n return { theme, setTheme };\r\n};\r\n\r\nexport default useTheme;\r\n","import { Toaster as Sonner, type ToasterProps } from 'sonner';\nimport useTheme from '@/hooks/useTheme';\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { theme = 'system' } = useTheme();\n return (\n <Sonner\n theme={theme as ToasterProps['theme']}\n position=\"top-center\"\n style={\n {\n '--normal-bg': 'var(--popover)',\n '--normal-text': 'var(--popover-foreground)',\n '--normal-border': 'var(--border)',\n '--border-radius': 'var(--radius)',\n } as React.CSSProperties\n }\n {...props}\n />\n );\n};\n\nexport { Toaster };\n","import type { AlertDialogOptionsProps } from '@/components/custom/AlertDialog';\r\nimport type { ISubscriptionConfig } from '@/lib/billingsdk-config';\r\nimport type { loggedInUserInf, OrganizationType, purchasedPlansInf } from '@/lib/types';\r\nimport { defaultAlertConfig } from '@/lib/utils';\r\nimport { createContext } from 'react';\r\n\r\ninterface AppContextType {\r\n setAlertDlgOptions: (options: AlertDialogOptionsProps) => void;\r\n alertDlgOptions: AlertDialogOptionsProps;\r\n orgs: OrganizationType[];\r\n setOrgs: (orgs: OrganizationType[]) => void;\r\n loggedInUser: loggedInUserInf;\r\n setLoggedInUser: (loggedInUser: loggedInUserInf) => void;\r\n activeOrg: OrganizationType | undefined;\r\n setActiveOrg: (org: OrganizationType) => void;\r\n purchasePlans: purchasedPlansInf[];\r\n setPurchasePlans: (purchasePlans: purchasedPlansInf[]) => void;\r\n activePlan: purchasedPlansInf | undefined;\r\n setActivePlan: (plan: purchasedPlansInf) => void;\r\n subscriptionConfig: ISubscriptionConfig;\r\n setSubscriptionConfig: (subscriptionConfig: ISubscriptionConfig) => void;\r\n featureFlags: Record<string, boolean>;\r\n setFeatureFlags: (flags: Record<string, boolean>) => void;\r\n}\r\n\r\nconst AppContext = createContext<AppContextType>({\r\n setAlertDlgOptions: () => {},\r\n alertDlgOptions: defaultAlertConfig,\r\n orgs: [],\r\n setOrgs: () => {},\r\n loggedInUser: null as unknown as loggedInUserInf,\r\n setLoggedInUser: () => {},\r\n activeOrg: undefined,\r\n setActiveOrg: () => {},\r\n purchasePlans: [],\r\n setPurchasePlans: () => {},\r\n activePlan: null as unknown as purchasedPlansInf,\r\n setActivePlan: () => {},\r\n subscriptionConfig: {} as ISubscriptionConfig,\r\n setSubscriptionConfig: () => {},\r\n featureFlags: {},\r\n setFeatureFlags: () => {},\r\n});\r\n\r\nexport default AppContext;\r\n","import { Loader2Icon } from 'lucide-react';\r\n\r\nconst LoadingCmp = () => {\r\n return <Loader2Icon className=\"animate-spin\" />;\r\n};\r\n\r\nexport default LoadingCmp;\r\n","import { appInfo } from '@/config/app-config';\r\nimport LoadingCmp from './LoadingCmp';\r\n\r\nconst FullPageLoading = () => {\r\n return (\r\n <div className=\"bg-muted flex min-h-svh flex-col items-center justify-center gap-6\">\r\n <h3 className=\"scroll-m-20 text-xl font-semibold tracking-tight text-primary inline-flex gap-2\">\r\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\">\r\n <appInfo.logo className=\"size-4\" />\r\n </div>\r\n <div className=\"grid flex-1 text-left leading-tight items-center text-foreground\">{appInfo.appName}</div>\r\n </h3>\r\n <div className=\"inline-flex gap-1 ml-5\">\r\n <LoadingCmp />\r\n Loading application...\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FullPageLoading;\r\n","import type { JSX } from 'react';\r\nimport { toast } from 'sonner';\r\n\r\ninterface ToastParams {\r\n header?: string;\r\n description: string | JSX.Element;\r\n}\r\n\r\nexport const showSuccessToast = ({ header = 'Success', description }: ToastParams) => {\r\n toast.success(header, {\r\n description,\r\n // style: { background: '#22c55e', color: 'white' },\r\n });\r\n};\r\n\r\nexport const showErrorToast = ({ header = 'Error', description }: ToastParams) => {\r\n toast.error(header, {\r\n description,\r\n // style: { background: 'orangered', color: 'white' },\r\n });\r\n};\r\n\r\nexport const showWarningToast = ({ header = 'Warning', description }: ToastParams) => {\r\n toast.warning(header, {\r\n description,\r\n // style: { background: '#f97316', color: 'white' },\r\n });\r\n};\r\n","import axios, { type AxiosInstance } from 'axios';\r\nimport { getLocalStorage } from './utils';\r\nimport { showErrorToast } from './toast-helper';\r\nimport { appInfo } from '../config/app-config';\r\n\r\n/**\r\n * Axios utility for making HTTP requests with common configurations.\r\n * Automatically attaches the provided API key to every request header.\r\n */\r\n\r\n/**\r\n * Creates an Axios instance with default headers and base URL.\r\n * @returns Configured Axios instance.\r\n */\r\n\r\nlet axiosInstance: AxiosInstance | null = null;\r\n\r\nconst getAxiosInstance = (): AxiosInstance => {\r\n if (axiosInstance) {\r\n return axiosInstance;\r\n }\r\n\r\n axiosInstance = axios.create({\r\n baseURL: appInfo.serverUrl,\r\n headers: {\r\n api: getLocalStorage('apiKey') || '',\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n // Add a request interceptor to always set the latest API key\r\n axiosInstance.interceptors.request.use((config) => {\r\n config.headers = config.headers || {};\r\n config.headers['api'] = getLocalStorage('apiKey') || '';\r\n return config;\r\n });\r\n\r\n axiosInstance.interceptors.response.use(\r\n (response) => {\r\n return response.data?.response;\r\n },\r\n (error) => {\r\n if (!error.response) {\r\n showErrorToast({\r\n header: error.message || 'Network error',\r\n description: 'Unable to connect with server.',\r\n });\r\n throw error;\r\n }\r\n\r\n const errorRes = error.response.data;\r\n\r\n showErrorToast({\r\n header: parseDbErrorMessageEnhanced(errorRes?.error?.errorMsg) || 'Server error',\r\n description: parseDbErrorMessageEnhanced(errorRes.error.solution) || '',\r\n });\r\n\r\n throw errorRes.error;\r\n },\r\n );\r\n return axiosInstance;\r\n};\r\n\r\nconst tableNameMapping: Record<string, Record<string, string>> = {\r\n auth_users_tbl: {\r\n user_id: 'User Id',\r\n user_email: 'User Email',\r\n user_mobile_no: 'User Mobile Number',\r\n user_fname: \"User's First Name\",\r\n user_lname: \"User's Last Name\",\r\n user_is_active: 'User Is Active',\r\n },\r\n auth_organization_tbl: {\r\n org_id: appInfo.account_type_txt.singular + ' Id',\r\n org_name: appInfo.account_type_txt.singular + ' Name',\r\n org_address: appInfo.account_type_txt.singular + ' Address',\r\n org_state: appInfo.account_type_txt.singular + ' State',\r\n org_country: appInfo.account_type_txt.singular + ' Country',\r\n org_external_id: appInfo.account_type_txt.singular + ' External ID',\r\n org_gst_in: appInfo.account_type_txt.singular + ' External ID',\r\n org_is_deleted: appInfo.account_type_txt.singular + ' Deleted',\r\n org_created_by: appInfo.account_type_txt.singular + ' Created By',\r\n },\r\n auth_organization_users_tbl: {\r\n org_user_id: appInfo.account_type_txt.singular + 'User ID',\r\n org_id: appInfo.account_type_txt.singular + 'ID',\r\n user_id: 'User Id',\r\n org_user_role_id: appInfo.account_type_txt.singular + 'User Role Id',\r\n org_user_is_active: appInfo.account_type_txt.singular + 'User is active',\r\n user_opinion: 'User Opinion',\r\n },\r\n auth_invited_users_tbl: {\r\n invited_users_id: 'Invited Users Id',\r\n org_id: appInfo.account_type_txt.singular + 'Id',\r\n email: 'Email',\r\n invited_user_role_id: 'Invited user role Id',\r\n invited_by_user_id: 'Invited by user Id',\r\n is_deleted: 'Deleted',\r\n },\r\n};\r\n\r\nconst parseDbErrorMessageEnhanced = (errorMessage: string): string => {\r\n // Regular expression to match table.column patterns\r\n const tableColumnPattern = /(\\w+)\\.(\\w+)/g;\r\n\r\n let parsedMessage = errorMessage;\r\n\r\n // Find all table.column matches\r\n const matches = errorMessage.matchAll(tableColumnPattern);\r\n\r\n for (const match of matches) {\r\n const fullMatch = match[0]; // e.g., \"auth_users_tbl.user_email\"\r\n const tableName = match[1]; // e.g., \"auth_users_tbl\"\r\n const columnName = match[2]; // e.g., \"user_email\"\r\n\r\n // Check if we have a mapping for this table and column\r\n if (tableNameMapping[tableName]?.[columnName]) {\r\n const friendlyName = tableNameMapping[tableName][columnName];\r\n parsedMessage = parsedMessage.replace(fullMatch, friendlyName);\r\n }\r\n }\r\n\r\n parsedMessage = parsedMessage.replaceAll('key', 'field');\r\n\r\n return parsedMessage;\r\n};\r\n\r\nexport { getAxiosInstance };\r\n","import { appInfo } from '@/config/app-config';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showErrorToast } from '@/lib/toast-helper';\r\nimport type { ICreateOrderResponse, IRazorPayPrefill, IVerifyPaymentResponse, purchasedPlansInf } from '@/lib/types';\r\nimport type { CurrencyCode } from 'react-razorpay/dist/constants/currency';\r\n\r\nexport const getCurrencySymbol = (currency: string) => {\r\n if (currency === 'INR') return '₹';\r\n if (currency === 'USD') return '$';\r\n if (currency === 'EUR') return '€';\r\n if (currency === 'GBP') return '£';\r\n if (currency === 'AUD') return '$';\r\n if (currency === 'CAD') return '$';\r\n if (currency === 'CHF') return '₣';\r\n if (currency === 'CNY') return '¥';\r\n if (currency === 'DKK') return 'kr';\r\n if (currency === 'HKD') return '$';\r\n if (currency === 'NZD') return '$';\r\n if (currency === 'SEK') return 'kr';\r\n if (currency === 'SGD') return '$';\r\n if (currency === 'ZAR') return 'R';\r\n return '';\r\n};\r\n\r\nexport const getDisplayPaymentMethod = (paymentMethod: string) => {\r\n if (paymentMethod === 'netbanking') return 'Net Banking';\r\n if (paymentMethod === 'wallet') return 'Wallet';\r\n if (paymentMethod === 'upi') return 'UPI';\r\n if (paymentMethod === 'card') return 'Card';\r\n return paymentMethod;\r\n};\r\n\r\nexport const isFreePlan = (plan: purchasedPlansInf | undefined) => !plan || plan.plan_id === 'starter';\r\n\r\nexport const invokeRazorPay = (\r\n totalFinalPrice: number,\r\n CURRENCY: string,\r\n createdOrderResponse: ICreateOrderResponse,\r\n prefillObject: IRazorPayPrefill,\r\n Razorpay: any,\r\n) => {\r\n return new Promise((resolve, reject) => {\r\n const options = {\r\n key: appInfo.razorPayKey,\r\n amount: totalFinalPrice * 100,\r\n currency: CURRENCY as CurrencyCode,\r\n order_id: createdOrderResponse.orderId,\r\n name: appInfo.appName,\r\n description: appInfo.appDescription,\r\n\r\n handler: async function (response: any) {\r\n // setPaymentLoading(true);\r\n\r\n try {\r\n const verifyRes: IVerifyPaymentResponse = await getAxiosInstance().post('payment-gateway/verify-payment', {\r\n orderId: createdOrderResponse.orderId,\r\n razorpayPaymentId: response.razorpay_payment_id,\r\n razorpaySignature: response.razorpay_signature,\r\n });\r\n if (!verifyRes.success) return reject('Payment verification failed.');\r\n\r\n resolve(true);\r\n } catch (error: any) {\r\n showErrorToast({\r\n header: 'Payment failed!',\r\n description: error?.message || 'Payment verification failed.',\r\n });\r\n reject(error);\r\n }\r\n },\r\n\r\n prefill: prefillObject,\r\n theme: { color: appInfo.themeColor },\r\n modal: {\r\n ondismiss: function () {\r\n // User closed the payment dialog without completing payment\r\n reject(new Error('Payment cancelled!'));\r\n },\r\n },\r\n };\r\n\r\n const razorpay = new Razorpay(options);\r\n\r\n // Add error handling after razorpay.open()\r\n razorpay.on('payment.failed', function (response: any) {\r\n showErrorToast({\r\n header: 'Payment Failed!',\r\n description: response.error.description || 'Payment could not be processed.',\r\n });\r\n\r\n // Optional: Log the failure to your backend\r\n getAxiosInstance()\r\n .post('payment-gateway/log-failure', {\r\n orderId: createdOrderResponse.orderId,\r\n errorCode: response.error.code,\r\n errorDescription: response.error.description,\r\n errorReason: response.error.reason,\r\n paymentId: response.metadata?.payment_id,\r\n })\r\n .catch(() => {});\r\n });\r\n\r\n razorpay.open();\r\n });\r\n};\r\n","import { useCallback, useContext } from 'react';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport type { purchasedPlansInf, purchasedPlansInfResponse } from '@/lib/types';\r\nimport AppContext from '@/store/AppContext';\r\nimport { isFreePlan } from '../utils/subscription-utils';\r\n\r\nconst processPurchasedPlan = (plan: purchasedPlansInf): purchasedPlansInf => {\r\n if (plan.status !== 'paid') return plan;\r\n\r\n plan.startAt = new Date(plan.startAt);\r\n plan.endAt = new Date(plan.endAt);\r\n\r\n plan.old_purchased_amount = Number(plan.amount);\r\n plan.updatedRecords &&\r\n plan.updatedRecords.forEach((updatedRecord: any) => {\r\n plan.amount = Number(plan.amount) + Number(updatedRecord.amount);\r\n });\r\n\r\n return plan;\r\n};\r\n\r\nconst usePurchasedPlans = () => {\r\n const { setPurchasePlans, setActivePlan, featureFlags, activePlan, activeOrg } = useContext(AppContext);\r\n\r\n const loadPurchasedPlans = useCallback(\r\n async (forceLoad: boolean = false) => {\r\n if (!forceLoad && !featureFlags.ff_enable_paid_subscription) return;\r\n\r\n const purchasedPlans = (await getAxiosInstance().get('/purchased-plans')) as purchasedPlansInfResponse;\r\n\r\n purchasedPlans.purchasedPlans.forEach(processPurchasedPlan);\r\n\r\n setPurchasePlans([...(purchasedPlans.purchasedPlans || [])].reverse());\r\n setActivePlan(processPurchasedPlan(purchasedPlans.activePlan));\r\n },\r\n [setPurchasePlans, setActivePlan, featureFlags.ff_enable_paid_subscription],\r\n );\r\n\r\n const isActiveOrgFreePlan = useCallback(() => {\r\n return isFreePlan(activeOrg?.active_purchased_plan);\r\n }, [activeOrg]);\r\n\r\n const isUserFreePlan = useCallback(() => {\r\n return isFreePlan(activePlan);\r\n }, [activePlan]);\r\n\r\n // const isActiveOrgCreatedByUser = useCallback(() => {\r\n // return activeOrg?. === 'user';\r\n // }, [activeOrg]);\r\n\r\n return {\r\n loadPurchasedPlans,\r\n isActiveOrgFreePlan,\r\n isUserFreePlan,\r\n };\r\n};\r\n\r\nexport default usePurchasedPlans;\r\n","import FullPageLoading from '@/components/custom/FullPageLoading';\r\nimport usePurchasedPlans from '@/app/routes/Subscriptions/hooks/usePurchasedPlans';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport type { IFeatureFlagsResponse, OrganizationTypeResponse, SessionInfoResponse } from '@/lib/types';\r\nimport { getLocalStorage } from '@/lib/utils';\r\nimport AppContext from '@/store/AppContext';\r\nimport { useState, useEffect, useContext, type ReactNode } from 'react';\r\nimport { Navigate, useLocation } from 'react-router';\r\nimport type { ISubscriptionConfig } from '@/lib/billingsdk-config';\r\n\r\ninterface RequireAuthProps {\r\n children: ReactNode;\r\n}\r\n\r\nconst RequireAuth = ({ children }: RequireAuthProps) => {\r\n const [loading, setLoading] = useState(true);\r\n const location = useLocation();\r\n const { orgs, setOrgs, loggedInUser, setLoggedInUser, setActiveOrg, subscriptionConfig, setSubscriptionConfig, featureFlags, setFeatureFlags } =\r\n useContext(AppContext);\r\n const { loadPurchasedPlans } = usePurchasedPlans();\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n try {\r\n await new Promise((resolve) => setTimeout(resolve, 200));\r\n\r\n const featuresFlg = (await getAxiosInstance().get('/feature-flags')) as IFeatureFlagsResponse;\r\n setFeatureFlags(featuresFlg.featureFlags);\r\n\r\n const sessionResponse = (await getAxiosInstance().get('/check-session')) as SessionInfoResponse;\r\n const isAuthed = !!sessionResponse.sessionInfo?.id;\r\n\r\n setLoggedInUser({\r\n email: sessionResponse.user.user_email,\r\n id: sessionResponse.sessionInfo?.id,\r\n fname: sessionResponse.user.user_fname,\r\n lname: sessionResponse.user.user_lname,\r\n mobNo: String(sessionResponse.user.user_mobile_no),\r\n });\r\n\r\n if (isAuthed === true) {\r\n if (featuresFlg.featureFlags.ff_enable_paid_subscription) {\r\n await loadPurchasedPlans(true);\r\n }\r\n\r\n if (featuresFlg.featureFlags.ff_enable_teams) {\r\n const orgsRes = (await getAxiosInstance().get('organization')) as OrganizationTypeResponse;\r\n const fetchedOrgs = orgsRes?.orgs || [];\r\n setOrgs(fetchedOrgs);\r\n\r\n const activeOrgId = getLocalStorage('activeOrgId');\r\n let lastSelectedOrg = fetchedOrgs[0];\r\n if (activeOrgId) {\r\n lastSelectedOrg = fetchedOrgs.find((org) => String(org.org_id) === activeOrgId) || lastSelectedOrg;\r\n }\r\n setActiveOrg(lastSelectedOrg);\r\n }\r\n }\r\n\r\n if (featuresFlg.featureFlags.ff_enable_paid_subscription && 'plans' in subscriptionConfig === false) {\r\n const subscriptionConfigResponse = (await getAxiosInstance().get('/get-subscription-config')) as ISubscriptionConfig;\r\n setSubscriptionConfig(subscriptionConfigResponse);\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n fetchData();\r\n }, []);\r\n\r\n if (loading) {\r\n return <FullPageLoading />;\r\n }\r\n\r\n if (!loggedInUser?.id) {\r\n return <Navigate to=\"/login\" state={{ from: location }} replace />;\r\n }\r\n\r\n if (featureFlags.ff_enable_teams && orgs.length === 0 && !location.pathname.includes('infrastructure')) {\r\n return (\r\n <Navigate\r\n to={featureFlags.ff_enable_paid_subscription ? '/infrastructure/manage-subscription' : '/infrastructure'}\r\n state={{ from: location }}\r\n replace\r\n />\r\n );\r\n }\r\n\r\n // if (orgs.length === 0 && !location.pathname.includes('/infrastructure/manage-subscription')) {\r\n // return <Navigate to=\"/infrastructure/manage-subscription\" state={{ from: location }} replace />;\r\n // }\r\n\r\n return children;\r\n};\r\n\r\nexport default RequireAuth;\r\n","import { createBrowserRouter, RouterProvider, type RouteObject } from 'react-router';\nimport { useContext, lazy, Suspense } from 'react';\nimport AppContext from '@/store/AppContext';\nimport RequireAuth from './routes/components/RequireAuth';\nimport FullPageLoading from '../components/custom/FullPageLoading';\n\n// Lazy load all route components\nconst Auth = lazy(() => import('./routes/auth/components/Auth'));\nconst LoginForm = lazy(() => import('./routes/auth/LoginForm'));\nconst RegistrationForm = lazy(() => import('./routes/auth/RegistrationForm'));\nconst Dashboard = lazy(() => import('./routes/Dashboard/Dashboard'));\nconst NotFound = lazy(() => import('./routes/NotFound'));\nconst ForgotPasswordForm = lazy(() => import('./routes/auth/ForgotPasswordForm'));\nconst OrgSetup = lazy(() => import('./routes/OrgSetup/OrgSetup'));\nconst CreateOrg = lazy(() => import('./routes/OrgSetup/CreateOrg'));\nconst JoinOrg = lazy(() => import('./routes/OrgSetup/JoinOrg'));\nconst OrgRootLayout = lazy(() => import('./routes/OrgSetup/components/OrgRootLayout'));\nconst ManageOrgs = lazy(() => import('./routes/OrgSetup/ManageOrgs'));\nconst PricingTbl = lazy(() => import('./routes/Subscriptions/PricingPg').then((m) => ({ default: m.PricingTbl })));\nconst SubscriptionMgmt = lazy(() => import('./routes/Subscriptions/SubscriptionMgmt'));\nconst Checkout = lazy(() => import('./routes/Subscriptions/Checkout'));\nconst PaymentHistory = lazy(() => import('./routes/Subscriptions/PaymentHistory'));\nconst GeneralSettingsPg = lazy(() => import('./routes/Dashboard/components/Settings/GeneralSettingsPg'));\n\nexport interface IRoutes {\n appRoutes: RouteObject[];\n publicRoutes?: RouteObject[];\n}\n\nfunction Routes({ appRoutes, publicRoutes = [] }: IRoutes) {\n const { featureFlags } = useContext(AppContext);\n\n const router = createBrowserRouter([\n {\n path: '/',\n element: (\n <RequireAuth>\n <Dashboard />\n </RequireAuth>\n ),\n children: [\n ...appRoutes,\n {\n path: 'app/general-settings',\n Component: GeneralSettingsPg,\n },\n {\n path: 'app/*',\n element: <NotFound canShowHeader={false} />,\n },\n ],\n },\n ...(featureFlags.ff_enable_paid_subscription === false\n ? []\n : [\n {\n path: 'plans',\n Component: PricingTbl,\n },\n ]),\n ...publicRoutes,\n {\n path: 'infrastructure',\n element: (\n <RequireAuth>\n <OrgRootLayout />\n </RequireAuth>\n ),\n children: [\n ...(featureFlags.ff_enable_teams === false\n ? []\n : [\n {\n index: true,\n Component: OrgSetup,\n },\n {\n path: 'create-new-org',\n Component: CreateOrg,\n },\n {\n path: 'edit-org/:orgId',\n Component: CreateOrg,\n },\n {\n path: 'user-invitations',\n Component: JoinOrg,\n },\n {\n path: 'manage-infra',\n Component: ManageOrgs,\n },\n ]),\n ...(featureFlags.ff_enable_paid_subscription === false\n ? []\n : [\n {\n path: 'manage-subscription',\n Component: SubscriptionMgmt,\n },\n {\n path: 'checkout',\n Component: Checkout,\n },\n {\n path: 'payment-history',\n Component: PaymentHistory,\n },\n ]),\n ],\n },\n {\n Component: Auth,\n children: [\n {\n path: 'login',\n Component: LoginForm,\n },\n {\n path: 'forgot-password',\n Component: ForgotPasswordForm,\n },\n {\n path: 'register',\n Component: RegistrationForm,\n },\n ],\n },\n {\n path: '*',\n Component: NotFound,\n },\n ]);\n return (\n <Suspense fallback={<FullPageLoading />}>\n <RouterProvider router={router} />\n </Suspense>\n );\n}\n\nexport default Routes;\n","import * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { XIcon } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean;\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n );\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n );\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn('text-lg leading-none font-semibold', className)}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","import * as React from 'react';\r\nimport { Slot } from '@radix-ui/react-slot';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nimport { cn } from '@/lib/utils';\r\nimport LoadingCmp from '../custom/LoadingCmp';\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',\r\n destructive:\r\n 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\r\n outline:\r\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\r\n secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',\r\n ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n linkNoUnderline: 'text-primary underline-offset-4',\r\n },\r\n size: {\r\n default: 'h-8 px-4 py-2 has-[>svg]:px-3',\r\n sm: 'h-7 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\r\n lg: 'h-9 rounded-md px-6 has-[>svg]:px-4',\r\n icon: 'size-9',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n },\r\n);\r\n\r\nfunction InnerButton({\r\n className,\r\n variant,\r\n size,\r\n asChild = false,\r\n ...props\r\n}: React.ComponentProps<'button'> &\r\n VariantProps<typeof buttonVariants> & {\r\n asChild?: boolean;\r\n }) {\r\n const Comp = asChild ? Slot : 'button';\r\n return (\r\n <Comp\r\n data-slot=\"button\"\r\n className={cn(buttonVariants({ variant, size, className }), 'cursor-pointer')}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\ninterface CustomProps {\r\n loading?: boolean;\r\n}\r\n\r\nfunction Button({\r\n loading = false,\r\n children,\r\n ...props\r\n}: React.ComponentProps<'button'> &\r\n VariantProps<typeof buttonVariants> & {\r\n asChild?: boolean;\r\n } & CustomProps) {\r\n return (\r\n <InnerButton {...props} disabled={loading || props.disabled}>\r\n {loading && <LoadingCmp />}\r\n {children}\r\n </InnerButton>\r\n );\r\n}\r\n\r\nexport { Button, buttonVariants };\r\n","import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog';\r\nimport type { JSX, ReactNode } from 'react';\r\n\r\ninterface DialogWrapperProps {\r\n open: boolean;\r\n setIsOpen: (isOpen: boolean) => void;\r\n header: string;\r\n children: ReactNode;\r\n actionsJSX: JSX.Element;\r\n disableOutsideClick?: boolean;\r\n dlgContentClsName?: string;\r\n}\r\n\r\nconst DialogWrapper = ({ open, setIsOpen, header, children, actionsJSX, disableOutsideClick = false, dlgContentClsName }: DialogWrapperProps) => {\r\n return (\r\n <Dialog open={open} onOpenChange={(isOpen) => setIsOpen(isOpen === true)}>\r\n <DialogContent\r\n aria-describedby={'dialog-content'}\r\n onPointerDownOutside={(e) => {\r\n if (disableOutsideClick) {\r\n e.preventDefault();\r\n }\r\n }}\r\n className={dlgContentClsName}\r\n >\r\n <DialogHeader>\r\n <DialogTitle>{header}</DialogTitle>\r\n </DialogHeader>\r\n {children}\r\n <DialogFooter>{actionsJSX}</DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n};\r\n\r\nexport default DialogWrapper;\r\n","import AppContext from '@/store/AppContext';\r\nimport { useContext, type JSX } from 'react';\r\n\r\nexport interface AlertConfigs {\r\n text: JSX.Element | string;\r\n onClose?: (result: 'CONFIRM' | 'CANCEL') => void;\r\n type: 'ALERT' | 'CONFIRM';\r\n}\r\n\r\nconst useAlertDialog = () => {\r\n const appLevelContext = useContext(AppContext);\r\n\r\n const showAlertBox = (newOptions: AlertConfigs) => {\r\n appLevelContext.setAlertDlgOptions({\r\n ...newOptions,\r\n open: true,\r\n });\r\n };\r\n\r\n const closeAlertBox = () => {\r\n appLevelContext.setAlertDlgOptions({\r\n ...appLevelContext.alertDlgOptions,\r\n open: false,\r\n });\r\n };\r\n\r\n const showAlertDlgPromise = async (newOptions: AlertConfigs) => {\r\n return new Promise((resolve, reject) => {\r\n showAlertBox({\r\n ...newOptions,\r\n async onClose(result) {\r\n if (result !== 'CONFIRM') {\r\n reject(result);\r\n return;\r\n }\r\n resolve(result);\r\n },\r\n });\r\n });\r\n };\r\n\r\n return {\r\n showAlertBox,\r\n closeAlertBox,\r\n showAlertDlgPromise,\r\n };\r\n};\r\n\r\nexport default useAlertDialog;\r\n","import { DialogDescription } from '@/components/ui/dialog';\r\nimport { Button } from '@/components/ui/button';\r\nimport DialogWrapper from './DialogWrapper';\r\nimport useAlertDialog from '@/hooks/useAlertDialog';\r\nimport type { JSX } from 'react';\r\n\r\nexport interface AlertDialogOptionsProps {\r\n open: boolean;\r\n text: JSX.Element | string;\r\n onClose?: (result: 'CONFIRM' | 'CANCEL') => void;\r\n type: 'ALERT' | 'CONFIRM';\r\n}\r\n\r\ninterface AlertDialogProps {\r\n options: AlertDialogOptionsProps;\r\n}\r\n\r\nconst AlertDialog = ({ options }: AlertDialogProps) => {\r\n const dlg = useAlertDialog();\r\n\r\n const closeDlg = () => {\r\n dlg.closeAlertBox();\r\n if (options.onClose) options.onClose('CANCEL');\r\n };\r\n\r\n const confirmDlg = () => {\r\n dlg.closeAlertBox();\r\n if (options.onClose) options.onClose('CONFIRM');\r\n };\r\n\r\n return (\r\n <DialogWrapper\r\n open={options.open}\r\n setIsOpen={closeDlg}\r\n header={options.type === 'ALERT' ? 'Alert' : 'Confirmation'}\r\n actionsJSX={\r\n <>\r\n <Button onClick={closeDlg} variant={'ghost'}>\r\n Cancel\r\n </Button>\r\n {options.type === 'CONFIRM' && <Button onClick={confirmDlg}>Confirm</Button>}\r\n </>\r\n }\r\n >\r\n <DialogDescription className=\"mt-3\">{options.text}</DialogDescription>\r\n </DialogWrapper>\r\n );\r\n};\r\n\r\nexport default AlertDialog;\r\n","import { appInfo } from '../config/app-config';\n\nexport const ROLES = {\n READ: 0,\n ADMIN: 1,\n WRITE: 2,\n Is_ADMIN: function (roleId: number) {\n return roleId === this.ADMIN;\n },\n CAN_WRITE: function (roleId: number) {\n return roleId === this.WRITE || roleId === this.ADMIN;\n },\n CAN_READ: function (roleId: number) {\n return roleId === this.READ || roleId === this.WRITE || roleId === this.ADMIN;\n },\n\n DISPLAY_TEXT: function (roleId: number) {\n const textMap = {\n [this.READ]: 'Read',\n [this.WRITE]: 'Read / Write',\n [this.ADMIN]: appInfo.account_type_txt.singular + ' Admin',\n };\n\n return textMap[roleId] || '';\n },\n\n IS_VALID_ROLE_ID: function (roleId: number) {\n return roleId === this.READ || roleId === this.ADMIN || roleId === this.WRITE;\n },\n\n GET_LIST: function () {\n return [\n { id: this.READ.toString(), text: this.DISPLAY_TEXT(this.READ) },\n { id: this.WRITE.toString(), text: this.DISPLAY_TEXT(this.WRITE) },\n { id: this.ADMIN.toString(), text: this.DISPLAY_TEXT(this.ADMIN) },\n ];\n },\n};\n\nexport const updateRolesEnum = (newRoles: any) => {\n Object.assign(ROLES, newRoles);\n};\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nfunction Table({ className, ...props }: React.ComponentProps<'table'>) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full overflow-x-auto flex-1\">\n <table\n data-slot=\"table\"\n className={cn('w-full caption-bottom text-sm', className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<'thead'>) {\n return <thead data-slot=\"table-header\" className={cn('[&_tr]:border-b', className)} {...props} />;\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<'tbody'>) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn('[&_tr:last-child]:border-0', className)}\n {...props}\n />\n );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn('bg-muted/50 border-t font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<'tr'>) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n 'hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<'th'>) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n 'text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<'td'>) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n 'p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCaption({ className, ...props }: React.ComponentProps<'caption'>) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn('text-muted-foreground mt-4 text-sm', className)}\n {...props}\n />\n );\n}\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n );\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n};\n","import * as React from \"react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\r\n return (\r\n <input\r\n type={type}\r\n data-slot=\"input\"\r\n className={cn(\r\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\r\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\r\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Input }\r\n","import * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n","import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import * as React from \"react\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Switch({\n className,\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n \"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","import * as React from 'react';\r\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\nfunction TooltipProvider({\r\n delayDuration = 0,\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\r\n return (\r\n <TooltipPrimitive.Provider\r\n data-slot=\"tooltip-provider\"\r\n delayDuration={delayDuration}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction Tooltip({ delayDuration, ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\r\n return (\r\n <TooltipProvider delayDuration={delayDuration}>\r\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\r\n </TooltipProvider>\r\n );\r\n}\r\n\r\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\r\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\r\n}\r\n\r\nfunction TooltipContent({\r\n className,\r\n sideOffset = 0,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\r\n return (\r\n <TooltipPrimitive.Portal>\r\n <TooltipPrimitive.Content\r\n data-slot=\"tooltip-content\"\r\n sideOffset={sideOffset}\r\n className={cn(\r\n 'bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <TooltipPrimitive.Arrow className=\"bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\r\n </TooltipPrimitive.Content>\r\n </TooltipPrimitive.Portal>\r\n );\r\n}\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\r\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90',\n secondary: 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90',\n destructive:\n 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline: 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground',\n success: 'border-transparent bg-primary/10 text-primary [a&]:hover:bg-primary/20',\n failure: 'border-transparent bg-destructive/10 text-destructive [a&]:hover:bg-destructive/20',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<'span'> & VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'span';\n\n return <Comp data-slot=\"badge\" className={cn(badgeVariants({ variant }), className)} {...props} />;\n}\n\nexport { Badge, badgeVariants };\n","import * as React from 'react';\r\nimport * as SeparatorPrimitive from '@radix-ui/react-separator';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\nfunction Separator({ className, orientation = 'horizontal', decorative = true, ...props }: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\r\n return (\r\n <SeparatorPrimitive.Root\r\n data-slot=\"separator\"\r\n decorative={decorative}\r\n orientation={orientation}\r\n className={cn(\r\n 'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport { Separator };\r\n","import * as React from 'react';\r\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\r\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\nfunction DropdownMenu({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\r\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\r\n}\r\n\r\nfunction DropdownMenuPortal({\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\r\n return <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />;\r\n}\r\n\r\nfunction DropdownMenuTrigger({\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\r\n return <DropdownMenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />;\r\n}\r\n\r\nfunction DropdownMenuContent({\r\n className,\r\n sideOffset = 4,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\r\n return (\r\n <DropdownMenuPrimitive.Portal>\r\n <DropdownMenuPrimitive.Content\r\n data-slot=\"dropdown-menu-content\"\r\n sideOffset={sideOffset}\r\n className={cn(\r\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n );\r\n}\r\n\r\nfunction DropdownMenuGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\r\n return <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />;\r\n}\r\n\r\nfunction DropdownMenuItem({\r\n className,\r\n inset,\r\n variant = 'default',\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\r\n inset?: boolean;\r\n variant?: 'default' | 'destructive';\r\n}) {\r\n return (\r\n <DropdownMenuPrimitive.Item\r\n data-slot=\"dropdown-menu-item\"\r\n data-inset={inset}\r\n data-variant={variant}\r\n className={cn(\r\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction DropdownMenuCheckboxItem({\r\n className,\r\n children,\r\n checked,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\r\n return (\r\n <DropdownMenuPrimitive.CheckboxItem\r\n data-slot=\"dropdown-menu-checkbox-item\"\r\n className={cn(\r\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\r\n className,\r\n )}\r\n checked={checked}\r\n {...props}\r\n >\r\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <CheckIcon className=\"size-4\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.CheckboxItem>\r\n );\r\n}\r\n\r\nfunction DropdownMenuRadioGroup({\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\r\n return <DropdownMenuPrimitive.RadioGroup data-slot=\"dropdown-menu-radio-group\" {...props} />;\r\n}\r\n\r\nfunction DropdownMenuRadioItem({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\r\n return (\r\n <DropdownMenuPrimitive.RadioItem\r\n data-slot=\"dropdown-menu-radio-item\"\r\n className={cn(\r\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\r\n className,\r\n )}\r\n {...props}\r\n >\r\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <CircleIcon className=\"size-2 fill-current\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.RadioItem>\r\n );\r\n}\r\n\r\nfunction DropdownMenuLabel({\r\n className,\r\n inset,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\r\n inset?: boolean;\r\n}) {\r\n return (\r\n <DropdownMenuPrimitive.Label\r\n data-slot=\"dropdown-menu-label\"\r\n data-inset={inset}\r\n className={cn('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction DropdownMenuSeparator({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\r\n return (\r\n <DropdownMenuPrimitive.Separator\r\n data-slot=\"dropdown-menu-separator\"\r\n className={cn('bg-border -mx-1 my-1 h-px', className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction DropdownMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) {\r\n return (\r\n <span\r\n data-slot=\"dropdown-menu-shortcut\"\r\n className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction DropdownMenuSub({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\r\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\r\n}\r\n\r\nfunction DropdownMenuSubTrigger({\r\n className,\r\n inset,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\r\n inset?: boolean;\r\n}) {\r\n return (\r\n <DropdownMenuPrimitive.SubTrigger\r\n data-slot=\"dropdown-menu-sub-trigger\"\r\n data-inset={inset}\r\n className={cn(\r\n 'focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronRightIcon className=\"ml-auto size-4\" />\r\n </DropdownMenuPrimitive.SubTrigger>\r\n );\r\n}\r\n\r\nfunction DropdownMenuSubContent({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\r\n return (\r\n <DropdownMenuPrimitive.SubContent\r\n data-slot=\"dropdown-menu-sub-content\"\r\n className={cn(\r\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport {\r\n DropdownMenu,\r\n DropdownMenuPortal,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuGroup,\r\n DropdownMenuLabel,\r\n DropdownMenuItem,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuRadioGroup,\r\n DropdownMenuRadioItem,\r\n DropdownMenuSeparator,\r\n DropdownMenuShortcut,\r\n DropdownMenuSub,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuSubContent,\r\n};\r\n","import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n 'border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","import * as React from 'react';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\nfunction Tabs({ className, orientation = 'horizontal', ...props }: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn('group/tabs flex gap-2 data-[orientation=horizontal]:flex-col', className)}\n {...props}\n />\n );\n}\n\nconst tabsListVariants = cva(\n 'rounded-lg p-[3px] group-data-[orientation=horizontal]/tabs:h-9 data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col',\n {\n variants: {\n variant: {\n default: 'bg-muted',\n line: 'gap-1 bg-transparent',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nfunction TabsList({\n className,\n variant = 'default',\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> & VariantProps<typeof tabsListVariants>) {\n return <TabsPrimitive.List data-slot=\"tabs-list\" data-variant={variant} className={cn(tabsListVariants({ variant }), className)} {...props} />;\n}\n\nfunction TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring text-foreground/60 hover:text-foreground dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n 'group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent',\n 'data-[state=active]:bg-background dark:data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 data-[state=active]:text-foreground',\n 'after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return <TabsPrimitive.Content data-slot=\"tabs-content\" className={cn('flex-1 outline-none', className)} {...props} />;\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants };\n","import LoadingCmp from './LoadingCmp';\r\n\r\nconst LoadingMask = () => {\r\n return (\r\n <div className=\"absolute inset-0 flex items-center justify-center\">\r\n <LoadingCmp /> &nbsp;Loading...\r\n </div>\r\n );\r\n};\r\n\r\nexport default LoadingMask;\r\n","import type { HTMLAttributes } from 'react';\r\nimport LoadingMask from '../LoadingMask';\r\n\r\ninterface FlexColsLayoutProps extends HTMLAttributes<HTMLDivElement> {\r\n className?: string;\r\n layout?: 'horizontal' | 'vertical';\r\n loading?: boolean;\r\n doNotAppendFlex1?: boolean;\r\n responsive?: boolean;\r\n}\r\n\r\nconst FlexColsLayout = ({ className, layout = 'vertical', loading, doNotAppendFlex1 = false, responsive = false, ...props }: FlexColsLayoutProps) => {\r\n const layoutCls = layout === 'horizontal' ? (responsive === true ? 'sm:flex-row flex-col' : 'flex-row') : 'flex-col';\r\n const flex1 = doNotAppendFlex1 ? '' : 'flex-1';\r\n\r\n const container = (cls?: string) => (\r\n <div className={`${flex1} flex ${layoutCls} items-stretch overflow-auto ${cls || ''} ${className}`} {...props} />\r\n );\r\n\r\n if (!loading) {\r\n return container();\r\n }\r\n\r\n const loadingCls = loading ? 'pointer-events-none opacity-50' : '';\r\n return (\r\n <div className=\"relative flex-1\">\r\n {loading && <LoadingMask />}\r\n {container(loadingCls)}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FlexColsLayout;\r\n","import * as React from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined);\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n mql.addEventListener('change', onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n return !!isMobile;\n}\n","import React, { useState } from 'react';\r\nimport DialogWrapper from './DialogWrapper';\r\nimport { Button } from '../ui';\r\nimport { Menu } from 'lucide-react';\r\nimport { useIsMobile } from '@/hooks/useIsMobile';\r\n\r\nexport interface ToolbarProps {\r\n leftItems?: React.ReactNode[];\r\n centerItems?: React.ReactNode[];\r\n rightItems?: React.ReactNode[];\r\n className?: string;\r\n style?: React.CSSProperties;\r\n menuProps?: object;\r\n}\r\n\r\nexport const Toolbar: React.FC<ToolbarProps> = ({ leftItems = [], centerItems = [], rightItems = [], className = '', style = {} }) => {\r\n const isMobile = useIsMobile();\r\n const [dialogOpen, setDialogOpen] = useState(false);\r\n\r\n // Combine all items for menu in mobile\r\n const allMenuItems = [...leftItems, ...centerItems, ...rightItems];\r\n\r\n return (\r\n <div className={`flex items-center w-full ${className}`} style={{ minHeight: 48, ...style }}>\r\n {isMobile ? (\r\n <div className=\"flex w-full justify-end items-center\">\r\n <Button type=\"button\" onClick={() => setDialogOpen(true)}>\r\n <Menu />\r\n </Button>\r\n <DialogWrapper open={dialogOpen} setIsOpen={setDialogOpen} header={'Menu'} actionsJSX={<></>} disableOutsideClick={false}>\r\n <div className=\"flex flex-col gap-5 mt-2\">\r\n {allMenuItems.map((item, idx) => (\r\n <div key={idx}>{item}</div>\r\n ))}\r\n </div>\r\n </DialogWrapper>\r\n </div>\r\n ) : (\r\n <>\r\n {leftItems.length > 0 && <div className=\"flex flex-1 items-center gap-2 justify-start px-1\">{leftItems}</div>}\r\n {centerItems.length > 0 && <div className=\"flex flex-1 items-center gap-2 justify-center px-1\">{centerItems}</div>}\r\n {rightItems.length > 0 && <div className=\"flex flex-1 items-center gap-2 justify-end px-1\">{rightItems}</div>}\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import { Button } from '@/components/ui/button';\r\nimport { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';\r\nimport { Input } from '@/components/ui/input';\r\nimport { ChevronDown, RefreshCcw } from 'lucide-react';\r\nimport type { Table } from '@tanstack/react-table';\r\nimport type { columnProp } from './DataTable';\r\nimport FlexColsLayout from '../Layouts/FlexColsLayout';\r\nimport { useIsMobile } from '@/hooks/useIsMobile';\r\nimport { Toolbar } from '../Toolbar';\r\n\r\nexport interface DataTableToolbarProp {\r\n canShowSearchField: boolean;\r\n searchFieldConfig?: {\r\n placeholder?: string;\r\n searchField?: string;\r\n };\r\n canShowColumnsBtn: boolean;\r\n additionalJSX: React.ReactNode[];\r\n refreshBtn?: {\r\n canShow: boolean;\r\n onClick: () => void;\r\n };\r\n}\r\n\r\ninterface DataTableToolbarInternalProps<TData> {\r\n table: Table<TData>;\r\n rawColumns: columnProp[];\r\n}\r\n\r\nfunction DataTableToolbar<TData>({\r\n table,\r\n canShowSearchField = true,\r\n searchFieldConfig = {},\r\n canShowColumnsBtn = false,\r\n additionalJSX,\r\n rawColumns,\r\n refreshBtn = {\r\n canShow: false,\r\n onClick: () => {},\r\n },\r\n}: DataTableToolbarProp & DataTableToolbarInternalProps<TData>) {\r\n const getColumnById = (id: string) => rawColumns.find((col) => col.id === id);\r\n const isMobile = useIsMobile();\r\n\r\n return (\r\n <FlexColsLayout className=\"px-1 py-2 gap-2\" layout={isMobile ? 'vertical' : 'horizontal'} doNotAppendFlex1={true}>\r\n <Toolbar\r\n leftItems={[\r\n canShowSearchField && searchFieldConfig.searchField ? (\r\n <Input\r\n key=\"searchField\"\r\n placeholder={searchFieldConfig.placeholder}\r\n value={(table.getColumn(searchFieldConfig.searchField)?.getFilterValue() as string) ?? ''}\r\n onChange={(event) => {\r\n const column = table.getColumn(searchFieldConfig.searchField as string);\r\n column?.setFilterValue(event.target.value);\r\n }}\r\n className=\"max-w-sm\"\r\n />\r\n ) : (\r\n <></>\r\n ),\r\n\r\n refreshBtn.canShow && (\r\n <Button variant={'ghost'} key=\"refreshBtn\" onClick={refreshBtn.onClick}>\r\n <RefreshCcw /> Refresh\r\n </Button>\r\n ),\r\n ]}\r\n rightItems={[\r\n canShowColumnsBtn && (\r\n <DropdownMenu key=\"columnsBtnDropDown\">\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"ghost\" key=\"columnsBtn\">\r\n Columns <ChevronDown />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n {table\r\n .getAllColumns()\r\n .filter((column) => column.getCanHide() && getColumnById(column.id)?.enableHiding)\r\n .map((column) => {\r\n return (\r\n <DropdownMenuCheckboxItem\r\n key={column.id}\r\n checked={column.getIsVisible()}\r\n onCheckedChange={(value) => column.toggleVisibility(!!value)}\r\n >\r\n {getColumnById(column.id)?.headerText || ''}\r\n </DropdownMenuCheckboxItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n ),\r\n ...additionalJSX,\r\n ]}\r\n />\r\n </FlexColsLayout>\r\n );\r\n}\r\n\r\nexport default DataTableToolbar;\r\n","import * as React from \"react\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n MoreHorizontalIcon,\n} from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Button, buttonVariants } from \"@/components/ui/button\";\n\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n );\n}\n\nfunction PaginationContent({\n className,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n );\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />;\n}\n\ntype PaginationLinkProps = {\n isActive?: boolean;\n} & Pick<React.ComponentProps<typeof Button>, \"size\"> &\n React.ComponentProps<\"a\">;\n\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) {\n return (\n <a\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n \"cursor-pointer\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction PaginationPrevious({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pl-2.5\", className)}\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"hidden sm:block\">Previous</span>\n </PaginationLink>\n );\n}\n\nfunction PaginationNext({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pr-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">Next</span>\n <ChevronRightIcon />\n </PaginationLink>\n );\n}\n\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n );\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n};\n","import {\r\n Pagination,\r\n PaginationContent,\r\n PaginationEllipsis,\r\n PaginationItem,\r\n PaginationLink,\r\n PaginationNext,\r\n PaginationPrevious,\r\n} from \"@/components/ui/pagination\";\r\nimport { createIndexedArray } from \"@/lib/utils\";\r\nimport React, { useMemo } from \"react\";\r\n\r\ninterface PaginationWrapperProps {\r\n totalCount: number;\r\n activePage: number;\r\n pageSize: number;\r\n onPageChange: (pageNo: number) => void;\r\n}\r\n\r\nconst PaginationWrapper = ({\r\n totalCount,\r\n activePage,\r\n pageSize,\r\n onPageChange,\r\n}: PaginationWrapperProps) => {\r\n const totalPages = useMemo(\r\n () => Math.ceil(totalCount / pageSize),\r\n [totalCount, pageSize]\r\n );\r\n\r\n const handleOnPageChange = (newPageNo: number) => {\r\n if (newPageNo < 0 || newPageNo >= totalPages) return;\r\n onPageChange(newPageNo);\r\n };\r\n\r\n const disabledCls = \"opacity-50 cursor-not-allowed\";\r\n\r\n const paginationArr = createIndexedArray(totalPages).filter(\r\n (pageNo) =>\r\n (pageNo < activePage + 3 && pageNo > activePage - 3) ||\r\n pageNo === 0 ||\r\n pageNo === totalPages - 1\r\n );\r\n\r\n return (\r\n <Pagination className=\"text-secondary-foreground\">\r\n <PaginationContent>\r\n <PaginationItem>\r\n <PaginationPrevious\r\n className={activePage === 0 ? disabledCls : \"\"}\r\n onClick={() => handleOnPageChange(activePage - 1)}\r\n />\r\n </PaginationItem>\r\n\r\n {paginationArr.map((pageNo, index) => {\r\n //checking if all consecutive numbers are there, if not then adding ellipse.\r\n\r\n let ellipse = null;\r\n if (index > 0 && pageNo - paginationArr[index - 1] !== 1) {\r\n ellipse = (\r\n <PaginationItem>\r\n <PaginationEllipsis />\r\n </PaginationItem>\r\n );\r\n }\r\n return (\r\n <React.Fragment key={pageNo}>\r\n {ellipse}\r\n <PaginationItem\r\n className={\r\n activePage === pageNo\r\n ? \"bg-primary text-primary-foreground rounded-2xl hover:bg-primary\"\r\n : \"\"\r\n }\r\n >\r\n <PaginationLink onClick={() => handleOnPageChange(pageNo)}>\r\n {pageNo + 1}\r\n </PaginationLink>\r\n </PaginationItem>\r\n </React.Fragment>\r\n );\r\n })}\r\n\r\n <PaginationItem>\r\n <PaginationNext\r\n className={activePage === totalPages - 1 ? disabledCls : \"\"}\r\n onClick={() => handleOnPageChange(activePage + 1)}\r\n />\r\n </PaginationItem>\r\n </PaginationContent>\r\n </Pagination>\r\n );\r\n};\r\n\r\nexport default PaginationWrapper;\r\n","import type { Table } from '@tanstack/react-table';\r\nimport PaginationWrapper from '../PaginationWrapper';\r\n\r\ninterface DataTablePaginationProp<TData> {\r\n pagination: {\r\n pageIndex: number;\r\n pageSize: number;\r\n };\r\n totalCount: number;\r\n table: Table<TData>;\r\n}\r\n\r\nconst DataTablePagination = <TData,>({\r\n pagination,\r\n totalCount,\r\n table,\r\n}: DataTablePaginationProp<TData>) => {\r\n return (\r\n <div className=\"flex items-center justify-end space-x-2 pt-4\">\r\n <PaginationWrapper\r\n totalCount={totalCount}\r\n activePage={pagination.pageIndex}\r\n onPageChange={(pageNo: number) => {\r\n table.setPageIndex(pageNo);\r\n }}\r\n pageSize={pagination.pageSize}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default DataTablePagination;\r\n","import * as React from 'react';\r\nimport {\r\n type ColumnDef,\r\n type ColumnFiltersState,\r\n flexRender,\r\n getCoreRowModel,\r\n getFilteredRowModel,\r\n getPaginationRowModel,\r\n getSortedRowModel,\r\n type SortingState,\r\n useReactTable,\r\n type VisibilityState,\r\n} from '@tanstack/react-table';\r\nimport { ArrowUpDown, Check, MoreHorizontal, X } from 'lucide-react';\r\n\r\nimport { Button } from '@/components/ui/button';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuTrigger,\r\n} from '@/components/ui/dropdown-menu';\r\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';\r\nimport DataTableToolbar, { type DataTableToolbarProp } from './DataTableToolbar';\r\nimport DataTablePagination from './DataTablePagination';\r\nimport { formatISODateWithTime24H, isFunction } from '@/lib/utils';\r\nimport LoadingMask from '../LoadingMask';\r\nimport FlexColsLayout from '../Layouts/FlexColsLayout';\r\n\r\nexport interface columnProp {\r\n id: string;\r\n headerText: string;\r\n enableSorting: boolean;\r\n enableHiding: boolean;\r\n type?: 'boolean' | 'date' | 'string';\r\n editable?: boolean;\r\n renderer?: (record: unknown, cellValue: unknown) => unknown;\r\n}\r\n\r\ninterface ActionProp<TData> {\r\n id: string;\r\n headerText: string;\r\n onClick?: (record: TData) => void;\r\n}\r\n\r\ninterface DataTableProps<TData> {\r\n data: TData[];\r\n columns: columnProp[];\r\n actions?: ActionProp<TData>[];\r\n toolbarConfig?: DataTableToolbarProp;\r\n loading?: boolean;\r\n canShowToolbar?: boolean;\r\n canShowPagination?: boolean;\r\n}\r\n\r\nfunction DataTable<TData extends object>({\r\n data,\r\n columns,\r\n actions,\r\n toolbarConfig,\r\n loading = false,\r\n canShowToolbar = true,\r\n canShowPagination = true,\r\n}: DataTableProps<TData>) {\r\n const [sorting, setSorting] = React.useState<SortingState>([]);\r\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>([]);\r\n const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({});\r\n const [rowSelection, setRowSelection] = React.useState({});\r\n\r\n const tableColumns: ColumnDef<TData>[] = columns.map((columnRec) => {\r\n return {\r\n accessorKey: columnRec.id,\r\n header: ({ column }) => {\r\n if (!columnRec.enableSorting) {\r\n return <span>{columnRec.headerText}</span>;\r\n }\r\n\r\n return (\r\n <Button variant=\"ghost\" onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}>\r\n {columnRec.headerText}\r\n <ArrowUpDown />\r\n </Button>\r\n );\r\n },\r\n cell: ({ row }) => {\r\n const cellValue = row.getValue(columnRec.id);\r\n\r\n if (isFunction(columnRec.renderer)) {\r\n return columnRec.renderer(row, cellValue);\r\n }\r\n\r\n let result;\r\n\r\n if (columnRec.type === 'boolean') {\r\n result = cellValue ? <Check size={20} /> : <X size={18} />;\r\n } else if (columnRec.type === 'date') {\r\n result = formatISODateWithTime24H(cellValue as string);\r\n } else {\r\n result = String(cellValue);\r\n }\r\n\r\n return <div>{result}</div>;\r\n },\r\n };\r\n });\r\n\r\n if (actions && actions.length > 0) {\r\n tableColumns.unshift({\r\n id: 'actions',\r\n enableHiding: false,\r\n cell: ({ row }) => {\r\n const record = row.original;\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"secondary\" className=\"h-5 w-8 p-0\">\r\n <span className=\"sr-only\">Open menu</span>\r\n <MoreHorizontal />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"start\">\r\n <DropdownMenuLabel>Actions</DropdownMenuLabel>\r\n\r\n {actions.map((menuAction) =>\r\n menuAction.headerText === 'SEPARATOR' ? (\r\n <DropdownMenuSeparator key={menuAction.id} />\r\n ) : (\r\n <DropdownMenuItem key={menuAction.id} onClick={() => menuAction.onClick && menuAction.onClick(record)}>\r\n {menuAction.headerText}\r\n </DropdownMenuItem>\r\n ),\r\n )}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n },\r\n });\r\n }\r\n\r\n const [pagination, setPagination] = React.useState({\r\n pageIndex: 0,\r\n pageSize: 100,\r\n });\r\n\r\n const table = useReactTable({\r\n data,\r\n columns: tableColumns,\r\n onSortingChange: setSorting,\r\n onColumnFiltersChange: setColumnFilters,\r\n getCoreRowModel: getCoreRowModel(),\r\n getSortedRowModel: getSortedRowModel(),\r\n getFilteredRowModel: getFilteredRowModel(),\r\n onColumnVisibilityChange: setColumnVisibility,\r\n onRowSelectionChange: setRowSelection,\r\n ...(canShowPagination && {\r\n getPaginationRowModel: getPaginationRowModel(),\r\n onPaginationChange: setPagination,\r\n }),\r\n state: {\r\n sorting,\r\n columnFilters,\r\n columnVisibility,\r\n rowSelection,\r\n pagination,\r\n },\r\n });\r\n\r\n const loadingCls = loading ? 'pointer-events-none opacity-50' : '';\r\n return (\r\n <FlexColsLayout className=\"w-full\">\r\n {canShowToolbar && (\r\n <DataTableToolbar\r\n table={table}\r\n rawColumns={columns}\r\n canShowSearchField={true}\r\n canShowColumnsBtn={true}\r\n {...toolbarConfig}\r\n additionalJSX={toolbarConfig?.additionalJSX || []}\r\n />\r\n )}\r\n {loading && <LoadingMask />}\r\n <FlexColsLayout className={`rounded-md border overflow-auto ${loadingCls}`}>\r\n <Table>\r\n <TableHeader className=\"sticky top-0 bg-sidebar\">\r\n {table.getHeaderGroups().map((headerGroup) => (\r\n <TableRow key={headerGroup.id}>\r\n {headerGroup.headers.map((header) => {\r\n return (\r\n <TableHead key={header.id}>\r\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\r\n </TableHead>\r\n );\r\n })}\r\n </TableRow>\r\n ))}\r\n </TableHeader>\r\n <TableBody className=\"flex-1\">\r\n {table.getRowModel().rows?.length ? (\r\n table.getRowModel().rows.map((row) => (\r\n <TableRow key={row.id} data-state={row.getIsSelected() && 'selected'}>\r\n {row.getVisibleCells().map((cell) => (\r\n <TableCell key={cell.id}>{flexRender(cell.column.columnDef.cell, cell.getContext())}</TableCell>\r\n ))}\r\n </TableRow>\r\n ))\r\n ) : (\r\n <TableRow>\r\n <TableCell colSpan={actions && actions.length > 0 ? columns.length + 1 : columns.length} className=\"h-24 text-center\">\r\n No results.\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </FlexColsLayout>\r\n {canShowPagination && <DataTablePagination pagination={pagination} totalCount={data.length} table={table} />}\r\n </FlexColsLayout>\r\n );\r\n}\r\n\r\nexport default React.memo(DataTable);\r\n","import { mapIncrementBy2 } from '@/lib/utils';\r\nimport type { JSX } from 'react';\r\n\r\ninterface ITabularLayout {\r\n child: JSX.Element[];\r\n className?: string;\r\n rowCls?: string;\r\n leftCls?: string;\r\n rightCls?: string;\r\n}\r\n\r\nconst TabularLayout = ({ child, className, rowCls, leftCls, rightCls }: ITabularLayout) => {\r\n return (\r\n <div className={`w-full ${className || ''}`}>\r\n {mapIncrementBy2(child, (firstEl, secondEl, index) => (\r\n <div key={index + 'tabularLayout'} className={`flex w-full ${rowCls || ''}`}>\r\n <div className={`flex-shrink-0 ${leftCls || ''}`}>{firstEl}</div>\r\n <div className={`flex-1 min-w-0 ${rightCls || ''}`}>{secondEl}</div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nexport default TabularLayout;\r\n","import type { HTMLAttributes } from 'react';\r\n\r\ninterface ITypographyHeading extends HTMLAttributes<HTMLHeadElement> {\r\n className?: string;\r\n}\r\n\r\nexport function TypographyHeading({ className, ...props }: ITypographyHeading) {\r\n return <h4 className={`scroll-m-20 text-xl font-semibold tracking-tight ${className || ''}`} {...props} />;\r\n}\r\n","export function TypographyP({ ...props }) {\r\n return <p className=\"leading-7 [&:not(:first-child)]:mt-6\" {...props} />;\r\n}\r\n","import * as React from \"react\"\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Accordion({\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"border-b last:border-b-0\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm\"\n {...props}\n >\n <div className={cn(\"pt-0 pb-4\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n","import type React from 'react';\r\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '../ui/accordion';\r\n\r\ninterface IAccordionWrapperProps {\r\n title: React.ReactNode | string;\r\n children: React.ReactNode | string;\r\n}\r\n\r\nconst AccordionWrapper = ({ title, children }: IAccordionWrapperProps) => {\r\n return (\r\n <Accordion type=\"single\" collapsible>\r\n <AccordionItem value=\"item-1\">\r\n <AccordionTrigger>{title}</AccordionTrigger>\r\n <AccordionContent>{children}</AccordionContent>\r\n </AccordionItem>\r\n </Accordion>\r\n );\r\n};\r\n\r\nexport default AccordionWrapper;\r\n","import { NavLink, type NavLinkProps } from 'react-router';\r\n\r\ninterface ILinkWrapper {\r\n className?: string;\r\n disabled?: boolean;\r\n removeAllStyles?: boolean;\r\n}\r\n\r\nconst LocalEmptySpan = ({ ...props }) => <span {...props} />;\r\n\r\nconst LinkWrapper = ({ className, disabled, removeAllStyles = false, ...props }: ILinkWrapper & NavLinkProps) => {\r\n const CustomComponent = disabled ? LocalEmptySpan : NavLink;\r\n\r\n const systemCls = disabled ? 'opacity-40 cursor-not-allowed' : 'cursor-pointer hover:underline';\r\n\r\n return <CustomComponent className={(className || '') + ' ' + (removeAllStyles ? '' : systemCls)} {...props} />;\r\n};\r\n\r\nexport default LinkWrapper;\r\n","import LinkWrapper from './LinkWrapper';\r\n\r\ninterface BigSquareProps {\r\n children: React.ReactNode;\r\n toPath: string;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\nconst BigSquare = ({ children, toPath, disabled, className, ...props }: BigSquareProps) => {\r\n return (\r\n <LinkWrapper\r\n to={toPath}\r\n disabled={disabled}\r\n className={\r\n 'h-40 p-5 w-60 border-2 border-primary rounded-4xl font-semibold flex flex-col justify-center hover:bg-accent ' +\r\n className\r\n }\r\n {...props}\r\n >\r\n {children}\r\n </LinkWrapper>\r\n );\r\n};\r\n\r\nexport default BigSquare;\r\n","import type { JSX } from 'react';\r\n\r\ninterface HeaderTextProps {\r\n children: string | JSX.Element;\r\n}\r\n\r\nconst HeaderText = ({ children }: HeaderTextProps) => {\r\n return <h3 className=\"text-lg font-medium\">{children}</h3>;\r\n};\r\n\r\nexport default HeaderText;\r\n","import { Button } from '@/components/ui/button';\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\r\nimport { InfoIcon } from 'lucide-react';\r\nimport type { ReactNode } from 'react';\r\n\r\ninterface InfoButtonProps {\r\n children: ReactNode;\r\n side: 'right' | 'left' | 'top' | 'bottom';\r\n}\r\n\r\nconst InfoButton = ({ children, side }: InfoButtonProps) => {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <span className=\"ml-2 align-middle cursor-pointer\">\r\n <Button variant={'link'} className=\"-ml-5\" type=\"button\" tabIndex={-1}>\r\n <InfoIcon />\r\n </Button>\r\n </span>\r\n </TooltipTrigger>\r\n <TooltipContent side={side}>{children}</TooltipContent>\r\n </Tooltip>\r\n );\r\n};\r\n\r\nexport default InfoButton;\r\n","import type { JSX } from 'react';\r\nimport { Label } from '../ui/label';\r\n\r\ninterface ListPanelInf {\r\n title: string;\r\n description: string;\r\n control?: JSX.Element;\r\n labelCls?: string;\r\n className?: string;\r\n}\r\n\r\nconst ListPanel = ({ title, description, control, labelCls = '', className = '' }: ListPanelInf) => {\r\n return (\r\n <div className={`flex flex-row items-center justify-between rounded-lg border p-4 shadow-sm ${className}`}>\r\n <div className=\"flex-1 space-y-2\">\r\n <Label className={`cursor-pointer ${labelCls}`}>{title}</Label>\r\n <Label className={`font-normal text-gray-500 cursor-pointer ${labelCls}`}>{description}</Label>\r\n </div>\r\n <div>{control}</div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default ListPanel;\r\n","import { Crown } from 'lucide-react';\r\n\r\ninterface IPremiumHighlighter {\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst PremiumHighlighter = ({ children }: IPremiumHighlighter) => {\r\n return (\r\n <span\r\n className={`premium-icon-wrapper relative inline-flex items-center ${\r\n children ? 'gap-1' : ''\r\n } px-1.5 py-1.5 rounded-lg bg-gradient-to-br from-amber-400 via-amber-500 to-amber-600 bg-[length:200%_200%] text-xs font-semibold text-white transition-all duration-300 ease-in-out overflow-hidden hover:scale-105 hover:shadow-[0_0_20px_rgba(251,191,36,0.6),0_0_40px_rgba(251,191,36,0.3)] dark:from-amber-900 dark:via-amber-700 dark:to-amber-600 dark:bg-[length:200%_200%]`}\r\n >\r\n <Crown size={14} className=\"premium-crown relative z-10 flex-shrink-0 drop-shadow-[0_2px_4px_rgba(0,0,0,0.2)] text-white\" strokeWidth={2.5} />\r\n <span className=\"relative z-10\">{children}</span>\r\n </span>\r\n );\r\n};\r\n\r\nexport default PremiumHighlighter;\r\n","import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\r\n\r\n// interface IItem {\r\n// value: string;\r\n// label: string;\r\n// }\r\n\r\ninterface ISelectListWrapper {\r\n placeholder?: string;\r\n value?: string;\r\n onValueChange?: (value: string) => void;\r\n triggerClassName?: string;\r\n valueField?: string;\r\n labelField?: string;\r\n items: Record<string, unknown>[];\r\n id?: string;\r\n}\r\n\r\nconst SelectListWrapper = ({\r\n placeholder,\r\n items,\r\n value,\r\n onValueChange,\r\n triggerClassName = 'w-[180px]',\r\n valueField = 'value',\r\n labelField = 'label',\r\n id,\r\n ...props\r\n}: ISelectListWrapper) => {\r\n return (\r\n <Select\r\n value={value}\r\n onValueChange={(newValue: string) => {\r\n onValueChange?.(newValue);\r\n }}\r\n >\r\n <SelectTrigger className={triggerClassName} {...props} id={id}>\r\n <SelectValue placeholder={placeholder} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {items.map((item) => (\r\n <SelectItem key={item[valueField] as string} value={item[valueField] as string}>\r\n {item[labelField] as string | React.ReactNode}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n );\r\n};\r\n\r\nexport default SelectListWrapper;\r\n","import { useRef, useState } from 'react';\r\nimport { TooltipContent, TooltipTrigger, Tooltip } from '../ui/tooltip';\r\n\r\nexport interface ITooltipProps {\r\n children: React.ReactNode;\r\n content: React.ReactNode;\r\n side?: 'top' | 'right' | 'bottom' | 'left';\r\n triggerOn?: 'default' | 'click';\r\n delayDuration?: number;\r\n canShowTooltip?: boolean;\r\n contentProps?: React.ComponentProps<typeof TooltipContent>;\r\n rootProps?: React.ComponentProps<typeof Tooltip>;\r\n triggerProps?: React.ComponentProps<typeof TooltipTrigger>;\r\n}\r\n\r\nexport const TooltipWrapper = ({\r\n content,\r\n side = 'bottom',\r\n rootProps,\r\n contentProps,\r\n triggerProps,\r\n children,\r\n canShowTooltip = true,\r\n delayDuration = 100,\r\n triggerOn = 'default',\r\n}: ITooltipProps) => {\r\n // If canShowTooltip is true AND triggerOn is \"default\", then ShadCN will manage the state internally (undefined).\r\n // Otherwise, we manage the open state manually.\r\n const [open, setOpen] = useState<boolean | undefined>(() => {\r\n if (triggerOn === 'default') {\r\n return canShowTooltip ? undefined : false;\r\n }\r\n return false;\r\n });\r\n\r\n const triggerComponentRef = useRef<HTMLButtonElement | null>(null);\r\n\r\n const isTooltipTriggerClicked = (event?: Event) => {\r\n const target = event?.target as HTMLElement;\r\n\r\n return target && triggerComponentRef.current && triggerComponentRef.current?.contains(target);\r\n };\r\n\r\n const closeTooltip = (event?: Event) => {\r\n if (triggerOn !== 'click') return;\r\n\r\n // Prevent closing if the click is on the trigger itself\r\n // The trigger's onClick will handle the toggle\r\n if (isTooltipTriggerClicked(event)) return;\r\n\r\n setOpen(false);\r\n };\r\n\r\n return (\r\n <Tooltip open={open} delayDuration={delayDuration} {...rootProps}>\r\n <TooltipTrigger\r\n data-testid=\"tooltip-trigger\"\r\n asChild\r\n ref={triggerComponentRef}\r\n onClick={() => {\r\n if (triggerOn === 'click') {\r\n setOpen(canShowTooltip && !open);\r\n }\r\n }}\r\n {...triggerProps}\r\n >\r\n {children}\r\n </TooltipTrigger>\r\n <TooltipContent side={side} data-testid=\"tooltip-content\" onPointerDownOutside={closeTooltip} onEscapeKeyDown={closeTooltip} {...contentProps}>\r\n {content}\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useEditor, EditorContent, BubbleMenu, FloatingMenu, mergeAttributes } from '@tiptap/react';\r\nimport StarterKit from '@tiptap/starter-kit';\r\nimport Underline from '@tiptap/extension-underline';\r\nimport Link from '@tiptap/extension-link';\r\nimport Placeholder from '@tiptap/extension-placeholder';\r\nimport BubbleMenuExtension from '@tiptap/extension-bubble-menu';\r\nimport FloatingMenuExtension from '@tiptap/extension-floating-menu';\r\nimport {\r\n Bold,\r\n Italic,\r\n Underline as UnderlineIcon,\r\n List,\r\n Sparkles,\r\n Heading1,\r\n Heading2,\r\n Quote,\r\n ListOrdered,\r\n Link as LinkIcon,\r\n Check,\r\n X,\r\n} from 'lucide-react';\r\nimport { Button, Separator, Input } from '../ui';\r\nimport { cn } from '@/lib/utils';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\n\r\nconst isUrl = (text: string) => {\r\n try {\r\n const url = new URL(text);\r\n return url.protocol === 'http:' || url.protocol === 'https:';\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\nexport interface RichTextEditorProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n onAICall?: (selectedText: string, fullText: string) => void;\r\n placeholder?: string;\r\n className?: string;\r\n minHeight?: string | number;\r\n id?: string;\r\n enableSlashMenu?: boolean;\r\n canShowAIOptions?: boolean;\r\n classNameEditor?: string;\r\n readingMode?: boolean;\r\n}\r\n\r\nexport const RichTextEditor: React.FC<RichTextEditorProps> = ({\r\n value,\r\n onChange,\r\n onAICall,\r\n placeholder = 'Type / for commands or start writing...',\r\n className: classNameRoot = '',\r\n classNameEditor = '',\r\n minHeight = 'unset',\r\n id = '',\r\n enableSlashMenu = false,\r\n canShowAIOptions = false,\r\n readingMode = false,\r\n}) => {\r\n const fetchAndUpdateLinkMetadata = (url: string) => {\r\n if (!editor) return;\r\n\r\n // Generate a unique marker to find this specific link in the editor\r\n const markerId = `link-${Math.random().toString(36).slice(2, 9)}`;\r\n\r\n // Show only the URL text during loading (no icons)\r\n editor.chain().focus().insertContent(`<a href=\"${url}\" data-marker=\"${markerId}\">${url}</a>`).run();\r\n\r\n // Fetch metadata\r\n getAxiosInstance()\r\n .get(`/link-metadata?url=${encodeURIComponent(url)}`)\r\n .then((res: any) => {\r\n if (!res) return;\r\n const { title, image = `https://www.google.com/s2/favicons?domain=${url}`, description } = res;\r\n const finalTitle = title || url;\r\n\r\n // Find the node by marker in the document structure\r\n let foundPos = -1;\r\n let nodeSize = 0;\r\n\r\n editor.state.doc.descendants((node, pos) => {\r\n if (node.isText) {\r\n const mark = node.marks.find((m) => m.type.name === 'link' && m.attrs['data-marker'] === markerId);\r\n if (mark) {\r\n foundPos = pos;\r\n nodeSize = node.nodeSize;\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n\r\n if (foundPos !== -1) {\r\n editor\r\n .chain()\r\n .deleteRange({ from: foundPos, to: foundPos + nodeSize })\r\n .insertContent(`<a href=\"${url}\" data-image=\"${image || ''}\" data-description=\"${description || ''}\">${finalTitle}</a>`)\r\n .run();\r\n }\r\n })\r\n .catch(() => {\r\n // Fallback: remove marker but keep URL text\r\n editor.state.doc.descendants((node, pos) => {\r\n if (node.isText) {\r\n const mark = node.marks.find((m) => m.type.name === 'link' && m.attrs['data-marker'] === markerId);\r\n if (mark) {\r\n editor\r\n .chain()\r\n .deleteRange({ from: pos, to: pos + node.nodeSize })\r\n .insertContent(`<a href=\"${url}\">${url}</a>`)\r\n .run();\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n });\r\n };\r\n\r\n const editor = useEditor({\r\n editable: !readingMode,\r\n extensions: [\r\n StarterKit.configure({\r\n heading: {\r\n levels: [1, 2, 3],\r\n },\r\n }),\r\n Underline,\r\n Link.extend({\r\n inclusive: false,\r\n addAttributes() {\r\n return {\r\n ...this.parent?.(),\r\n 'data-marker': {\r\n default: null,\r\n parseHTML: (element) => element.getAttribute('data-marker'),\r\n renderHTML: (attributes) => {\r\n if (!attributes['data-marker']) return {};\r\n return { 'data-marker': attributes['data-marker'] };\r\n },\r\n },\r\n 'data-image': {\r\n default: null,\r\n parseHTML: (element) => element.getAttribute('data-image'),\r\n renderHTML: (attributes) => {\r\n if (!attributes['data-image']) return {};\r\n return { 'data-image': attributes['data-image'] };\r\n },\r\n },\r\n 'data-description': {\r\n default: null,\r\n parseHTML: (element) => element.getAttribute('data-description'),\r\n renderHTML: (attributes) => {\r\n if (!attributes['data-description']) return {};\r\n return { 'data-description': attributes['data-description'] };\r\n },\r\n },\r\n style: {\r\n default: null,\r\n parseHTML: (element) => element.getAttribute('style'),\r\n renderHTML: (attributes) => {\r\n if (!attributes.style) return {};\r\n return { style: attributes.style };\r\n },\r\n },\r\n };\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n const { 'data-image': dataImage, 'data-description': dataDescription, ...rest } = HTMLAttributes;\r\n const mergedAttrs = mergeAttributes(this.options.HTMLAttributes, rest, {\r\n 'data-image': dataImage,\r\n 'data-description': dataDescription,\r\n title: dataDescription || '', // Add description as title attribute for tooltip\r\n });\r\n\r\n if (dataImage) {\r\n return [\r\n 'a',\r\n mergedAttrs,\r\n [\r\n 'img',\r\n {\r\n src: dataImage,\r\n width: '16',\r\n height: '16',\r\n },\r\n ],\r\n ['span', 0],\r\n ];\r\n }\r\n return ['a', mergedAttrs, 0];\r\n },\r\n }).configure({\r\n openOnClick: false,\r\n autolink: true,\r\n HTMLAttributes: {},\r\n }),\r\n Placeholder.configure({\r\n placeholder,\r\n emptyEditorClass: 'is-editor-empty',\r\n }),\r\n ...(enableSlashMenu ? [BubbleMenuExtension] : []),\r\n FloatingMenuExtension,\r\n ],\r\n content: value,\r\n onUpdate: ({ editor }) => {\r\n onChange(editor.getHTML());\r\n },\r\n editorProps: {\r\n attributes: {\r\n class: cn('prose dark:prose-invert max-w-none focus:outline-none min-h-full', 'selection:bg-primary/30'),\r\n id,\r\n },\r\n handlePaste: (_, event) => {\r\n const text = event.clipboardData?.getData('text/plain');\r\n if (text && isUrl(text)) {\r\n fetchAndUpdateLinkMetadata(text);\r\n return true;\r\n }\r\n return false;\r\n },\r\n },\r\n });\r\n\r\n // Keep editor content in sync with external value\r\n useEffect(() => {\r\n if (editor && value !== editor.getHTML()) {\r\n editor.commands.setContent(value);\r\n }\r\n }, [value, editor]);\r\n\r\n // Update editable state when readingMode changes\r\n useEffect(() => {\r\n if (editor) {\r\n editor.setEditable(!readingMode);\r\n }\r\n }, [editor, readingMode]);\r\n\r\n if (!editor) {\r\n return null;\r\n }\r\n\r\n const [isLinkEditorOpen, setIsLinkEditorOpen] = React.useState(false);\r\n const [linkInput, setLinkInput] = React.useState('');\r\n\r\n const handleAIAction = () => {\r\n const { from, to } = editor.state.selection;\r\n const selectedText = editor.state.doc.textBetween(from, to, ' ');\r\n const fullText = editor.getText();\r\n if (onAICall) {\r\n onAICall(selectedText, fullText);\r\n }\r\n };\r\n\r\n const setLink = () => {\r\n // If empty input, remove link\r\n if (linkInput === '') {\r\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\r\n } else {\r\n // Add https:// if missing and not a relative/local link\r\n let url = linkInput;\r\n if (!/^https?:\\/\\//i.test(url) && !url.startsWith('/') && !url.startsWith('#')) {\r\n url = 'https://' + url;\r\n }\r\n\r\n const { empty } = editor.state.selection;\r\n\r\n if (empty) {\r\n fetchAndUpdateLinkMetadata(url);\r\n } else {\r\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\r\n }\r\n }\r\n setIsLinkEditorOpen(false);\r\n setLinkInput('');\r\n };\r\n\r\n const handleLinkClick = () => {\r\n const previousUrl = editor.getAttributes('link').href;\r\n setLinkInput(previousUrl || '');\r\n setIsLinkEditorOpen(true);\r\n };\r\n\r\n // Handle Ctrl+K\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'k') {\r\n if (readingMode) return;\r\n e.preventDefault();\r\n handleLinkClick();\r\n }\r\n };\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => window.removeEventListener('keydown', handleKeyDown);\r\n }, [editor]);\r\n\r\n const getMenuButtonClass = (active: boolean) =>\r\n cn(\r\n 'h-8 w-8 p-0 transition-all duration-200',\r\n active ? 'bg-primary text-primary-foreground hover:bg-primary/90' : 'hover:bg-accent hover:text-accent-foreground',\r\n );\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'group relative w-full border rounded-md bg-transparent dark:bg-input/30 transition-[color,box-shadow] outline-none shadow-xs',\r\n 'border-input focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px] text-sm',\r\n classNameRoot,\r\n )}\r\n style={{ minHeight }}\r\n >\r\n {/* Scrollable Content Area */}\r\n <div\r\n className={cn('px-3 py-2 h-full', readingMode ? 'cursor-default' : 'cursor-text', classNameEditor)}\r\n onClick={() => !readingMode && editor.chain().focus().run()}\r\n >\r\n {/* Selection Toolbar (Bubble Menu) */}\r\n {!readingMode && (\r\n <BubbleMenu\r\n editor={editor}\r\n tippyOptions={{\r\n duration: 150,\r\n animation: 'shift-away',\r\n onHidden: () => setIsLinkEditorOpen(false),\r\n }}\r\n className=\"flex items-center gap-0.5 bg-popover/90 backdrop-blur-md border border-border rounded-lg shadow-xl p-1 overflow-hidden animate-in fade-in zoom-in duration-200\"\r\n >\r\n {isLinkEditorOpen ? (\r\n <div className=\"flex items-center gap-1 px-1\" onClick={(e) => e.stopPropagation()}>\r\n <Input\r\n type=\"text\"\r\n value={linkInput}\r\n onChange={(e) => setLinkInput(e.target.value)}\r\n placeholder=\"Paste or type a link...\"\r\n className=\"h-7 w-48 text-xs border-none focus-visible:ring-0 bg-transparent\"\r\n autoFocus\r\n onKeyDown={(e) => {\r\n e.stopPropagation();\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n setLink();\r\n }\r\n if (e.key === 'Escape') {\r\n setIsLinkEditorOpen(false);\r\n }\r\n }}\r\n />\r\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={setLink} className=\"h-7 w-7 p-0\">\r\n <Check className=\"h-3.5 w-3.5\" />\r\n </Button>\r\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setIsLinkEditorOpen(false)} className=\"h-7 w-7 p-0\">\r\n <X className=\"h-3.5 w-3.5\" />\r\n </Button>\r\n </div>\r\n ) : (\r\n <>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => editor.chain().focus().toggleBold().run()}\r\n className={getMenuButtonClass(editor.isActive('bold'))}\r\n >\r\n <Bold className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => editor.chain().focus().toggleItalic().run()}\r\n className={getMenuButtonClass(editor.isActive('italic'))}\r\n >\r\n <Italic className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => editor.chain().focus().toggleUnderline().run()}\r\n className={getMenuButtonClass(editor.isActive('underline'))}\r\n >\r\n <UnderlineIcon className=\"h-4 w-4\" />\r\n </Button>\r\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={handleLinkClick} className={getMenuButtonClass(editor.isActive('link'))}>\r\n <LinkIcon className=\"h-4 w-4\" />\r\n </Button>\r\n <Separator orientation=\"vertical\" className=\"h-4 mx-1\" />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => editor.chain().focus().toggleBulletList().run()}\r\n className={getMenuButtonClass(editor.isActive('bulletList'))}\r\n >\r\n <List className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .toggleBlockquote()\r\n .run();\r\n }}\r\n className={getMenuButtonClass(editor.isActive('blockquote'))}\r\n >\r\n <Quote className=\"h-4 w-4\" />\r\n </Button>\r\n {canShowAIOptions && (\r\n <>\r\n <Separator orientation=\"vertical\" className=\"h-4 mx-1\" />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleAIAction}\r\n className=\"h-8 px-2 flex items-center gap-1.5 text-primary hover:bg-primary/10 transition-colors\"\r\n >\r\n <Sparkles className=\"h-4 w-4 fill-primary/20 animate-pulse\" />\r\n <span className=\"text-xs font-semibold\">AI Edit</span>\r\n </Button>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </BubbleMenu>\r\n )}\r\n\r\n {/* Slash Command / Floating Menu */}\r\n {enableSlashMenu && !readingMode && (\r\n <FloatingMenu\r\n editor={editor}\r\n tippyOptions={{\r\n duration: 150,\r\n placement: 'bottom-start',\r\n offset: [0, 8],\r\n }}\r\n shouldShow={({ state }: { state: any }) => {\r\n const { selection } = state;\r\n const { $from } = selection;\r\n\r\n // Show only if line is empty OR only contains '/'\r\n const currentLine = $from.nodeBefore?.text || '';\r\n const isAtLineStart = $from.parentOffset === 1 && currentLine === '/';\r\n\r\n return isAtLineStart;\r\n }}\r\n className=\"flex flex-col min-w-[180px] bg-popover border border-border rounded-lg shadow-2xl p-1.5 animate-in slide-in-from-top-2 duration-200 z-50\"\r\n >\r\n <div className=\"px-2 py-1.5 text-[10px] font-bold text-muted-foreground uppercase tracking-wider\">Quick Actions</div>\r\n\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .toggleHeading({ level: 1 })\r\n .run();\r\n }}\r\n icon={<Heading1 className=\"h-4 w-4\" />}\r\n label=\"Heading 1\"\r\n shortcut=\"H1\"\r\n />\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .toggleHeading({ level: 2 })\r\n .run();\r\n }}\r\n icon={<Heading2 className=\"h-4 w-4\" />}\r\n label=\"Heading 2\"\r\n shortcut=\"H2\"\r\n />\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .toggleBulletList()\r\n .run();\r\n }}\r\n icon={<List className=\"h-4 w-4\" />}\r\n label=\"Bullet List\"\r\n shortcut=\"-\"\r\n />\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .toggleOrderedList()\r\n .run();\r\n }}\r\n icon={<ListOrdered className=\"h-4 w-4\" />}\r\n label=\"Ordered List\"\r\n shortcut=\"1.\"\r\n />\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .toggleBlockquote()\r\n .run();\r\n }}\r\n icon={<Quote className=\"h-4 w-4\" />}\r\n label=\"Quote\"\r\n shortcut=\">\"\r\n />\r\n\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .run();\r\n handleLinkClick();\r\n }}\r\n icon={<LinkIcon className=\"h-4 w-4\" />}\r\n label=\"Hyperlink\"\r\n shortcut=\"K\"\r\n />\r\n\r\n <Separator className=\"my-1\" />\r\n\r\n {canShowAIOptions && (\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .run();\r\n handleAIAction();\r\n }}\r\n icon={<Sparkles className=\"h-4 w-4 text-primary\" />}\r\n label=\"AI Assistant\"\r\n className=\"text-primary hover:bg-primary/10\"\r\n />\r\n )}\r\n </FloatingMenu>\r\n )}\r\n\r\n <EditorContent editor={editor} />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\ninterface SlashMenuItemProps {\r\n onClick: () => void;\r\n icon: React.ReactNode;\r\n label: string;\r\n shortcut?: string;\r\n className?: string;\r\n}\r\n\r\nconst SlashMenuItem: React.FC<SlashMenuItemProps> = ({ onClick, icon, label, shortcut, className }) => (\r\n <button\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onClick();\r\n }}\r\n className={cn(\r\n 'flex items-center justify-between w-full px-2 py-1.5 text-sm rounded-md transition-colors',\r\n 'hover:bg-accent hover:text-accent-foreground text-left',\r\n className,\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"flex items-center justify-center w-6 h-6 rounded-md bg-muted/50\">{icon}</div>\r\n <span>{label}</span>\r\n </div>\r\n {shortcut && <span className=\"text-[10px] text-muted-foreground bg-muted px-1.5 py-0.5 rounded uppercase font-medium\">{shortcut}</span>}\r\n </button>\r\n);\r\n\r\nexport default RichTextEditor;\r\n","import { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { useEffect, useState } from 'react';\r\n\r\nconst useFetchData = <T>(url: string) => {\r\n const [response, setResponse] = useState<T | null>(null);\r\n const [loading, setLoading] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n setLoading(true);\r\n\r\n try {\r\n const lResponse = await getAxiosInstance().get(url);\r\n setResponse(lResponse as unknown as T);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n fetchData();\r\n }, [url]);\r\n\r\n return { loading, response };\r\n};\r\n\r\nexport default useFetchData;\r\n","import { Outlet } from 'react-router';\r\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\r\nimport { cn } from '@/lib/utils';\r\nimport { appInfo } from '../../../../config/app-config';\r\n\r\nexport default function Auth() {\r\n return (\r\n <div className=\"bg-muted flex min-h-svh flex-col items-center justify-center gap-6 p-6 md:p-10\">\r\n <div className=\"flex w-full max-w-sm flex-col gap-6\">\r\n <span className=\"flex items-center gap-2 self-center font-medium\">\r\n <div className=\"bg-primary text-primary-foreground flex size-6 items-center justify-center rounded-md\">\r\n <appInfo.logo className=\"size-4\" />\r\n </div>\r\n {appInfo.appName}\r\n </span>\r\n <div className={cn('flex flex-col gap-6')}>\r\n <Card>\r\n <CardHeader className=\"text-center\">\r\n <CardTitle className=\"text-xl\">Welcome</CardTitle>\r\n <CardDescription>Please fill the below details to continue</CardDescription>\r\n </CardHeader>\r\n <CardContent>\r\n <Outlet />\r\n </CardContent>\r\n </Card>\r\n <div className=\"text-muted-foreground *:[a]:hover:text-primary text-center text-xs text-balance *:[a]:underline *:[a]:underline-offset-4\">\r\n By clicking continue, you agree to our <a>Terms of Service</a> and <a>Privacy Policy</a>.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Label } from '@/components/ui/label';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showErrorToast, showSuccessToast } from '@/lib/toast-helper';\r\nimport type { LoginCmd } from '@/lib/types';\r\nimport { errorLogger, getFormDataByFormEl, isEmailValid, setLocalStorage } from '@/lib/utils';\r\nimport { useEffect, useRef, useState, useTransition } from 'react';\r\nimport { NavLink, useLocation, useNavigate } from 'react-router';\r\nimport { Turnstile, type TurnstileInstance } from '@marsidev/react-turnstile';\r\nimport { appInfo } from '@/config/app-config';\r\n\r\nexport default function LoginForm() {\r\n const emailField = useRef<HTMLInputElement>(null);\r\n const navigate = useNavigate();\r\n const [isPending, startTransition] = useTransition();\r\n const location = useLocation();\r\n const [turnstileToken, setTurnstileToken] = useState<string>('');\r\n const turnstileRef = useRef<TurnstileInstance>(null);\r\n\r\n const from = location.state?.from;\r\n const navigateTo = from ? `${from.pathname}${from.search}${from.hash}` : '/';\r\n const gridCls = 'grid gap-1';\r\n\r\n useEffect(() => {\r\n emailField?.current?.focus();\r\n }, []);\r\n\r\n const handleOnSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n\r\n if (!turnstileToken) {\r\n showErrorToast({\r\n header: 'Captcha not completed',\r\n description: 'Please complete the captcha to proceed.',\r\n });\r\n return;\r\n }\r\n\r\n const data = getFormDataByFormEl(event.currentTarget);\r\n\r\n const reqObj = {\r\n username: data.email,\r\n password: data.password,\r\n turnstileToken,\r\n };\r\n\r\n if (isEmailValid(reqObj.username as string) === false) {\r\n showErrorToast({\r\n header: 'Email is not valid.',\r\n description: 'Kindly recheck the email and try again.',\r\n });\r\n return;\r\n }\r\n\r\n startTransition(async () => {\r\n try {\r\n const response: LoginCmd = await getAxiosInstance().post('/login', reqObj);\r\n\r\n const { api = '' } = response;\r\n\r\n if (!api) {\r\n showErrorToast({\r\n header: 'Something went wrong!',\r\n description: 'API Key not found.',\r\n });\r\n errorLogger('API key not found in login command.');\r\n return;\r\n }\r\n\r\n showSuccessToast({\r\n header: 'Welcome Back!',\r\n description: 'Login Successful.',\r\n });\r\n\r\n setLocalStorage('apiKey', api);\r\n navigate(navigateTo);\r\n } catch (error) {\r\n // Failed login - reset Turnstile to generate new token\r\n turnstileRef.current?.reset();\r\n setTurnstileToken('');\r\n\r\n errorLogger(error);\r\n }\r\n });\r\n };\r\n\r\n return (\r\n <div className=\"grid gap-6\">\r\n <div className=\"after:border-border relative text-center text-sm after:absolute after:inset-0 after:top-1/2 after:z-0 after:flex after:items-center after:border-t\">\r\n <span className=\"bg-card text-muted-foreground relative z-10 px-2\">Login</span>\r\n </div>\r\n\r\n <form onSubmit={handleOnSubmit} className=\"grid gap-6\">\r\n <div className={gridCls}>\r\n <Label htmlFor=\"email\">Email *</Label>\r\n <Input id=\"email\" type=\"email\" placeholder=\"mail@example.com\" name=\"email\" ref={emailField} required />\r\n </div>\r\n <div className={gridCls}>\r\n <Label htmlFor=\"password\">Password *</Label>\r\n <Input id=\"password\" type=\"password\" name=\"password\" placeholder=\"**********\" required />\r\n <NavLink to=\"/forgot-password\" className=\"ml-auto text-sm underline-offset-4 hover:underline cursor-pointer\">\r\n Forgot your password?\r\n </NavLink>\r\n </div>\r\n <div className=\"text-center\">\r\n <Turnstile ref={turnstileRef} siteKey={appInfo.cloudFareKey} onSuccess={(token) => setTurnstileToken(token)} />\r\n </div>\r\n <Button type=\"submit\" className=\"w-full\" size={'lg'} loading={isPending}>\r\n Login\r\n </Button>\r\n </form>\r\n\r\n <div className=\"text-center text-sm\">\r\n Don&apos;t have an account?{' '}\r\n <NavLink to=\"/register\">\r\n <span className=\"underline underline-offset-4\">Register</span>\r\n </NavLink>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import InfoButton from '@/components/custom/InfoButton';\r\n\r\nconst PasswordPolicyIBtn = () => {\r\n return (\r\n <InfoButton side=\"right\">\r\n <h5>Password Policy:</h5>\r\n <ul>\r\n <li>Password must be at least 8 characters long.</li>\r\n <li>Password must contain at least one uppercase letter.</li>\r\n <li>Password must contain at least one lowercase letter.</li>\r\n <li>Password must contain at least one number.</li>\r\n <li>Password must contain at least one special character.</li>\r\n </ul>\r\n </InfoButton>\r\n );\r\n};\r\n\r\nexport default PasswordPolicyIBtn;\r\n","import { useImperativeHandle, useRef, useTransition, type Ref } from 'react';\r\nimport { sendOTP, type sendOTPInf } from '../utils/auth-lib';\r\nimport { errorLogger, getFormDataByFormEl } from '@/lib/utils';\r\nimport { Label } from '@/components/ui/label';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Button } from '@/components/ui/button';\r\n\r\ninterface SendOTPProps {\r\n handleOnOTPSent: (reqObj: { email: string }) => void;\r\n ref: Ref<any>;\r\n gridCls: string;\r\n hidden: boolean;\r\n path: string;\r\n}\r\n\r\nconst SendOTP = ({ handleOnOTPSent, ref, gridCls, hidden, path }: SendOTPProps) => {\r\n const emailField = useRef<HTMLInputElement>(null);\r\n const [isPending, startTransition] = useTransition();\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => {\r\n return {\r\n focus() {\r\n emailField.current?.focus();\r\n },\r\n };\r\n },\r\n [],\r\n );\r\n\r\n const handleOnEmailSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n const data: Record<string, FormDataEntryValue> = getFormDataByFormEl(event.currentTarget);\r\n\r\n const reqObj: sendOTPInf = {\r\n email: (data.email as string) || '',\r\n };\r\n\r\n startTransition(async () => {\r\n try {\r\n await sendOTP(path, reqObj);\r\n\r\n handleOnOTPSent(reqObj);\r\n } catch (error) {\r\n errorLogger(error);\r\n }\r\n });\r\n };\r\n\r\n return (\r\n <form onSubmit={handleOnEmailSubmit} className={`grid gap-5 ${hidden && 'hidden'}`}>\r\n <div className={gridCls}>\r\n <Label htmlFor=\"email\">Email *</Label>\r\n <Input id=\"email\" type=\"email\" name=\"email\" placeholder=\"mail@example.com\" ref={emailField} required />\r\n </div>\r\n <Button type=\"submit\" className=\"w-full\" loading={isPending}>\r\n Generate OTP\r\n </Button>\r\n </form>\r\n );\r\n};\r\n\r\nexport default SendOTP;\r\n","import { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showErrorToast, showSuccessToast } from '@/lib/toast-helper';\r\nimport { errorLogger, isEmailValid } from '@/lib/utils';\r\n\r\ninterface responseInf {\r\n message: string;\r\n}\r\n\r\nexport interface sendOTPInf {\r\n email: string;\r\n}\r\n\r\nexport const sendOTP = async (path: string, reqObj: sendOTPInf) => {\r\n if (isEmailValid(reqObj.email) === false) {\r\n throw showErrorToast({\r\n header: 'Email is not valid.',\r\n description: 'Kindly recheck the email and try again.',\r\n });\r\n }\r\n\r\n try {\r\n const response: responseInf = await getAxiosInstance().post('/send-otp/' + path, reqObj);\r\n\r\n showSuccessToast({\r\n header: response.message || 'OTP has been sent successfully',\r\n description: 'Kindly enter below details to continue.',\r\n });\r\n } catch (error) {\r\n errorLogger(error);\r\n throw error;\r\n }\r\n};\r\n","import * as React from \"react\"\nimport { OTPInput, OTPInputContext } from \"input-otp\"\nimport { MinusIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"flex items-center gap-2 has-disabled:opacity-50\",\n containerClassName\n )}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"flex items-center\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number\n}) {\n const inputOTPContext = React.useContext(OTPInputContext)\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]\",\n className\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\" />\n </div>\n )}\n </div>\n )\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"input-otp-separator\" role=\"separator\" {...props}>\n <MinusIcon />\n </div>\n )\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\n","import { InputOTP, InputOTPGroup, InputOTPSlot } from '@/components/ui/input-otp';\r\nimport { Label } from '@/components/ui/label';\r\nimport { useCountdown } from '@/hooks/useCountDown';\r\nimport type { Ref } from 'react';\r\n\r\ninterface InputOTPFieldProps {\r\n className: string;\r\n inputOTPField: Ref<any>;\r\n otp: string;\r\n setOtp: (otp: string) => void;\r\n onChangeEmailClick: () => void;\r\n}\r\n\r\nconst InputOTPField = ({ className, inputOTPField, otp, setOtp, onChangeEmailClick }: InputOTPFieldProps) => {\r\n const secondLeft = useCountdown();\r\n return (\r\n <div className={className}>\r\n <Label htmlFor=\"otp\">Enter OTP *</Label>\r\n\r\n <InputOTP maxLength={4} name=\"otp\" id=\"otp\" ref={inputOTPField} value={otp} onChange={setOtp}>\r\n <InputOTPGroup>\r\n <InputOTPSlot index={0} />\r\n <InputOTPSlot index={1} />\r\n <InputOTPSlot index={2} />\r\n <InputOTPSlot index={3} />\r\n </InputOTPGroup>\r\n </InputOTP>\r\n <span className=\"text-xs underline-offset-4 italic\">\r\n {secondLeft > 0 ? (\r\n <span className=\"muted-foreground\">You can resend the OTP in {secondLeft} seconds.</span>\r\n ) : (\r\n <span className=\"hover:underline cursor-pointer\" onClick={() => onChangeEmailClick()}>\r\n Didn't receive the OTP? Send again.\r\n </span>\r\n )}\r\n </span>\r\n </div>\r\n );\r\n};\r\n\r\nexport default InputOTPField;\r\n","import { useState, useEffect } from \"react\";\r\n\r\n// Returns seconds left; starts from initial value and counts down to 0\r\nexport function useCountdown(initialSeconds = 30) {\r\n const [secondsLeft, setSecondsLeft] = useState(initialSeconds);\r\n\r\n useEffect(() => {\r\n if (secondsLeft > 0) {\r\n const timer = setTimeout(() => setSecondsLeft(secondsLeft - 1), 1000);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [secondsLeft]);\r\n\r\n return secondsLeft;\r\n}\r\n","import { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Label } from '@/components/ui/label';\r\nimport { appInfo } from '@/config/app-config';\r\nimport { showErrorToast, showSuccessToast } from '@/lib/toast-helper';\r\nimport { errorLogger, getFormDataByFormEl, validatePassword } from '@/lib/utils';\r\nimport { useEffect, useRef, useState, useTransition } from 'react';\r\nimport { NavLink, useNavigate } from 'react-router';\r\nimport PasswordPolicyIBtn from './components/PasswordPolicyIBtn';\r\nimport SendOTP from './components/SendOTP';\r\nimport InputOTPField from './components/InputOTPField';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\n\r\nexport default function RegistrationForm() {\r\n const sendOTPCmp = useRef<HTMLInputElement>(null);\r\n const gridCls = 'grid gap-1';\r\n const inputOTPFieldRef = useRef<HTMLInputElement>(null);\r\n const [isOTPGenerated, setIsOTPGenerated] = useState(false);\r\n const [otp, setOtp] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [isPending, startTransition] = useTransition();\r\n const navigate = useNavigate();\r\n\r\n const handleOnSubmit = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n if (!otp) {\r\n showErrorToast({\r\n header: 'OTP Required!',\r\n description: 'Please enter your OTP and try again.',\r\n });\r\n inputOTPFieldRef.current?.focus();\r\n return;\r\n }\r\n\r\n const reqObj = getFormDataByFormEl(event.currentTarget);\r\n reqObj.otp = otp;\r\n reqObj.user_email = email;\r\n\r\n const isValid = validatePassword(reqObj.user_password as string);\r\n\r\n if (isValid.valid === false) {\r\n showErrorToast({\r\n header: 'Password Policy',\r\n description: isValid.message,\r\n });\r\n return;\r\n }\r\n\r\n startTransition(async () => {\r\n try {\r\n await getAxiosInstance().post('user-registration', reqObj);\r\n\r\n showSuccessToast({\r\n header: `Welcome to ${appInfo.appName}`,\r\n description: 'Registration successful! Please log in to continue.',\r\n });\r\n\r\n navigate('/login');\r\n } catch (error) {\r\n errorLogger(error);\r\n }\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (isOTPGenerated) {\r\n inputOTPFieldRef.current?.focus();\r\n } else {\r\n sendOTPCmp?.current?.focus();\r\n }\r\n }, [isOTPGenerated]);\r\n\r\n const reSendOTP = () => {\r\n setIsOTPGenerated(false);\r\n };\r\n\r\n return (\r\n <div className=\"grid gap-5\">\r\n <div className=\"after:border-border relative text-center text-sm after:absolute after:inset-0 after:top-1/2 after:z-0 after:flex after:items-center after:border-t\">\r\n <span className=\"bg-card text-muted-foreground relative z-10 px-2\">User Registration</span>\r\n </div>\r\n\r\n <SendOTP\r\n ref={sendOTPCmp}\r\n handleOnOTPSent={(reqObj) => {\r\n setIsOTPGenerated(true);\r\n setEmail(reqObj.email);\r\n }}\r\n gridCls={gridCls}\r\n hidden={isOTPGenerated}\r\n path=\"new-registration\"\r\n />\r\n\r\n {isOTPGenerated && (\r\n <form onSubmit={handleOnSubmit} className={`grid gap-5`}>\r\n <div className={gridCls}>\r\n <Label htmlFor=\"emailOTPGenerated\">Email *</Label>\r\n <Input id=\"emailOTPGenerated\" type=\"email\" name=\"email\" placeholder=\"mail@example.com\" value={email} disabled required />\r\n <span className=\"ml-auto text-xs underline-offset-4 hover:underline cursor-pointer italic\" onClick={reSendOTP}>\r\n Change Email\r\n </span>\r\n </div>\r\n\r\n <InputOTPField className={gridCls} inputOTPField={inputOTPFieldRef} otp={otp} setOtp={setOtp} onChangeEmailClick={reSendOTP} />\r\n\r\n <div className=\"flex gap-4\">\r\n <div className={gridCls + ' flex-1'}>\r\n <Label htmlFor=\"firstName\">First Name *</Label>\r\n <Input id=\"firstName\" name=\"user_fname\" type=\"text\" required />\r\n </div>\r\n <div className={gridCls + ' flex-1'}>\r\n <Label htmlFor=\"lastName\">Last Name *</Label>\r\n <Input id=\"lastName\" name=\"user_lname\" type=\"text\" required />\r\n </div>\r\n </div>\r\n <div className={gridCls}>\r\n <Label htmlFor=\"mobile\">Mobile No</Label>\r\n <Input id=\"mobile\" type=\"number\" name=\"user_mobile_no\" placeholder=\"98******88\" />\r\n </div>\r\n <div className={gridCls}>\r\n <Label htmlFor=\"password\">\r\n Set Password * <PasswordPolicyIBtn />\r\n </Label>\r\n <Input id=\"password\" name=\"user_password\" type=\"password\" placeholder=\"**********\" required />\r\n </div>\r\n <Button type=\"submit\" className=\"w-full\" size={'lg'} loading={isPending}>\r\n Create account\r\n </Button>\r\n </form>\r\n )}\r\n\r\n <div className=\"text-center text-sm\">\r\n Already have an account?{' '}\r\n <NavLink to=\"/login\">\r\n <span className=\"underline underline-offset-4\">Login</span>\r\n </NavLink>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\n\nfunction Collapsible({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />;\n}\n\nfunction CollapsibleTriggerWrapper({\n isCollapsible,\n ...props\n}: {\n isCollapsible: boolean;\n children?: React.ReactNode;\n} & React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n if (isCollapsible)\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n );\n\n return <>{props.children}</>;\n}\n\nfunction CollapsibleTrigger({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n );\n}\n\nfunction CollapsibleContent({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return (\n <CollapsiblePrimitive.CollapsibleContent\n data-slot=\"collapsible-content\"\n {...props}\n />\n );\n}\n\nexport {\n Collapsible,\n CollapsibleTrigger,\n CollapsibleTriggerWrapper,\n CollapsibleContent,\n};\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { PanelLeftIcon } from 'lucide-react';\n\nimport { useIsMobile } from '@/hooks/useIsMobile';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Separator } from '@/components/ui/separator';\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '@/components/ui/sheet';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state';\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'l';\n\ntype SidebarContextProps = {\n state: 'expanded' | 'collapsed';\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [setOpenProp, open],\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn('group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full', className)}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === 'none') {\n return (\n <div data-slot=\"sidebar\" className={cn('bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col', className)} {...props}>\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)',\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex',\n side === 'left'\n ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'\n : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\n // Adjust the padding for floating and inset variants.\n variant === 'floating' || variant === 'inset'\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('size-7', className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex',\n 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n 'bg-background relative flex w-full flex-1 flex-col',\n 'md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return <Input data-slot=\"sidebar-input\" data-sidebar=\"input\" className={cn('bg-background h-8 w-full shadow-none', className)} {...props} />;\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sidebar-header\" data-sidebar=\"header\" className={cn('flex flex-col gap-2 p-2', className)} {...props} />;\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sidebar-footer\" data-sidebar=\"footer\" className={cn('flex flex-col gap-2 p-2', className)} {...props} />;\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return <Separator data-slot=\"sidebar-separator\" data-sidebar=\"separator\" className={cn('bg-sidebar-border mx-2 w-auto', className)} {...props} />;\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn('flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sidebar-group\" data-sidebar=\"group\" className={cn('relative flex w-full min-w-0 flex-col p-2', className)} {...props} />;\n}\n\nfunction SidebarGroupLabel({ className, asChild = false, ...props }: React.ComponentProps<'div'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n 'text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({ className, asChild = false, ...props }: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sidebar-group-content\" data-sidebar=\"group-content\" className={cn('w-full text-sm', className)} {...props} />;\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n return <ul data-slot=\"sidebar-menu\" data-sidebar=\"menu\" className={cn('flex w-full min-w-0 flex-col gap-1', className)} {...props} />;\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n return <li data-slot=\"sidebar-menu-item\" data-sidebar=\"menu-item\" className={cn('group/menu-item relative', className)} {...props} />;\n}\n\nconst sidebarMenuButtonVariants = cva(\n 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n outline:\n 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\n },\n size: {\n default: 'h-8 text-sm',\n sm: 'h-7 text-xs',\n lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isExpanded = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n isExpanded?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot : 'button';\n // const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isExpanded}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n // hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none',\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n 'border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return <li data-slot=\"sidebar-menu-sub-item\" data-sidebar=\"menu-sub-item\" className={cn('group/menu-sub-item relative', className)} {...props} />;\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isExpanded = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n size?: 'sm' | 'md';\n isExpanded?: boolean;\n}) {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isExpanded}\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\n size === 'sm' && 'text-xs',\n size === 'md' && 'text-sm',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n};\n","import { ChevronRight } from 'lucide-react';\n\nimport { Collapsible, CollapsibleContent, CollapsibleTriggerWrapper } from '@/components/ui/collapsible';\nimport {\n SidebarGroup,\n SidebarGroupLabel,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n} from '@/components/ui/sidebar';\nimport { NavLink, useLocation } from 'react-router';\nimport { getModuleNameFromUrl, isSameNavItem } from '@/lib/utils';\nimport type { NavGroup, NavItem } from '@/lib/types';\n\ninterface NavMainProps {\n navItems: NavGroup[];\n}\n\nexport function NavMain({ navItems }: NavMainProps) {\n const location = useLocation();\n const moduleName = location.pathname;\n const currentPath = getModuleNameFromUrl(moduleName);\n\n const getModuleLink = (path: string) => `app/${path}`;\n\n const selectedItemCls = `bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground`;\n\n const getSidebarMenuBtn = (item: NavItem) => {\n const sidebarMenuBtn = (\n <SidebarMenuButton tooltip={item.title} className={'cursor-pointer ' + (isSameNavItem(currentPath, item.url || '') ? selectedItemCls : '')}>\n {item.icon && <item.icon />}\n <span>{item.title}</span>\n {item.items && <ChevronRight className=\"ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90\" />}\n </SidebarMenuButton>\n );\n\n if (!item.url) {\n return sidebarMenuBtn;\n }\n\n return (\n <NavLink to={getModuleLink(item.url)} className=\"w-full\">\n {sidebarMenuBtn}\n </NavLink>\n );\n };\n\n return (\n <>\n {navItems.map((navItem) => (\n <SidebarGroup key={navItem.title}>\n <SidebarGroupLabel>{navItem.title}</SidebarGroupLabel>\n <SidebarMenu>\n {navItem.items.map((item) => {\n const hasSelectedSubItem = item.items && item.items.some((subItem) => isSameNavItem(currentPath, subItem.url));\n\n return (\n <Collapsible key={item.title} asChild defaultOpen={hasSelectedSubItem} className=\"group/collapsible\">\n <SidebarMenuItem>\n <CollapsibleTriggerWrapper isCollapsible={!!item.items} asChild>\n {getSidebarMenuBtn(item)}\n </CollapsibleTriggerWrapper>\n <CollapsibleContent>\n <SidebarMenuSub>\n {item.items?.map((subItem) => (\n <SidebarMenuSubItem key={subItem.title}>\n <SidebarMenuSubButton asChild className={isSameNavItem(currentPath, subItem.url) ? selectedItemCls : ''}>\n <NavLink to={getModuleLink(subItem.url)} title={subItem.title}>\n <span>{subItem.title}</span>\n </NavLink>\n </SidebarMenuSubButton>\n </SidebarMenuSubItem>\n ))}\n </SidebarMenuSub>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n );\n })}\n </SidebarMenu>\n </SidebarGroup>\n ))}\n </>\n );\n}\n","import * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted flex size-full items-center justify-center rounded-full\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import { useState, useEffect, useContext } from 'react';\r\nimport DialogWrapper from '@/components/custom/DialogWrapper';\r\nimport { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Label } from '@/components/ui/label';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showSuccessToast } from '@/lib/toast-helper';\r\nimport AppContext from '@/store/AppContext';\r\nimport type { IUserData } from '@/lib/types';\r\nimport { generatePublicId } from '@/lib/utils';\r\nimport { LoadingCmp } from '@/components/custom';\r\n\r\ninterface IUserAccount {\r\n isDialogOpen: boolean;\r\n setIsDialogOpen: (open: boolean) => void;\r\n}\r\n\r\nconst UserAccount = ({ isDialogOpen, setIsDialogOpen }: IUserAccount) => {\r\n const { loggedInUser, setLoggedInUser } = useContext(AppContext);\r\n const [loading, setLoading] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n\r\n const [userData, setUserData] = useState<IUserData | null>(null);\r\n const [formData, setFormData] = useState<Partial<IUserData>>({});\r\n\r\n useEffect(() => {\r\n if (isDialogOpen) {\r\n fetchUserData();\r\n }\r\n }, [isDialogOpen]);\r\n\r\n const fetchUserData = async () => {\r\n setLoading(true);\r\n try {\r\n // const response = await getAxiosInstance().get('/user/profile');\r\n // setUserData(response);\r\n // setFormData(response);\r\n\r\n const data: IUserData = {\r\n user_id: loggedInUser.id,\r\n user_email: loggedInUser.email,\r\n user_mobile_no: loggedInUser.mobNo?.toString() || '',\r\n user_fname: loggedInUser.fname || '',\r\n user_lname: loggedInUser.lname || '',\r\n user_is_active: true,\r\n created_at: new Date().toISOString(),\r\n updated_at: new Date().toISOString(),\r\n };\r\n\r\n setUserData(data);\r\n setFormData(data);\r\n } catch (error) {\r\n console.error('Error fetching user data:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleInputChange = (field: keyof IUserData, value: string | boolean) => {\r\n setFormData((prev) => ({\r\n ...prev,\r\n [field]: value,\r\n }));\r\n };\r\n\r\n const handleSave = async () => {\r\n setSaving(true);\r\n try {\r\n const reqBody = {\r\n user_mobile_no: formData.user_mobile_no,\r\n user_fname: formData.user_fname,\r\n user_lname: formData.user_lname,\r\n };\r\n\r\n await getAxiosInstance().put(`/user-profile/${formData.user_id}`, reqBody);\r\n showSuccessToast({\r\n header: 'Success',\r\n description: 'User profile updated successfully',\r\n });\r\n setUserData(formData as IUserData);\r\n\r\n setLoggedInUser({\r\n ...loggedInUser,\r\n mobNo: formData.user_mobile_no,\r\n fname: formData.user_fname,\r\n lname: formData.user_lname,\r\n });\r\n\r\n setIsDialogOpen(false);\r\n } catch (error) {\r\n console.error('Error saving user data:', error);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n setFormData(userData || {});\r\n setIsDialogOpen(false);\r\n };\r\n\r\n return (\r\n <DialogWrapper\r\n open={isDialogOpen}\r\n setIsOpen={setIsDialogOpen}\r\n header=\"Edit User Profile\"\r\n disableOutsideClick={true}\r\n actionsJSX={\r\n <div className=\"flex gap-3\">\r\n <Button variant=\"outline\" onClick={handleCancel} disabled={saving}>\r\n Cancel\r\n </Button>\r\n <Button onClick={handleSave} loading={saving}>\r\n Save Changes\r\n </Button>\r\n </div>\r\n }\r\n >\r\n {loading ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <div className=\"text-muted-foreground flex items-center gap-1\">\r\n <LoadingCmp />\r\n Loading user data...\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4 mt-4\">\r\n {/* User ID - Read Only */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"user_id\">User ID</Label>\r\n <Input id=\"user_id\" value={formData.user_id ? generatePublicId(formData.user_id) : ''} disabled className=\"bg-muted\" />\r\n </div>\r\n\r\n {/* Email */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"user_email\">Email</Label>\r\n <Input id=\"user_email\" type=\"email\" value={formData.user_email || ''} placeholder=\"Enter email address\" disabled className=\"bg-muted\" />\r\n </div>\r\n\r\n {/* Mobile Number */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"user_mobile_no\">Mobile Number</Label>\r\n <Input\r\n id=\"user_mobile_no\"\r\n type=\"number\"\r\n value={formData.user_mobile_no || ''}\r\n onChange={(e) => handleInputChange('user_mobile_no', e.target.value)}\r\n placeholder=\"Enter mobile number\"\r\n />\r\n </div>\r\n\r\n {/* First Name */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"user_fname\">First Name</Label>\r\n <Input\r\n id=\"user_fname\"\r\n value={formData.user_fname || ''}\r\n onChange={(e) => handleInputChange('user_fname', e.target.value)}\r\n placeholder=\"Enter first name\"\r\n />\r\n </div>\r\n\r\n {/* Last Name */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"user_lname\">Last Name</Label>\r\n <Input\r\n id=\"user_lname\"\r\n value={formData.user_lname || ''}\r\n onChange={(e) => handleInputChange('user_lname', e.target.value)}\r\n placeholder=\"Enter last name\"\r\n />\r\n </div>\r\n\r\n {/* Active Status - Read Only */}\r\n {/* <div className=\"space-y-2\">\r\n <Label htmlFor=\"user_is_active\">Account Status</Label>\r\n <Input id=\"user_is_active\" value={formData.user_is_active ? 'Active' : 'Inactive'} disabled className=\"bg-muted\" />\r\n </div> */}\r\n\r\n {/* Created At - Read Only */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"created_at\">Joined On</Label>\r\n <Input id=\"created_at\" value={formData.created_at ? new Date(formData.created_at).toLocaleString() : ''} disabled className=\"bg-muted\" />\r\n </div>\r\n\r\n {/* Updated At - Read Only */}\r\n {/* <div className=\"space-y-2\">\r\n <Label htmlFor=\"updated_at\">Last Updated</Label>\r\n <Input id=\"updated_at\" value={formData.updated_at ? new Date(formData.updated_at).toLocaleString() : ''} disabled className=\"bg-muted\" />\r\n </div> */}\r\n </div>\r\n )}\r\n </DialogWrapper>\r\n );\r\n};\r\n\r\nexport default UserAccount;\r\n","import { BadgeCheck, ChevronsUpDown, CircleUserRound, CreditCard, LogOut, Sparkle } from 'lucide-react';\n\nimport { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport { SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar } from '@/components/ui/sidebar';\nimport { setLocalStorage } from '@/lib/utils';\nimport { useNavigate } from 'react-router';\nimport LinkWrapper from '../custom/LinkWrapper';\nimport { useContext, useState } from 'react';\nimport AppContext from '@/store/AppContext';\nimport { isFreePlan } from '@/app/routes/Subscriptions/utils/subscription-utils';\nimport UserAccount from '@/app/UserAccount';\n\nexport function NavUser({ fname, lname, email, avatar }: { fname: string; lname: string; email: string; avatar: string }) {\n const navigate = useNavigate();\n const { isMobile } = useSidebar();\n const { activePlan, featureFlags } = useContext(AppContext);\n const fullName = `${fname} ${lname}`;\n const [isAccountDialogOpen, setIsAccountDialogOpen] = useState(false);\n\n return (\n <>\n <UserAccount isDialogOpen={isAccountDialogOpen} setIsDialogOpen={setIsAccountDialogOpen} />\n <SidebarMenu>\n <SidebarMenuItem>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton size=\"lg\" className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\">\n <Avatar className=\"h-8 w-8 rounded-lg\">\n <AvatarImage src={avatar} alt={fullName} />\n <AvatarFallback className=\"rounded-lg\">\n {fname[0].toLocaleUpperCase()}\n {lname[0].toLocaleUpperCase()}\n </AvatarFallback>\n </Avatar>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">{fullName}</span>\n <span className=\"truncate text-xs\">{email}</span>\n </div>\n <ChevronsUpDown className=\"ml-auto size-4\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg\"\n side={isMobile ? 'bottom' : 'right'}\n align=\"end\"\n sideOffset={4}\n >\n <DropdownMenuLabel className=\"p-0 font-normal\">\n <div className=\"flex items-center gap-2 px-1 py-1.5 text-left text-sm\">\n <Avatar className=\"h-8 w-8 rounded-lg\">\n <AvatarImage src={avatar} alt={fullName} />\n <AvatarFallback className=\"rounded-lg\">\n {fname[0].toLocaleUpperCase()}\n {lname[0].toLocaleUpperCase()}\n </AvatarFallback>\n </Avatar>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">{fullName}</span>\n <span className=\"truncate text-xs\">{email}</span>\n </div>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => setIsAccountDialogOpen(true)}>\n <CircleUserRound />\n Your Profile\n </DropdownMenuItem>\n {featureFlags.ff_enable_paid_subscription ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem\n onClick={() => {\n setTimeout(\n () => {\n navigate('/plans');\n },\n isMobile ? 500 : 0,\n );\n }}\n >\n <Sparkle />\n {isFreePlan(activePlan) ? 'Upgrade to premium' : 'View Plans'}\n </DropdownMenuItem>\n </DropdownMenuGroup>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem\n onClick={() => {\n setTimeout(\n () => {\n navigate('/infrastructure/manage-subscription');\n },\n isMobile ? 500 : 0,\n );\n }}\n >\n <BadgeCheck />\n Subscriptions\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => {\n setTimeout(\n () => {\n navigate('/infrastructure/payment-history');\n },\n isMobile ? 500 : 0,\n );\n }}\n >\n <CreditCard />\n Payment History\n </DropdownMenuItem>\n {/* <DropdownMenuItem>\n <Bell />\n Notifications\n </DropdownMenuItem> */}\n </DropdownMenuGroup>\n </>\n ) : null}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={() => {\n setLocalStorage('apiKey', '');\n navigate('/login');\n }}\n >\n <LogOut />\n Log out\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n </>\n );\n}\n","// import PremiumHighlighter from '@/components/custom/PremiumHighlighter';\r\nimport { TooltipWrapper } from '@/components/custom/TooltipWrapper';\r\nimport { Badge } from '@/components/ui';\r\nimport { appInfo } from '@/config/app-config';\r\nimport type { purchasedPlansInf } from '@/lib/types';\r\nimport AppContext from '@/store/AppContext';\r\n// import { SparkleIcon } from 'lucide-react';\r\nimport { useContext } from 'react';\r\nimport { isFreePlan } from '../utils/subscription-utils';\r\n\r\ninterface IPremiumIcon {\r\n purchasedPlan: purchasedPlansInf;\r\n}\r\n\r\nconst PremiumIcon = ({ purchasedPlan }: IPremiumIcon) => {\r\n const { subscriptionConfig, featureFlags } = useContext(AppContext);\r\n\r\n if (!featureFlags.ff_enable_paid_subscription) return null;\r\n\r\n const plan = subscriptionConfig.plans.find((p) => p.id === purchasedPlan.plan_id);\r\n if (!plan) return null;\r\n\r\n const isFree = isFreePlan(purchasedPlan);\r\n\r\n return (\r\n <TooltipWrapper\r\n delayDuration={20}\r\n content={\r\n <>\r\n This {appInfo.account_type_txt.singular.toLocaleLowerCase()} is on a \"{plan.title}\" plan.\r\n </>\r\n }\r\n side=\"right\"\r\n >\r\n <div>\r\n {/* <PremiumHighlighter /> */}\r\n {/* <SparkleIcon /> */}\r\n <Badge variant={'success'}>{isFree ? 'Free' : 'Premium'}</Badge>\r\n </div>\r\n </TooltipWrapper>\r\n );\r\n};\r\n\r\nexport default PremiumIcon;\r\n","import React, { useContext } from 'react';\r\nimport { ChevronsUpDown, FolderKanban, Pen, Plus, UserRoundPlus, Users2 } from 'lucide-react';\r\n\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuTrigger,\r\n} from '@/components/ui/dropdown-menu';\r\n\r\nimport { SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar } from '@/components/ui/sidebar';\r\n\r\nimport AppContext from '@/store/AppContext';\r\nimport { useNavigate } from 'react-router';\r\nimport { appInfo } from '@/config/app-config';\r\nimport { generatePublicId, isValidId } from '@/lib/utils';\r\nimport { ROLES } from '@/lib/enums';\r\nimport { TooltipWrapper } from '../custom/TooltipWrapper';\r\nimport { showErrorToast } from '@/lib/toast-helper';\r\nimport PremiumIcon from '@/app/routes/Subscriptions/components/PremiumIcon';\r\n\r\ninterface OrgSwitcherMenuProps {\r\n text: React.ReactNode;\r\n link: string;\r\n icon: React.ReactNode;\r\n disabled?: boolean;\r\n tooltip?: string;\r\n addTopSeparator?: boolean;\r\n key: string;\r\n}\r\n\r\nexport function OrgSwitcher() {\r\n const { isMobile, setOpenMobile } = useSidebar();\r\n const { orgs, activeOrg, setActiveOrg } = useContext(AppContext);\r\n const navigate = useNavigate();\r\n\r\n const getOrgSpecificOptions = () => {\r\n const options: OrgSwitcherMenuProps[] = [];\r\n\r\n if (activeOrg && isValidId(activeOrg?.org_id || 0)) {\r\n const isAdmin = ROLES.Is_ADMIN(activeOrg?.role_id || NaN);\r\n options.push(\r\n {\r\n text: <>Invite team members</>,\r\n link: `/infrastructure/edit-org/${generatePublicId(activeOrg?.org_id || 0)}`,\r\n disabled: !isAdmin,\r\n icon: <UserRoundPlus className=\"size-4\" />,\r\n tooltip: isAdmin\r\n ? `Invite peoples to \"${activeOrg.org_name}\" ${appInfo.account_type_txt.singular.toLocaleLowerCase()}`\r\n : `You are not an admin for \"${\r\n activeOrg.org_name\r\n }\" ${appInfo.account_type_txt.singular.toLocaleLowerCase()}, Only admins can invite peoples.`,\r\n key: 'invite-peoples',\r\n },\r\n {\r\n text: <>Edit {appInfo.account_type_txt.singular.toLocaleLowerCase()}</>,\r\n link: `/infrastructure/edit-org/${generatePublicId(activeOrg?.org_id || 0)}`,\r\n disabled: !isAdmin,\r\n icon: <Pen className=\"size-4\" />,\r\n tooltip: isAdmin\r\n ? `Edit \"${activeOrg.org_name}\" ${appInfo.account_type_txt.singular.toLocaleLowerCase()} details`\r\n : `You are not an admin for \"${\r\n activeOrg.org_name\r\n }\" ${appInfo.account_type_txt.singular.toLocaleLowerCase()}, Only admins can invite peoples.`,\r\n key: 'edit-org',\r\n },\r\n );\r\n }\r\n\r\n options.push(\r\n {\r\n addTopSeparator: true,\r\n text: <>Create new {appInfo.account_type_txt.singular.toLocaleLowerCase()}</>,\r\n link: '/infrastructure/create-new-org',\r\n icon: <Plus className=\"size-4\" />,\r\n key: 'create-new-org',\r\n },\r\n {\r\n text: <>View all {appInfo.account_type_txt.plural.toLocaleLowerCase()}</>,\r\n link: '/infrastructure/manage-infra',\r\n icon: <FolderKanban className=\"size-4\" />,\r\n key: 'view-all-orgs',\r\n },\r\n {\r\n addTopSeparator: true,\r\n text: <>Check invites</>,\r\n link: 'infrastructure/user-invitations',\r\n icon: <UserRoundPlus className=\"size-4\" />,\r\n key: 'check-invitations',\r\n },\r\n );\r\n\r\n return (\r\n <>\r\n {options.map((rec) => {\r\n return (\r\n <TooltipWrapper key={rec.key} content={<>{rec.tooltip}</>} side=\"right\" canShowTooltip={!!rec.tooltip}>\r\n <div key={rec.key}>\r\n {rec.addTopSeparator ? <DropdownMenuSeparator /> : null}\r\n <DropdownMenuItem\r\n key={rec.link}\r\n className=\"gap-2 p-2 cursor-pointer\"\r\n // disabled={rec.disabled}\r\n onClick={() => {\r\n setOpenMobile(false);\r\n setTimeout(\r\n () => {\r\n if (rec.disabled) {\r\n showErrorToast({\r\n header: 'Action not allowed!',\r\n description: rec.tooltip || 'You cannot access this option',\r\n });\r\n return;\r\n }\r\n navigate(rec.link);\r\n },\r\n isMobile ? 500 : 0,\r\n );\r\n }}\r\n >\r\n <div className=\"flex size-6 items-center justify-center rounded-md border bg-transparent\" title={rec.tooltip}>\r\n {rec.icon}\r\n </div>\r\n <div className=\"text-muted-foreground font-medium\">{rec.text}</div>\r\n </DropdownMenuItem>\r\n </div>\r\n </TooltipWrapper>\r\n );\r\n })}\r\n </>\r\n );\r\n };\r\n\r\n return (\r\n <SidebarMenu>\r\n <SidebarMenuItem>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <SidebarMenuButton size=\"lg\" className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\">\r\n <div className=\"flex aspect-square size-8 items-center justify-center rounded-lg\">\r\n {activeOrg?.logo ? <activeOrg.logo className=\"size-4\" /> : <Users2 className=\"size-4\" />}\r\n </div>\r\n\r\n {activeOrg ? (\r\n <TooltipWrapper content={activeOrg.org_name + ' - ' + activeOrg.org_external_id} side=\"right\" canShowTooltip={true}>\r\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\r\n <span className=\"truncate font-medium\">{activeOrg.org_name}</span>\r\n <span className=\"truncate text-xs\">{activeOrg.org_external_id}</span>\r\n </div>\r\n </TooltipWrapper>\r\n ) : (\r\n <div className=\"truncate text-xs\">No Active {appInfo.account_type_txt.singular}, select one.</div>\r\n )}\r\n\r\n {activeOrg?.active_purchased_plan && (\r\n <div className=\"flex items-center justify-center rounded-md border\">\r\n <PremiumIcon purchasedPlan={activeOrg.active_purchased_plan} />\r\n </div>\r\n )}\r\n <ChevronsUpDown className=\"ml-auto\" />\r\n </SidebarMenuButton>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent\r\n className=\"w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg\"\r\n align=\"start\"\r\n side={isMobile ? 'bottom' : 'right'}\r\n sideOffset={4}\r\n >\r\n <DropdownMenuLabel className=\"text-muted-foreground text-xs\">{appInfo.account_type_txt.plural}</DropdownMenuLabel>\r\n {orgs.map((org) => (\r\n <DropdownMenuItem key={org.org_id} onClick={() => setActiveOrg(org)} className=\"gap-2 p-2\">\r\n {org.logo ? (\r\n <div className=\"flex size-6 items-center justify-center rounded-md border\">\r\n <org.logo className=\"size-3.5 shrink-0\" />\r\n </div>\r\n ) : (\r\n <></>\r\n )}\r\n {org.org_name}\r\n {org.active_purchased_plan && (\r\n <div className=\"ml-auto flex items-center justify-center rounded-md border\">\r\n <PremiumIcon purchasedPlan={org.active_purchased_plan} />\r\n </div>\r\n )}\r\n {/* <DropdownMenuShortcut></DropdownMenuShortcut> */}\r\n </DropdownMenuItem>\r\n ))}\r\n <DropdownMenuSeparator />\r\n {getOrgSpecificOptions()}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n );\r\n}\r\n","import { SidebarMenu, SidebarMenuButton, SidebarMenuItem } from '@/components/ui/sidebar';\nimport { appInfo } from '@/config/app-config';\nimport { NavLink } from 'react-router';\n\nexport function AppHeader() {\n return (\n <SidebarMenu>\n <NavLink to={'/'}>\n <SidebarMenuItem>\n <SidebarMenuButton size=\"lg\" className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\">\n {/* <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\">\n <appInfo.logo className=\"size-4\" />\n </div> */}\n <div className=\"w-10 h-10 bg-sidebar-primary text-sidebar-primary-foreground rounded-lg flex items-center justify-center\">\n <appInfo.logo />\n </div>\n\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">{appInfo.appName}</span>\n <span className=\"truncate text-xs\">v{appInfo.version}</span>\n </div>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </NavLink>\n </SidebarMenu>\n );\n}\n","import * as React from 'react';\nimport { NavMain } from '@/components/side-bar/nav-main';\nimport { NavUser } from '@/components/side-bar/nav-user';\nimport { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarRail } from '@/components/ui/sidebar';\n// import { appInfo } from \"../lib/app-config\";\nimport { OrgSwitcher } from '@/components/side-bar/org-switcher';\nimport { AppHeader } from './app-header';\nimport { navigationItems } from '@/lib/nav-menu';\nimport AppContext from '@/store/AppContext';\n\n// This is sample data.\nconst data = navigationItems;\n\nexport function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {\n const { loggedInUser, featureFlags } = React.useContext(AppContext);\n\n return (\n <Sidebar collapsible=\"icon\" {...props}>\n <SidebarHeader>\n <AppHeader />\n {featureFlags.ff_enable_teams && <OrgSwitcher />}\n </SidebarHeader>\n <SidebarContent>\n <NavMain navItems={data.navMain} />\n </SidebarContent>\n <SidebarFooter>\n <NavUser\n email={loggedInUser?.email || ''}\n fname={loggedInUser?.fname || ''}\n lname={loggedInUser?.lname || ''}\n avatar={'/avatars/shadcn.jpg'}\n />\n </SidebarFooter>\n <SidebarRail />\n </Sidebar>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Breadcrumb({ ...props }: React.ComponentProps<\"nav\">) {\n return <nav aria-label=\"breadcrumb\" data-slot=\"breadcrumb\" {...props} />;\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : \"a\";\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"hover:text-foreground transition-colors\", className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"text-foreground font-normal\", className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n );\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"size-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n );\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n};\n","import { findNavMenu, getModuleNameFromUrl } from '@/lib/utils';\r\nimport { useLocation } from 'react-router';\r\n\r\nconst useSelectedNavItem = () => {\r\n const location = useLocation();\r\n const currentPath = location.pathname;\r\n\r\n if (!currentPath || currentPath === '/')\r\n return {\r\n title: 'Dashboard',\r\n };\r\n\r\n const moduleName = getModuleNameFromUrl(currentPath);\r\n const selectedNavItem = findNavMenu(moduleName);\r\n\r\n if (!selectedNavItem) {\r\n return {\r\n title: 'Not Found',\r\n url: 'notFound',\r\n };\r\n }\r\n\r\n return selectedNavItem;\r\n};\r\n\r\nexport default useSelectedNavItem;\r\n","import { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator } from '@/components/ui/breadcrumb';\r\nimport type { NavItem } from '@/lib/types';\r\nimport type { JSX } from 'react';\r\nimport { Fragment } from 'react';\r\nimport useSelectedNavItem from '@/hooks/useSelectedNavItem';\r\n\r\nconst AppBreadcrumb = () => {\r\n const selectedNavItem = useSelectedNavItem();\r\n\r\n const getBreadcrumbItem = (navItem: NavItem, isRoot: boolean): JSX.Element[] => {\r\n let result: JSX.Element[] = [];\r\n\r\n result.push(\r\n <Fragment key={navItem.title}>\r\n <BreadcrumbItem>\r\n {isRoot ? <BreadcrumbPage>{navItem.title}</BreadcrumbPage> : <BreadcrumbLink>{navItem.title}</BreadcrumbLink>}\r\n </BreadcrumbItem>\r\n {!isRoot && <BreadcrumbSeparator />}\r\n </Fragment>,\r\n );\r\n\r\n if (navItem.parent) {\r\n result = [getBreadcrumbItem(navItem.parent, false), ...result].flat();\r\n }\r\n\r\n return result;\r\n };\r\n\r\n return (\r\n <Breadcrumb>\r\n <BreadcrumbList>{getBreadcrumbItem(selectedNavItem, true)}</BreadcrumbList>\r\n </Breadcrumb>\r\n );\r\n};\r\n\r\nexport default AppBreadcrumb;\r\n","import { showSuccessToast, showWarningToast } from '@/lib/toast-helper';\r\nimport type { OrganizationType, TeamMembersDetails } from '@/lib/types';\r\nimport { generatePublicId } from '@/lib/utils';\r\nimport { useNavigate } from 'react-router';\r\nimport { appInfo } from '@/config/app-config';\r\nimport useAlertDialog from '@/hooks/useAlertDialog';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { ROLES } from '@/lib/enums';\r\nimport AppContext from '@/store/AppContext';\r\nimport { useContext } from 'react';\r\n\r\nconst useOrgHelper = () => {\r\n const navigate = useNavigate();\r\n const dlg = useAlertDialog();\r\n const { activeOrg, loggedInUser } = useContext(AppContext);\r\n\r\n const editOrganization = (org: OrganizationType) => {\r\n if (!ROLES.Is_ADMIN(org.role_id)) {\r\n showWarningToast({\r\n header: 'Alert',\r\n description: (\r\n <>\r\n You are not allowed to edit the <b>{org.org_name}</b> {appInfo.account_type_txt.singular.toLocaleLowerCase()}.\r\n </>\r\n ),\r\n });\r\n return;\r\n }\r\n\r\n navigate('/infrastructure/edit-org/' + generatePublicId(org.org_id));\r\n };\r\n\r\n const handleOnDeleteUnregisteredUser = (user: Partial<TeamMembersDetails>, orgId: number) => {\r\n const { id, email } = user;\r\n\r\n return new Promise((resolve, reject) => {\r\n dlg.showAlertBox({\r\n type: 'CONFIRM',\r\n text: `Are you sure you want to remove \"${email}\" user from your ${appInfo.account_type_txt.singular}?`,\r\n async onClose(result) {\r\n if (result !== 'CONFIRM') {\r\n reject();\r\n return;\r\n }\r\n\r\n const reqData = {\r\n invited_users_id: id,\r\n org_id: orgId,\r\n };\r\n\r\n try {\r\n const result = await getAxiosInstance().delete('/org-member/unregistered-user-invitation', {\r\n data: reqData,\r\n });\r\n\r\n showSuccessToast({\r\n description: `${email} has been successfully removed from the team.`,\r\n });\r\n\r\n resolve(result);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n },\r\n });\r\n });\r\n };\r\n\r\n const isActiveOrgCreatedByMe = () => {\r\n return Number(activeOrg?.org_created_by) === Number(loggedInUser.id);\r\n };\r\n\r\n return {\r\n editOrganization,\r\n handleOnDeleteUnregisteredUser,\r\n isActiveOrgCreatedByMe,\r\n };\r\n};\r\n\r\nexport default useOrgHelper;\r\n","import AppContext from '@/store/AppContext';\r\nimport { useContext } from 'react';\r\nimport { useSidebar } from '@/components/ui/sidebar';\r\nimport { useNavigate } from 'react-router';\r\nimport PremiumHighlighter from '@/components/custom/PremiumHighlighter';\r\nimport usePurchasedPlans from '../hooks/usePurchasedPlans';\r\nimport useOrgHelper from '../../OrgSetup/hooks/useOrgHelper';\r\n\r\nconst UpgradeToPro = () => {\r\n const { featureFlags } = useContext(AppContext);\r\n const { isMobile, setOpenMobile } = useSidebar();\r\n const navigate = useNavigate();\r\n const { isActiveOrgFreePlan, isUserFreePlan } = usePurchasedPlans();\r\n const { isActiveOrgCreatedByMe } = useOrgHelper();\r\n\r\n if (featureFlags.ff_enable_paid_subscription === false) {\r\n return null;\r\n }\r\n\r\n const onBtnClick = () => {\r\n if (isMobile) {\r\n setOpenMobile(false);\r\n }\r\n // navigate('/infrastructure/manage-subscription');\r\n navigate('/plans');\r\n };\r\n\r\n if (isUserFreePlan() && (!featureFlags.ff_enable_teams || (isActiveOrgFreePlan() && isActiveOrgCreatedByMe()))) {\r\n return (\r\n <button onClick={onBtnClick}>\r\n <PremiumHighlighter>{'Upgrade to premium'}</PremiumHighlighter>\r\n </button>\r\n );\r\n }\r\n\r\n // return (\r\n // <Button variant=\"linkNoUnderline\" size=\"sm\" className=\"bg-primary/20 hover:bg-primary/10\" onClick={onBtnClick}>\r\n // <Sparkles /> {plan?.title} Plan\r\n // </Button>\r\n // );\r\n return null;\r\n};\r\n\r\nexport default UpgradeToPro;\r\n","import { AppSidebar } from '@/components/side-bar/app-sidebar';\r\nimport { Separator } from '@/components/ui/separator';\r\nimport { SidebarInset, SidebarProvider, SidebarTrigger } from '@/components/ui/sidebar';\r\nimport { Outlet } from 'react-router';\r\nimport AppBreadcrumb from './components/AppBreadcrumb';\r\nimport UpgradeToPro from '@/app/routes/Subscriptions/components/UpgradeToPro';\r\nimport { useIsMobile } from '@/hooks/useIsMobile';\r\n\r\nexport default function Dashboard() {\r\n const isMobile = useIsMobile();\r\n return (\r\n <SidebarProvider>\r\n <AppSidebar />\r\n <SidebarInset className=\"h-screen\">\r\n <header className=\"flex py-4 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12 bg-background\">\r\n <div className=\"flex items-center gap-2 px-4\">\r\n <SidebarTrigger className=\"-ml-1\" />\r\n <Separator orientation=\"vertical\" className=\"mr-2 data-[orientation=vertical]:h-4\" />\r\n <AppBreadcrumb />\r\n </div>\r\n <div className=\"flex-1\" />\r\n <div className=\"flex items-center gap-2 px-4\">{isMobile ? <></> : <UpgradeToPro />}</div>\r\n </header>\r\n <div className=\"flex items-stretch flex-col flex-1 overflow-auto\">\r\n <Outlet />\r\n </div>\r\n </SidebarInset>\r\n </SidebarProvider>\r\n );\r\n}\r\n","import { appInfo } from '@/config/app-config';\r\nimport { NavLink } from 'react-router';\r\n\r\nconst NotFound: React.FC<{ canShowHeader?: boolean }> = ({ canShowHeader = true }) => {\r\n return (\r\n <div className=\"flex flex-col stretch justify-center gap-4 items-center flex-1 p-5\">\r\n {canShowHeader && (\r\n <>\r\n <h1 className=\"text-3xl font-bold text-primary p-0\">{appInfo.appName}</h1>\r\n <p className=\"text-sm\">{appInfo.appDescription}</p>\r\n </>\r\n )}\r\n <div className=\"flex flex-col justify-center\">\r\n <div className=\"text-muted-foreground mb-4 text-sm\">404 Page Not Found</div>\r\n <NavLink to=\"/\" className=\"p-2 bg-primary text-primary-foreground rounded-md transition-colors text-sm\">\r\n Go to Homepage\r\n </NavLink>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default NotFound;\r\n","import { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Label } from '@/components/ui/label';\r\nimport { showErrorToast, showSuccessToast } from '@/lib/toast-helper';\r\nimport { errorLogger, getFormDataByFormEl, validatePassword } from '@/lib/utils';\r\nimport { useEffect, useImperativeHandle, useRef, useState, useTransition, type Ref } from 'react';\r\nimport { NavLink, useNavigate } from 'react-router';\r\nimport PasswordPolicyIBtn from './components/PasswordPolicyIBtn';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport SendOTP from './components/SendOTP';\r\nimport InputOTPField from './components/InputOTPField';\r\n\r\ninterface ResetFormProps {\r\n ref: Ref<{}>;\r\n gridCls: string;\r\n onChangeEmailClick: () => void;\r\n email: string;\r\n}\r\n\r\nconst ResentForm = ({ ref, gridCls, onChangeEmailClick, email }: ResetFormProps) => {\r\n const [otp, setOtp] = useState('');\r\n const [isPending, startTransition] = useTransition();\r\n const navigate = useNavigate();\r\n const inputOTPFieldRef = useRef<HTMLInputElement>(null);\r\n\r\n const handleOnSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n\r\n if (!otp) {\r\n showErrorToast({\r\n header: 'OTP Required!',\r\n description: 'Please enter your OTP and try again.',\r\n });\r\n inputOTPFieldRef.current?.focus();\r\n return;\r\n }\r\n\r\n const reqObj = getFormDataByFormEl(event.currentTarget);\r\n reqObj.otp = otp;\r\n reqObj.user_email = email;\r\n\r\n const isValid = validatePassword(reqObj.password as string);\r\n\r\n if (isValid.valid === false) {\r\n showErrorToast({\r\n header: 'Password Policy',\r\n description: isValid.message,\r\n });\r\n return;\r\n }\r\n\r\n if (reqObj.password !== reqObj.user_password) {\r\n showErrorToast({\r\n header: 'Password and Confirm Password fields contain different passwords.',\r\n description: '',\r\n });\r\n return;\r\n }\r\n\r\n startTransition(async () => {\r\n try {\r\n delete reqObj.password;\r\n\r\n await getAxiosInstance().put('/reset-password', reqObj);\r\n\r\n showSuccessToast({\r\n header: 'Your password has been reset successfully!',\r\n description: 'Please log in using your new password.',\r\n });\r\n\r\n navigate('/login');\r\n } catch (error) {\r\n errorLogger(error);\r\n }\r\n });\r\n };\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => {\r\n return {\r\n focus() {\r\n inputOTPFieldRef.current?.focus();\r\n },\r\n };\r\n },\r\n [],\r\n );\r\n\r\n return (\r\n <form onSubmit={handleOnSubmit} className=\"grid gap-6\">\r\n <div className={gridCls}>\r\n <Label htmlFor=\"emailOTPGenerated\">Email *</Label>\r\n <Input id=\"emailOTPGenerated\" type=\"email\" name=\"user_email\" placeholder=\"mail@example.com\" value={email} disabled required />\r\n <span className=\"ml-auto text-xs underline-offset-4 hover:underline cursor-pointer italic\" onClick={() => onChangeEmailClick()}>\r\n Change Email\r\n </span>\r\n </div>\r\n\r\n <InputOTPField className={gridCls} inputOTPField={inputOTPFieldRef} otp={otp} setOtp={setOtp} onChangeEmailClick={onChangeEmailClick} />\r\n\r\n <div className={gridCls}>\r\n <Label htmlFor=\"password\">\r\n New Password * <PasswordPolicyIBtn />\r\n </Label>\r\n <Input id=\"password\" type=\"password\" name=\"password\" placeholder=\"**********\" required />\r\n </div>\r\n <div className={gridCls}>\r\n <Label htmlFor=\"cnf-password\">Confirm Password *</Label>\r\n <Input id=\"cnf-password\" type=\"password\" name=\"user_password\" placeholder=\"**********\" required />\r\n </div>\r\n <Button type=\"submit\" className=\"w-full\" size={'lg'} loading={isPending}>\r\n Reset Password\r\n </Button>\r\n </form>\r\n );\r\n};\r\n\r\nexport default function ForgotPasswordForm() {\r\n const sendOTPCmp = useRef<HTMLInputElement>(null);\r\n const resetFormCmp = useRef<HTMLInputElement>(null);\r\n const [isOTPGenerated, setIsOTPGenerated] = useState(false);\r\n const [email, setEmail] = useState('');\r\n const gridCls = 'grid gap-1';\r\n\r\n useEffect(() => {\r\n if (isOTPGenerated) {\r\n resetFormCmp.current?.focus();\r\n } else {\r\n sendOTPCmp?.current?.focus();\r\n }\r\n }, [isOTPGenerated]);\r\n\r\n return (\r\n <div className=\"grid gap-6\">\r\n <div className=\"after:border-border relative text-center text-sm after:absolute after:inset-0 after:top-1/2 after:z-0 after:flex after:items-center after:border-t\">\r\n <span className=\"bg-card text-muted-foreground relative z-10 px-2\">Forgot Password</span>\r\n </div>\r\n\r\n <SendOTP\r\n ref={sendOTPCmp}\r\n handleOnOTPSent={(reqObj) => {\r\n setIsOTPGenerated(true);\r\n setEmail(reqObj.email);\r\n }}\r\n gridCls={gridCls}\r\n hidden={isOTPGenerated}\r\n path=\"forgot-password\"\r\n />\r\n\r\n {isOTPGenerated && <ResentForm ref={resetFormCmp} gridCls={gridCls} onChangeEmailClick={() => setIsOTPGenerated(false)} email={email} />}\r\n\r\n <div className=\"text-center text-sm\">\r\n Already have an account?{' '}\r\n <NavLink to=\"/login\">\r\n <span className=\"underline underline-offset-4\">Login</span>\r\n </NavLink>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import BigSquare from '@/components/custom/BigSquare';\r\nimport { appInfo } from '@/config/app-config';\r\nimport AppContext from '@/store/AppContext';\r\nimport { useContext } from 'react';\r\n\r\nconst OrgSetup = () => {\r\n const { orgs } = useContext(AppContext);\r\n\r\n return (\r\n <div className=\"mt-5\">\r\n <div className=\"flex flex-row justify-center gap-6\">\r\n <BigSquare toPath={'create-new-org'} className=\"text-center\">\r\n Create new {appInfo.account_type_txt.singular.toLocaleLowerCase()}\r\n </BigSquare>\r\n\r\n <BigSquare toPath={'user-invitations'} className=\"text-center\">\r\n Accept/Reject Invitations\r\n </BigSquare>\r\n </div>\r\n <div className=\"flex flex-row justify-center gap-6 mt-5\">\r\n <BigSquare toPath={'manage-infra'} className={'text-center'} disabled={orgs.length <= 0}>\r\n Manage {appInfo.account_type_txt.plural.toLocaleLowerCase()}\r\n </BigSquare>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default OrgSetup;\r\n","import { SelectListWrapper } from '@/components/custom';\r\nimport { ROLES } from '@/lib/enums';\r\n\r\ninterface IRolesCmb {\r\n value: string;\r\n setValue: (value: string) => void;\r\n id: string;\r\n}\r\n\r\nconst RolesCmb = ({ value, setValue, id }: IRolesCmb) => {\r\n return (\r\n <SelectListWrapper\r\n valueField=\"id\"\r\n labelField=\"text\"\r\n placeholder=\"Specify Role\"\r\n items={ROLES.GET_LIST()}\r\n value={value}\r\n onValueChange={(value) => {\r\n setValue(value);\r\n }}\r\n triggerClassName=\"w-[180px]\"\r\n id={id}\r\n />\r\n );\r\n};\r\n\r\nexport default RolesCmb;\r\n","import DataTable from '@/components/custom/DataTable/DataTable';\r\nimport DialogWrapper from '@/components/custom/DialogWrapper';\r\nimport InfoButton from '@/components/custom/InfoButton';\r\nimport FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport { TypographyP } from '@/components/custom/Typography/TypographyP';\r\nimport { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Label } from '@/components/ui/label';\r\nimport { Textarea } from '@/components/ui/textarea';\r\nimport useAlertDialog from '@/hooks/useAlertDialog';\r\nimport { appInfo } from '@/config/app-config';\r\nimport { ROLES } from '@/lib/enums';\r\nimport { showErrorToast, showSuccessToast, showWarningToast } from '@/lib/toast-helper';\r\nimport type { EmailProcessingResult, TeamMembersDetails } from '@/lib/types';\r\nimport { isEmailValid, processEmailsWithValidation, INVITATION_ENUMS } from '@/lib/utils';\r\nimport AppContext from '@/store/AppContext';\r\nimport { Files, Pencil, Plus, Trash } from 'lucide-react';\r\nimport { useContext, useEffect, useState } from 'react';\r\nimport RolesCmb from './RolesCmb';\r\n\r\ninterface IncludedUsersProps {\r\n teamMembers: TeamMembersDetails[];\r\n setTeamMembers: (teamMembers: TeamMembersDetails[]) => void;\r\n inactiveUsers: TeamMembersDetails[];\r\n}\r\n\r\nconst canAllowEmailEdit = (record: TeamMembersDetails | undefined, editingRowId: string | number | undefined) => {\r\n return (\r\n editingRowId === -1 ||\r\n // record?.user_opinion === INVITATION_ENUMS.INVITED ||\r\n record?.user_opinion === INVITATION_ENUMS.NOT_SAVED\r\n );\r\n};\r\n\r\nconst IncludedUsers = ({ teamMembers, setTeamMembers, inactiveUsers }: IncludedUsersProps) => {\r\n const [processedEmailsTextArea, setProcessedEmailsTextArea] = useState<EmailProcessingResult>();\r\n const [bulkRole, setBulkRole] = useState(NaN);\r\n\r\n const dlg = useAlertDialog();\r\n\r\n const [editingRowId, setEditingRowId] = useState<string | number | undefined>();\r\n const [isBulkWindowOpen, setIsBulkWindowOpen] = useState<boolean>(false);\r\n const [singleRecFields, setSingleRecFields] = useState<TeamMembersDetails>({\r\n email: '',\r\n role_id: ROLES.READ,\r\n user_opinion: INVITATION_ENUMS.INVITED,\r\n id: '',\r\n });\r\n const { loggedInUser } = useContext(AppContext);\r\n\r\n const addUniqueTeamMembers = (tMembers: TeamMembersDetails[]) => {\r\n const uniqueEmails: { [key: string]: number } = {};\r\n\r\n const newTeamMembers = [...(teamMembers ?? []), ...tMembers];\r\n newTeamMembers.forEach((tMemberRec) => {\r\n const emailKey = tMemberRec.email as string;\r\n\r\n uniqueEmails[emailKey] = uniqueEmails[emailKey] ? uniqueEmails[emailKey]++ : 1;\r\n });\r\n\r\n const result = newTeamMembers.filter((rec) => {\r\n uniqueEmails[rec.email]--;\r\n return uniqueEmails[rec.email] === 0;\r\n });\r\n\r\n setTeamMembers(result);\r\n\r\n return newTeamMembers.length === result.length;\r\n };\r\n\r\n const addBulkEmails = () => {\r\n const { validEmails } = processedEmailsTextArea || {};\r\n\r\n if (!validEmails?.length || validEmails?.length <= 0)\r\n return showWarningToast({\r\n description: 'Please add comma separated emails, then press Continue button',\r\n });\r\n\r\n const data = validEmails.map((email: string) => ({\r\n email,\r\n role_id: bulkRole,\r\n id: email,\r\n user_opinion: INVITATION_ENUMS.INVITED,\r\n }));\r\n\r\n addUniqueTeamMembers(data);\r\n setProcessedEmailsTextArea(undefined);\r\n setIsBulkWindowOpen(false);\r\n\r\n showSuccessToast({\r\n description: `${validEmails?.length} emails has been added.`,\r\n });\r\n };\r\n\r\n const validateFields = (rec: TeamMembersDetails) => {\r\n if (!rec || !rec.email || isEmailValid(rec.email) === false) {\r\n showErrorToast({\r\n description: `Invalid email, please enter correct email and try again.`,\r\n });\r\n return false;\r\n }\r\n\r\n if (!ROLES.IS_VALID_ROLE_ID(rec.role_id)) {\r\n showErrorToast({\r\n description: `Invalid role selected. Please select a valid role and try again.`,\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const addNewTeamMember = () => {\r\n if (!validateFields(singleRecFields)) {\r\n return;\r\n }\r\n\r\n const isAdded = addUniqueTeamMembers([\r\n {\r\n ...singleRecFields,\r\n id: singleRecFields.email,\r\n user_opinion: INVITATION_ENUMS.NOT_SAVED,\r\n },\r\n ]);\r\n\r\n if (!isAdded) {\r\n showErrorToast({\r\n description: `This email is already exists in list: ${singleRecFields.email}`,\r\n });\r\n return;\r\n }\r\n\r\n setEditingRowId(undefined);\r\n };\r\n\r\n const updateTeamMember = () => {\r\n if (!validateFields(singleRecFields)) {\r\n return;\r\n }\r\n\r\n const recordWithSameEmail = teamMembers?.find((teamMemberRec) => {\r\n return teamMemberRec.email === singleRecFields.email && teamMemberRec.id !== editingRowId;\r\n });\r\n\r\n if (recordWithSameEmail) {\r\n showWarningToast({\r\n description: `This email is already exists in list: ${singleRecFields.email}`,\r\n });\r\n return;\r\n }\r\n\r\n const newTeamMembers = [...(teamMembers || [])];\r\n const record = newTeamMembers.find((teamMemberRec) => teamMemberRec.id === editingRowId);\r\n\r\n if (!record) {\r\n showErrorToast({ description: 'Record not found to update, something went wrong!' });\r\n return;\r\n }\r\n\r\n record.email = singleRecFields.email;\r\n record.role_id = singleRecFields.role_id;\r\n\r\n setTeamMembers(newTeamMembers);\r\n setEditingRowId(undefined);\r\n };\r\n\r\n useEffect(() => {\r\n if (!editingRowId) {\r\n setSingleRecFields({\r\n email: '',\r\n role_id: NaN,\r\n user_opinion: INVITATION_ENUMS.INVITED,\r\n id: '',\r\n });\r\n return;\r\n }\r\n\r\n if (editingRowId === -1) return;\r\n\r\n const rec = teamMembers?.find((teamMemberRec) => teamMemberRec.id === editingRowId);\r\n if (!rec) {\r\n showErrorToast({ description: 'Something went wrong, please reload and try again.' });\r\n return;\r\n }\r\n\r\n setSingleRecFields({\r\n email: rec.email,\r\n role_id: rec.role_id,\r\n user_opinion: rec.user_opinion,\r\n id: rec.id || rec.email,\r\n });\r\n }, [editingRowId]);\r\n\r\n return (\r\n <FlexColsLayout layout=\"vertical\" className=\"gap-2\">\r\n {isBulkWindowOpen && (\r\n <DialogWrapper\r\n open={true}\r\n setIsOpen={setIsBulkWindowOpen}\r\n header=\"Bulk Add Users\"\r\n actionsJSX={<Button onClick={addBulkEmails}>Add users</Button>}\r\n >\r\n <FlexColsLayout layout=\"horizontal\" className=\"gap-2\">\r\n <Textarea\r\n id=\"includeUsers\"\r\n placeholder=\"Enter comma separated emailIds like mail1@temp.com, mail2@temp.com\"\r\n className=\"w-full min-h-[80px] max-h-[500px] mr-1\"\r\n onChange={(e) => setProcessedEmailsTextArea(processEmailsWithValidation(e.target.value))}\r\n />\r\n <span>\r\n <InfoButton side=\"right\">Enter comma separated emailIds like mail1@temp.com, mail2@temp.com</InfoButton>\r\n </span>\r\n </FlexColsLayout>\r\n <span className=\"mb-5\">\r\n <span className=\"text-success\">Valid Emails: {processedEmailsTextArea?.validEmails.length || 0}</span>,{' '}\r\n <span className=\"text-failure\">Invalid Emails: {processedEmailsTextArea?.invalidEmails.length || 0}</span>\r\n </span>\r\n\r\n <div className=\"flex flex-row gap-2\">\r\n {/* <Input\r\n type=\"checkbox\"\r\n id=\"areAdmins\"\r\n className=\"w-4\"\r\n checked={areAdmins}\r\n onChange={(e) => setAreAdmins(e.target.checked)}\r\n /> */}\r\n <Label htmlFor=\"roles\">Role *</Label>\r\n <RolesCmb\r\n id=\"bulk-roles\"\r\n value={bulkRole?.toString() || ''}\r\n setValue={(newVal) => {\r\n setBulkRole(Number(newVal));\r\n }}\r\n />\r\n </div>\r\n </DialogWrapper>\r\n )}\r\n {editingRowId && (\r\n <DialogWrapper\r\n open={true}\r\n setIsOpen={(val) => {\r\n setEditingRowId(val === false ? undefined : editingRowId);\r\n }}\r\n header={editingRowId === -1 ? 'Add User' : 'Edit User'}\r\n actionsJSX={\r\n <Button type=\"button\" onClick={editingRowId === -1 ? addNewTeamMember : updateTeamMember}>\r\n Update\r\n </Button>\r\n }\r\n >\r\n <div className=\"flex flex-col p-5 gap-5\">\r\n <div className=\"flex flex-col gap-2\">\r\n <Label htmlFor=\"email\">Email *</Label>\r\n <Input\r\n id=\"email\"\r\n type=\"email\"\r\n placeholder=\"mail@example.com\"\r\n value={singleRecFields.email}\r\n disabled={canAllowEmailEdit(singleRecFields, editingRowId) === false}\r\n onChange={(e) =>\r\n setSingleRecFields((prev) => ({\r\n ...prev,\r\n email: e.target.value,\r\n }))\r\n }\r\n />\r\n </div>\r\n <div className=\"flex flex-col gap-2 \">\r\n {/* <Input\r\n type=\"checkbox\"\r\n id=\"isAdmin\"\r\n className=\"w-4\"\r\n checked={singleRecFields.isAdmin}\r\n onChange={(e) =>\r\n setSingleRecFields((prev) => ({\r\n ...prev,\r\n isAdmin: e.target.checked,\r\n }))\r\n }\r\n /> */}\r\n <Label htmlFor=\"roles\">Role *</Label>\r\n <RolesCmb\r\n id=\"roles\"\r\n value={singleRecFields.role_id?.toString() || ''}\r\n setValue={(newVal) => {\r\n setSingleRecFields((prev) => ({\r\n ...prev,\r\n role_id: Number(newVal),\r\n }));\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </DialogWrapper>\r\n )}\r\n <DataTable\r\n canShowToolbar={true}\r\n canShowPagination={false}\r\n data={teamMembers || []}\r\n toolbarConfig={{\r\n canShowSearchField: false,\r\n canShowColumnsBtn: false,\r\n additionalJSX: [\r\n <Button\r\n variant=\"secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n // const newNode = {\r\n // email: '',\r\n // isAdmin: false,\r\n // id: generateRandom4Digits().toString(),\r\n // };\r\n // setTeamMembers((prev) => [...(prev ?? []), newNode]);\r\n setEditingRowId(-1);\r\n }}\r\n >\r\n <Plus /> Add User\r\n </Button>,\r\n\r\n <Button\r\n variant=\"outline\"\r\n type=\"button\"\r\n onClick={() => {\r\n setIsBulkWindowOpen(true);\r\n }}\r\n >\r\n <Files /> Bulk Add\r\n </Button>,\r\n ],\r\n }}\r\n columns={[\r\n {\r\n id: 'email',\r\n headerText: 'Email',\r\n enableSorting: false,\r\n enableHiding: false,\r\n editable: true,\r\n },\r\n {\r\n id: 'role_id',\r\n headerText: 'Role',\r\n enableSorting: false,\r\n enableHiding: false,\r\n editable: true,\r\n type: 'string',\r\n renderer(_, cellValue) {\r\n return ROLES.DISPLAY_TEXT(cellValue as number);\r\n },\r\n },\r\n {\r\n id: 'user_opinion',\r\n headerText: 'Status',\r\n enableSorting: false,\r\n enableHiding: false,\r\n type: 'boolean',\r\n editable: false,\r\n renderer(record: any) {\r\n const { user_opinion } = record.original;\r\n return INVITATION_ENUMS.getDisplay(user_opinion);\r\n },\r\n },\r\n {\r\n id: 'joinedOn',\r\n headerText: 'Joined On',\r\n enableSorting: false,\r\n enableHiding: false,\r\n type: 'date',\r\n editable: true,\r\n },\r\n {\r\n id: 'actions',\r\n headerText: 'Actions',\r\n enableSorting: false,\r\n enableHiding: false,\r\n renderer(record: any) {\r\n const { id: rowId } = record?.original;\r\n return (\r\n <>\r\n <Button\r\n variant={'ghost'}\r\n onClick={() => {\r\n const record = teamMembers?.find((record) => record.id === rowId);\r\n const fullName = record?.fname || record?.lname ? `${record?.fname} ${record?.lname}` : record?.email;\r\n\r\n if (record?.email === loggedInUser?.email) {\r\n showWarningToast({\r\n header: `Not allowed to edit \"${fullName}\"`,\r\n description: `If you want to leave this ${appInfo.account_type_txt.singular.toLocaleLowerCase()}, go to \"Manage ${\r\n appInfo.account_type_txt.singular\r\n },\" open the actions menu (three dots), and click \"Leave ${appInfo.account_type_txt.singular}.\"`,\r\n });\r\n return;\r\n }\r\n\r\n if (canAllowEmailEdit(record, undefined) === false) {\r\n //showing just waring here..\r\n showWarningToast({\r\n header: `Not allowed to edit email \"${fullName}\", however you can update its administrative privileges.`,\r\n description: `The invitation has been already sent. If you do not want this user as a team member, you can delete them and correct one.`,\r\n });\r\n // return;\r\n }\r\n\r\n setEditingRowId(rowId);\r\n }}\r\n type=\"button\"\r\n >\r\n <Pencil />\r\n </Button>\r\n\r\n <Button\r\n variant={'ghost'}\r\n onClick={() => {\r\n const record = teamMembers?.find((record) => record.id === rowId);\r\n const fullName = record?.fname || record?.lname ? `${record?.fname} ${record?.lname}` : record?.email;\r\n\r\n if (record?.email === loggedInUser?.email) {\r\n showWarningToast({\r\n header: `Not allowed to remove \"${fullName}\"`,\r\n description: `If you want to leave this ${appInfo.account_type_txt.singular}, go to \"Manage ${appInfo.account_type_txt.singular},\" open the actions menu (three dots), and click \"Leave ${appInfo.account_type_txt.singular}.\"`,\r\n });\r\n return;\r\n }\r\n\r\n dlg.showAlertBox({\r\n type: 'CONFIRM',\r\n text: `Are you sure you want to remove \"${fullName}\" user?`,\r\n async onClose(result) {\r\n if (result !== 'CONFIRM') {\r\n return;\r\n }\r\n\r\n setTeamMembers(teamMembers?.filter((record) => record.id !== rowId));\r\n },\r\n });\r\n }}\r\n type=\"button\"\r\n >\r\n <Trash />\r\n </Button>\r\n </>\r\n );\r\n },\r\n },\r\n ]}\r\n />\r\n {inactiveUsers.length > 0 && (\r\n <>\r\n <TypographyP className={'mt-5 leading-normal font-semibold'}>Following users are inactive/deleted.</TypographyP>\r\n <ol>\r\n {inactiveUsers.map((user, index) => (\r\n <li key={user.email}>\r\n {index + 1}.&nbsp;\r\n {user.email}&nbsp;\r\n {ROLES.DISPLAY_TEXT(user.role_id)}\r\n </li>\r\n ))}\r\n </ol>\r\n </>\r\n )}\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default IncludedUsers;\r\n","import FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport TabularLayout from '@/components/custom/Layouts/TabularLayout';\r\nimport { TypographyHeading } from '@/components/custom/Typography/TypographyHeading';\r\nimport { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { getFormDataByFormEl, isObjectEmpty, isTruthyValue, isValidId, undoPublicId } from '@/lib/utils';\r\nimport AppContext from '@/store/AppContext';\r\nimport { Label } from '@radix-ui/react-label';\r\nimport { useContext, useEffect, useRef, useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router';\r\nimport IncludedUsers from './components/IncludedUsers';\r\nimport type { OrganizationType, OrganizationTypeResponse, responseTeamMembersInf, TeamMembersDetails } from '@/lib/types';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showErrorToast, showSuccessToast } from '@/lib/toast-helper';\r\nimport { APP_INFO_ACCOUNT_TYPE, appInfo } from '@/config/app-config';\r\nimport { ROLES } from '@/lib/enums';\r\nimport { TypographyP } from '@/components/custom/Typography/TypographyP';\r\nimport { Trash } from 'lucide-react';\r\nimport useOrgHelper from './hooks/useOrgHelper';\r\nimport { Separator } from '@/components/ui/separator';\r\nimport PremiumIcon from '../Subscriptions/components/PremiumIcon';\r\n\r\nconst CreateOrg = () => {\r\n const navigate = useNavigate();\r\n\r\n const { orgId = '' } = useParams();\r\n const [id, setId] = useState<number>(() => {\r\n return orgId ? undoPublicId(parseInt(orgId, 10)) : -1;\r\n });\r\n\r\n const [canShowTeamMembers, setCanShowTeamMembers] = useState(false);\r\n const [teamMembers, setTeamMembers] = useState<TeamMembersDetails[]>([]);\r\n const [unregisteredUsers, setUnregisteredUsers] = useState<Partial<TeamMembersDetails>[]>([]);\r\n const [inactiveUsers, setInactiveUsers] = useState<TeamMembersDetails[]>([]);\r\n const [areTeamMembersLoading, setAreTeamMembersLoading] = useState<boolean | string>(false);\r\n const initializedTeamMembers = useRef<TeamMembersDetails[]>([]);\r\n const [unregisteredUserLoading, setUnregisteredUsersLoading] = useState<boolean>();\r\n\r\n const { orgs, setOrgs, loggedInUser } = useContext(AppContext);\r\n const orgRecord = id > -1 ? orgs.find((rec) => rec.org_id === id) : null;\r\n const isEditMode = id > -1 || orgRecord;\r\n\r\n const { handleOnDeleteUnregisteredUser } = useOrgHelper();\r\n\r\n useEffect(() => {\r\n if (!isEditMode) return;\r\n\r\n const convertServerToLocalFields = (members: responseTeamMembersInf[]) => {\r\n return members.map((rec) => ({\r\n id: rec.user_id,\r\n email: rec.user_email,\r\n role_id: rec.role_id,\r\n user_opinion: rec.user_opinion,\r\n fname: rec.user_fname,\r\n lname: rec.user_lname,\r\n joinedOn: rec.joined_on,\r\n }));\r\n };\r\n\r\n const fetchTeamMembers = async () => {\r\n setAreTeamMembersLoading('Fetching Team Members');\r\n try {\r\n const responseTeamMembers: {\r\n orgMembers: responseTeamMembersInf[];\r\n unregisteredUsers: Partial<responseTeamMembersInf>[];\r\n } = await getAxiosInstance().get(`org-member/${id}`);\r\n\r\n const orgMembers = responseTeamMembers.orgMembers.filter((rec) => isTruthyValue(rec.is_active));\r\n\r\n const tMembers: TeamMembersDetails[] = convertServerToLocalFields(orgMembers);\r\n\r\n const unregistered = responseTeamMembers.unregisteredUsers.map((rec) => ({\r\n role_id: rec.role_id,\r\n email: rec.email,\r\n id: rec.invited_users_id,\r\n }));\r\n\r\n const inactiveUsers_deleted = responseTeamMembers.orgMembers.filter((rec) => !isTruthyValue(rec.is_active));\r\n\r\n setTeamMembers(tMembers);\r\n setCanShowTeamMembers(true);\r\n setUnregisteredUsers(unregistered);\r\n setInactiveUsers(convertServerToLocalFields(inactiveUsers_deleted));\r\n initializedTeamMembers.current = structuredClone(tMembers);\r\n } finally {\r\n setAreTeamMembersLoading(false);\r\n }\r\n };\r\n\r\n fetchTeamMembers();\r\n }, [isEditMode, id]);\r\n\r\n const putData = (newRecord: OrganizationType) => {\r\n const reqData: Partial<OrganizationType> = {},\r\n oldData = orgRecord;\r\n\r\n if (newRecord.org_name !== oldData?.org_name && newRecord.org_name) {\r\n reqData.org_name = newRecord.org_name;\r\n }\r\n if (newRecord.org_address !== oldData?.org_address && newRecord.org_address) {\r\n reqData.org_address = newRecord.org_address;\r\n }\r\n if (newRecord.org_state !== oldData?.org_state && newRecord.org_state) {\r\n reqData.org_state = newRecord.org_state;\r\n }\r\n if (newRecord.org_country !== oldData?.org_country && newRecord.org_country) {\r\n reqData.org_country = newRecord.org_country;\r\n }\r\n if (newRecord.org_external_id !== oldData?.org_external_id && newRecord.org_external_id) {\r\n reqData.org_external_id = newRecord.org_external_id;\r\n }\r\n\r\n if (isObjectEmpty(reqData)) {\r\n return;\r\n }\r\n\r\n return getAxiosInstance().put(`/organization/${orgRecord?.org_id}`, reqData);\r\n };\r\n\r\n const postData = async (newRecord: OrganizationType) => {\r\n const reqData = {\r\n org_name: newRecord.org_name,\r\n org_address: newRecord.org_address,\r\n org_state: newRecord.org_state,\r\n org_country: newRecord.org_country,\r\n org_external_id: newRecord.org_external_id,\r\n };\r\n\r\n return getAxiosInstance().post(`/organization`, reqData);\r\n };\r\n\r\n const handleOnSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n\r\n setAreTeamMembersLoading('Saving...');\r\n\r\n try {\r\n let orgId = orgRecord?.org_id;\r\n\r\n const data = getFormDataByFormEl(event.currentTarget) as unknown as OrganizationType;\r\n // console.log('old orgData:', orgRecord);\r\n // console.log('new orgData:', data);\r\n if (isEditMode) {\r\n //if error, then below code will not execute.\r\n await putData(data);\r\n } else {\r\n const res = (await postData(data)) as unknown as { insertedOrgId: string };\r\n orgId = parseInt(res.insertedOrgId, 10);\r\n\r\n if (isValidId(orgId) === false) {\r\n showErrorToast({\r\n description: `No response received from the ${appInfo.account_type_txt.singular.toLocaleLowerCase()} service. Returning to the Manage ${\r\n appInfo.account_type_txt.singular\r\n } page.`,\r\n });\r\n setTimeout(() => {\r\n navigate('/infrastructure/manage-infra');\r\n }, 1000);\r\n }\r\n }\r\n\r\n const handleSuccess = (isTeamMemberAdded: boolean) => {\r\n showSuccessToast({\r\n description: `${appInfo.account_type_txt.singular} has been ${isEditMode ? 'updated' : 'created'} successfully.${\r\n isTeamMemberAdded ? ' Team members have also been updated successfully and sent invitation emails.' : ''\r\n }`,\r\n });\r\n\r\n navigate('/infrastructure/manage-infra');\r\n };\r\n\r\n if (!canShowTeamMembers) return handleSuccess(false);\r\n\r\n try {\r\n const initialValues = initializedTeamMembers.current;\r\n // console.log('original: ', initializedTeamMembers.current);\r\n // console.log('new', teamMembers);\r\n\r\n const needToRemoveTeamMembers = initialValues.filter((rec) => !teamMembers.find((teamMemberRec) => rec.email === teamMemberRec.email));\r\n // console.log('needToRemoveTeamMembers', needToRemoveTeamMembers);\r\n if (needToRemoveTeamMembers && needToRemoveTeamMembers.length > 0) {\r\n const reqParams = {\r\n org_id: orgId,\r\n users: needToRemoveTeamMembers.map((rec) => ({\r\n user_id: rec.id,\r\n // is_admin: rec.isAdmin,\r\n })),\r\n };\r\n\r\n await getAxiosInstance().delete('/org-member', { data: reqParams });\r\n }\r\n\r\n const needToUpdate = teamMembers.filter((rec) => {\r\n const tMemberRec = initialValues.find((teamMemberRec) => rec.id === teamMemberRec.id);\r\n\r\n if (!tMemberRec) return false; //here means, this record might be deleted.\r\n if (tMemberRec.role_id === rec.role_id) return false; //nothing has changed.\r\n\r\n return true;\r\n });\r\n\r\n // console.log('needToUpdate', needToUpdate);\r\n if (needToUpdate && needToUpdate.length > 0) {\r\n const reqParams = {\r\n org_id: orgId,\r\n users: needToUpdate.map((rec) => ({\r\n user_id: rec.id,\r\n role_id: rec.role_id,\r\n })),\r\n };\r\n\r\n await getAxiosInstance().put('/org-member', reqParams);\r\n }\r\n\r\n const needToNewAddTeamMembers = teamMembers.filter((teamMemberRec) => !initialValues.find((rec) => rec.email === teamMemberRec.email));\r\n if (needToNewAddTeamMembers && needToNewAddTeamMembers.length > 0) {\r\n const reqParams = {\r\n org_id: orgId,\r\n included_users: needToNewAddTeamMembers.map((rec) => ({\r\n email: rec.email,\r\n role_id: rec.role_id,\r\n })),\r\n };\r\n\r\n await getAxiosInstance().post('/org-member/by-emails', reqParams);\r\n }\r\n // console.log('needToNewAddTeamMembers', needToNewAddTeamMembers);\r\n\r\n handleSuccess(true);\r\n } finally {\r\n setId(orgId || -1);\r\n }\r\n } finally {\r\n setAreTeamMembersLoading(false);\r\n const orgsRes = (await getAxiosInstance().get('organization')) as OrganizationTypeResponse;\r\n setOrgs(orgsRes?.orgs || []);\r\n }\r\n };\r\n\r\n const defaultOrgName = isEditMode\r\n ? orgRecord?.org_name\r\n : `${loggedInUser?.fname}'s ${appInfo.account_type_txt.singular} ${orgs.length >= 1 ? orgs.length + 1 : ''}`;\r\n\r\n return (\r\n <FlexColsLayout className=\"pb-5 sm:px-0 px-5 pt-5\">\r\n <FlexColsLayout layout=\"horizontal\">\r\n <span className=\"md:flex-1 flex-none\"></span>\r\n <FlexColsLayout className=\"flex-4 max-w-4xl pr-5 sm:pl-0 pl-2 overflow-visible\">\r\n <TypographyHeading className=\"text-center pl-5 gap-1\">\r\n <span className=\"inline-flex items-center gap-2\">\r\n {isEditMode\r\n ? `Editing \"${orgRecord?.org_name}\" ${appInfo.account_type_txt.singular}`\r\n : `Create new ${appInfo.account_type_txt.singular}`}\r\n {isEditMode && orgRecord?.active_purchased_plan ? <PremiumIcon purchasedPlan={orgRecord?.active_purchased_plan} /> : null}\r\n </span>\r\n </TypographyHeading>\r\n\r\n <form onSubmit={handleOnSubmit}>\r\n <TabularLayout\r\n className=\"w-full pr-1 mt-2 text-sm\"\r\n leftCls=\"w-32 sm:w-36 md:w-40 w-full sm:w-40 text-left sm:text-right pr-0 sm:pr-2 pt-3 sm:pt-7\"\r\n rightCls=\"pt-1 sm:pt-5\"\r\n rowCls=\"flex-col sm:flex-row\"\r\n child={[\r\n <Label htmlFor=\"orgName\" className=\"font-medium\">\r\n {appInfo.account_type_txt.singular} Name * :\r\n </Label>,\r\n <Input\r\n id=\"orgName\"\r\n name=\"org_name\"\r\n type=\"text\"\r\n required\r\n className=\"w-full\"\r\n defaultValue={orgRecord?.org_name ?? defaultOrgName}\r\n autoFocus\r\n />,\r\n\r\n ...(appInfo.account_type_txt.value === APP_INFO_ACCOUNT_TYPE.ORG\r\n ? [\r\n <Label htmlFor=\"address\" className=\"font-medium\">\r\n Address * :\r\n </Label>,\r\n <Input id=\"address\" name=\"org_address\" type=\"text\" required className=\"w-full\" defaultValue={orgRecord?.org_address ?? ''} />,\r\n\r\n <Label htmlFor=\"state\" className=\"font-medium\">\r\n State * :\r\n </Label>,\r\n <Input id=\"state\" name=\"org_state\" type=\"text\" required className=\"w-full\" defaultValue={orgRecord?.org_state ?? ''} />,\r\n <Label htmlFor=\"country\" className=\"font-medium\">\r\n Country * :\r\n </Label>,\r\n <Input id=\"country\" name=\"org_country\" type=\"text\" required className=\"w-full\" defaultValue={orgRecord?.org_country ?? ''} />,\r\n ]\r\n : []),\r\n\r\n <Label htmlFor=\"org_external_id\" className=\"font-medium\">\r\n External Id (optional) :\r\n </Label>,\r\n <Input id=\"org_external_id\" name=\"org_external_id\" type=\"text\" className=\"w-full\" defaultValue={orgRecord?.org_external_id ?? ''} />,\r\n\r\n <></>,\r\n <FlexColsLayout layout=\"horizontal\">\r\n <Input\r\n id=\"doIncludeUsers\"\r\n type=\"checkbox\"\r\n className=\"w-4\"\r\n checked={canShowTeamMembers}\r\n onChange={(e) => setCanShowTeamMembers(e.target.checked)}\r\n />\r\n <Label htmlFor=\"doIncludeUsers\" className=\"font-medium mt-2 ml-1\">\r\n Would you like to invite your team members in this {appInfo.account_type_txt.singular}?\r\n </Label>\r\n </FlexColsLayout>,\r\n ...(canShowTeamMembers\r\n ? [\r\n <Label htmlFor=\"includeUsers\" className=\"font-medium\">\r\n Team Members:\r\n </Label>,\r\n\r\n <IncludedUsers teamMembers={teamMembers} setTeamMembers={setTeamMembers} inactiveUsers={inactiveUsers} />,\r\n ]\r\n : []),\r\n\r\n <></>,\r\n <div className=\"flex gap-2 pt-2\">\r\n <Button type=\"submit\" className=\"flex-1 sm:flex-none\" loading={!!areTeamMembersLoading}>\r\n {areTeamMembersLoading ? areTeamMembersLoading : 'Save'}\r\n </Button>\r\n <Button type=\"button\" variant=\"outline\" className=\"flex-1 sm:flex-none\" onClick={() => navigate(-1)}>\r\n Cancel\r\n </Button>\r\n {/* <Button type=\"reset\" variant=\"outline\" className=\"flex-1 sm:flex-none\">\r\n Reset\r\n </Button> */}\r\n </div>,\r\n <></>,\r\n <></>,\r\n\r\n <></>,\r\n <>{unregisteredUsers.length > 0 && <Separator />}</>,\r\n\r\n <>{unregisteredUsers.length > 0 && 'Unregistered Users:'}</>,\r\n <>\r\n {unregisteredUsers.length > 0 && (\r\n <FlexColsLayout loading={unregisteredUserLoading}>\r\n <TypographyP className={'mt-2 leading-normal font-semibold'}>\r\n Following users are unregistered. We have sent them invitation emails; once they accept, they will be part of this{' '}\r\n {appInfo.account_type_txt.singular.toLocaleLowerCase()}.\r\n </TypographyP>\r\n <ol>\r\n {unregisteredUsers.map((user, index) => (\r\n <li key={user.email} className=\"mt-1\">\r\n <span className=\"inline-flex group\">\r\n <span>\r\n {index + 1}.&nbsp;\r\n {user.email}, (role: &nbsp;\r\n {ROLES.DISPLAY_TEXT(user.role_id as number)})\r\n </span>\r\n {/* <span title=\"Edit\">\r\n <Pencil\r\n size={'15px'}\r\n className=\"opacity-40 group-hover:opacity-60 hover:opacity-100 ml-1 mt-0.5 cursor-pointer\"\r\n onClick={() => console.log('123')}\r\n />\r\n </span> */}\r\n <span title=\"Delete\">\r\n <Trash\r\n size={'15px'}\r\n className=\"opacity-40 group-hover:opacity-60 hover:opacity-100 ml-1 mt-0.5 cursor-pointer\"\r\n onClick={async () => {\r\n try {\r\n setUnregisteredUsersLoading(true);\r\n await handleOnDeleteUnregisteredUser(user, id);\r\n\r\n const copyUsers = [...unregisteredUsers];\r\n copyUsers.splice(index, 1);\r\n setUnregisteredUsers(copyUsers);\r\n } finally {\r\n setUnregisteredUsersLoading(false);\r\n }\r\n }}\r\n />\r\n </span>\r\n </span>\r\n </li>\r\n ))}\r\n </ol>\r\n </FlexColsLayout>\r\n )}\r\n </>,\r\n ]}\r\n />\r\n </form>\r\n </FlexColsLayout>\r\n <span className=\"md:flex-1 flex-none\"></span>\r\n </FlexColsLayout>\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default CreateOrg;\r\n","import FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport TabularLayout from '@/components/custom/Layouts/TabularLayout';\r\nimport LinkWrapper from '@/components/custom/LinkWrapper';\r\nimport LoadingCmp from '@/components/custom/LoadingCmp';\r\nimport { TypographyP } from '@/components/custom/Typography/TypographyP';\r\nimport { Button } from '@/components/ui/button';\r\nimport { Label } from '@/components/ui/label';\r\nimport useAlertDialog from '@/hooks/useAlertDialog';\r\nimport useFetchData from '@/hooks/useFetchData';\r\nimport { appInfo } from '@/config/app-config';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showSuccessToast } from '@/lib/toast-helper';\r\nimport type { IEachInvitation, IInvitationsResponse, OrganizationTypeResponse } from '@/lib/types';\r\nimport { formatISODateWithTime24H, isTruthyValue, INVITATION_ENUMS } from '@/lib/utils';\r\nimport AppContext from '@/store/AppContext';\r\nimport { Check, X } from 'lucide-react';\r\nimport { useContext, useState } from 'react';\r\n\r\nconst JoinOrg = () => {\r\n const { loading: fetchingInvitations, response: invitationsResponse } = useFetchData<IInvitationsResponse>('/invitation');\r\n\r\n const dlg = useAlertDialog();\r\n\r\n const invitations = invitationsResponse?.invites.filter((rec) => rec.user_opinion !== INVITATION_ENUMS.ACCEPTED);\r\n\r\n const [isSaving, setIsSaving] = useState(-1);\r\n\r\n const { setOrgs } = useContext(AppContext);\r\n\r\n const respondToInvitation = async (selectedOption: (typeof INVITATION_ENUMS)[keyof typeof INVITATION_ENUMS], org: IEachInvitation) => {\r\n if (!org) return;\r\n try {\r\n const orgId = parseInt(org.org_id, 10);\r\n setIsSaving(orgId);\r\n\r\n const reqJson = {\r\n org_id: orgId,\r\n user_opinion: selectedOption,\r\n };\r\n\r\n await getAxiosInstance().put('/invitation', reqJson);\r\n\r\n const orgsRes = (await getAxiosInstance().get('organization')) as OrganizationTypeResponse;\r\n setOrgs(orgsRes?.orgs || []);\r\n\r\n //locally setting this flag, to filter out the invitations\r\n org.user_opinion = INVITATION_ENUMS.ACCEPTED;\r\n\r\n showSuccessToast({\r\n description: `Invitation for ${org.org_name} ${appInfo.account_type_txt.singular} has been ${\r\n selectedOption === INVITATION_ENUMS.ACCEPTED ? 'accepted' : 'rejected'\r\n } successfully.`,\r\n });\r\n } finally {\r\n setIsSaving(-1);\r\n }\r\n };\r\n\r\n const contentJSX = () => {\r\n if (fetchingInvitations) {\r\n return (\r\n <span>\r\n <FlexColsLayout layout=\"horizontal\" className=\"text-center mt-5 justify-center items-center\">\r\n <LoadingCmp />\r\n </FlexColsLayout>\r\n </span>\r\n );\r\n }\r\n\r\n if (!invitations || invitations.length <= 0) {\r\n return (\r\n <TypographyP className=\"text-center mt-5\">\r\n You don't have any invitations from any {appInfo.account_type_txt.singular.toLocaleLowerCase()}.\r\n </TypographyP>\r\n );\r\n }\r\n\r\n const rows = invitations\r\n .filter((rec) => isTruthyValue(rec.org_user_is_active))\r\n .map((rec) => [\r\n <Label className=\"font-normal\">\r\n <span className=\"font-semibold\">{rec.org_name},</span>sent on &nbsp;\r\n {formatISODateWithTime24H(rec.sent_at)}\r\n </Label>,\r\n <FlexColsLayout className=\"gap-1 justify-end pr-3\" layout=\"horizontal\">\r\n <Button\r\n onClick={() => respondToInvitation(INVITATION_ENUMS.ACCEPTED, rec)}\r\n loading={isSaving === parseInt(rec.org_id, 10)}\r\n disabled={isSaving !== -1}\r\n className=\"bg-green-500 hover:bg-green-600\"\r\n >\r\n <Check /> Accept\r\n </Button>\r\n <Button\r\n variant={'destructive'}\r\n loading={isSaving === parseInt(rec.org_id, 10)}\r\n disabled={isSaving !== -1}\r\n onClick={() => {\r\n dlg.showAlertBox({\r\n type: 'CONFIRM',\r\n text: `Are you sure you want to reject this ${appInfo.account_type_txt.singular.toLocaleLowerCase()} request? You can't re-join until an administrator invites you again.`,\r\n async onClose(result) {\r\n if (result !== 'CONFIRM') {\r\n return;\r\n }\r\n\r\n respondToInvitation(INVITATION_ENUMS.REJECTED, rec);\r\n },\r\n });\r\n }}\r\n >\r\n <X /> Reject\r\n </Button>\r\n </FlexColsLayout>,\r\n ]);\r\n\r\n return (\r\n <TabularLayout\r\n className=\"w-full mt-5 text-sm border-b-1\"\r\n leftCls=\"w-full sm:w-100 text-left sm:text-right pt-3\"\r\n rightCls=\"sm:pt-0 pt-2\"\r\n rowCls=\"flex-col sm:flex-row border-t-1 p-2 hover:bg-muted\"\r\n child={rows.flat()}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <FlexColsLayout layout=\"horizontal\">\r\n <span className=\"md:flex-1 flex-none\"></span>\r\n <FlexColsLayout className=\"flex-4 max-w-4xl mt-5\">\r\n {/* <TypographyHeading className=\"text-center pl-4\">Invitations</TypographyHeading> */}\r\n <FlexColsLayout>\r\n {contentJSX()}\r\n <span className=\"mt-5 text-center\">\r\n <Button className=\"mt-5\" variant={'link'}>\r\n <LinkWrapper to={'/infrastructure/manage-infra'}>View all {appInfo.account_type_txt.plural.toLocaleLowerCase()}</LinkWrapper>\r\n </Button>\r\n </span>\r\n </FlexColsLayout>\r\n </FlexColsLayout>\r\n <span className=\"md:flex-1 flex-none\"></span>\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default JoinOrg;\r\n","import { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Separator } from \"@/components/ui/separator\"\n\nconst buttonGroupVariants = cva(\n \"flex w-fit items-stretch [&>*]:focus-visible:z-10 [&>*]:focus-visible:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md has-[>[data-slot=button-group]]:gap-2\",\n {\n variants: {\n orientation: {\n horizontal:\n \"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none\",\n vertical:\n \"flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n }\n)\n\nfunction ButtonGroup({\n className,\n orientation,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof buttonGroupVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"button-group\"\n data-orientation={orientation}\n className={cn(buttonGroupVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupText({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot : \"div\"\n\n return (\n <Comp\n className={cn(\n \"bg-muted flex items-center gap-2 rounded-md border px-4 text-sm font-medium shadow-xs [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"button-group-separator\"\n orientation={orientation}\n className={cn(\n \"bg-input relative !m-0 self-stretch data-[orientation=vertical]:h-auto\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n ButtonGroup,\n ButtonGroupSeparator,\n ButtonGroupText,\n buttonGroupVariants,\n}\n","import FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport { Button } from '@/components/ui/button';\r\nimport { ButtonGroup } from '@/components/ui/button-group';\r\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';\r\nimport { useIsMobile } from '@/hooks/useIsMobile';\r\nimport { appInfo } from '@/config/app-config';\r\nimport AppContext from '@/store/AppContext';\r\nimport { ArrowLeft, LogOut, Menu, X } from 'lucide-react';\r\nimport { useContext } from 'react';\r\nimport { NavLink, Outlet, useLocation, useNavigate } from 'react-router';\r\n\r\nconst OrgRootLayout = () => {\r\n const { orgs, featureFlags } = useContext(AppContext);\r\n const forceOrgJoin = featureFlags.ff_enable_teams && orgs.length === 0;\r\n const location = useLocation();\r\n const navigate = useNavigate();\r\n const isMobile = useIsMobile();\r\n\r\n const canShowBackBtn = () => {\r\n if (location.pathname === '/infrastructure') return false;\r\n return true;\r\n };\r\n\r\n const navItems = [\r\n ...(featureFlags.ff_enable_teams\r\n ? [\r\n {\r\n title: appInfo.account_type_txt.plural,\r\n url: '/infrastructure/manage-infra',\r\n },\r\n {\r\n title: 'Invitations',\r\n url: '/infrastructure/user-invitations',\r\n },\r\n ]\r\n : []),\r\n ...(featureFlags.ff_enable_paid_subscription\r\n ? [\r\n {\r\n title: 'Subscriptions',\r\n url: '/infrastructure/manage-subscription',\r\n },\r\n {\r\n title: 'Payment History',\r\n url: '/infrastructure/payment-history',\r\n },\r\n ]\r\n : []),\r\n ];\r\n\r\n const canShowNavItems = () => {\r\n return navItems.some((item) => item.url === location.pathname);\r\n };\r\n\r\n return (\r\n <FlexColsLayout className=\"h-screen sm:pt-10 pt-5\">\r\n <div className=\"scroll-m-20 text-xl inline-flex gap-2 px-5 pb-5\">\r\n {canShowBackBtn() && (\r\n <Button variant={'ghost'} onClick={() => navigate(-1)}>\r\n <ArrowLeft size={20} /> Back\r\n </Button>\r\n )}\r\n <span className=\"flex-1\"></span>\r\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\">\r\n <appInfo.logo className=\"size-4\" />\r\n </div>\r\n <div className=\"grid text-left leading-tight items-center text-foreground font-semibold tracking-tight\">{appInfo.appName}</div>\r\n <span className=\"flex-1\"></span>\r\n {forceOrgJoin ? (\r\n <NavLink to=\"/login\">\r\n <Button variant={'ghost'}>\r\n <LogOut />\r\n Log out\r\n </Button>\r\n </NavLink>\r\n ) : (\r\n <NavLink to={'/'}>\r\n <Button variant={'ghost'} title=\"close\">\r\n <X size={20} />\r\n </Button>\r\n </NavLink>\r\n )}\r\n </div>\r\n {canShowNavItems() && (\r\n <FlexColsLayout doNotAppendFlex1={true} className=\"mx-auto mb-4\">\r\n {isMobile ? (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"default\">\r\n <Menu />\r\n Menu\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent>\r\n {navItems.map((item) => (\r\n <DropdownMenuItem key={item.title} onClick={() => navigate(item.url)}>\r\n {item.title}\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n ) : (\r\n <ButtonGroup>\r\n {navItems.map((item) => (\r\n <Button key={item.title} variant={location.pathname === item.url ? 'default' : 'outline'} onClick={() => navigate(item.url)}>\r\n {item.title}\r\n </Button>\r\n ))}\r\n </ButtonGroup>\r\n )}\r\n </FlexColsLayout>\r\n )}\r\n {/* <Separator /> */}\r\n <Outlet />\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default OrgRootLayout;\r\n","import DataTable from '@/components/custom/DataTable/DataTable';\r\nimport LinkWrapper from '@/components/custom/LinkWrapper';\r\nimport { Button } from '@/components/ui/button';\r\nimport useAlertDialog from '@/hooks/useAlertDialog';\r\nimport { APP_INFO_ACCOUNT_TYPE, appInfo } from '@/config/app-config';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { ROLES } from '@/lib/enums';\r\nimport { showSuccessToast, showWarningToast } from '@/lib/toast-helper';\r\nimport type { OrganizationType, OrganizationTypeResponse, purchasedPlansInf } from '@/lib/types';\r\nimport AppContext from '@/store/AppContext';\r\nimport { Check, Plus, X } from 'lucide-react';\r\nimport { useContext, useState } from 'react';\r\nimport useOrgHelper from './hooks/useOrgHelper';\r\nimport { INVITATION_ENUMS } from '@/lib/utils';\r\nimport FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport PremiumIcon from '../Subscriptions/components/PremiumIcon';\r\nimport { useNavigate } from 'react-router';\r\n\r\nconst ManageOrgs = () => {\r\n const { orgs, setOrgs, featureFlags, loggedInUser, setActiveOrg } = useContext(AppContext);\r\n const dlg = useAlertDialog();\r\n const [loading, setLoading] = useState(false);\r\n const navigate = useNavigate();\r\n const { editOrganization } = useOrgHelper();\r\n\r\n const reloadData = async () => {\r\n setLoading(true);\r\n try {\r\n const orgsRes = (await getAxiosInstance().get('organization')) as OrganizationTypeResponse;\r\n setOrgs(orgsRes?.orgs || []);\r\n } catch {\r\n setOrgs([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // useEffect(() => {\r\n // reloadData();\r\n // }, []);\r\n\r\n return (\r\n <FlexColsLayout>\r\n <div className=\"flex-1 flex p-5 sm:px-10 px-4 flex-col sm:w-300 m:w-full w-full mx-auto\">\r\n {/* <TypographyHeading className=\"inline-flex mb-4\">\r\n <div className=\"p-1.5 sm:p-2 rounded-lg bg-primary/10 ring-1 ring-primary/20\">\r\n <UsersRound className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\r\n </div>\r\n <span className=\"ml-2\">{appInfo.account_type_txt.plural}</span>\r\n </TypographyHeading> */}\r\n <DataTable\r\n loading={loading}\r\n toolbarConfig={{\r\n canShowSearchField: true,\r\n searchFieldConfig: {\r\n placeholder: `Search by ${appInfo.account_type_txt.singular} Name...`,\r\n searchField: 'org_name',\r\n },\r\n canShowColumnsBtn: true,\r\n additionalJSX: [\r\n <LinkWrapper to={'/infrastructure/create-new-org'}>\r\n <Button variant=\"default\">\r\n <Plus /> Create new {appInfo.account_type_txt.singular}\r\n </Button>\r\n </LinkWrapper>,\r\n ],\r\n refreshBtn: {\r\n canShow: true,\r\n onClick: reloadData,\r\n },\r\n }}\r\n data={orgs}\r\n actions={[\r\n {\r\n id: 'actionId1',\r\n headerText: 'Edit',\r\n onClick: (record) => {\r\n const org = record as OrganizationType;\r\n editOrganization(org);\r\n },\r\n },\r\n {\r\n id: 'actionId2',\r\n headerText: 'Delete',\r\n onClick: (record) => {\r\n const org = record as OrganizationType;\r\n if (!ROLES.Is_ADMIN(org.role_id)) {\r\n showWarningToast({\r\n header: 'Alert',\r\n description: (\r\n <>\r\n You are not allowed to delete the <b>{org.org_name}</b> {appInfo.account_type_txt.singular}.\r\n </>\r\n ),\r\n });\r\n return;\r\n }\r\n dlg.showAlertBox({\r\n type: 'CONFIRM',\r\n text: `Are you sure you want to delete \"${org.org_name}\" ${appInfo.account_type_txt.singular.toLocaleLowerCase()}?`,\r\n async onClose(result) {\r\n if (result !== 'CONFIRM') {\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n try {\r\n const res: any = await getAxiosInstance().delete('organization/' + org.org_id);\r\n showSuccessToast({\r\n header: `${appInfo.account_type_txt.singular} has been deleted successfully.`,\r\n description: res.message,\r\n });\r\n\r\n await reloadData();\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n });\r\n },\r\n },\r\n {\r\n id: 'separate',\r\n headerText: 'SEPARATOR',\r\n },\r\n {\r\n id: 'actionId3',\r\n headerText: `Leave this ${appInfo.account_type_txt.singular.toLocaleLowerCase()}`,\r\n onClick: (record) => {\r\n const org = record as OrganizationType;\r\n // if (record.org_created_by === loggedInUser) {\r\n // }\r\n\r\n dlg.showAlertBox({\r\n type: 'CONFIRM',\r\n text: `Are you sure you want to leave this ${appInfo.account_type_txt.singular.toLocaleLowerCase()}? You can't re-join until an administrator invites you again.`,\r\n async onClose(result) {\r\n if (result !== 'CONFIRM') {\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n try {\r\n const reqJson = {\r\n org_id: org.org_id,\r\n user_opinion: INVITATION_ENUMS.LEFT,\r\n };\r\n await getAxiosInstance().put('invitation', reqJson);\r\n\r\n showSuccessToast({\r\n header: `You have successfully left this ${appInfo.account_type_txt.singular.toLocaleLowerCase()}.`,\r\n description: '',\r\n });\r\n\r\n await reloadData();\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n });\r\n },\r\n },\r\n {\r\n id: 'separate2',\r\n headerText: 'SEPARATOR',\r\n },\r\n {\r\n id: 'actionId4',\r\n headerText: 'Impersonate',\r\n onClick: (record) => {\r\n const org = record as OrganizationType;\r\n setActiveOrg(org);\r\n navigate('/');\r\n },\r\n },\r\n ]}\r\n columns={[\r\n ...(featureFlags.ff_enable_paid_subscription === false\r\n ? []\r\n : [\r\n {\r\n id: 'active_purchased_plan',\r\n headerText: '',\r\n enableSorting: false,\r\n enableHiding: false,\r\n type: 'string' as const,\r\n renderer(_: unknown, cellValue: unknown) {\r\n const purchasedPlan = cellValue as purchasedPlansInf;\r\n\r\n return <PremiumIcon purchasedPlan={purchasedPlan} />;\r\n },\r\n },\r\n ]),\r\n {\r\n id: 'org_name',\r\n headerText: `${appInfo.account_type_txt.singular} Name`,\r\n enableSorting: true,\r\n enableHiding: true,\r\n },\r\n ...(appInfo.account_type_txt.value === APP_INFO_ACCOUNT_TYPE.ORG\r\n ? [\r\n {\r\n id: 'org_address',\r\n headerText: 'Address',\r\n enableSorting: true,\r\n enableHiding: true,\r\n },\r\n {\r\n id: 'org_state',\r\n headerText: 'State',\r\n enableSorting: true,\r\n enableHiding: true,\r\n },\r\n {\r\n id: 'org_country',\r\n headerText: 'Country',\r\n enableSorting: true,\r\n enableHiding: true,\r\n },\r\n ]\r\n : []),\r\n {\r\n id: 'role_id',\r\n headerText: 'Role',\r\n enableSorting: true,\r\n enableHiding: true,\r\n type: 'string',\r\n renderer(_, cellValue) {\r\n return ROLES.DISPLAY_TEXT(cellValue as number);\r\n },\r\n },\r\n {\r\n id: 'org_created_by',\r\n headerText: 'Created By Me?',\r\n enableSorting: false,\r\n enableHiding: true,\r\n renderer(_, cellValue) {\r\n return Number(cellValue) === Number(loggedInUser.id) ? <Check /> : <X />;\r\n },\r\n },\r\n {\r\n id: 'updated_at',\r\n headerText: 'Updated On',\r\n enableSorting: true,\r\n enableHiding: true,\r\n type: 'date',\r\n },\r\n {\r\n id: 'created_at',\r\n headerText: 'Created On',\r\n enableSorting: true,\r\n enableHiding: true,\r\n type: 'date',\r\n },\r\n ]}\r\n />\r\n </div>\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default ManageOrgs;\r\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport { CircleIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction RadioGroup({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n return (\n <RadioGroupPrimitive.Root\n data-slot=\"radio-group\"\n className={cn(\"grid gap-3\", className)}\n {...props}\n />\n )\n}\n\nfunction RadioGroupItem({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-item\"\n className={cn(\n \"border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"relative flex items-center justify-center\"\n >\n <CircleIcon className=\"fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\n","'use client';\n\nimport { Check, Package, Award, Building2 } from 'lucide-react';\nimport { useState, useId } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { type Plan } from '@/lib/billingsdk-config';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Label } from '@/components/ui/label';\nimport { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';\nimport { Badge } from '@/components/ui/badge';\n\nconst sectionVariants = cva('py-32 relative overflow-hidden', {\n variants: {\n size: {\n small: 'py-12',\n medium: 'py-20',\n large: 'py-32',\n },\n theme: {\n minimal: 'bg-background',\n classic: 'bg-gradient-to-b from-background to-muted/20',\n },\n },\n defaultVariants: {\n size: 'medium',\n theme: 'minimal',\n },\n});\n\nconst titleVariants = cva('font-bold mb-4 text-foreground', {\n variants: {\n size: {\n small: 'text-3xl lg:text-4xl',\n medium: 'text-4xl lg:text-5xl',\n large: 'text-4xl lg:text-6xl',\n },\n theme: {\n minimal: '',\n classic: 'bg-gradient-to-r from-foreground to-muted-foreground bg-clip-text text-transparent',\n },\n },\n defaultVariants: {\n size: 'medium',\n theme: 'minimal',\n },\n});\n\nconst descriptionVariants = cva('text-muted-foreground max-w-3xl mx-auto mb-2', {\n variants: {\n size: {\n small: 'text-base lg:text-lg',\n medium: 'text-lg lg:text-xl',\n large: 'lg:text-xl',\n },\n theme: {\n minimal: '',\n classic: '',\n },\n },\n defaultVariants: {\n size: 'medium',\n theme: 'minimal',\n },\n});\n\nconst cardVariants = cva('relative h-full transition-all duration-300 rounded-lg border bg-card text-card-foreground', {\n variants: {\n size: {\n small: 'p-4',\n medium: 'p-5',\n large: 'p-6',\n },\n theme: {\n minimal: 'hover:bg-muted/30',\n classic: 'hover:shadow-xl backdrop-blur-sm bg-card/50 border-border/50',\n },\n highlight: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n theme: 'classic',\n highlight: true,\n className: 'ring-2 ring-primary/20 border-primary/30 bg-gradient-to-b from-primary/5 to-transparent relative overflow-hidden shadow-xl',\n },\n {\n theme: 'minimal',\n highlight: true,\n className: 'bg-muted/50 border-primary/20',\n },\n ],\n defaultVariants: {\n size: 'large',\n theme: 'minimal',\n highlight: false,\n },\n});\n\nconst toggleVariants = cva('flex h-11 w-fit shrink-0 items-center rounded-md p-1 text-lg', {\n variants: {\n theme: {\n minimal: 'bg-muted',\n classic: 'bg-muted/50 backdrop-blur-sm border border-border/50 shadow-lg',\n },\n },\n defaultVariants: {\n theme: 'minimal',\n },\n});\n\nconst priceTextVariants = cva('font-medium', {\n variants: {\n size: {\n small: 'text-2xl',\n medium: 'text-3xl',\n large: 'text-4xl',\n },\n theme: {\n minimal: '',\n classic: 'font-extrabold bg-gradient-to-r from-foreground to-muted-foreground bg-clip-text text-transparent',\n },\n },\n defaultVariants: {\n size: 'large',\n theme: 'minimal',\n },\n});\n\nconst buttonVariants = cva('w-full transition-all duration-300 hover:cursor-pointer', {\n variants: {\n theme: {\n minimal:\n 'shadow hover:bg-primary/90 h-9 py-2 group bg-primary text-primary-foreground ring-primary before:from-primary-foreground/20 after:from-primary-foreground/10 relative isolate inline-flex w-full items-center justify-center overflow-hidden rounded-md px-3 text-left text-sm font-medium ring-1 before:pointer-events-none before:absolute before:inset-0 before:-z-10 before:rounded-md before:bg-gradient-to-b before:opacity-80 before:transition-opacity before:duration-300 before:ease-[cubic-bezier(0.4,0.36,0,1)] after:pointer-events-none after:absolute after:inset-0 after:-z-10 after:rounded-md after:bg-gradient-to-b after:to-transparent after:mix-blend-overlay',\n classic:\n 'relative overflow-hidden bg-gradient-to-r from-primary to-primary/80 text-primary-foreground font-semibold py-3 px-6 rounded-lg hover:shadow-xl active:scale-95 border border-primary/20',\n },\n },\n defaultVariants: {\n theme: 'minimal',\n },\n});\n\nconst featureIconVariants = cva('flex-none h-[1lh]', {\n variants: {\n size: {\n small: 'size-3',\n medium: 'size-4',\n large: 'size-4',\n },\n theme: {\n minimal: 'text-primary',\n classic: 'text-primary',\n },\n },\n defaultVariants: {\n size: 'large',\n theme: 'minimal',\n },\n});\n\nexport interface PricingTableFourProps extends VariantProps<typeof sectionVariants> {\n plans: Plan[];\n title?: string;\n description?: string;\n subtitle?: string;\n onPlanSelect?: (planId: string, isYearly: boolean) => void;\n className?: string;\n showBillingToggle?: boolean;\n billingToggleLabels?: {\n monthly: string;\n yearly: string;\n };\n}\n\nconst defaultIcons = {\n starter: <Package className=\"w-4 h-4\" />,\n pro: <Award className=\"w-4 h-4\" />,\n enterprise: <Building2 className=\"w-4 h-4\" />,\n};\n\nexport function PricingTableFour({\n plans,\n title = 'Choose Your Perfect Plan',\n description = 'Transform your project with our comprehensive pricing options designed for every need.',\n subtitle,\n onPlanSelect,\n className,\n size = 'medium',\n theme = 'minimal',\n showBillingToggle = true,\n billingToggleLabels = {\n monthly: 'Monthly',\n yearly: 'Yearly',\n },\n}: PricingTableFourProps) {\n const [isAnnually, setIsAnnually] = useState(false);\n const uniqueId = useId();\n\n function calculateDiscount(monthlyPrice: string, yearlyPrice: string): number {\n const monthly = parseFloat(monthlyPrice);\n const yearly = parseFloat(yearlyPrice);\n\n if (monthlyPrice.toLowerCase() === 'custom' || yearlyPrice.toLowerCase() === 'custom' || isNaN(monthly) || isNaN(yearly) || monthly === 0) {\n return 0;\n }\n\n const discount = ((monthly * 12 - yearly) / (monthly * 12)) * 100;\n return Math.round(discount);\n }\n\n const yearlyPriceDiscount = plans.length ? Math.max(...plans.map((plan) => calculateDiscount(plan.monthlyPrice, plan.yearlyPrice))) : 0;\n\n const handlePlanSelect = (planId: string) => {\n onPlanSelect?.(planId, isAnnually);\n };\n\n const getPlanIcon = (planId: string) => {\n return defaultIcons[planId as keyof typeof defaultIcons] || <Package className=\"w-5 h-5\" />;\n };\n\n return (\n <section className={cn(sectionVariants({ size, theme }), className)}>\n {/* Classic theme background elements */}\n {theme === 'classic' && (\n <>\n <div className=\"absolute inset-0 bg-grid-pattern opacity-5\" />\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-96 h-96 bg-primary/5 rounded-full blur-3xl\" />\n <div className=\"absolute top-1/4 right-1/4 w-64 h-64 bg-secondary/5 rounded-full blur-2xl\" />\n </>\n )}\n\n <div className=\"container max-w-7xl mx-auto relative\">\n {/* Header */}\n <div className=\"text-center mb-12\">\n {subtitle && <p className=\"text-sm font-medium text-primary mb-3 tracking-wide uppercase\">{subtitle}</p>}\n <h2 className={cn(titleVariants({ size, theme }))}>{title}</h2>\n <p className={cn(descriptionVariants({ size, theme }))}>{description}</p>\n\n {showBillingToggle && (\n <div className={cn('flex justify-center mt-8 mx-auto', toggleVariants({ theme }))}>\n <RadioGroup\n defaultValue=\"monthly\"\n className=\"h-full grid-cols-2\"\n onValueChange={(value) => {\n setIsAnnually(value === 'annually');\n }}\n >\n <div className='has-[button[data-state=\"checked\"]]:bg-background h-full rounded-md transition-all'>\n <RadioGroupItem value=\"monthly\" id={`${uniqueId}-monthly`} className=\"peer sr-only\" />\n <Label\n htmlFor={`${uniqueId}-monthly`}\n className=\"text-muted-foreground peer-data-[state=checked]:text-primary flex h-full cursor-pointer items-center justify-center px-2 md:px-7 font-semibold transition-all hover:text-foreground\"\n >\n {billingToggleLabels.monthly}\n </Label>\n </div>\n <div className='has-[button[data-state=\"checked\"]]:bg-background h-full rounded-md transition-all'>\n <RadioGroupItem value=\"annually\" id={`${uniqueId}-annually`} className=\"peer sr-only\" />\n <Label\n htmlFor={`${uniqueId}-annually`}\n className=\"text-muted-foreground peer-data-[state=checked]:text-primary flex h-full cursor-pointer items-center justify-center gap-1 px-2 md:px-7 font-semibold transition-all hover:text-foreground\"\n >\n {billingToggleLabels.yearly}\n {yearlyPriceDiscount > 0 && (\n <span className=\"ml-1 rounded bg-primary/10 px-2 py-0.5 text-xs text-primary border border-primary/20 font-medium\">\n Save {yearlyPriceDiscount}%\n </span>\n )}\n </Label>\n </div>\n </RadioGroup>\n </div>\n )}\n </div>\n\n <div\n className={cn(\n 'grid gap-6',\n plans.length === 1 && 'grid-cols-1 max-w-md mx-auto',\n plans.length === 2 && 'grid-cols-1 md:grid-cols-2 max-w-4xl mx-auto',\n plans.length === 3 && 'grid-cols-1 md:grid-cols-3',\n plans.length >= 4 && 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',\n )}\n >\n {plans.map((plan, index) => (\n <motion.div\n key={plan.id}\n className=\"relative group h-full\"\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{\n duration: 0.4,\n delay: index * 0.1,\n ease: 'easeOut',\n }}\n >\n {/* Popular badge */}\n {plan.badge && (\n <Badge\n className={cn(\n 'absolute -top-3 left-1/2 transform -translate-x-1/2 z-20',\n theme === 'classic'\n ? 'bg-gradient-to-r from-primary to-primary/80 text-primary-foreground border-primary/20 shadow-lg'\n : 'bg-primary text-primary-foreground',\n )}\n >\n {plan.badge}\n </Badge>\n )}\n\n {/* Classic theme highlight effect */}\n {theme === 'classic' && plan.highlight && (\n <div className=\"absolute -top-px left-1/2 -translate-x-1/2 w-32 h-px bg-gradient-to-r from-transparent via-primary to-transparent\" />\n )}\n\n <div className={cn(cardVariants({ size, theme, highlight: plan.highlight }))}>\n <div className=\"flex flex-col h-full\">\n {/* Icon and Title */}\n <div className=\"flex items-start gap-4 mb-4\">\n <div className=\"flex-1\">\n <h3 className={cn('text-xl font-bold mb-1', theme === 'classic' ? 'text-lg' : '')}>{plan.title}</h3>\n <p className={cn('text-sm text-muted-foreground', theme === 'classic' && 'text-foreground/80')}>{plan.description}</p>\n </div>\n <div\n className={cn(\n 'w-10 h-10 flex items-center rounded-lg justify-center flex-shrink-0',\n theme === 'classic' ? 'bg-primary/10 text-primary border border-primary/20' : 'bg-muted text-foreground border border-border',\n )}\n >\n {getPlanIcon(plan.id)}\n </div>\n </div>\n\n {/* Price */}\n <div className=\"mb-6\">\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={isAnnually ? 'year' : 'month'}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.2 }}\n >\n {isAnnually ? (\n <div className=\"flex items-baseline gap-1\">\n <span className={cn(priceTextVariants({ size, theme }))}>\n {parseFloat(plan.yearlyPrice) >= 0 && plan.yearlyPrice.toLowerCase() !== 'custom' && <>{plan.currency}</>}\n {plan.yearlyPrice}\n </span>\n <span className=\"text-muted-foreground text-sm\">/year</span>\n {calculateDiscount(plan.monthlyPrice, plan.yearlyPrice) > 0 && (\n <span\n className={cn('text-xs ml-2', theme === 'classic' ? 'text-emerald-500 font-semibold' : 'text-primary font-medium')}\n >\n {calculateDiscount(plan.monthlyPrice, plan.yearlyPrice)}% off\n </span>\n )}\n </div>\n ) : (\n <div className=\"flex items-baseline gap-1\">\n <span className={cn(priceTextVariants({ size, theme }))}>\n {parseFloat(plan.monthlyPrice) >= 0 && plan.monthlyPrice.toLowerCase() !== 'custom' && <>{plan.currency}</>}\n {plan.monthlyPrice}\n </span>\n <span className=\"text-muted-foreground text-sm\">/month</span>\n </div>\n )}\n </motion.div>\n </AnimatePresence>\n </div>\n\n {/* CTA Button */}\n <div className=\"mb-6\">\n <Button\n onClick={() => handlePlanSelect(plan.id)}\n className={cn(\n buttonVariants({ theme }),\n !plan.highlight && theme === 'minimal' && 'bg-secondary hover:bg-secondary/80 text-secondary-foreground',\n )}\n variant={plan.highlight ? 'default' : 'secondary'}\n >\n {plan.buttonText}\n {theme === 'classic' && plan.highlight && (\n <div className=\"absolute inset-0 bg-gradient-to-r from-white/0 via-white/10 to-white/0 translate-x-[-100%] hover:translate-x-[100%] transition-transform duration-700\" />\n )}\n </Button>\n </div>\n\n {/* Features */}\n <div className=\"flex-1\">\n <ul className=\"space-y-3\">\n {plan.features.map((feature, featureIndex) => (\n <motion.li\n key={featureIndex}\n className=\"flex gap-3 items-start\"\n initial={{ opacity: 0, x: -10 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ duration: 0.3, delay: featureIndex * 0.05 }}\n >\n <Check className={cn(featureIconVariants({ size, theme }))} />\n <span className={cn('text-sm', theme === 'classic' ? 'text-foreground/90' : 'text-muted-foreground')}>{feature.name}</span>\n </motion.li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </motion.div>\n ))}\n </div>\n </div>\n </section>\n );\n}\n","import { PricingTableFour } from '@/components/billingsdk/pricing-table-four';\r\nimport AccordionWrapper from '@/components/custom/AccordionWrapper';\r\nimport FullPageLoading from '@/components/custom/FullPageLoading';\r\nimport { TypographyHeading } from '@/components/custom/Typography/TypographyHeading';\r\nimport { appInfo } from '@/config/app-config';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport type { ISubscriptionConfig } from '@/lib/billingsdk-config';\r\nimport AppContext from '@/store/AppContext';\r\nimport { useContext, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router';\r\n\r\nexport function PricingTbl() {\r\n const navigate = useNavigate();\r\n const { subscriptionConfig, setSubscriptionConfig } = useContext(AppContext);\r\n const { plans, faqs } = subscriptionConfig;\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n if ('plans' in subscriptionConfig === false) {\r\n const subscriptionConfigResponse = (await getAxiosInstance().get('/get-subscription-config')) as ISubscriptionConfig;\r\n setSubscriptionConfig(subscriptionConfigResponse);\r\n }\r\n };\r\n fetchData();\r\n }, [setSubscriptionConfig, subscriptionConfig]);\r\n\r\n if ('plans' in subscriptionConfig === false) {\r\n return <FullPageLoading />;\r\n }\r\n\r\n return (\r\n <div className=\"px-5\">\r\n <PricingTableFour\r\n plans={plans}\r\n title=\"Choose Your Perfect Plan\"\r\n theme=\"classic\"\r\n description=\"Transform your project with our comprehensive pricing options designed for every need.\"\r\n subtitle={appInfo.appName}\r\n onPlanSelect={(planId: string, isYearly: boolean) => {\r\n navigate(`/infrastructure/checkout?plan=${planId}&billing=${isYearly ? 'yearly' : 'monthly'}`);\r\n }}\r\n size=\"small\"\r\n className=\"w-full\"\r\n showBillingToggle={true}\r\n billingToggleLabels={{\r\n monthly: 'Monthly',\r\n yearly: 'Yearly',\r\n }}\r\n />\r\n\r\n <div className=\"m-8 mx-auto max-w-200\">\r\n <TypographyHeading className=\"mb-2\">Need a custom plan?</TypographyHeading>\r\n <p className=\"text-muted-foreground\">Contact our sales team for tailored solutions that fit your organization&apos;s unique needs.</p>\r\n\r\n <TypographyHeading className=\"mb-2 mt-15 font-medium text-lg\">Frequently Asked Questions</TypographyHeading>\r\n <div className=\"mt-5\">\r\n {faqs.map((faq, index) => (\r\n <div className=\"border-t\" key={index}>\r\n <AccordionWrapper title={<h1 className=\"\">{faq.question}</h1>}>\r\n <div className=\"\">{faq.answer}</div>\r\n </AccordionWrapper>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <TypographyHeading className=\"mb-2 mt-15 font-medium text-lg\">Still have questions?</TypographyHeading>\r\n <p className=\"text-muted-foreground\">\r\n Reach out to our support team at{' '}\r\n <a href={`mailto:${appInfo.supportEmail}`} className=\"text-primary underline\">\r\n {appInfo.supportEmail}\r\n </a>{' '}\r\n for personalized assistance.\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport { Button } from '@/components/ui/button';\nimport { Badge } from '@/components/ui/badge';\nimport { Dialog, DialogClose, DialogContent, DialogTitle, DialogTrigger } from '@/components/ui/dialog';\nimport { type Plan } from '@/lib/billingsdk-config';\nimport { cn } from '@/lib/utils';\nimport { X, Circle } from 'lucide-react';\n\nexport interface CancelSubscriptionDialogProps {\n title: string;\n description: string;\n plan: Plan;\n triggerButtonText?: string;\n leftPanelImageUrl?: string;\n warningTitle?: string;\n warningText?: string;\n keepButtonText?: string;\n continueButtonText?: string;\n finalTitle?: string;\n finalSubtitle?: string;\n finalWarningText?: string;\n goBackButtonText?: string;\n confirmButtonText?: string;\n onCancel: (planId: string) => Promise<void> | void;\n onKeepSubscription?: (planId: string) => Promise<void> | void;\n onDialogClose?: () => void;\n className?: string;\n}\n\nexport function CancelSubscriptionDialog({\n title,\n description,\n plan,\n triggerButtonText,\n leftPanelImageUrl,\n warningTitle,\n warningText,\n keepButtonText,\n continueButtonText,\n finalTitle,\n finalSubtitle,\n finalWarningText,\n goBackButtonText,\n confirmButtonText,\n onCancel,\n onKeepSubscription,\n onDialogClose,\n className,\n}: CancelSubscriptionDialogProps) {\n const [showConfirmation, setShowConfirmation] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleContinueCancellation = () => {\n setShowConfirmation(true);\n setError(null);\n };\n\n const handleConfirmCancellation = async () => {\n try {\n setIsLoading(true);\n setError(null);\n await onCancel(plan.id);\n handleDialogClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to cancel subscription');\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleKeepSubscription = async () => {\n try {\n setIsLoading(true);\n setError(null);\n if (onKeepSubscription) {\n await onKeepSubscription(plan.id);\n }\n handleDialogClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to keep subscription');\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleDialogClose = () => {\n setIsOpen(false);\n setShowConfirmation(false);\n setError(null);\n setIsLoading(false);\n onDialogClose?.();\n };\n\n const handleGoBack = () => {\n setShowConfirmation(false);\n setError(null);\n };\n\n // Handle keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!isOpen) return;\n\n if (event.key === 'Escape') {\n event.preventDefault();\n handleDialogClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen]);\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={(open) => {\n if (open) {\n setIsOpen(true);\n } else {\n handleDialogClose();\n }\n }}\n >\n <DialogTrigger asChild>\n <Button variant=\"outline\">{triggerButtonText || 'Cancel Subscription'}</Button>\n </DialogTrigger>\n <DialogContent\n className={cn(\n 'sm:max-w-[1000px] flex flex-col md:flex-row p-0 overflow-hidden text-foreground w-[95%] md:w-[100%]',\n leftPanelImageUrl ? '' : 'sm:max-w-[500px]',\n className,\n )}\n >\n <DialogTitle className=\"sr-only\">{title}</DialogTitle>\n <DialogClose\n className=\"absolute right-4 top-4 z-10 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\"\n onClick={handleDialogClose}\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogClose>\n {leftPanelImageUrl && (\n <div className=\"w-full md:w-1/2 min-h-[500px] relative hidden md:block overflow-hidden\">\n <img src={leftPanelImageUrl} alt=\"Cancel Subscription\" className=\"absolute inset-0 w-full h-full object-cover\" />\n <div className=\"absolute inset-0 bg-gradient-to-r from-transparent via-background/30 to-background/90 dark:block hidden\"></div>\n <div className=\"absolute inset-0 bg-gradient-to-t from-background/80 via-transparent to-background/20 dark:block hidden\"></div>\n </div>\n )}\n <div className={cn('py-6 px-4 flex flex-col gap-4', leftPanelImageUrl ? 'w-full md:w-1/2' : 'w-full')}>\n <div className=\"flex flex-col gap-2 text-center md:text-left\">\n <h2 className=\"md:text-2xl text-xl font-semibold\">{title}</h2>\n <p className=\"md:text-sm text-xs text-muted-foreground\">{description}</p>\n {error && (\n <div className=\"p-3 bg-destructive/10 border border-destructive/20 rounded-md\">\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n )}\n </div>\n\n {/* Plan Details */}\n {!showConfirmation && (\n <div className=\"flex flex-col gap-4 p-4 bg-muted/50 rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"font-semibold text-lg\">{plan.title} Plan</span>\n <span className=\"text-sm text-muted-foreground\">Current subscription</span>\n </div>\n <Badge variant=\"secondary\">\n {parseFloat(plan.monthlyPrice) >= 0 ? `${plan.currency}${plan.monthlyPrice}/monthly` : `${plan.monthlyPrice}/monthly`}\n </Badge>\n </div>\n <div className=\"flex flex-col gap-2\">\n {plan.features.slice(0, 4).map((feature, index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <Circle className=\"w-2 h-2 fill-primary text-primary\" />\n <span className=\"text-sm text-muted-foreground\">{feature.name}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Warning Section */}\n {!showConfirmation && (warningTitle || warningText) && (\n <div className=\"p-4 bg-muted/30 border border-border rounded-lg\">\n {warningTitle && <h3 className=\"font-semibold text-foreground mb-2\">{warningTitle}</h3>}\n {warningText && <p className=\"text-sm text-muted-foreground\">{warningText}</p>}\n </div>\n )}\n {/* Action Buttons */}\n {!showConfirmation ? (\n <div className=\"flex flex-col sm:flex-row gap-3 mt-auto\">\n <Button className=\"flex-1\" onClick={handleKeepSubscription} disabled={isLoading}>\n {isLoading ? 'Processing...' : keepButtonText || 'Keep My Subscription'}\n </Button>\n <Button variant=\"destructive\" className=\"flex-1\" onClick={handleContinueCancellation} disabled={isLoading}>\n {continueButtonText || 'Continue Cancellation'}\n </Button>\n </div>\n ) : (\n <div className=\"flex flex-col gap-4 mt-auto\">\n <div className=\"text-center p-4 bg-muted/50 rounded-lg\">\n <h3 className=\"font-semibold mb-2 text-foreground\">{finalTitle || 'Final Confirmation'}</h3>\n <p className=\"text-sm text-muted-foreground mb-2\">{finalSubtitle || 'Are you sure you want to cancel your subscription?'}</p>\n <p className=\"text-sm text-destructive\">\n {finalWarningText || \"This action cannot be undone and you'll lose access to all premium features.\"}\n </p>\n </div>\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <Button variant=\"outline\" className=\"flex-1\" onClick={handleGoBack} disabled={isLoading}>\n {goBackButtonText || 'Go Back'}\n </Button>\n <Button variant=\"destructive\" className=\"flex-1\" onClick={handleConfirmCancellation} disabled={isLoading}>\n {isLoading ? 'Cancelling...' : confirmButtonText || 'Yes, Cancel Subscription'}\n </Button>\n </div>\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground\",\n },\n size: {\n default: \"h-9 px-2 min-w-9\",\n sm: \"h-8 px-1.5 min-w-8\",\n lg: \"h-10 px-2.5 min-w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n","'use client';\n\nimport { motion, AnimatePresence } from 'motion/react';\nimport { Button } from '@/components/ui/button';\nimport { Badge } from '@/components/ui/badge';\nimport { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';\nimport { Toggle } from '@/components/ui/toggle';\nimport { Label } from '@/components/ui/label';\nimport { type Plan } from '@/lib/billingsdk-config';\nimport { cn } from '@/lib/utils';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';\nimport { useState, useCallback } from 'react';\n\nexport interface UpdatePlanDialogProps {\n currentPlan: Plan;\n plans: Plan[];\n triggerText: string;\n onPlanChange: (planId: string, isYearly: boolean) => void;\n className?: string;\n title?: string;\n}\n\nconst easing = [0.4, 0, 0.2, 1] as const;\n\nexport function UpdatePlanDialog({ currentPlan, plans, onPlanChange, className, title, triggerText }: UpdatePlanDialogProps) {\n const [isYearly, setIsYearly] = useState(false);\n const [selectedPlan, setSelectedPlan] = useState<string | undefined>(undefined);\n const [isOpen, setIsOpen] = useState(false);\n\n const getCurrentPrice = useCallback((plan: Plan) => (isYearly ? `${plan.yearlyPrice}` : `${plan.monthlyPrice}`), [isYearly]);\n\n const handlePlanChange = useCallback((planId: string) => {\n setSelectedPlan((prev) => (prev === planId ? undefined : planId));\n }, []);\n\n const handleOpenChange = useCallback((open: boolean) => {\n setIsOpen(open);\n if (!open) {\n setSelectedPlan(undefined);\n }\n }, []);\n\n return (\n <Dialog open={isOpen} onOpenChange={handleOpenChange}>\n <DialogTrigger asChild>\n <Button>{triggerText || 'Update Plan'}</Button>\n </DialogTrigger>\n <DialogContent\n className={cn(\n 'gap-3 sm:gap-4 max-h-[95vh] sm:max-h-[90vh] flex flex-col text-foreground',\n 'w-[calc(100vw-2rem)] sm:w-full max-w-2xl',\n 'p-4 sm:p-6',\n className,\n )}\n >\n <DialogHeader className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 sm:gap-4 pb-2 sm:pb-0\">\n <DialogTitle className=\"text-lg sm:text-xl font-semibold\">{title || 'Upgrade Plan'}</DialogTitle>\n <div className=\"flex items-center gap-1.5 sm:gap-2 text-sm\">\n <Toggle\n size=\"sm\"\n pressed={!isYearly}\n onPressedChange={(pressed) => setIsYearly(!pressed)}\n className=\"px-3 sm:px-4 h-9 sm:h-10 text-xs sm:text-sm\"\n >\n Monthly\n </Toggle>\n <Toggle\n size=\"sm\"\n pressed={isYearly}\n onPressedChange={(pressed) => setIsYearly(pressed)}\n className=\"px-3 sm:px-4 h-9 sm:h-10 text-xs sm:text-sm\"\n >\n Yearly\n </Toggle>\n </div>\n </DialogHeader>\n <div\n className=\"flex-1 min-h-0 overflow-y-auto overflow-x-hidden -mx-4 sm:-mx-6 px-4 sm:px-6 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-muted [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:border-2 [&::-webkit-scrollbar-thumb]:border-transparent hover:[&::-webkit-scrollbar-thumb]:bg-muted-foreground/20\"\n style={{ scrollbarWidth: 'thin', scrollbarColor: 'hsl(var(--muted)) transparent' }}\n >\n {plans.length === 0 ? (\n <div className=\"flex items-center justify-center py-12 text-center\">\n <p className=\"text-sm text-muted-foreground\">No plans available</p>\n </div>\n ) : (\n <RadioGroup value={selectedPlan} onValueChange={handlePlanChange}>\n <div className=\"space-y-2.5 sm:space-y-3 pb-2 pr-0.5\">\n {plans.map((plan, index) => (\n <motion.div\n key={plan.id}\n layout\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{\n layout: { duration: 0.3, ease: easing },\n opacity: { delay: index * 0.05, duration: 0.3, ease: easing },\n y: { delay: index * 0.05, duration: 0.3, ease: easing },\n }}\n onClick={() => handlePlanChange(plan.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handlePlanChange(plan.id);\n }\n }}\n role=\"button\"\n tabIndex={0}\n aria-pressed={selectedPlan === plan.id}\n className={cn(\n 'relative rounded-lg sm:rounded-xl border cursor-pointer overflow-hidden transition-all duration-200',\n 'touch-manipulation focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2',\n selectedPlan === plan.id\n ? 'border-primary bg-gradient-to-br from-muted/60 to-muted/30 shadow-sm'\n : 'border-border hover:border-primary/50',\n )}\n >\n <motion.div layout=\"position\" className=\"p-3 sm:p-4\">\n <div className=\"flex items-start justify-between gap-2 sm:gap-3\">\n <div className=\"flex gap-2 sm:gap-3 min-w-0 flex-1\">\n <RadioGroupItem value={plan.id} id={plan.id} className=\"flex-shrink-0 pointer-events-none mt-0.5 sm:mt-1\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5 sm:gap-2 flex-wrap\">\n <Label htmlFor={plan.id} className=\"font-semibold sm:font-medium text-sm sm:text-base cursor-pointer leading-tight\">\n {plan.title}\n </Label>\n {plan.badge && (\n <Badge\n variant=\"secondary\"\n className=\"flex-shrink-0 text-[10px] sm:text-xs px-1.5 sm:px-2 py-0 sm:py-0.5 h-5 sm:h-auto\"\n >\n {plan.badge}\n </Badge>\n )}\n </div>\n <p className=\"text-[11px] sm:text-xs text-muted-foreground mt-1 leading-relaxed\">{plan.description}</p>\n {plan.features.length > 0 && (\n <div className=\"pt-2 sm:pt-3\">\n <div className=\"flex flex-wrap gap-1.5 sm:gap-2\">\n {plan.features.map((feature, featureIndex) => (\n <div\n key={featureIndex}\n className=\"flex items-center gap-1.5 sm:gap-2 px-2 py-1 rounded-md sm:rounded-lg bg-muted/20 border border-border/30 flex-shrink-0\"\n >\n <div className=\"w-1 h-1 sm:w-1.5 sm:h-1.5 rounded-full bg-primary flex-shrink-0\" />\n <span className=\"text-[10px] sm:text-xs text-muted-foreground whitespace-nowrap leading-none\">\n {feature.name}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n <div className=\"text-right flex-shrink-0 min-w-[60px] sm:min-w-[80px]\">\n <div className=\"text-base sm:text-xl font-bold sm:font-semibold leading-tight\">\n {parseFloat(getCurrentPrice(plan)) >= 0 ? `${plan.currency}${getCurrentPrice(plan)}` : getCurrentPrice(plan)}\n </div>\n <div className=\"text-[10px] sm:text-xs text-muted-foreground mt-0.5\">/{isYearly ? 'year' : 'month'}</div>\n </div>\n </div>\n </motion.div>\n\n <AnimatePresence initial={false}>\n {selectedPlan === plan.id && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{\n height: 'auto',\n opacity: 1,\n transition: {\n height: { duration: 0.3, ease: easing },\n opacity: { duration: 0.25, delay: 0.05, ease: easing },\n },\n }}\n exit={{\n height: 0,\n opacity: 0,\n transition: {\n height: { duration: 0.25, ease: easing },\n opacity: { duration: 0.15, ease: easing },\n },\n }}\n className=\"overflow-hidden\"\n >\n <motion.div\n initial={{ y: -8 }}\n animate={{\n y: 0,\n transition: { duration: 0.25, delay: 0.05, ease: easing },\n }}\n exit={{ y: -8 }}\n className=\"px-3 sm:px-4 pb-3 sm:pb-4\"\n >\n <Button\n className=\"w-full h-10 sm:h-11 text-sm sm:text-base font-medium touch-manipulation\"\n disabled={selectedPlan === currentPlan.id}\n onClick={(e) => {\n e.stopPropagation();\n onPlanChange(plan.id, isYearly);\n handleOpenChange(false);\n }}\n >\n {selectedPlan === currentPlan.id ? 'Current Plan' : 'Upgrade'}\n </Button>\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n ))}\n </div>\n </RadioGroup>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","'use client';\n\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Badge } from '@/components/ui/badge';\nimport { Separator } from '@/components/ui/separator';\nimport { Calendar, CreditCard, MoveUpRight } from 'lucide-react';\nimport type { CurrentPlan } from '@/lib/billingsdk-config';\nimport { cn } from '@/lib/utils';\nimport { CancelSubscriptionDialog, type CancelSubscriptionDialogProps } from '@/components/billingsdk/cancel-subscription-dialog';\nimport { UpdatePlanDialog, type UpdatePlanDialogProps } from '@/components/billingsdk/update-plan-dialog';\nimport { Button } from '../ui/button';\nimport LinkWrapper from '../custom/LinkWrapper';\n\nexport interface SubscriptionManagementProps {\n className?: string;\n currentPlan: CurrentPlan;\n cancelSubscription: CancelSubscriptionDialogProps;\n updatePlan: UpdatePlanDialogProps;\n canShowUpdatePlanBtn: boolean;\n canShowCancelPlanBtn: boolean;\n addMoreBtnProps?: AddMoreBtnProps;\n}\n\ninterface AddMoreBtnProps {\n text: React.ReactNode;\n buttonProps: React.ComponentProps<typeof Button>;\n canShow: boolean;\n}\n\nexport function SubscriptionManagement({\n className,\n currentPlan,\n cancelSubscription,\n updatePlan,\n canShowUpdatePlanBtn,\n addMoreBtnProps,\n canShowCancelPlanBtn,\n}: SubscriptionManagementProps) {\n return (\n <div className={cn('text-left w-full', className)}>\n <Card className=\"\">\n <CardHeader className=\"pb-4 sm:pb-6 px-4 sm:px-6\">\n <CardTitle className=\"flex items-center gap-2 sm:gap-3 text-lg sm:text-xl\">\n <div className=\"p-1.5 sm:p-2 rounded-lg bg-primary/10 ring-1 ring-primary/20\">\n <CreditCard className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n Current Subscription\n </CardTitle>\n <CardDescription className=\"text-sm sm:text-base\">Manage your billing and subscription settings</CardDescription>\n </CardHeader>\n\n <CardContent className=\"space-y-6 sm:space-y-8 px-4 sm:px-6\">\n {/* Current Plan Details with highlighted styling */}\n <div className=\"relative p-3 sm:p-4 rounded-xl bg-gradient-to-r from-muted/30 via-muted/20 to-muted/30 border border-border/50 overflow-hidden\">\n <div className=\"relative\">\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 sm:gap-0\">\n <div className=\"w-full\">\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-3 mb-2\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-lg sm:text-xl font-semibold\">{currentPlan.plan.title} Plan</h3>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge\n variant={currentPlan.status === 'active' ? 'default' : 'outline'}\n className=\"shadow-sm text-xs sm:text-sm bg-primary/90 hover:bg-primary border-0 font-medium\"\n >\n {currentPlan.type === `monthly`\n ? `${currentPlan.plan.currency}${currentPlan.plan.monthlyPrice}/month`\n : currentPlan.type === `yearly`\n ? `${currentPlan.plan.currency}${currentPlan.plan.yearlyPrice}/year`\n : `${currentPlan.price}`}\n </Badge>\n <Badge variant=\"outline\" className=\"shadow-sm text-xs sm:text-sm border-border/60 bg-background/50 backdrop-blur-sm\">\n {currentPlan.status}\n </Badge>\n </div>\n </div>\n <div className=\"relative\">\n <p className=\"text-xs sm:text-sm text-muted-foreground relative z-10\">{currentPlan.plan.description}</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <Separator className=\"my-4 sm:my-6 bg-gradient-to-r from-transparent via-border to-transparent\" />\n\n <div className=\"space-y-3 sm:space-y-4\">\n <h4 className=\"font-medium flex items-center gap-2 text-base sm:text-lg\">\n <div className=\"p-1 sm:p-1.5 rounded-md bg-muted ring-1 ring-border/50\">\n <Calendar className=\"h-3 w-3 sm:h-4 sm:w-4\" />\n </div>\n Billing Information\n </h4>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 sm:gap-6\">\n <div className=\"group p-2.5 sm:p-3 rounded-lg md:bg-gradient-to-tl bg-gradient-to-b from-muted to-background/10 border border-border/30 hover:border-border/60 transition-all duration-200\">\n <span className=\"text-xs sm:text-sm text-muted-foreground block mb-1\">Start Date</span>\n <div className=\"font-medium text-sm sm:text-base group-hover:text-primary transition-colors duration-200\">\n {currentPlan.startDate}\n </div>\n </div>\n <div className=\"group p-2.5 sm:p-3 rounded-lg md:bg-gradient-to-tl bg-gradient-to-b from-muted to-background/10 border border-border/30 hover:border-border/60 transition-all duration-200\">\n <span className=\"text-xs sm:text-sm text-muted-foreground block mb-1\">Plan Expiry Date</span>\n <div className=\"font-medium text-sm sm:text-base group-hover:text-primary transition-colors duration-200\">\n {currentPlan.expiryDate}\n </div>\n </div>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 sm:gap-6\">\n <div className=\"group p-2.5 sm:p-3 rounded-lg md:bg-gradient-to-tl bg-gradient-to-b from-muted to-background/10 border border-border/30 hover:border-border/60 transition-all duration-200\">\n <span className=\"text-xs sm:text-sm text-muted-foreground block mb-1\">Active Plan for</span>\n <div className=\"font-medium text-sm sm:text-base group-hover:text-primary transition-colors duration-200\">\n {currentPlan.activePlanFor} users\n </div>\n </div>\n <div className=\"group p-2.5 sm:p-3 rounded-lg md:bg-gradient-to-tr bg-gradient-to-b from-muted to-background/10 border border-border/30 hover:border-border/60 transition-all duration-200\">\n <span className=\"text-xs sm:text-sm text-muted-foreground block mb-1\">Total Paid Amount</span>\n <div className=\"font-medium text-sm sm:text-base group-hover:text-primary transition-colors duration-200\">\n {currentPlan.paidAmount}\n </div>\n </div>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 sm:gap-6\">\n <div className=\"group p-2.5 sm:p-3 rounded-lg md:bg-gradient-to-tr bg-gradient-to-b from-muted to-background/10 border border-border/30 hover:border-border/60 transition-all duration-200\">\n <span className=\"text-xs sm:text-sm text-muted-foreground block mb-1\">Payment method</span>\n <div className=\"font-medium text-sm sm:text-base group-hover:text-primary transition-colors duration-200\">\n {currentPlan.paymentMethod}\n </div>\n </div>\n <div className=\"group p-2.5 sm:p-3 rounded-lg md:bg-gradient-to-tr bg-gradient-to-b from-muted to-background/10 border border-border/30 hover:border-border/60 transition-all duration-200\">\n <span className=\"text-xs sm:text-sm text-muted-foreground block mb-1\">Order Id</span>\n <div className=\"font-medium text-sm sm:text-base group-hover:text-primary transition-colors duration-200\">\n {currentPlan.transactionId || 'N/A'}\n </div>\n </div>\n </div>\n </div>\n\n <Separator className=\"my-4 sm:my-6 bg-gradient-to-r from-transparent via-border to-transparent\" />\n\n <div className=\"flex flex-col sm:flex-row gap-3\">\n {canShowUpdatePlanBtn && <UpdatePlanDialog className=\"mx-0 shadow-lg hover:shadow-xl transition-all duration-200\" {...updatePlan} />}\n {addMoreBtnProps && addMoreBtnProps.canShow && <Button {...addMoreBtnProps.buttonProps}>{addMoreBtnProps.text}</Button>}\n {canShowCancelPlanBtn && (\n <CancelSubscriptionDialog className=\"mx-0 shadow-lg hover:shadow-xl transition-all duration-200\" {...cancelSubscription} />\n )}\n <LinkWrapper to={'/plans'}>\n <Button variant={'outline'}>\n Buy Upcoming Plan <MoveUpRight />\n </Button>\n </LinkWrapper>\n </div>\n\n <div className=\"pt-4 sm:pt-6\">\n <h4 className=\"font-medium mb-3 sm:mb-4 text-base sm:text-lg\">Current Plan Features</h4>\n <div className=\"flex flex-wrap gap-2 sm:gap-3\">\n {currentPlan.plan.features.map((feature, index) => (\n <div\n key={index}\n className=\"group flex items-center gap-2 p-2 sm:p-2 rounded-lg border border-border/80 hover:border-primary/30 hover:bg-primary/5 transition-all duration-200\"\n >\n <div className=\"w-1 h-1 sm:w-1.5 sm:h-1.5 rounded-full bg-primary flex-shrink-0 group-hover:bg-primary group-hover:scale-125 transition-all duration-200\"></div>\n <span className=\"text-xs sm:text-sm text-muted-foreground group-hover:text-foreground transition-colors duration-200\">\n {feature.name}\n </span>\n </div>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n","import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\r\nimport { getCurrencySymbol } from '../utils/subscription-utils';\r\nimport { LogIn, type LucideIcon } from 'lucide-react';\r\nimport { Badge } from '@/components/ui/badge';\r\nimport { formatISODateWithTime24H } from '@/lib/utils';\r\nimport LinkWrapper from '@/components/custom/LinkWrapper';\r\nimport { Button } from '@/components/ui/button';\r\nimport { useContext } from 'react';\r\nimport type { purchasedPlansInf } from '@/lib/types';\r\nimport AppContext from '@/store/AppContext';\r\nimport PremiumHighlighter from '@/components/custom/PremiumHighlighter';\r\n\r\ninterface IUpcomingPlans {\r\n upcomingPlans: purchasedPlansInf[] | any[];\r\n Icon: LucideIcon;\r\n title: string;\r\n badgeText: string;\r\n isFreePlan?: boolean;\r\n}\r\n\r\nconst UpcomingPlans = ({ upcomingPlans, Icon, title, badgeText, isFreePlan = false }: IUpcomingPlans) => {\r\n const { subscriptionConfig, orgs, featureFlags } = useContext(AppContext);\r\n const { plans } = subscriptionConfig;\r\n\r\n return (\r\n <Card key=\"upcoming-plans\" className=\"mt-5\">\r\n <CardHeader>\r\n <CardTitle className=\"flex items-center gap-2 sm:gap-3 text-lg sm:text-xl\">\r\n <div className=\"p-1.5 sm:p-2 rounded-lg bg-primary/10 ring-1 ring-primary/20\">\r\n <Icon className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\r\n </div>\r\n {title}\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent>\r\n <div className=\"flex flex-wrap gap-2 sm:gap-3\">\r\n {upcomingPlans.length ? (\r\n upcomingPlans.map((purchasedPlan) => {\r\n const plan = plans.find((p) => p.id === purchasedPlan.plan_id);\r\n\r\n return (\r\n <div\r\n key={purchasedPlan.z_order_id}\r\n className=\"w-full relative p-3 sm:p-4 rounded-xl bg-gradient-to-r from-muted/30 via-muted/20 to-muted/30 border border-border/50 overflow-hidden\"\r\n >\r\n <div className=\"relative\">\r\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 sm:gap-0\">\r\n <div className=\"w-full\">\r\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-3 mb-2\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-lg sm:text-xl font-semibold\">{plan?.title} Plan</h3>\r\n </div>\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n <Badge\r\n variant={purchasedPlan.status === 'active' ? 'default' : 'outline'}\r\n className=\"shadow-sm text-xs sm:text-sm bg-primary/90 hover:bg-primary border-0 font-medium text-primary-foreground\"\r\n >\r\n {getCurrencySymbol(purchasedPlan.z_currency)}\r\n {purchasedPlan.amount}\r\n </Badge>\r\n <Badge variant=\"outline\" className=\"shadow-sm text-xs sm:text-sm border-border/60 bg-background/50 backdrop-blur-sm\">\r\n {badgeText}\r\n </Badge>\r\n </div>\r\n </div>\r\n {isFreePlan ? (\r\n <>\r\n <div className=\"mt-5\">\r\n <LinkWrapper to={'/plans'}>\r\n {/* <Button className={'mt-5'}>\r\n <SparkleIcon /> \r\n Purchase Plan\r\n </Button> */}\r\n <PremiumHighlighter>{'Upgrade to premium'}</PremiumHighlighter>\r\n </LinkWrapper>\r\n\r\n {featureFlags.ff_enable_teams && orgs.length === 0 && (\r\n <LinkWrapper to={'/infrastructure/create-new-org'}>\r\n <Button className={'ml-2'} variant={'outline'}>\r\n <LogIn /> Continue with Free Plan\r\n </Button>\r\n </LinkWrapper>\r\n )}\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"relative\">\r\n <span className=\"text-xs sm:text-sm text-muted-foreground relative z-10\">\r\n <p>\r\n {purchasedPlan.for_no_users} Users for {purchasedPlan.for_months} Months\r\n </p>\r\n <p>Start Date: {formatISODateWithTime24H(purchasedPlan.startAt)}</p>\r\n <p>End Date: {formatISODateWithTime24H(purchasedPlan.endAt)}</p>\r\n <p>Order Id: {purchasedPlan.z_order_id}</p>\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })\r\n ) : (\r\n <p className=\"text-center text-muted-foreground\">No {badgeText} Plans</p>\r\n )}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n};\r\n\r\nexport default UpcomingPlans;\r\n","'use client';\n\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { CheckCircle2 } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\n\nexport interface PaymentSuccessDialogProps {\n title?: string;\n subtitle?: string;\n currencySymbol?: string;\n price: string;\n productName: string;\n proceedButtonText?: string;\n backButtonText?: string;\n onProceed?: () => void;\n onBack?: () => void;\n className?: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport interface PaymentSuccessDialogRef {\n open: () => void;\n close: () => void;\n}\n\ntype ConfettiPiece = {\n id: number;\n x: number;\n xEnd: number;\n delay: number;\n rotation: number;\n size: number;\n colorVar: string; // CSS var name like --primary, --accent\n};\n\nexport const PaymentSuccessDialog = forwardRef<PaymentSuccessDialogRef, PaymentSuccessDialogProps>(function PaymentSuccessDialog(\n {\n title = 'Congratulations!',\n subtitle = 'Your payment was successful.',\n currencySymbol = '$',\n price,\n productName,\n proceedButtonText = 'Proceed',\n backButtonText = 'Back',\n onProceed,\n onBack,\n className,\n open,\n onOpenChange,\n },\n ref,\n) {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(false);\n const openState = isControlled ? (open as boolean) : internalOpen;\n const setOpenState = (value: boolean) => {\n if (isControlled) {\n onOpenChange?.(value);\n } else {\n setInternalOpen(value);\n }\n };\n useImperativeHandle(\n ref,\n () => ({\n open: () => setOpenState(true),\n close: () => setOpenState(false),\n }),\n [isControlled, onOpenChange],\n );\n const [confettiActive, setConfettiActive] = useState(false);\n\n useEffect(() => {\n if (openState) {\n setConfettiActive(true);\n const t = setTimeout(() => setConfettiActive(false), 2200);\n return () => clearTimeout(t);\n }\n setConfettiActive(false);\n }, [openState]);\n\n const confetti: ConfettiPiece[] = useMemo(() => {\n const pieces: ConfettiPiece[] = [];\n const colors = ['--primary', '--accent', '--secondary'];\n for (let i = 0; i < 42; i++) {\n const startX = Math.random() * 100;\n const drift = (Math.random() - 0.5) * 24; // -12% to +12%\n pieces.push({\n id: i,\n x: startX,\n xEnd: Math.max(0, Math.min(100, startX + drift)),\n delay: Math.random() * 0.4,\n rotation: Math.random() * 360,\n size: 6 + Math.round(Math.random() * 6),\n colorVar: colors[i % colors.length],\n });\n }\n return pieces;\n }, []);\n\n return (\n <Dialog open={openState} onOpenChange={setOpenState}>\n <DialogContent className={cn('w-[95%] sm:max-w-[560px] p-0 overflow-hidden text-foreground', className)}>\n <div className=\"relative\">\n <div className=\"p-7 flex flex-col items-center text-center gap-5\">\n <div className=\"relative\">\n <motion.div\n className=\"absolute inset-0 -z-10 mx-auto size-20 rounded-full blur-xl\"\n style={{ background: 'var(--primary)', opacity: 0.12 }}\n initial={{ scale: 0.9, opacity: 0 }}\n animate={{ scale: 1, opacity: 0.12 }}\n transition={{ duration: 0.5, ease: 'easeOut' }}\n />\n <div className=\"relative\">\n <div className=\"size-16 rounded-full bg-primary/10 flex items-center justify-center border border-primary/30 shadow-sm\">\n <CheckCircle2 className=\"size-10 text-primary\" />\n </div>\n <motion.span\n className=\"absolute inset-0 rounded-full border-2 border-primary/30\"\n initial={{ scale: 0.9, opacity: 0.5 }}\n animate={{ scale: 1.25, opacity: 0 }}\n transition={{ duration: 1.2, repeat: Infinity, ease: 'easeOut' }}\n />\n <motion.span\n className=\"absolute inset-0 rounded-full border-2 border-accent/30\"\n initial={{ scale: 0.9, opacity: 0.5 }}\n animate={{ scale: 1.6, opacity: 0 }}\n transition={{ duration: 1.6, repeat: Infinity, ease: 'easeOut', delay: 0.2 }}\n />\n </div>\n </div>\n\n <DialogHeader className=\"text-center\">\n <DialogTitle className=\"text-2xl font-semibold\">{title}</DialogTitle>\n </DialogHeader>\n <p className=\"text-sm text-muted-foreground max-w-[38ch]\">{subtitle}</p>\n\n <div className=\"flex flex-col items-center gap-1\">\n <motion.div\n className=\"text-4xl font-semibold tracking-tight\"\n initial={{ y: 6, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{ type: 'spring', stiffness: 280, damping: 22 }}\n >\n {currencySymbol}\n {price}\n </motion.div>\n <div className=\"text-xs text-muted-foreground\">Paid for {productName}</div>\n </div>\n\n <DialogFooter className=\"w-full flex-col sm:flex-col gap-3 mt-1\">\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={() => {\n onBack?.();\n setOpenState(false);\n }}\n >\n {backButtonText}\n </Button>\n <Button\n className=\"w-full\"\n onClick={() => {\n onProceed?.();\n setOpenState(false);\n }}\n >\n {proceedButtonText}\n </Button>\n </DialogFooter>\n </div>\n\n <AnimatePresence>\n {confettiActive && (\n <motion.div className=\"pointer-events-none absolute inset-0\" initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }}>\n {confetti.map((c) => (\n <motion.span\n key={c.id}\n className=\"absolute block rounded-[2px]\"\n style={{\n left: `${c.x}%`,\n top: '-16px',\n width: c.size,\n height: c.size * 0.6,\n backgroundColor: `var(${c.colorVar})`,\n }}\n initial={{ y: -20, rotate: c.rotation }}\n animate={{ y: 360 + Math.random() * 80, x: `${c.xEnd}%`, rotate: c.rotation + 720 }}\n transition={{ duration: 1.8 + Math.random() * 0.8, delay: c.delay, ease: 'easeOut' }}\n />\n ))}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </DialogContent>\n </Dialog>\n );\n});\n","import DialogWrapper from '@/components/custom/DialogWrapper';\r\nimport { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Label } from '@/components/ui/label';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showErrorToast } from '@/lib/toast-helper';\r\nimport type { ICreateOrderResponse } from '@/lib/types';\r\nimport AppContext from '@/store/AppContext';\r\nimport { useContext, useState, useMemo, useTransition } from 'react';\r\nimport { invokeRazorPay } from '../utils/subscription-utils';\r\nimport { useRazorpay } from 'react-razorpay';\r\nimport { PaymentSuccessDialog } from '@/components/billingsdk/payment-success-dialog';\r\nimport { useNavigate } from 'react-router';\r\nimport usePurchasedPlans from '../hooks/usePurchasedPlans';\r\n\r\ninterface AddMoreUsersDialogProps {\r\n isOpen: boolean;\r\n setIsOpen: (isOpen: boolean) => void;\r\n purchasePlanId: number;\r\n}\r\n\r\nconst AddMoreUsersDialog = ({ isOpen, setIsOpen, purchasePlanId }: AddMoreUsersDialogProps) => {\r\n const { purchasePlans, subscriptionConfig, loggedInUser } = useContext(AppContext);\r\n const { plans, CURRENCY_SYMBOL, CURRENCY } = subscriptionConfig;\r\n const [numberOfUsers, setNumberOfUsers] = useState<number>(1);\r\n const [isTransitionGoingOn, startTransition] = useTransition();\r\n const { Razorpay } = useRazorpay();\r\n const { loadPurchasedPlans } = usePurchasedPlans();\r\n const navigate = useNavigate();\r\n const [paymentSuccessDialogOpen, setPaymentSuccessDialogOpen] = useState(false);\r\n\r\n // Find the purchased plan details\r\n const purchasedPlan = useMemo(() => purchasePlans.find((plan) => plan.purchased_id === purchasePlanId), [purchasePlans, purchasePlanId]);\r\n\r\n // Find the plan configuration\r\n const planConfig = useMemo(() => plans.find((p) => p.id === purchasedPlan?.plan_id), [plans, purchasedPlan]);\r\n\r\n // Calculate the amount based on number of users\r\n const calculatedAmount = useMemo(() => {\r\n if (!purchasedPlan || !planConfig) return 0;\r\n\r\n // Determine if it's monthly or yearly based on for_months\r\n const isYearly = purchasedPlan.for_months === 12;\r\n const pricePerUser = isYearly ? parseFloat(planConfig.yearlyPrice) : parseFloat(planConfig.monthlyPrice);\r\n\r\n return pricePerUser * numberOfUsers;\r\n }, [purchasedPlan, planConfig, numberOfUsers]);\r\n\r\n const handleAddUsers = () => {\r\n setIsOpen(false);\r\n\r\n startTransition(async () => {\r\n try {\r\n await new Promise((resolve) => setTimeout(resolve, 200));\r\n\r\n const createdOrderResponse: ICreateOrderResponse = await getAxiosInstance().post('payment-gateway/add-more-users-order', {\r\n purchased_id: purchasePlanId,\r\n currency: CURRENCY,\r\n for_no_users: numberOfUsers,\r\n });\r\n\r\n await invokeRazorPay(\r\n calculatedAmount,\r\n CURRENCY,\r\n createdOrderResponse,\r\n {\r\n name: `${loggedInUser.fname} ${loggedInUser.lname}`,\r\n email: loggedInUser.email,\r\n contact: loggedInUser.mobNo?.toString() || '',\r\n },\r\n Razorpay,\r\n );\r\n\r\n setIsOpen(true);\r\n setPaymentSuccessDialogOpen(true);\r\n } catch (e) {\r\n setIsOpen(true);\r\n\r\n showErrorToast({\r\n header: 'Failed to add users.',\r\n description: 'Please try again later or contact support if the issue persists.',\r\n });\r\n } finally {\r\n loadPurchasedPlans();\r\n }\r\n });\r\n };\r\n\r\n const handleCancel = () => {\r\n setNumberOfUsers(1);\r\n setIsOpen(false);\r\n };\r\n\r\n if (!purchasedPlan || !planConfig) {\r\n showErrorToast({\r\n header: 'Failed to load plan details.',\r\n description: 'Please try again later or contact support if the issue persists.',\r\n });\r\n return null;\r\n }\r\n\r\n return (\r\n <DialogWrapper\r\n open={isOpen}\r\n setIsOpen={setIsOpen}\r\n disableOutsideClick\r\n header={`Add More Users in ${planConfig.title}`}\r\n actionsJSX={\r\n <>\r\n <Button variant=\"outline\" onClick={handleCancel}>\r\n Cancel\r\n </Button>\r\n <Button onClick={handleAddUsers} disabled={numberOfUsers < 1} loading={isTransitionGoingOn}>\r\n Make Payment\r\n </Button>\r\n </>\r\n }\r\n >\r\n <div className=\"space-y-4 pt-4\">\r\n {/* Sub-header with Order ID */}\r\n <div className=\"text-sm text-muted-foreground\">\r\n <p>\r\n <span className=\"font-medium\">Order ID:</span> {purchasedPlan.z_order_id}\r\n </p>\r\n <p>\r\n <span className=\"font-medium\">Current Users:</span> {purchasedPlan.for_no_users}\r\n </p>\r\n <p>\r\n <span className=\"font-medium\">Plan Duration:</span> {purchasedPlan.for_months === 12 ? 'Yearly' : 'Monthly'}\r\n </p>\r\n </div>\r\n\r\n {/* Input field for number of users */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"numberOfUsers\">Number of Users to Add</Label>\r\n <Input\r\n id=\"numberOfUsers\"\r\n type=\"number\"\r\n min=\"1\"\r\n value={numberOfUsers}\r\n onChange={(e) => setNumberOfUsers(Math.max(1, parseInt(e.target.value) || 1))}\r\n placeholder=\"Enter number of users\"\r\n />\r\n </div>\r\n\r\n {/* Amount calculation display */}\r\n <div className=\"rounded-lg bg-muted p-4 space-y-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm font-medium\">Price per user:</span>\r\n <span className=\"text-sm\">\r\n {CURRENCY_SYMBOL}\r\n {purchasedPlan.for_months === 12 ? planConfig.yearlyPrice : planConfig.monthlyPrice}\r\n </span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm font-medium\">Number of users:</span>\r\n <span className=\"text-sm\">{numberOfUsers}</span>\r\n </div>\r\n <div className=\"border-t pt-2 mt-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"font-semibold\">Total Amount:</span>\r\n <span className=\"text-lg font-bold text-primary\">\r\n {CURRENCY_SYMBOL}\r\n {calculatedAmount.toFixed(2)}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <PaymentSuccessDialog\r\n open={paymentSuccessDialogOpen}\r\n onOpenChange={(isOpen) => {\r\n setPaymentSuccessDialogOpen(isOpen);\r\n\r\n if (!isOpen) {\r\n navigate('/infrastructure/payment-history');\r\n }\r\n }}\r\n price={calculatedAmount.toFixed(2)}\r\n currencySymbol={CURRENCY_SYMBOL}\r\n productName={planConfig.title}\r\n proceedButtonText=\"Go to Dashboard\"\r\n backButtonText=\"Go to Payment History\"\r\n onProceed={() => navigate('/')}\r\n onBack={() => navigate('/infrastructure/payment-history')}\r\n />\r\n </DialogWrapper>\r\n );\r\n};\r\n\r\nexport default AddMoreUsersDialog;\r\n","import { getDisplayPaymentMethod, isFreePlan } from './utils/subscription-utils';\r\nimport { useNavigate } from 'react-router';\r\nimport FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport { SubscriptionManagement } from '@/components/billingsdk/subscription-management';\r\nimport { useContext, useMemo, useState } from 'react';\r\nimport AppContext from '@/store/AppContext';\r\nimport { formatISODateWithTime24H } from '@/lib/utils';\r\nimport { CreditCard, GalleryVerticalEnd, History } from 'lucide-react';\r\nimport UpcomingPlans from './components/UpcomingPlans';\r\nimport AddMoreUsersDialog from './components/AddMoreUsersDialog';\r\n\r\nconst SubscriptionMgmt = () => {\r\n const navigate = useNavigate();\r\n const { activePlan, purchasePlans, subscriptionConfig } = useContext(AppContext);\r\n const { plans, CURRENCY_SYMBOL } = subscriptionConfig;\r\n const [isDialogOpen, setIsDialogOpen] = useState(false);\r\n\r\n const activePurchasedPlan = plans.find((p) => p.id === activePlan?.plan_id) || plans[0];\r\n\r\n const upcomingPlans = useMemo(\r\n () => purchasePlans.filter((purchasePlan) => purchasePlan.status === 'paid' && new Date(purchasePlan.startAt) > new Date()).reverse(),\r\n [purchasePlans],\r\n );\r\n const historyPlans = useMemo(\r\n () => purchasePlans.filter((purchasePlan) => purchasePlan.status === 'paid' && new Date(purchasePlan.endAt) < new Date()),\r\n [purchasePlans],\r\n );\r\n\r\n const freePlan = !activePlan || isFreePlan(activePlan);\r\n\r\n return (\r\n <FlexColsLayout>\r\n <div className=\"pb-5 sm:pl-20 px-2 w-200 mx-auto\">\r\n {!freePlan ? (\r\n <>\r\n <SubscriptionManagement\r\n currentPlan={{\r\n plan: activePurchasedPlan,\r\n type: activePlan.for_months === 12 ? 'yearly' : 'monthly',\r\n startDate: formatISODateWithTime24H(activePlan.startAt),\r\n expiryDate: formatISODateWithTime24H(activePlan.endAt),\r\n paymentMethod: getDisplayPaymentMethod(activePlan.z_payment_method),\r\n activePlanFor: activePlan.for_no_users,\r\n paidAmount: `${CURRENCY_SYMBOL}${activePlan.amount}`,\r\n status: 'active',\r\n transactionId: (() => {\r\n const orderIds = [activePlan.z_order_id];\r\n\r\n if (activePlan.updatedRecords)\r\n activePlan.updatedRecords.forEach((record) => {\r\n if (record.status !== 'paid') return;\r\n orderIds.push(record.z_order_id);\r\n });\r\n\r\n return orderIds.join(', ');\r\n })(),\r\n }}\r\n canShowCancelPlanBtn={false}\r\n cancelSubscription={{\r\n title: 'Cancel Subscription',\r\n description: 'Are you sure you want to cancel your subscription?',\r\n plan: activePurchasedPlan,\r\n onCancel: (planId) => console.log('Subscription cancelled for plan:', planId),\r\n onKeepSubscription: (planId) => console.log('Subscription kept for plan:', planId),\r\n }}\r\n addMoreBtnProps={{\r\n text: 'Add more users to your plan',\r\n buttonProps: {\r\n // onClick: () => navigate('/infrastructure/checkout?purchasePlanId=' + activePlan.purchased_id),\r\n onClick: () => setIsDialogOpen(true),\r\n },\r\n canShow: activePlan.for_no_users < activePurchasedPlan.maxUserRequired,\r\n }}\r\n canShowUpdatePlanBtn={false}\r\n updatePlan={{\r\n currentPlan: activePurchasedPlan,\r\n plans: plans,\r\n triggerText: 'Change Plan',\r\n onPlanChange: (planId, isYearly) => {\r\n navigate(`/infrastructure/checkout?plan=${planId}&billing=${isYearly ? 'yearly' : 'monthly'}`);\r\n },\r\n }}\r\n />\r\n <AddMoreUsersDialog isOpen={isDialogOpen} setIsOpen={setIsDialogOpen} purchasePlanId={activePlan.purchased_id} />\r\n </>\r\n ) : (\r\n <UpcomingPlans upcomingPlans={[activePlan]} Icon={CreditCard} title=\"Current Subscription\" badgeText=\"Active\" isFreePlan />\r\n )}\r\n\r\n <UpcomingPlans upcomingPlans={upcomingPlans} Icon={GalleryVerticalEnd} title=\"Upcoming Plans\" badgeText=\"Upcoming\" />\r\n <UpcomingPlans upcomingPlans={historyPlans} Icon={History} title=\"Expired Plans\" badgeText=\"Expired\" />\r\n </div>\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default SubscriptionMgmt;\r\n","import { getAxiosInstance } from '@/lib/axios-utils';\r\nimport type { ICountries, ICountry } from '@/lib/types';\r\nimport { getLocalStorage, setLocalStorage } from '@/lib/utils';\r\nimport { useEffect, useState } from 'react';\r\n\r\nconst useCountries = (): ICountry[] => {\r\n const [countries, setCountries] = useState<ICountry[]>([]);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n const saved = getLocalStorage('countries');\r\n if (saved) {\r\n try {\r\n const parsed = JSON.parse(saved) as unknown;\r\n if (Array.isArray(parsed)) {\r\n setCountries(parsed as ICountry[]);\r\n return;\r\n }\r\n } catch {\r\n // ignore parse error and fall back to network request\r\n }\r\n }\r\n\r\n const response = (await getAxiosInstance().get('get-countries')) as ICountries;\r\n const lCountries = response.countries ?? [];\r\n if (lCountries.length > 0) {\r\n setLocalStorage('countries', JSON.stringify(lCountries));\r\n }\r\n\r\n setCountries(lCountries);\r\n };\r\n\r\n fetchData();\r\n }, []);\r\n\r\n return countries;\r\n};\r\n\r\nexport default useCountries;\r\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n","import FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport SelectListWrapper from '@/components/custom/SelectListWrapper';\r\nimport { TypographyHeading } from '@/components/custom/Typography/TypographyHeading';\r\nimport { Navigate, useNavigate, useSearchParams } from 'react-router';\r\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\r\nimport { Label } from '@/components/ui/label';\r\nimport { Input } from '@/components/ui/input';\r\nimport useCountries from '@/hooks/useCountries';\r\nimport { Textarea } from '@/components/ui/textarea';\r\nimport { Button } from '@/components/ui/button';\r\nimport { AlertCircleIcon, ArrowRight } from 'lucide-react';\r\nimport LinkWrapper from '@/components/custom/LinkWrapper';\r\nimport { useContext, useRef, useState } from 'react';\r\nimport { useRazorpay } from 'react-razorpay';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport AppContext from '@/store/AppContext';\r\nimport { showErrorToast } from '@/lib/toast-helper';\r\nimport { PaymentSuccessDialog } from '@/components/billingsdk/payment-success-dialog';\r\nimport type { ICreateOrderResponse } from '@/lib/types';\r\nimport { isEmailValid } from '@/lib/utils';\r\nimport usePurchasedPlans from '@/app/routes/Subscriptions/hooks/usePurchasedPlans';\r\nimport { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';\r\nimport { invokeRazorPay, isFreePlan } from './utils/subscription-utils';\r\n\r\nconst Checkout = () => {\r\n const { Razorpay } = useRazorpay();\r\n const { loggedInUser, subscriptionConfig, activePlan } = useContext(AppContext);\r\n const [searchParams] = useSearchParams();\r\n const selectedPlanId = searchParams.get('plan');\r\n const selectedBilling = searchParams.get('billing') || 'yearly';\r\n\r\n const countries = useCountries();\r\n\r\n const navigate = useNavigate();\r\n const [paymentSuccessDialogOpen, setPaymentSuccessDialogOpen] = useState(false);\r\n const [isPaymentLoading, setPaymentLoading] = useState(false);\r\n\r\n const { plans, CURRENCY, CURRENCY_SYMBOL } = subscriptionConfig;\r\n\r\n const selectedPlanRecord = plans.find((rec) => rec.id === selectedPlanId) || plans[0];\r\n const { minUserRequired, maxUserRequired } = selectedPlanRecord;\r\n\r\n const [billingPeriod, setBillingPeriod] = useState(selectedBilling);\r\n const [teamSize, setTimeSize] = useState(minUserRequired);\r\n\r\n //Total Calculation...\r\n const teamSizeForCalculation = teamSize <= minUserRequired ? minUserRequired : teamSize;\r\n\r\n const planAmount = billingPeriod === 'yearly' ? selectedPlanRecord.yearlyPrice : selectedPlanRecord.monthlyPrice;\r\n const totalFinalPrice = teamSizeForCalculation * parseFloat(planAmount);\r\n\r\n const largeAmountMonths = billingPeriod === 'yearly' ? 12 : 1;\r\n const monthlyPlanAmount = selectedPlanRecord.monthlyPrice;\r\n const subTotal = largeAmountMonths * teamSizeForCalculation * parseFloat(monthlyPlanAmount);\r\n\r\n const billingDetails = useRef({\r\n fullName: loggedInUser?.fname + ' ' + loggedInUser?.lname,\r\n country: '',\r\n address: '',\r\n email: loggedInUser?.email,\r\n mobileNo: loggedInUser?.mobNo?.toString(),\r\n });\r\n\r\n const { loadPurchasedPlans } = usePurchasedPlans();\r\n\r\n if (selectedPlanRecord.monthlyPrice === '0' || selectedPlanRecord.yearlyPrice === '0') {\r\n return <Navigate to=\"/\" />;\r\n }\r\n\r\n const handleOnPayNow = async () => {\r\n const validateBillingDetails = () => {\r\n const errors: { [key: string]: string } = {};\r\n const details = billingDetails.current;\r\n\r\n if (!details.fullName.trim()) {\r\n errors.fullName = 'Full Name is required.';\r\n }\r\n\r\n if (!details.country.trim()) {\r\n errors.country = 'Country is required.';\r\n }\r\n\r\n if (!details.address.trim()) {\r\n errors.address = 'Address is required.';\r\n } else if (details.address.trim().length < 5) {\r\n errors.address = 'Address must be at least 5 characters.';\r\n }\r\n\r\n if (!details.email.trim()) {\r\n errors.email = 'Email is required.';\r\n } else if (!isEmailValid(details.email)) {\r\n errors.email = 'Email is invalid.';\r\n }\r\n\r\n if (!details.mobileNo?.toString().trim()) {\r\n errors.mobileNo = 'Mobile Number is required.';\r\n } else if (\r\n !/^\\d+$/.test(details.mobileNo?.toString()) ||\r\n details.mobileNo?.toString().trim().length < 10 ||\r\n details.mobileNo?.toString().trim().length > 15\r\n ) {\r\n errors.mobileNo = 'Mobile Number is invalid (must be 10-15 digits).';\r\n }\r\n\r\n return errors;\r\n };\r\n\r\n const validationErrors = validateBillingDetails();\r\n if (Object.keys(validationErrors).length > 0) {\r\n Object.values(validationErrors)\r\n .reverse()\r\n .forEach((errorMsg) =>\r\n showErrorToast({\r\n header: 'Invalid Billing Details',\r\n description: errorMsg,\r\n }),\r\n );\r\n return;\r\n }\r\n\r\n try {\r\n setPaymentLoading(true);\r\n\r\n const createdOrderResponse: ICreateOrderResponse = await getAxiosInstance().post('payment-gateway/create-order', {\r\n planId: selectedPlanRecord.id,\r\n // amount: totalFinalPrice,\r\n currency: CURRENCY,\r\n // for_months: billingPeriod === 'yearly' ? 12 : 1,\r\n billingPeriod: billingPeriod || 'yearly',\r\n for_no_users: teamSizeForCalculation,\r\n\r\n billing_name: billingDetails.current.fullName,\r\n billing_email: billingDetails.current.email,\r\n billing_contact_no: billingDetails.current.mobileNo,\r\n billing_address: billingDetails.current.address,\r\n billing_country: billingDetails.current.country,\r\n });\r\n\r\n const billerInfo = billingDetails.current;\r\n\r\n await invokeRazorPay(\r\n totalFinalPrice,\r\n CURRENCY,\r\n createdOrderResponse,\r\n {\r\n name: billerInfo.fullName || `${loggedInUser.fname} ${loggedInUser.lname}`,\r\n email: billerInfo.email || loggedInUser.email,\r\n contact: billerInfo.mobileNo?.toString() || loggedInUser.mobNo?.toString() || '',\r\n },\r\n Razorpay,\r\n );\r\n\r\n setPaymentSuccessDialogOpen(true);\r\n } catch (e: unknown) {\r\n showErrorToast({\r\n header: 'Payment Failed!',\r\n description: (e as Error)?.message,\r\n });\r\n } finally {\r\n await loadPurchasedPlans();\r\n setPaymentLoading(false);\r\n }\r\n };\r\n\r\n const getAlert = () => {\r\n if (isFreePlan(activePlan)) return null;\r\n\r\n return (\r\n <Alert variant=\"default\" className=\"mb-5\">\r\n <AlertCircleIcon />\r\n <AlertTitle>You currently have an active paid plan.</AlertTitle>\r\n <AlertDescription>\r\n <p>\r\n Please be aware that this purchase is for an upcoming plan. Check your{' '}\r\n <LinkWrapper className=\"text-primary\" to={'/infrastructure/manage-subscription'}>\r\n current subscription\r\n </LinkWrapper>\r\n .\r\n </p>\r\n </AlertDescription>\r\n </Alert>\r\n );\r\n };\r\n\r\n return (\r\n <FlexColsLayout className=\"pb-5\" responsive>\r\n <div className=\"sm:mx-auto mx-1 px-5\">\r\n <TypographyHeading className=\"mb-4\">\r\n Checkout \"{selectedPlanRecord.title}\" Plan{' '}\r\n <LinkWrapper className={'text-xs text-primary'} to={'/plans'}>\r\n Change Plan\r\n </LinkWrapper>\r\n </TypographyHeading>\r\n {getAlert()}\r\n <FlexColsLayout layout=\"horizontal\" className=\"gap-5\" responsive>\r\n <FlexColsLayout layout=\"vertical\" className=\"sm:w-150 w-full gap-5\" doNotAppendFlex1 responsive>\r\n <Card>\r\n <CardHeader>\r\n <CardTitle>Specify billing period and team size</CardTitle>\r\n <CardDescription>With yearly plans, you can save up to 17%.</CardDescription>\r\n </CardHeader>\r\n <CardContent>\r\n <div className=\"grid gap-6\">\r\n <div className=\"grid gap-2\">\r\n <Label>Billing period *</Label>\r\n <SelectListWrapper\r\n triggerClassName=\"w-full\"\r\n placeholder=\"Select billing period\"\r\n items={[\r\n { value: 'monthly', label: `Monthly - ${selectedPlanRecord.planDisplayCost?.monthly}` },\r\n { value: 'yearly', label: `Yearly - ${selectedPlanRecord.planDisplayCost?.yearly}` },\r\n ]}\r\n value={billingPeriod}\r\n onValueChange={(value) => setBillingPeriod(value)}\r\n />\r\n </div>\r\n {minUserRequired > 1 ? (\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"teamSize\">\r\n Team Size (This should be {minUserRequired} or &gt; {minUserRequired}) *\r\n </Label>\r\n <Input\r\n type=\"number\"\r\n id=\"teamSize\"\r\n placeholder=\"\"\r\n min={minUserRequired}\r\n max={maxUserRequired}\r\n value={teamSize}\r\n onChange={(e) => setTimeSize(Math.max(minUserRequired, parseInt(e.target.value) || minUserRequired))}\r\n />\r\n </div>\r\n ) : (\r\n <></>\r\n )}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n\r\n <Card>\r\n <CardHeader>\r\n <CardTitle>Billing Details</CardTitle>\r\n <CardDescription>To finalize your subscription, kindly complete your details.</CardDescription>\r\n </CardHeader>\r\n <CardContent>\r\n <div className=\"grid gap-6\">\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"fullName\">Full Name *</Label>\r\n <Input\r\n onChange={(e) => (billingDetails.current.fullName = e.currentTarget.value)}\r\n id=\"fullName\"\r\n type=\"text\"\r\n placeholder=\"\"\r\n name=\"fullName\"\r\n defaultValue={loggedInUser?.fname + ' ' + loggedInUser?.lname}\r\n />\r\n </div>\r\n\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"country\">Country *</Label>\r\n <SelectListWrapper\r\n valueField=\"countryCode\"\r\n labelField=\"countryName\"\r\n triggerClassName=\"w-full\"\r\n placeholder=\"\"\r\n items={countries as unknown as Record<string, unknown>[]}\r\n // value={selectedBilling || undefined}\r\n onValueChange={(value) => {\r\n billingDetails.current.country = value;\r\n }}\r\n />\r\n </div>\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"address\">Address *</Label>\r\n <Textarea onChange={(e) => (billingDetails.current.address = e.target.value)} id=\"address\" placeholder=\"\" />\r\n </div>\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"email\">Email *</Label>\r\n <Input\r\n defaultValue={loggedInUser?.email}\r\n onChange={(e) => (billingDetails.current.email = e.target.value)}\r\n id=\"email\"\r\n type=\"email\"\r\n placeholder=\"\"\r\n name=\"email\"\r\n />\r\n </div>\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"mobileNo\">Mobile No *</Label>\r\n <Input\r\n onChange={(e) => (billingDetails.current.mobileNo = e.target.value)}\r\n id=\"mobileNo\"\r\n type=\"number\"\r\n placeholder=\"\"\r\n name=\"mobileNo\"\r\n defaultValue={loggedInUser?.mobNo}\r\n />\r\n </div>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n </FlexColsLayout>\r\n <FlexColsLayout layout=\"vertical\" className=\"sm:w-80 w-full\" doNotAppendFlex1 responsive>\r\n <Card>\r\n <CardHeader>\r\n <CardTitle>Summary</CardTitle>\r\n </CardHeader>\r\n <CardContent>\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-muted-foreground\">Subtotal</span>\r\n <span className=\"tabular-nums\">\r\n {CURRENCY_SYMBOL}\r\n {subTotal.toFixed(2)}\r\n </span>\r\n </div>\r\n\r\n {/* {billingPeriod === 'yearly' ? ( */}\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-muted-foreground\">Discount (Yearly)</span>\r\n <span className=\"tabular-nums\">\r\n - {CURRENCY_SYMBOL}\r\n {(subTotal - totalFinalPrice).toFixed(2)}\r\n </span>\r\n </div>\r\n {/* ) : (\r\n <></>\r\n )} */}\r\n\r\n {/* <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-muted-foreground\">Subtotal</span>\r\n <span className=\"tabular-nums\">${subtotal.toFixed(2)}</span>\r\n </div> */}\r\n\r\n <div className=\"flex items-center justify-between border-t pt-2\">\r\n <span className=\"font-medium\">Total</span>\r\n <span className=\"text-xl font-semibold tabular-nums\">\r\n {CURRENCY_SYMBOL}\r\n {totalFinalPrice.toFixed(2)}\r\n </span>\r\n </div>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n <Button className=\"mt-5\" onClick={handleOnPayNow} loading={isPaymentLoading}>\r\n Make Payment <ArrowRight />\r\n </Button>\r\n </FlexColsLayout>\r\n </FlexColsLayout>\r\n </div>\r\n\r\n <PaymentSuccessDialog\r\n open={paymentSuccessDialogOpen}\r\n onOpenChange={(isOpen) => {\r\n setPaymentSuccessDialogOpen(isOpen);\r\n\r\n if (!isOpen) {\r\n navigate('/infrastructure/payment-history');\r\n }\r\n }}\r\n price={totalFinalPrice.toFixed(2)}\r\n currencySymbol={CURRENCY_SYMBOL}\r\n productName={selectedPlanRecord.title}\r\n proceedButtonText=\"Go to Dashboard\"\r\n backButtonText=\"Go to Payment History\"\r\n onProceed={() => navigate('/')}\r\n onBack={() => navigate('/infrastructure/payment-history')}\r\n />\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default Checkout;\r\n","'use client';\n\nimport { cn } from '@/lib/utils';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Table, TableBody, TableCell, TableCaption, TableHead, TableHeader, TableRow } from '@/components/ui/table';\nimport { Badge } from '@/components/ui/badge';\nimport { CalendarDays, Download, ReceiptText } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\n\nexport interface InvoiceItem {\n id: string;\n date: string;\n amount: string;\n status: 'paid' | 'refunded' | 'idle' | 'verified' | 'failed';\n invoiceUrl?: string;\n description?: string;\n transactionId?: string;\n}\n\ninterface InvoiceHistoryProps {\n className?: string;\n title?: string;\n description?: string;\n invoices: InvoiceItem[];\n onDownload?: (invoiceId: string) => void;\n}\n\nexport function InvoiceHistory({\n className,\n title = 'Invoice History',\n description = 'Your past invoices and payment receipts.',\n invoices,\n onDownload,\n}: InvoiceHistoryProps) {\n if (!invoices) return null;\n\n const statusBadge = (status: InvoiceItem['status']) => {\n switch (status) {\n case 'paid':\n return <Badge className=\"bg-emerald-600 text-emerald-50 border-emerald-700/40\">Paid</Badge>;\n case 'refunded':\n return <Badge variant=\"secondary\">Refunded</Badge>;\n case 'idle':\n return <Badge variant=\"outline\">Open</Badge>;\n case 'verified':\n return <Badge variant=\"outline\">Verified</Badge>;\n case 'failed':\n return <Badge variant=\"destructive\">Failed</Badge>;\n }\n };\n\n return (\n <Card className={cn('w-full', className)}>\n {(title || description) && (\n <CardHeader className=\"space-y-1\">\n {title && (\n <CardTitle className=\"text-base font-medium leading-tight truncate flex items-center gap-2 sm:gap-3 text-lg sm:text-xl\">\n <ReceiptText className=\"h-4 w-4 text-primary\" />\n {title}\n </CardTitle>\n )}\n {description && <CardDescription className=\"text-sm text-muted-foreground\">{description}</CardDescription>}\n </CardHeader>\n )}\n <CardContent>\n <Table>\n <TableCaption className=\"sr-only\">List of past invoices with dates, amounts, status and download actions</TableCaption>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[120px]\">Date</TableHead>\n <TableHead className=\"text-left\">Order ID</TableHead>\n <TableHead>Description</TableHead>\n <TableHead className=\"text-right\">Amount</TableHead>\n <TableHead className=\"text-right\">Status</TableHead>\n <TableHead className=\"text-right\">Action</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {invoices.length === 0 && (\n <TableRow>\n <TableCell colSpan={6} className=\"h-24 text-center text-muted-foreground\">\n No invoices yet\n </TableCell>\n </TableRow>\n )}\n {invoices.map((inv) => (\n <TableRow key={inv.id} className=\"group\">\n <TableCell className=\"text-muted-foreground\">\n <div className=\"inline-flex items-center gap-2\">\n <CalendarDays className=\"h-3.5 w-3.5\" />\n {inv.date}\n </div>\n </TableCell>\n <TableCell className=\"text-left\">{inv.transactionId}</TableCell>\n <TableCell className=\"max-w-[320px]\">\n <div className=\"truncate\" title={inv.description || 'Invoice'}>\n {inv.description || 'Invoice'}\n </div>\n </TableCell>\n <TableCell className=\"text-right font-medium\">{inv.amount}</TableCell>\n <TableCell className=\"text-right\">{statusBadge(inv.status)}</TableCell>\n <TableCell className=\"text-right\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 text-xs\"\n onClick={() => (inv.invoiceUrl ? window.open(inv.invoiceUrl, '_blank', 'noopener,noreferrer') : onDownload?.(inv.id))}\n aria-label={`Download invoice ${inv.id}`}\n >\n <Download className=\"h-3.5 w-3.5\" />\n Download\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n );\n}\n","import { InvoiceHistory, type InvoiceItem } from '@/components/billingsdk/invoice-history';\r\nimport { formatISODateWithTime24H } from '@/lib/utils';\r\nimport AppContext from '@/store/AppContext';\r\nimport { useContext } from 'react';\r\nimport { getCurrencySymbol } from './utils/subscription-utils';\r\nimport FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\n\r\nconst PaymentHistory = () => {\r\n const { purchasePlans, subscriptionConfig } = useContext(AppContext);\r\n const { plans } = subscriptionConfig;\r\n\r\n const invoices: InvoiceItem[] = [];\r\n\r\n purchasePlans.forEach((plan) => {\r\n const activePlan = plans.find((p) => p.id === plan.plan_id);\r\n\r\n const invoiceItem = {\r\n id: plan.z_order_id,\r\n date: formatISODateWithTime24H(plan.purchased_at),\r\n amount: `${getCurrencySymbol(plan.z_currency)}${plan.old_purchased_amount || plan.amount} (${plan.z_currency})`,\r\n status: plan.status as InvoiceItem['status'],\r\n description: `${activePlan?.title} — ${plan.for_months} months, ${plan.old_purchased_for_no_users || plan.for_no_users} users`,\r\n // invoiceUrl: plan.invoiceUrl,\r\n transactionId: plan.z_order_id,\r\n };\r\n\r\n if (plan.updatedRecords) {\r\n plan.updatedRecords.forEach((record) => {\r\n invoices.push({\r\n id: record.z_order_id,\r\n date: formatISODateWithTime24H(record.updated_at),\r\n amount: `${getCurrencySymbol(record.z_currency)}${record.amount} (${record.z_currency})`,\r\n status: record.status as InvoiceItem['status'],\r\n description: `Added ${record.for_no_users} more users, in ${plan.z_order_id}`,\r\n // invoiceUrl: record.invoiceUrl,\r\n transactionId: record.z_order_id,\r\n });\r\n });\r\n }\r\n invoices.push(invoiceItem);\r\n });\r\n\r\n invoices.sort((a, b) => {\r\n const dateA = new Date(a.date).getTime();\r\n const dateB = new Date(b.date).getTime();\r\n return dateA - dateB;\r\n });\r\n\r\n return (\r\n <FlexColsLayout>\r\n <div className=\"w-full sm:max-w-250 mx-auto\">\r\n <InvoiceHistory\r\n title=\"Payment History\"\r\n description=\"Your past payment receipts.\"\r\n className=\"shadow-none border-none\"\r\n invoices={invoices.reverse()}\r\n />\r\n </div>\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default PaymentHistory;\r\n","import {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from \"@/components/ui/select\";\r\nimport useTheme from \"@/hooks/useTheme\";\r\n\r\nconst ThemeCmb = () => {\r\n const { theme, setTheme } = useTheme();\r\n\r\n return (\r\n <Select\r\n value={theme}\r\n onValueChange={(newTheme) => {\r\n setTheme(newTheme);\r\n }}\r\n >\r\n <SelectTrigger className=\"w-[180px]\">\r\n <SelectValue placeholder=\"Theme\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"light\">Light</SelectItem>\r\n <SelectItem value=\"dark\">Dark</SelectItem>\r\n <SelectItem value=\"system\">System</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n );\r\n};\r\n\r\nexport default ThemeCmb;\r\n","import ListPanel from '@/components/custom/ListPanel';\r\nimport HeaderText from '@/components/custom/HeaderText';\r\nimport { Switch } from '@/components/ui/switch';\r\nimport ThemeCmb from './Components/ThemeCmb';\r\nimport { FlexColsLayout, LinkWrapper } from '@/components/custom';\r\nimport { appInfo } from '@/config/app-config';\r\nimport { SquareArrowOutUpRight } from 'lucide-react';\r\nimport { useContext } from 'react';\r\nimport AppContext from '@/store/AppContext';\r\n\r\nconst GeneralSettingsPg = () => {\r\n const { featureFlags } = useContext(AppContext);\r\n return (\r\n <FlexColsLayout className=\"pr-5 pl-5\">\r\n <div className=\"space-y-3\">\r\n <HeaderText>Email Settings</HeaderText>\r\n {/* <ListPanel title=\"Marketing emails\" description=\"Receive emails about new products, features, and more.\" control={<Switch />} /> */}\r\n <ListPanel title=\"Security emails\" description=\"Receive emails about your account security.\" control={<Switch checked={true} disabled />} />\r\n </div>\r\n\r\n <div className=\"space-y-3 mt-4\">\r\n <HeaderText>Theme</HeaderText>\r\n <ListPanel title=\"Specify theme\" description=\"Choose your preferred theme to enhance your reading experience.\" control={<ThemeCmb />} />\r\n </div>\r\n\r\n {featureFlags?.ff_enable_teams && (\r\n <div className=\"space-y-3 mt-4\">\r\n <HeaderText>\r\n <>{appInfo.account_type_txt.plural} Settings</>\r\n </HeaderText>\r\n\r\n <LinkWrapper to={'/infrastructure/manage-infra'}>\r\n <ListPanel\r\n title={`Manage ${appInfo.account_type_txt.plural}`}\r\n description={`Create and manage ${appInfo.account_type_txt.plural}, update ${appInfo.account_type_txt.singular} details, and invite members as needed.`}\r\n control={<SquareArrowOutUpRight />}\r\n labelCls=\"cursor-pointer\"\r\n />\r\n </LinkWrapper>\r\n <LinkWrapper to={'/infrastructure/user-invitations'}>\r\n <ListPanel\r\n title={`Check Invitations`}\r\n description={`View and respond to ${appInfo.account_type_txt.singular} invitations you have received.`}\r\n control={<SquareArrowOutUpRight />}\r\n labelCls=\"cursor-pointer\"\r\n className=\"mt-3\"\r\n />\r\n </LinkWrapper>\r\n </div>\r\n )}\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default GeneralSettingsPg;\r\n","const CenterAndMiddle = ({ className = '', children }: { className?: string; children: React.ReactNode }) => {\r\n return <div className={`flex-1 flex items-center justify-center ${className}`}>{children}</div>;\r\n};\r\n\r\nexport default CenterAndMiddle;\r\n","import { showSuccessToast } from '@/lib';\r\nimport { useState } from 'react';\r\nimport { Button, Textarea } from '../ui';\r\nimport { Check, Copy } from 'lucide-react';\r\n\r\nconst CopyTextField = ({ copyText }: { copyText: string }) => {\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = async (text: string) => {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n showSuccessToast({ description: 'Copied to clipboard' });\r\n };\r\n\r\n return (\r\n <div className=\"flex gap-2\">\r\n <Textarea readOnly value={copyText} />\r\n <Button variant=\"outline\" size=\"icon\" onClick={() => handleCopy(copyText)} className=\"shrink-0\">\r\n <span className=\"flex items-center\">{copied ? <Check size={16} className=\"text-green-500\" /> : <Copy size={16} />}</span>\r\n </Button>\r\n </div>\r\n );\r\n};\r\n\r\nexport default CopyTextField;\r\n","import type React from 'react';\r\nimport { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '../ui';\r\nimport { ChevronDown } from 'lucide-react';\r\n\r\ninterface IDropdownItem {\r\n label: string | React.ReactNode;\r\n value: string;\r\n}\r\n\r\ninterface IDropdownBtnProps {\r\n label?: React.ReactNode;\r\n children?: React.ReactNode;\r\n items: IDropdownItem[];\r\n onItemSelect?: (item: IDropdownItem) => void;\r\n disabled?: boolean;\r\n}\r\n\r\nexport const DropdownBtn = ({ label, children, items, onItemSelect, disabled }: IDropdownBtnProps) => {\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild disabled={disabled}>\r\n {children ? (\r\n children\r\n ) : (\r\n <Button className=\"flex items-center gap-1\">\r\n {label} <ChevronDown size={15} />\r\n </Button>\r\n )}\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent>\r\n {items.map((item) => (\r\n <DropdownMenuItem key={item.value} onClick={() => onItemSelect?.(item)}>\r\n {item.label}\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n};\r\n","import { ChevronDown } from 'lucide-react';\r\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Label } from '../ui';\r\n\r\nexport interface IDropdownItem {\r\n label: string;\r\n value: string;\r\n}\r\n\r\ninterface IDropdownLblProps {\r\n label?: string;\r\n selectedRec: IDropdownItem;\r\n setSelectedRec: (value: IDropdownItem) => void;\r\n items: IDropdownItem[];\r\n}\r\n\r\nexport const DropdownLbl = ({ label, selectedRec, setSelectedRec, items }: IDropdownLblProps) => {\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <div className=\"flex items-center gap-2\">\r\n {label && <Label className=\"whitespace-nowrap\">{label}</Label>}\r\n <span className=\"whitespace-nowrap text-primary flex items-center gap-1 text-sm cursor-pointer\">\r\n {selectedRec.label} <ChevronDown size={15} />\r\n </span>\r\n </div>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent>\r\n {items.map((item) => (\r\n <DropdownMenuItem key={item.value} onClick={() => setSelectedRec(item)}>\r\n {item.label}\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n};\r\n","import { Toaster } from '@/components/ui/sonner';\nimport Routes, { type IRoutes } from './app/Routes';\nimport AppContext from './store/AppContext';\nimport './App.css';\nimport useTheme from './hooks/useTheme';\nimport { useCallback, useState } from 'react';\nimport AlertDialog, { type AlertDialogOptionsProps } from './components/custom/AlertDialog';\nimport { defaultAlertConfig, setLocalStorage } from './lib/utils';\nimport type { loggedInUserInf, OrganizationType, purchasedPlansInf } from './lib/types';\nimport type { ISubscriptionConfig } from './lib/billingsdk-config';\n\ninterface IAppProps extends IRoutes {\n appRoutes: IRoutes['appRoutes'];\n publicRoutes?: IRoutes['publicRoutes'];\n}\n\nfunction App({ appRoutes, publicRoutes }: IAppProps) {\n useTheme();\n const [alertDlgOptions, setAlertDlgOptions] = useState<AlertDialogOptionsProps>(defaultAlertConfig);\n\n const [orgs, setOrgs] = useState<OrganizationType[]>([]);\n const [loggedInUser, setLoggedInUser] = useState<loggedInUserInf>();\n const [activeOrg, setActiveOrg] = useState<OrganizationType>();\n const [purchasePlans, setPurchasePlans] = useState<purchasedPlansInf[]>([]);\n const [activePlan, setActivePlan] = useState<purchasedPlansInf>();\n const [subscriptionConfig, setSubscriptionConfig] = useState<ISubscriptionConfig>({} as ISubscriptionConfig);\n const [featureFlags, setFeatureFlags] = useState<Record<string, boolean>>({});\n\n const setActiveOrgHandler = useCallback(\n (org: OrganizationType) => {\n if (!org) return;\n\n setLocalStorage('activeOrgId', String(org.org_id));\n setActiveOrg(org);\n },\n [setActiveOrg],\n );\n\n return (\n <AppContext.Provider\n value={{\n alertDlgOptions,\n setAlertDlgOptions,\n orgs,\n setOrgs,\n loggedInUser: loggedInUser || ({} as loggedInUserInf),\n setLoggedInUser,\n activeOrg,\n setActiveOrg: setActiveOrgHandler,\n purchasePlans,\n setPurchasePlans,\n activePlan,\n setActivePlan,\n subscriptionConfig,\n setSubscriptionConfig,\n featureFlags,\n setFeatureFlags,\n }}\n >\n <Routes appRoutes={appRoutes} publicRoutes={publicRoutes} />\n <Toaster />\n <AlertDialog options={alertDlgOptions} />\n </AppContext.Provider>\n );\n}\n\nexport default App;\n","import { cn } from \"@/lib/utils\"\r\n\r\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"skeleton\"\r\n className={cn(\"bg-accent animate-pulse rounded-md\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Skeleton }\r\n","import { TabsContent } from '@radix-ui/react-tabs';\r\nimport { Tabs, TabsList, TabsTrigger } from '../ui';\r\n\r\ninterface ITabsWrapperProps {\r\n tabs: {\r\n title: React.ReactNode;\r\n content: React.ReactNode;\r\n value: string;\r\n }[];\r\n variant?: 'default' | 'line';\r\n defaultValue?: string;\r\n}\r\nconst TabsWrapper = ({ tabs, variant, defaultValue }: ITabsWrapperProps) => {\r\n return (\r\n <Tabs defaultValue={defaultValue}>\r\n <TabsList variant={variant}>\r\n {tabs.map((tab) => (\r\n <TabsTrigger key={tab.value} value={tab.value}>\r\n {tab.title}\r\n </TabsTrigger>\r\n ))}\r\n </TabsList>\r\n\r\n {tabs.map((tab) => (\r\n <TabsContent key={tab.value} value={tab.value}>\r\n {tab.content}\r\n </TabsContent>\r\n ))}\r\n </Tabs>\r\n );\r\n};\r\nexport default TabsWrapper;\r\n","import { useBlocker } from 'react-router';\r\nimport AlertDialog from './AlertDialog';\r\nimport { useEffect } from 'react';\r\n\r\nconst UrlChangesGuard = ({ isDirty, setDirty }: { isDirty: boolean; setDirty: (dirty: boolean) => void }) => {\r\n const blocker = useBlocker(isDirty);\r\n\r\n useEffect(() => {\r\n const handler = (e: BeforeUnloadEvent) => {\r\n if (!isDirty) return;\r\n e.preventDefault();\r\n e.returnValue = '';\r\n };\r\n\r\n window.addEventListener('beforeunload', handler);\r\n return () => window.removeEventListener('beforeunload', handler);\r\n }, [isDirty]);\r\n\r\n if (blocker.state === 'blocked') {\r\n return (\r\n <AlertDialog\r\n options={{\r\n open: true,\r\n text: 'Are you sure you want to leave this page?',\r\n type: 'CONFIRM',\r\n onClose: (result: 'CONFIRM' | 'CANCEL') => {\r\n if (result === 'CONFIRM') {\r\n blocker?.proceed();\r\n setDirty(false);\r\n } else {\r\n blocker?.reset();\r\n }\r\n },\r\n }}\r\n />\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default UrlChangesGuard;\r\n"],"names":["navigationItems","navMain","title","items","icon","SquarePen","url","Bookmark","BookOpen","Settings2","virtualChildOf","loadRecursiveChild","elements","result","parent","forEach","el","otherProps","push","APP_INFO_ACCOUNT_TYPE","TEAM","ORG","appInfo","appId","appName","appDescription","logo","NotebookText","version","account_type_txt","singular","plural","value","supportEmail","cloudFareKey","razorPayKey","themeColor","serverUrl","cn","inputs","twMerge","clsx","getFormDataByFormEl","formEl","formData","FormData","Object","fromEntries","entries","processKey","key","setLocalStorage","localStorage","setItem","getLocalStorage","getItem","isSameNavItem","activeUrl","urlPath","find","vc","id","parentId","findNavMenu","moduleName","flatNavMap","navTree","undefined","getFlatNavigationItems","navItem","virtualChild","createIndexedArray","n","Array","from","length","_v","i","defaultAlertConfig","open","type","text","validatePassword","password","hasUpperCase","test","hasLowerCase","hasNumber","hasSpecialChar","valid","message","errorLogger","error","console","isEmailValid","email","arrayEmail","String","toLowerCase","match","isArray","processEmailsWithValidation","textareaValue","validEmails","invalidEmails","totalProcessed","emailList","replace","split","map","trim","filter","convertServerDateToJS","serverDateStr","Date","formatISODateWithTime24H","isoString","use12hr","date","day","getDate","padStart","month","getMonth","year","getFullYear","hours","getHours","minutes","getMinutes","ampm","hoursStr","MULTIPLIER","generatePublicId","privateId","undoPublicId","publicId","Math","floor","mapIncrementBy2","arr","callback","firstEl","secondEl","isFunction","isTruthyValue","INVITATION_ENUMS","freeze","NOT_SAVED","INVITED","ACCEPTED","REJECTED","LEFT","getDisplay","statusCode","this","isObjectEmpty","obj","keys","isValidId","parseInt","getModuleNameFromUrl","pathName","localStorageKey","useTheme","defaultTheme","getDefaultThemeSelected","theme","setTheme","useState","useEffect","root","window","document","documentElement","classList","remove","newTheme","matchMedia","matches","add","Toaster","props","_jsx","Sonner","position","style","AppContext","createContext","setAlertDlgOptions","alertDlgOptions","orgs","setOrgs","loggedInUser","setLoggedInUser","activeOrg","setActiveOrg","purchasePlans","setPurchasePlans","activePlan","setActivePlan","subscriptionConfig","setSubscriptionConfig","featureFlags","setFeatureFlags","LoadingCmp","Loader2Icon","className","FullPageLoading","_jsxs","children","showSuccessToast","header","description","toast","success","showErrorToast","showWarningToast","warning","axiosInstance","getAxiosInstance","axios","create","baseURL","headers","api","interceptors","request","use","config","response","data","errorRes","parseDbErrorMessageEnhanced","errorMsg","solution","tableNameMapping","auth_users_tbl","user_id","user_email","user_mobile_no","user_fname","user_lname","user_is_active","auth_organization_tbl","org_id","org_name","org_address","org_state","org_country","org_external_id","org_gst_in","org_is_deleted","org_created_by","auth_organization_users_tbl","org_user_id","org_user_role_id","org_user_is_active","user_opinion","auth_invited_users_tbl","invited_users_id","invited_user_role_id","invited_by_user_id","is_deleted","errorMessage","parsedMessage","matchAll","fullMatch","tableName","columnName","friendlyName","replaceAll","getCurrencySymbol","currency","isFreePlan","plan","plan_id","invokeRazorPay","totalFinalPrice","CURRENCY","createdOrderResponse","prefillObject","Razorpay","Promise","resolve","reject","options","amount","order_id","orderId","name","handler","async","post","razorpayPaymentId","razorpay_payment_id","razorpaySignature","razorpay_signature","prefill","color","modal","ondismiss","Error","razorpay","on","errorCode","code","errorDescription","errorReason","reason","paymentId","metadata","payment_id","catch","processPurchasedPlan","status","startAt","endAt","old_purchased_amount","Number","updatedRecords","updatedRecord","usePurchasedPlans","useContext","loadPurchasedPlans","useCallback","forceLoad","ff_enable_paid_subscription","purchasedPlans","get","reverse","isActiveOrgFreePlan","active_purchased_plan","isUserFreePlan","RequireAuth","loading","setLoading","location","useLocation","setTimeout","featuresFlg","sessionResponse","isAuthed","sessionInfo","user","fname","lname","mobNo","ff_enable_teams","orgsRes","fetchedOrgs","activeOrgId","lastSelectedOrg","org","subscriptionConfigResponse","fetchData","pathname","includes","Navigate","to","state","Auth","lazy","LoginForm","RegistrationForm","Dashboard","NotFound","ForgotPasswordForm","OrgSetup","CreateOrg","JoinOrg","OrgRootLayout","ManageOrgs","PricingTbl","then","PricingPg","m","default","SubscriptionMgmt","Checkout","PaymentHistory","GeneralSettingsPg","Routes","appRoutes","publicRoutes","router","createBrowserRouter","path","element","Component","canShowHeader","index","Suspense","fallback","RouterProvider","Dialog","DialogPrimitive","Root","DialogTrigger","Trigger","DialogPortal","Portal","DialogClose","Close","DialogOverlay","Overlay","DialogContent","showCloseButton","Content","XIcon","DialogHeader","DialogFooter","DialogTitle","Title","DialogDescription","Description","buttonVariants","cva","variants","variant","destructive","outline","secondary","ghost","link","linkNoUnderline","size","sm","lg","defaultVariants","InnerButton","asChild","Comp","Slot","Button","disabled","DialogWrapper","setIsOpen","actionsJSX","disableOutsideClick","dlgContentClsName","onOpenChange","isOpen","onPointerDownOutside","e","preventDefault","useAlertDialog","appLevelContext","showAlertBox","newOptions","closeAlertBox","showAlertDlgPromise","onClose","AlertDialog","dlg","closeDlg","_Fragment","onClick","ROLES","READ","ADMIN","WRITE","Is_ADMIN","roleId","CAN_WRITE","CAN_READ","DISPLAY_TEXT","IS_VALID_ROLE_ID","GET_LIST","toString","Table","TableHeader","TableBody","TableRow","TableHead","TableCell","TableCaption","Card","CardHeader","CardTitle","CardDescription","CardContent","Input","Label","LabelPrimitive","Select","SelectPrimitive","SelectValue","Value","SelectTrigger","Icon","ChevronDownIcon","SelectContent","SelectScrollUpButton","Viewport","SelectScrollDownButton","SelectItem","Item","ItemIndicator","CheckIcon","ItemText","ScrollUpButton","ChevronUpIcon","ScrollDownButton","Sheet","SheetPrimitive","SheetPortal","SheetOverlay","SheetContent","side","SheetHeader","SheetTitle","SheetDescription","Switch","SwitchPrimitive","Thumb","TooltipProvider","delayDuration","TooltipPrimitive","Provider","Tooltip","TooltipTrigger","TooltipContent","sideOffset","Arrow","badgeVariants","failure","Badge","Separator","orientation","decorative","SeparatorPrimitive","DropdownMenu","DropdownMenuPrimitive","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuGroup","Group","DropdownMenuItem","inset","DropdownMenuCheckboxItem","checked","CheckboxItem","DropdownMenuLabel","DropdownMenuSeparator","Textarea","Tabs","TabsPrimitive","tabsListVariants","line","TabsList","List","TabsTrigger","LoadingMask","FlexColsLayout","layout","doNotAppendFlex1","responsive","layoutCls","flex1","container","cls","loadingCls","useIsMobile","isMobile","setIsMobile","React","mql","onChange","innerWidth","addEventListener","removeEventListener","Toolbar","leftItems","centerItems","rightItems","dialogOpen","setDialogOpen","allMenuItems","minHeight","Menu","item","idx","DataTableToolbar","table","canShowSearchField","searchFieldConfig","canShowColumnsBtn","additionalJSX","rawColumns","refreshBtn","canShow","getColumnById","col","searchField","placeholder","getColumn","getFilterValue","event","column","setFilterValue","target","RefreshCcw","ChevronDown","align","getAllColumns","getCanHide","enableHiding","getIsVisible","onCheckedChange","toggleVisibility","headerText","Pagination","role","PaginationContent","PaginationItem","PaginationLink","isActive","PaginationPrevious","ChevronLeftIcon","PaginationNext","ChevronRightIcon","PaginationEllipsis","MoreHorizontalIcon","PaginationWrapper","totalCount","activePage","pageSize","onPageChange","totalPages","useMemo","ceil","handleOnPageChange","newPageNo","disabledCls","paginationArr","pageNo","ellipse","Fragment","DataTablePagination","pagination","pageIndex","setPageIndex","DataTable$1","memo","columns","actions","toolbarConfig","canShowToolbar","canShowPagination","sorting","setSorting","columnFilters","setColumnFilters","columnVisibility","setColumnVisibility","rowSelection","setRowSelection","tableColumns","columnRec","accessorKey","enableSorting","toggleSorting","getIsSorted","ArrowUpDown","cell","row","cellValue","getValue","renderer","Check","X","unshift","record","original","MoreHorizontal","menuAction","setPagination","useReactTable","onSortingChange","onColumnFiltersChange","getCoreRowModel","getSortedRowModel","getFilteredRowModel","onColumnVisibilityChange","onRowSelectionChange","getPaginationRowModel","onPaginationChange","getHeaderGroups","headerGroup","isPlaceholder","flexRender","columnDef","getContext","getRowModel","rows","getIsSelected","getVisibleCells","colSpan","TabularLayout","child","rowCls","leftCls","rightCls","TypographyHeading","TypographyP","Accordion","AccordionPrimitive","AccordionItem","AccordionTrigger","Header","AccordionContent","AccordionWrapper","collapsible","LocalEmptySpan","LinkWrapper","removeAllStyles","CustomComponent","NavLink","systemCls","BigSquare","toPath","HeaderText","InfoButton","tabIndex","InfoIcon","ListPanel","control","labelCls","PremiumHighlighter","Crown","strokeWidth","SelectListWrapper","onValueChange","triggerClassName","valueField","labelField","newValue","TooltipWrapper","content","rootProps","contentProps","triggerProps","canShowTooltip","triggerOn","setOpen","triggerComponentRef","useRef","closeTooltip","current","contains","isTooltipTriggerClicked","ref","onEscapeKeyDown","SlashMenuItem","label","shortcut","stopPropagation","useFetchData","setResponse","lResponse","Outlet","emailField","navigate","useNavigate","isPending","startTransition","useTransition","turnstileToken","setTurnstileToken","turnstileRef","navigateTo","search","hash","gridCls","focus","onSubmit","currentTarget","reqObj","username","reset","htmlFor","required","Turnstile","siteKey","onSuccess","token","PasswordPolicyIBtn","SendOTP","handleOnOTPSent","hidden","useImperativeHandle","sendOTP","InputOTP","containerClassName","OTPInput","InputOTPGroup","InputOTPSlot","inputOTPContext","OTPInputContext","char","hasFakeCaret","slots","InputOTPField","inputOTPField","otp","setOtp","onChangeEmailClick","secondLeft","initialSeconds","secondsLeft","setSecondsLeft","timer","clearTimeout","useCountdown","maxLength","sendOTPCmp","inputOTPFieldRef","isOTPGenerated","setIsOTPGenerated","setEmail","reSendOTP","isValid","user_password","Collapsible","CollapsiblePrimitive","CollapsibleTriggerWrapper","isCollapsible","CollapsibleTrigger","CollapsibleContent","SidebarContext","useSidebar","context","SidebarProvider","defaultOpen","openProp","setOpenProp","openMobile","setOpenMobile","_open","_setOpen","openState","cookie","toggleSidebar","handleKeyDown","metaKey","ctrlKey","contextValue","Sidebar","SidebarTrigger","PanelLeftIcon","SidebarRail","SidebarInset","SidebarHeader","SidebarFooter","SidebarContent","SidebarGroup","SidebarGroupLabel","SidebarMenu","SidebarMenuItem","sidebarMenuButtonVariants","SidebarMenuButton","isExpanded","tooltip","button","SidebarMenuSub","SidebarMenuSubItem","SidebarMenuSubButton","NavMain","navItems","currentPath","getModuleLink","selectedItemCls","getSidebarMenuBtn","sidebarMenuBtn","ChevronRight","hasSelectedSubItem","some","subItem","Avatar","AvatarPrimitive","AvatarImage","Image","AvatarFallback","Fallback","UserAccount","isDialogOpen","setIsDialogOpen","saving","setSaving","userData","setUserData","setFormData","fetchUserData","created_at","toISOString","updated_at","handleInputChange","field","prev","reqBody","put","toLocaleString","NavUser","avatar","fullName","isAccountDialogOpen","setIsAccountDialogOpen","src","alt","toLocaleUpperCase","ChevronsUpDown","CircleUserRound","Sparkle","BadgeCheck","CreditCard","LogOut","PremiumIcon","purchasedPlan","plans","p","isFree","toLocaleLowerCase","OrgSwitcher","Users2","isAdmin","role_id","NaN","UserRoundPlus","Pen","addTopSeparator","Plus","FolderKanban","rec","getOrgSpecificOptions","AppHeader","AppSidebar","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbPage","BreadcrumbSeparator","AppBreadcrumb","selectedNavItem","useSelectedNavItem","getBreadcrumbItem","isRoot","flat","useOrgHelper","editOrganization","handleOnDeleteUnregisteredUser","orgId","reqData","delete","isActiveOrgCreatedByMe","UpgradeToPro","onBtnClick","ResentForm","resetFormCmp","RolesCmb","setValue","canAllowEmailEdit","editingRowId","IncludedUsers","teamMembers","setTeamMembers","inactiveUsers","processedEmailsTextArea","setProcessedEmailsTextArea","bulkRole","setBulkRole","setEditingRowId","isBulkWindowOpen","setIsBulkWindowOpen","singleRecFields","setSingleRecFields","addUniqueTeamMembers","tMembers","uniqueEmails","newTeamMembers","tMemberRec","emailKey","validateFields","teamMemberRec","newVal","val","recordWithSameEmail","DataTable","Files","editable","_","rowId","Pencil","Trash","useParams","setId","canShowTeamMembers","setCanShowTeamMembers","unregisteredUsers","setUnregisteredUsers","setInactiveUsers","areTeamMembersLoading","setAreTeamMembersLoading","initializedTeamMembers","unregisteredUserLoading","setUnregisteredUsersLoading","orgRecord","isEditMode","convertServerToLocalFields","members","joinedOn","joined_on","responseTeamMembers","orgMembers","is_active","unregistered","inactiveUsers_deleted","structuredClone","fetchTeamMembers","defaultOrgName","newRecord","oldData","putData","res","postData","insertedOrgId","handleSuccess","isTeamMemberAdded","initialValues","needToRemoveTeamMembers","reqParams","users","needToUpdate","needToNewAddTeamMembers","included_users","defaultValue","autoFocus","copyUsers","splice","fetchingInvitations","invitationsResponse","invitations","invites","isSaving","setIsSaving","respondToInvitation","selectedOption","reqJson","sent_at","contentJSX","buttonGroupVariants","horizontal","vertical","ButtonGroup","forceOrgJoin","ArrowLeft","reloadData","RadioGroup","RadioGroupPrimitive","RadioGroupItem","Indicator","CircleIcon","sectionVariants","small","medium","large","minimal","classic","titleVariants","descriptionVariants","cardVariants","highlight","true","false","compoundVariants","toggleVariants","priceTextVariants","featureIconVariants","defaultIcons","starter","Package","pro","Award","enterprise","Building2","PricingTableFour","subtitle","onPlanSelect","showBillingToggle","billingToggleLabels","monthly","yearly","isAnnually","setIsAnnually","uniqueId","useId","calculateDiscount","monthlyPrice","yearlyPrice","parseFloat","isNaN","discount","round","yearlyPriceDiscount","max","motion","div","initial","opacity","y","animate","transition","duration","delay","ease","badge","planId","AnimatePresence","mode","exit","handlePlanSelect","buttonText","features","feature","featureIndex","li","x","faqs","isYearly","faq","question","answer","href","CancelSubscriptionDialog","triggerButtonText","leftPanelImageUrl","warningTitle","warningText","keepButtonText","continueButtonText","finalTitle","finalSubtitle","finalWarningText","goBackButtonText","confirmButtonText","onCancel","onKeepSubscription","onDialogClose","showConfirmation","setShowConfirmation","isLoading","setIsLoading","setError","handleDialogClose","slice","Circle","err","Toggle","TogglePrimitive","easing","UpdatePlanDialog","currentPlan","onPlanChange","triggerText","setIsYearly","selectedPlan","setSelectedPlan","getCurrentPrice","handlePlanChange","handleOpenChange","pressed","onPressedChange","scrollbarWidth","scrollbarColor","onKeyDown","height","SubscriptionManagement","cancelSubscription","updatePlan","canShowUpdatePlanBtn","addMoreBtnProps","canShowCancelPlanBtn","price","Calendar","startDate","expiryDate","activePlanFor","paidAmount","paymentMethod","transactionId","buttonProps","MoveUpRight","UpcomingPlans","upcomingPlans","badgeText","z_currency","LogIn","for_no_users","for_months","z_order_id","PaymentSuccessDialog","forwardRef","currencySymbol","productName","proceedButtonText","backButtonText","onProceed","onBack","isControlled","internalOpen","setInternalOpen","setOpenState","close","confettiActive","setConfettiActive","t","confetti","pieces","colors","startX","random","drift","xEnd","min","rotation","colorVar","background","scale","CheckCircle2","span","repeat","Infinity","stiffness","damping","c","left","top","width","backgroundColor","rotate","AddMoreUsersDialog","purchasePlanId","CURRENCY_SYMBOL","numberOfUsers","setNumberOfUsers","isTransitionGoingOn","useRazorpay","paymentSuccessDialogOpen","setPaymentSuccessDialogOpen","purchased_id","planConfig","calculatedAmount","contact","toFixed","activePurchasedPlan","purchasePlan","historyPlans","freePlan","z_payment_method","orderIds","join","log","maxUserRequired","GalleryVerticalEnd","History","alertVariants","Alert","AlertTitle","AlertDescription","searchParams","useSearchParams","selectedPlanId","selectedBilling","countries","setCountries","saved","parsed","JSON","parse","lCountries","stringify","useCountries","isPaymentLoading","setPaymentLoading","selectedPlanRecord","minUserRequired","billingPeriod","setBillingPeriod","teamSize","setTimeSize","teamSizeForCalculation","planAmount","largeAmountMonths","monthlyPlanAmount","subTotal","billingDetails","country","address","mobileNo","AlertCircleIcon","planDisplayCost","validationErrors","errors","details","validateBillingDetails","values","billing_name","billing_email","billing_contact_no","billing_address","billing_country","billerInfo","ArrowRight","InvoiceHistory","invoices","onDownload","statusBadge","ReceiptText","inv","CalendarDays","invoiceUrl","Download","invoiceItem","purchased_at","old_purchased_for_no_users","sort","a","b","getTime","ThemeCmb","SquareArrowOutUpRight","copyText","copied","setCopied","readOnly","navigator","clipboard","writeText","handleCopy","Copy","onItemSelect","selectedRec","setSelectedRec","RadioItem","Sub","SubContent","SubTrigger","onAICall","classNameRoot","classNameEditor","enableSlashMenu","canShowAIOptions","readingMode","fetchAndUpdateLinkMetadata","editor","markerId","chain","insertContent","run","encodeURIComponent","image","foundPos","nodeSize","doc","descendants","node","pos","isText","marks","attrs","deleteRange","useEditor","extensions","StarterKit","configure","heading","levels","Underline","Link","extend","inclusive","addAttributes","parseHTML","getAttribute","renderHTML","attributes","HTMLAttributes","dataImage","dataDescription","rest","mergedAttrs","mergeAttributes","openOnClick","autolink","Placeholder","emptyEditorClass","BubbleMenuExtension","FloatingMenuExtension","onUpdate","getHTML","editorProps","class","handlePaste","clipboardData","getData","URL","protocol","isUrl","commands","setContent","setEditable","isLinkEditorOpen","setIsLinkEditorOpen","linkInput","setLinkInput","handleAIAction","selection","selectedText","textBetween","fullText","getText","setLink","extendMarkRange","unsetLink","startsWith","empty","handleLinkClick","previousUrl","getAttributes","getMenuButtonClass","active","BubbleMenu","tippyOptions","animation","onHidden","toggleBold","Bold","toggleItalic","Italic","toggleUnderline","UnderlineIcon","LinkIcon","toggleBulletList","toggleBlockquote","Quote","Sparkles","FloatingMenu","placement","offset","shouldShow","$from","currentLine","nodeBefore","parentOffset","toggleHeading","level","Heading1","Heading2","toggleOrderedList","ListOrdered","EditorContent","setActiveOrgHandler","tabs","tab","TabsContent","isDirty","setDirty","blocker","useBlocker","returnValue","proceed","func","timeout","args","apply","diffInMs","diffInHours","diffInDays","toLocaleDateString","assign","info","newRoles","millSecs"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/lib/nav-menu.ts","../src/config/app-config.ts","../src/lib/utils.ts","../src/hooks/useTheme.ts","../src/components/ui/sonner.tsx","../src/store/AppContext.ts","../src/components/custom/LoadingCmp.tsx","../src/components/custom/FullPageLoading.tsx","../src/lib/toast-helper.ts","../src/lib/axios-utils.ts","../src/app/routes/Subscriptions/utils/subscription-utils.ts","../src/app/routes/Subscriptions/hooks/usePurchasedPlans.ts","../src/app/routes/components/RequireAuth.tsx","../src/app/Routes.tsx","../src/components/ui/dialog.tsx","../src/components/ui/button.tsx","../src/components/custom/DialogWrapper.tsx","../src/hooks/useAlertDialog.ts","../src/components/custom/AlertDialog.tsx","../src/lib/enums.ts","../src/components/ui/table.tsx","../src/components/ui/card.tsx","../src/components/ui/input.tsx","../src/components/ui/label.tsx","../src/components/ui/select.tsx","../src/components/ui/sheet.tsx","../src/components/ui/switch.tsx","../src/components/ui/tooltip.tsx","../src/components/ui/badge.tsx","../src/components/ui/separator.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/textarea.tsx","../src/components/ui/tabs.tsx","../src/components/custom/LoadingMask.tsx","../src/components/custom/Layouts/FlexColsLayout.tsx","../src/hooks/useIsMobile.ts","../src/components/custom/Toolbar.tsx","../src/components/custom/DataTable/DataTableToolbar.tsx","../src/components/ui/pagination.tsx","../src/components/custom/PaginationWrapper.tsx","../src/components/custom/DataTable/DataTablePagination.tsx","../src/components/custom/DataTable/DataTable.tsx","../src/components/custom/Layouts/TabularLayout.tsx","../src/components/custom/Typography/TypographyHeading.tsx","../src/components/custom/Typography/TypographyP.tsx","../src/components/ui/accordion.tsx","../src/components/custom/AccordionWrapper.tsx","../src/components/custom/LinkWrapper.tsx","../src/components/custom/BigSquare.tsx","../src/components/custom/HeaderText.tsx","../src/components/custom/InfoButton.tsx","../src/components/custom/ListPanel.tsx","../src/components/custom/PremiumHighlighter.tsx","../src/components/custom/SelectListWrapper.tsx","../src/components/custom/TooltipWrapper.tsx","../src/components/custom/RichTextEditor.tsx","../src/hooks/useFetchData.ts","../src/app/routes/auth/components/Auth.tsx","../src/app/routes/auth/LoginForm.tsx","../src/app/routes/auth/components/PasswordPolicyIBtn.tsx","../src/app/routes/auth/components/SendOTP.tsx","../src/app/routes/auth/utils/auth-lib.ts","../src/components/ui/input-otp.tsx","../src/app/routes/auth/components/InputOTPField.tsx","../src/hooks/useCountDown.ts","../src/app/routes/auth/RegistrationForm.tsx","../src/components/ui/collapsible.tsx","../src/components/ui/sidebar.tsx","../src/components/side-bar/nav-main.tsx","../src/components/ui/avatar.tsx","../src/app/UserAccount.tsx","../src/components/side-bar/nav-user.tsx","../src/app/routes/Subscriptions/components/PremiumIcon.tsx","../src/components/side-bar/org-switcher.tsx","../src/components/side-bar/app-header.tsx","../src/components/side-bar/app-sidebar.tsx","../src/components/ui/breadcrumb.tsx","../src/hooks/useSelectedNavItem.ts","../src/app/routes/Dashboard/components/AppBreadcrumb.tsx","../src/app/routes/OrgSetup/hooks/useOrgHelper.tsx","../src/app/routes/Subscriptions/components/UpgradeToPro.tsx","../src/app/routes/Dashboard/Dashboard.tsx","../src/app/routes/NotFound.tsx","../src/app/routes/auth/ForgotPasswordForm.tsx","../src/app/routes/OrgSetup/OrgSetup.tsx","../src/app/routes/OrgSetup/components/RolesCmb.tsx","../src/app/routes/OrgSetup/components/IncludedUsers.tsx","../src/app/routes/OrgSetup/CreateOrg.tsx","../src/app/routes/OrgSetup/JoinOrg.tsx","../src/components/ui/button-group.tsx","../src/app/routes/OrgSetup/components/OrgRootLayout.tsx","../src/app/routes/OrgSetup/ManageOrgs.tsx","../src/components/ui/radio-group.tsx","../src/components/billingsdk/pricing-table-four.tsx","../src/app/routes/Subscriptions/PricingPg.tsx","../src/components/billingsdk/cancel-subscription-dialog.tsx","../src/components/ui/toggle.tsx","../src/components/billingsdk/update-plan-dialog.tsx","../src/components/billingsdk/subscription-management.tsx","../src/app/routes/Subscriptions/components/UpcomingPlans.tsx","../src/components/billingsdk/payment-success-dialog.tsx","../src/app/routes/Subscriptions/components/AddMoreUsersDialog.tsx","../src/app/routes/Subscriptions/SubscriptionMgmt.tsx","../src/hooks/useCountries.ts","../src/components/ui/alert.tsx","../src/app/routes/Subscriptions/Checkout.tsx","../src/components/billingsdk/invoice-history.tsx","../src/app/routes/Subscriptions/PaymentHistory.tsx","../src/app/routes/Dashboard/components/Settings/Components/ThemeCmb.tsx","../src/app/routes/Dashboard/components/Settings/GeneralSettingsPg.tsx","../src/components/custom/Layouts/CenterAndMiddle.tsx","../src/components/custom/CopyTextField.tsx","../src/components/custom/DropdownBtn.tsx","../src/components/custom/DropdownLbl.tsx","../src/App.tsx","../src/components/ui/skeleton.tsx","../src/components/custom/TabsWrapper.tsx","../src/components/custom/UrlChangesGuard.tsx"],"sourcesContent":["import { Bookmark, BookOpen, Settings2, SquarePen } from 'lucide-react';\r\nimport type { IVirtualChildOf, NavGroup } from './types';\r\n\r\nexport const navigationItems: {\r\n orgs: Array<{ name: string; description: string }>;\r\n navMain: NavGroup[];\r\n virtualChildOf: IVirtualChildOf[];\r\n} = {\r\n orgs: [\r\n {\r\n name: 'Acme Corp.',\r\n // logo: AudioWaveform,\r\n description: 'Startup',\r\n },\r\n ],\r\n navMain: [\r\n {\r\n title: 'Your Work',\r\n items: [\r\n {\r\n title: 'Sample',\r\n icon: SquarePen,\r\n // isExpanded: true,\r\n url: 'sample-documents',\r\n },\r\n {\r\n title: 'Sample Saved',\r\n icon: Bookmark,\r\n // isExpanded: true,\r\n url: 'sample-saved-documents',\r\n },\r\n ],\r\n },\r\n {\r\n title: 'Settings',\r\n items: [\r\n {\r\n title: 'Documentation',\r\n icon: BookOpen,\r\n items: [\r\n {\r\n title: 'Sample Get Started',\r\n url: 'sample-doc-get-started',\r\n },\r\n {\r\n title: 'Sample Tutorials',\r\n url: 'sample-tutorials',\r\n },\r\n ],\r\n },\r\n {\r\n title: 'Settings',\r\n icon: Settings2,\r\n items: [\r\n {\r\n title: 'Sample General',\r\n url: 'sample-general-settings',\r\n },\r\n {\r\n title: 'Sample Active Plan',\r\n url: 'sample-active-plan-setting',\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n virtualChildOf: [],\r\n};\r\n\r\nconst loadRecursiveChild = (elements: any[], result: any[], parent?: any): void => {\r\n elements.forEach((el: any) => {\r\n const { items, ...otherProps } = el;\r\n otherProps.parent = parent;\r\n result.push(otherProps);\r\n\r\n if (items) loadRecursiveChild(items, result, otherProps);\r\n });\r\n};\r\n\r\nexport const getFlatNavigationItems = () => {\r\n const result: any[] = [];\r\n const navTree = navigationItems.navMain;\r\n\r\n loadRecursiveChild(navTree, result, undefined);\r\n\r\n return result;\r\n};\r\n\r\nexport const setNavigationItems = (navItems: NavGroup[], virtualChildOf: IVirtualChildOf[]) => {\r\n navigationItems.navMain = navItems;\r\n navigationItems.virtualChildOf = virtualChildOf || [];\r\n};\r\n","import { NotebookText } from 'lucide-react';\r\n\r\nexport const APP_INFO_ACCOUNT_TYPE = {\r\n TEAM: 'team',\r\n ORG: 'org',\r\n};\r\n\r\nexport const appInfo = {\r\n appId: 'gamma_tech',\r\n appName: 'Gamma Tech',\r\n appDescription: 'Gamma Tech is a software company that provides a range of services to help businesses grow and succeed.',\r\n logo: NotebookText,\r\n version: '2.0.1',\r\n account_type_txt: {\r\n singular: 'Team',\r\n plural: 'Teams',\r\n value: APP_INFO_ACCOUNT_TYPE.TEAM,\r\n },\r\n supportEmail: 'support@gammatech.com',\r\n cloudFareKey: '',\r\n razorPayKey: '',\r\n themeColor: '#00c950',\r\n serverUrl: 'http://192.168.31.71:6001',\r\n};\r\n\r\nexport const setAppInfo = (info: Partial<typeof appInfo>) => {\r\n Object.assign(appInfo, info);\r\n};\r\n\r\nexport const setAccountType = (type: Partial<typeof APP_INFO_ACCOUNT_TYPE>) => {\r\n Object.assign(APP_INFO_ACCOUNT_TYPE, type);\r\n};\r\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nimport { getFlatNavigationItems, navigationItems } from './nav-menu';\nimport type { EmailProcessingResult, NavItem } from './types';\nimport { appInfo } from '../config/app-config';\nimport type { AlertDialogOptionsProps } from '@/components/custom/AlertDialog';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport const getFormDataByFormEl = (formEl: HTMLFormElement) => {\n const formData = new FormData(formEl);\n return Object.fromEntries(formData.entries());\n};\n\nconst processKey = (key: string) => `${appInfo.appId}_${key}`;\n\nexport const setLocalStorage = (key: string, value: string) => {\n localStorage.setItem(processKey(key), value);\n};\n\nexport const getLocalStorage = (key: string) => {\n return localStorage.getItem(processKey(key));\n};\n\nexport const isSameNavItem = (activeUrl: string, urlPath: string) => {\n if (!activeUrl) return false;\n if (urlPath === activeUrl) return true;\n\n const found = navigationItems.virtualChildOf.find((vc) => {\n return vc.id === activeUrl && vc.parentId === urlPath;\n });\n\n return !!found;\n};\n\nexport const findNavMenu = <K extends keyof NavItem>(moduleName: NavItem[K]): NavItem | undefined => {\n const flatNavMap = getFlatNavigationItems();\n\n const navItem = flatNavMap.find((el) => el['url'] === moduleName);\n if (navItem) return navItem;\n\n //checking in virtualChildOf\n const virtualChild = navigationItems.virtualChildOf.find((vc) => vc.id === moduleName);\n if (virtualChild) {\n return flatNavMap.find((el) => el.url === virtualChild.parentId);\n }\n\n return undefined;\n};\n\nexport const createIndexedArray = (n: number) => {\n return Array.from({ length: n }, (_v, i) => i);\n};\n\nexport const defaultAlertConfig: AlertDialogOptionsProps = {\n open: false,\n type: 'CONFIRM',\n text: '',\n};\n\nexport const validatePassword = (password: string) => {\n // Minimum 8 characters, at least 1 uppercase, 1 lowercase, 1 digit, and 1 special character\n const minLength = 8;\n const hasUpperCase = /[A-Z]/.test(password);\n const hasLowerCase = /[a-z]/.test(password);\n const hasNumber = /[0-9]/.test(password);\n const hasSpecialChar = /[!@#$%^&*(),.?\":{}|<>]/.test(password);\n\n if (password.length < minLength) {\n return {\n valid: false,\n message: 'Password must be at least 8 characters long.',\n };\n }\n if (!hasUpperCase) {\n return {\n valid: false,\n message: 'Password must contain at least one uppercase letter.',\n };\n }\n if (!hasLowerCase) {\n return {\n valid: false,\n message: 'Password must contain at least one lowercase letter.',\n };\n }\n if (!hasNumber) {\n return {\n valid: false,\n message: 'Password must contain at least one number.',\n };\n }\n if (!hasSpecialChar) {\n return {\n valid: false,\n message: 'Password must contain at least one special character.',\n };\n }\n\n return { valid: true, message: 'Password is valid.' };\n};\n\nexport const errorLogger = (error: unknown) => {\n console.error(error);\n};\n\n/**\n * Check weather the email is valid or not.\n *\n * @param email - An email id\n * @returns Boolean\n */\nexport const isEmailValid = (email: string) => {\n if (!email) {\n return false;\n }\n\n const arrayEmail = String(email)\n .toLowerCase()\n .match(\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\n );\n return Array.isArray(arrayEmail) && arrayEmail.length > 0;\n};\n\nexport const processEmailsWithValidation = (textareaValue: string): EmailProcessingResult => {\n if (!textareaValue || typeof textareaValue !== 'string') {\n return {\n validEmails: [],\n invalidEmails: [],\n totalProcessed: 0,\n };\n }\n\n // Remove newline characters and split by comma\n const emailList = textareaValue\n .replace(/\\n/g, '') // Remove all newline characters\n .split(',') // Split by comma\n .map((email) => email.trim()) // Remove whitespace from each email\n .filter((email) => email.length > 0); // Remove empty strings\n\n const validEmails: string[] = [];\n const invalidEmails: string[] = [];\n\n emailList.forEach((email) => {\n if (isEmailValid(email)) {\n validEmails.push(email);\n } else {\n invalidEmails.push(email);\n }\n });\n\n return {\n validEmails,\n invalidEmails,\n totalProcessed: emailList.length,\n };\n};\n\nexport const waitTill = (millSecs: number = 3000) => {\n return new Promise((resolve) => setTimeout(resolve, millSecs));\n};\n\nexport const convertServerDateToJS = (serverDateStr: string) => new Date(serverDateStr);\n\nexport const formatISODateWithTime24H = (isoString: string | Date, use12hr: boolean = true) => {\n if (!isoString) return '';\n\n const date = isoString instanceof Date ? isoString : convertServerDateToJS(isoString);\n const day = String(date.getDate()).padStart(2, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const year = date.getFullYear();\n\n let hours = date.getHours();\n const minutes = String(date.getMinutes()).padStart(2, '0');\n\n let ampm = '';\n if (use12hr) {\n ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12 || 12; // convert to 12-hour format\n }\n\n const hoursStr = String(hours).padStart(2, '0');\n\n return use12hr ? `${day}/${month}/${year}, ${hoursStr}:${minutes} ${ampm}` : `${day}/${month}/${year}, ${hoursStr}:${minutes}`;\n};\n\nexport const formatElapsedTime = (date: Date) => {\n const now = new Date();\n const diffInMs = now.getTime() - date.getTime();\n const diffInHours = diffInMs / (1000 * 60 * 60);\n const diffInDays = diffInMs / (1000 * 60 * 60 * 24);\n\n if (diffInMs < 5 * 60 * 1000) {\n return 'Just now'; //less than 5 minutes\n } else if (diffInHours < 1) {\n return `${Math.floor(diffInMs / (1000 * 60))} minutes ago`;\n } else if (diffInHours < 24) {\n return `${Math.floor(diffInHours)} hours ago`;\n } else if (diffInDays < 7) {\n return `${Math.floor(diffInDays)} days ago`;\n } else {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n }\n};\n\nconst MULTIPLIER = 729444;\nexport const generatePublicId = (privateId: number) => privateId * MULTIPLIER;\nexport const undoPublicId = (publicId: number) => Math.floor(publicId / MULTIPLIER);\n\nexport const mapIncrementBy2 = <T, R>(arr: T[], callback: (firstEl: T, secondEl: T | undefined, i: number) => R): R[] => {\n const result: R[] = [];\n for (let i = 0; i < arr.length; i += 2) {\n const firstEl = arr[i];\n const secondEl = arr[i + 1];\n result.push(callback(firstEl, secondEl, i));\n }\n return result;\n};\n\nexport const generateRandom4Digits = (): string => {\n return Math.floor(1000 + Math.random() * 9000).toString();\n};\n\nexport const isFunction = (value: unknown) => {\n return typeof value === 'function';\n};\n\nexport const isTruthyValue = (value: 1 | '1' | boolean | 0 | '0') => value === 1 || value === '1' || value === true;\n\nexport const INVITATION_ENUMS = Object.freeze({\n NOT_SAVED: 10,\n INVITED: 0,\n ACCEPTED: 1,\n REJECTED: 2,\n LEFT: 3,\n text: {\n 10: 'Not Saved',\n 0: 'Invited',\n 1: 'Active (Accepted)',\n 2: 'Rejected',\n 3: 'Left',\n },\n getDisplay(statusCode: number) {\n return this.text[statusCode as keyof typeof this.text] as string;\n },\n});\n\nexport const isObjectEmpty = (obj: Record<string, unknown>): boolean => {\n return obj && Object.keys(obj).length === 0;\n};\n\nexport const isValidId = (id: string | number) => {\n const intId = parseInt(id as string, 10);\n return intId > 0;\n};\n\nexport const getModuleNameFromUrl = (pathName: string) => {\n const moduleName = pathName.split('/')[2];\n return moduleName;\n};\n\nexport function debounce<T extends (...args: unknown[]) => void>(func: T, delay: number) {\n let timeout: ReturnType<typeof setTimeout>;\n\n return function (this: ThisParameterType<T>, ...args: Parameters<T>) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, delay);\n };\n}\n","import { getLocalStorage, setLocalStorage } from \"@/lib/utils\";\r\nimport { useEffect, useState } from \"react\";\r\n\r\nconst localStorageKey = \"active-theme\";\r\nconst getDefaultThemeSelected = () =>\r\n getLocalStorage(localStorageKey) || \"system\";\r\n\r\nconst useTheme = (defaultTheme = getDefaultThemeSelected()) => {\r\n const [theme, setTheme] = useState(defaultTheme); //here theme value can be light / dark / system\r\n\r\n useEffect(() => {\r\n const root = window.document.documentElement;\r\n\r\n root.classList.remove(\"light\", \"dark\");\r\n\r\n let newTheme = theme;\r\n\r\n if (theme === \"system\") {\r\n newTheme = window.matchMedia(\"(prefers-color-scheme: dark)\").matches\r\n ? \"dark\"\r\n : \"light\";\r\n }\r\n\r\n root.classList.add(newTheme);\r\n setLocalStorage(localStorageKey, newTheme);\r\n }, [theme]);\r\n\r\n return { theme, setTheme };\r\n};\r\n\r\nexport default useTheme;\r\n","import { Toaster as Sonner, type ToasterProps } from 'sonner';\nimport useTheme from '@/hooks/useTheme';\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { theme = 'system' } = useTheme();\n return (\n <Sonner\n theme={theme as ToasterProps['theme']}\n position=\"top-center\"\n style={\n {\n '--normal-bg': 'var(--popover)',\n '--normal-text': 'var(--popover-foreground)',\n '--normal-border': 'var(--border)',\n '--border-radius': 'var(--radius)',\n } as React.CSSProperties\n }\n {...props}\n />\n );\n};\n\nexport { Toaster };\n","import type { AlertDialogOptionsProps } from '@/components/custom/AlertDialog';\r\nimport type { ISubscriptionConfig } from '@/lib/billingsdk-config';\r\nimport type { loggedInUserInf, OrganizationType, purchasedPlansInf } from '@/lib/types';\r\nimport { defaultAlertConfig } from '@/lib/utils';\r\nimport { createContext } from 'react';\r\n\r\ninterface AppContextType {\r\n setAlertDlgOptions: (options: AlertDialogOptionsProps) => void;\r\n alertDlgOptions: AlertDialogOptionsProps;\r\n orgs: OrganizationType[];\r\n setOrgs: (orgs: OrganizationType[]) => void;\r\n loggedInUser: loggedInUserInf;\r\n setLoggedInUser: (loggedInUser: loggedInUserInf) => void;\r\n activeOrg: OrganizationType | undefined;\r\n setActiveOrg: (org: OrganizationType) => void;\r\n purchasePlans: purchasedPlansInf[];\r\n setPurchasePlans: (purchasePlans: purchasedPlansInf[]) => void;\r\n activePlan: purchasedPlansInf | undefined;\r\n setActivePlan: (plan: purchasedPlansInf) => void;\r\n subscriptionConfig: ISubscriptionConfig;\r\n setSubscriptionConfig: (subscriptionConfig: ISubscriptionConfig) => void;\r\n featureFlags: Record<string, boolean>;\r\n setFeatureFlags: (flags: Record<string, boolean>) => void;\r\n}\r\n\r\nconst AppContext = createContext<AppContextType>({\r\n setAlertDlgOptions: () => {},\r\n alertDlgOptions: defaultAlertConfig,\r\n orgs: [],\r\n setOrgs: () => {},\r\n loggedInUser: null as unknown as loggedInUserInf,\r\n setLoggedInUser: () => {},\r\n activeOrg: undefined,\r\n setActiveOrg: () => {},\r\n purchasePlans: [],\r\n setPurchasePlans: () => {},\r\n activePlan: null as unknown as purchasedPlansInf,\r\n setActivePlan: () => {},\r\n subscriptionConfig: {} as ISubscriptionConfig,\r\n setSubscriptionConfig: () => {},\r\n featureFlags: {},\r\n setFeatureFlags: () => {},\r\n});\r\n\r\nexport default AppContext;\r\n","import { Loader2Icon } from 'lucide-react';\r\n\r\nconst LoadingCmp = () => {\r\n return <Loader2Icon className=\"animate-spin\" />;\r\n};\r\n\r\nexport default LoadingCmp;\r\n","import { appInfo } from '@/config/app-config';\r\nimport LoadingCmp from './LoadingCmp';\r\n\r\nconst FullPageLoading = () => {\r\n return (\r\n <div className=\"bg-muted flex min-h-svh flex-col items-center justify-center gap-6\">\r\n <h3 className=\"scroll-m-20 text-xl font-semibold tracking-tight text-primary inline-flex gap-2\">\r\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\">\r\n <appInfo.logo className=\"size-4\" />\r\n </div>\r\n <div className=\"grid flex-1 text-left leading-tight items-center text-foreground\">{appInfo.appName}</div>\r\n </h3>\r\n <div className=\"inline-flex gap-1 ml-5\">\r\n <LoadingCmp />\r\n Loading application...\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default FullPageLoading;\r\n","import type { JSX } from 'react';\r\nimport { toast } from 'sonner';\r\n\r\ninterface ToastParams {\r\n header?: string;\r\n description: string | JSX.Element;\r\n}\r\n\r\nexport const showSuccessToast = ({ header = 'Success', description }: ToastParams) => {\r\n toast.success(header, {\r\n description,\r\n // style: { background: '#22c55e', color: 'white' },\r\n });\r\n};\r\n\r\nexport const showErrorToast = ({ header = 'Error', description }: ToastParams) => {\r\n toast.error(header, {\r\n description,\r\n // style: { background: 'orangered', color: 'white' },\r\n });\r\n};\r\n\r\nexport const showWarningToast = ({ header = 'Warning', description }: ToastParams) => {\r\n toast.warning(header, {\r\n description,\r\n // style: { background: '#f97316', color: 'white' },\r\n });\r\n};\r\n","import axios, { type AxiosInstance } from 'axios';\r\nimport { getLocalStorage } from './utils';\r\nimport { showErrorToast } from './toast-helper';\r\nimport { appInfo } from '../config/app-config';\r\n\r\n/**\r\n * Axios utility for making HTTP requests with common configurations.\r\n * Automatically attaches the provided API key to every request header.\r\n */\r\n\r\n/**\r\n * Creates an Axios instance with default headers and base URL.\r\n * @returns Configured Axios instance.\r\n */\r\n\r\nlet axiosInstance: AxiosInstance | null = null;\r\n\r\nconst getAxiosInstance = (): AxiosInstance => {\r\n if (axiosInstance) {\r\n return axiosInstance;\r\n }\r\n\r\n axiosInstance = axios.create({\r\n baseURL: appInfo.serverUrl,\r\n headers: {\r\n api: getLocalStorage('apiKey') || '',\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n // Add a request interceptor to always set the latest API key\r\n axiosInstance.interceptors.request.use((config) => {\r\n config.headers = config.headers || {};\r\n config.headers['api'] = getLocalStorage('apiKey') || '';\r\n return config;\r\n });\r\n\r\n axiosInstance.interceptors.response.use(\r\n (response) => {\r\n return response.data?.response;\r\n },\r\n (error) => {\r\n if (!error.response) {\r\n showErrorToast({\r\n header: error.message || 'Network error',\r\n description: 'Unable to connect with server.',\r\n });\r\n throw error;\r\n }\r\n\r\n const errorRes = error.response.data;\r\n\r\n showErrorToast({\r\n header: parseDbErrorMessageEnhanced(errorRes?.error?.errorMsg) || 'Server error',\r\n description: parseDbErrorMessageEnhanced(errorRes.error.solution) || '',\r\n });\r\n\r\n throw errorRes.error;\r\n },\r\n );\r\n return axiosInstance;\r\n};\r\n\r\nconst tableNameMapping: Record<string, Record<string, string>> = {\r\n auth_users_tbl: {\r\n user_id: 'User Id',\r\n user_email: 'User Email',\r\n user_mobile_no: 'User Mobile Number',\r\n user_fname: \"User's First Name\",\r\n user_lname: \"User's Last Name\",\r\n user_is_active: 'User Is Active',\r\n },\r\n auth_organization_tbl: {\r\n org_id: appInfo.account_type_txt.singular + ' Id',\r\n org_name: appInfo.account_type_txt.singular + ' Name',\r\n org_address: appInfo.account_type_txt.singular + ' Address',\r\n org_state: appInfo.account_type_txt.singular + ' State',\r\n org_country: appInfo.account_type_txt.singular + ' Country',\r\n org_external_id: appInfo.account_type_txt.singular + ' External ID',\r\n org_gst_in: appInfo.account_type_txt.singular + ' External ID',\r\n org_is_deleted: appInfo.account_type_txt.singular + ' Deleted',\r\n org_created_by: appInfo.account_type_txt.singular + ' Created By',\r\n },\r\n auth_organization_users_tbl: {\r\n org_user_id: appInfo.account_type_txt.singular + 'User ID',\r\n org_id: appInfo.account_type_txt.singular + 'ID',\r\n user_id: 'User Id',\r\n org_user_role_id: appInfo.account_type_txt.singular + 'User Role Id',\r\n org_user_is_active: appInfo.account_type_txt.singular + 'User is active',\r\n user_opinion: 'User Opinion',\r\n },\r\n auth_invited_users_tbl: {\r\n invited_users_id: 'Invited Users Id',\r\n org_id: appInfo.account_type_txt.singular + 'Id',\r\n email: 'Email',\r\n invited_user_role_id: 'Invited user role Id',\r\n invited_by_user_id: 'Invited by user Id',\r\n is_deleted: 'Deleted',\r\n },\r\n};\r\n\r\nconst parseDbErrorMessageEnhanced = (errorMessage: string): string => {\r\n // Regular expression to match table.column patterns\r\n const tableColumnPattern = /(\\w+)\\.(\\w+)/g;\r\n\r\n let parsedMessage = errorMessage;\r\n\r\n // Find all table.column matches\r\n const matches = errorMessage.matchAll(tableColumnPattern);\r\n\r\n for (const match of matches) {\r\n const fullMatch = match[0]; // e.g., \"auth_users_tbl.user_email\"\r\n const tableName = match[1]; // e.g., \"auth_users_tbl\"\r\n const columnName = match[2]; // e.g., \"user_email\"\r\n\r\n // Check if we have a mapping for this table and column\r\n if (tableNameMapping[tableName]?.[columnName]) {\r\n const friendlyName = tableNameMapping[tableName][columnName];\r\n parsedMessage = parsedMessage.replace(fullMatch, friendlyName);\r\n }\r\n }\r\n\r\n parsedMessage = parsedMessage.replaceAll('key', 'field');\r\n\r\n return parsedMessage;\r\n};\r\n\r\nexport { getAxiosInstance };\r\n","import { appInfo } from '@/config/app-config';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showErrorToast } from '@/lib/toast-helper';\r\nimport type { ICreateOrderResponse, IRazorPayPrefill, IVerifyPaymentResponse, purchasedPlansInf } from '@/lib/types';\r\nimport type { CurrencyCode } from 'react-razorpay/dist/constants/currency';\r\n\r\nexport const getCurrencySymbol = (currency: string) => {\r\n if (currency === 'INR') return '₹';\r\n if (currency === 'USD') return '$';\r\n if (currency === 'EUR') return '€';\r\n if (currency === 'GBP') return '£';\r\n if (currency === 'AUD') return '$';\r\n if (currency === 'CAD') return '$';\r\n if (currency === 'CHF') return '₣';\r\n if (currency === 'CNY') return '¥';\r\n if (currency === 'DKK') return 'kr';\r\n if (currency === 'HKD') return '$';\r\n if (currency === 'NZD') return '$';\r\n if (currency === 'SEK') return 'kr';\r\n if (currency === 'SGD') return '$';\r\n if (currency === 'ZAR') return 'R';\r\n return '';\r\n};\r\n\r\nexport const getDisplayPaymentMethod = (paymentMethod: string) => {\r\n if (paymentMethod === 'netbanking') return 'Net Banking';\r\n if (paymentMethod === 'wallet') return 'Wallet';\r\n if (paymentMethod === 'upi') return 'UPI';\r\n if (paymentMethod === 'card') return 'Card';\r\n return paymentMethod;\r\n};\r\n\r\nexport const isFreePlan = (plan: purchasedPlansInf | undefined) => !plan || plan.plan_id === 'starter';\r\n\r\nexport const invokeRazorPay = (\r\n totalFinalPrice: number,\r\n CURRENCY: string,\r\n createdOrderResponse: ICreateOrderResponse,\r\n prefillObject: IRazorPayPrefill,\r\n Razorpay: any,\r\n) => {\r\n return new Promise((resolve, reject) => {\r\n const options = {\r\n key: appInfo.razorPayKey,\r\n amount: totalFinalPrice * 100,\r\n currency: CURRENCY as CurrencyCode,\r\n order_id: createdOrderResponse.orderId,\r\n name: appInfo.appName,\r\n description: appInfo.appDescription,\r\n\r\n handler: async function (response: any) {\r\n // setPaymentLoading(true);\r\n\r\n try {\r\n const verifyRes: IVerifyPaymentResponse = await getAxiosInstance().post('payment-gateway/verify-payment', {\r\n orderId: createdOrderResponse.orderId,\r\n razorpayPaymentId: response.razorpay_payment_id,\r\n razorpaySignature: response.razorpay_signature,\r\n });\r\n if (!verifyRes.success) return reject('Payment verification failed.');\r\n\r\n resolve(true);\r\n } catch (error: any) {\r\n showErrorToast({\r\n header: 'Payment failed!',\r\n description: error?.message || 'Payment verification failed.',\r\n });\r\n reject(error);\r\n }\r\n },\r\n\r\n prefill: prefillObject,\r\n theme: { color: appInfo.themeColor },\r\n modal: {\r\n ondismiss: function () {\r\n // User closed the payment dialog without completing payment\r\n reject(new Error('Payment cancelled!'));\r\n },\r\n },\r\n };\r\n\r\n const razorpay = new Razorpay(options);\r\n\r\n // Add error handling after razorpay.open()\r\n razorpay.on('payment.failed', function (response: any) {\r\n showErrorToast({\r\n header: 'Payment Failed!',\r\n description: response.error.description || 'Payment could not be processed.',\r\n });\r\n\r\n // Optional: Log the failure to your backend\r\n getAxiosInstance()\r\n .post('payment-gateway/log-failure', {\r\n orderId: createdOrderResponse.orderId,\r\n errorCode: response.error.code,\r\n errorDescription: response.error.description,\r\n errorReason: response.error.reason,\r\n paymentId: response.metadata?.payment_id,\r\n })\r\n .catch(() => {});\r\n });\r\n\r\n razorpay.open();\r\n });\r\n};\r\n","import { useCallback, useContext } from 'react';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport type { purchasedPlansInf, purchasedPlansInfResponse } from '@/lib/types';\r\nimport AppContext from '@/store/AppContext';\r\nimport { isFreePlan } from '../utils/subscription-utils';\r\n\r\nconst processPurchasedPlan = (plan: purchasedPlansInf): purchasedPlansInf => {\r\n if (plan.status !== 'paid') return plan;\r\n\r\n plan.startAt = new Date(plan.startAt);\r\n plan.endAt = new Date(plan.endAt);\r\n\r\n plan.old_purchased_amount = Number(plan.amount);\r\n plan.updatedRecords &&\r\n plan.updatedRecords.forEach((updatedRecord: any) => {\r\n plan.amount = Number(plan.amount) + Number(updatedRecord.amount);\r\n });\r\n\r\n return plan;\r\n};\r\n\r\nconst usePurchasedPlans = () => {\r\n const { setPurchasePlans, setActivePlan, featureFlags, activePlan, activeOrg } = useContext(AppContext);\r\n\r\n const loadPurchasedPlans = useCallback(\r\n async (forceLoad: boolean = false) => {\r\n if (!forceLoad && !featureFlags.ff_enable_paid_subscription) return;\r\n\r\n const purchasedPlans = (await getAxiosInstance().get('/purchased-plans')) as purchasedPlansInfResponse;\r\n\r\n purchasedPlans.purchasedPlans.forEach(processPurchasedPlan);\r\n\r\n setPurchasePlans([...(purchasedPlans.purchasedPlans || [])].reverse());\r\n setActivePlan(processPurchasedPlan(purchasedPlans.activePlan));\r\n },\r\n [setPurchasePlans, setActivePlan, featureFlags.ff_enable_paid_subscription],\r\n );\r\n\r\n const isActiveOrgFreePlan = useCallback(() => {\r\n return isFreePlan(activeOrg?.active_purchased_plan);\r\n }, [activeOrg]);\r\n\r\n const isUserFreePlan = useCallback(() => {\r\n return isFreePlan(activePlan);\r\n }, [activePlan]);\r\n\r\n // const isActiveOrgCreatedByUser = useCallback(() => {\r\n // return activeOrg?. === 'user';\r\n // }, [activeOrg]);\r\n\r\n return {\r\n loadPurchasedPlans,\r\n isActiveOrgFreePlan,\r\n isUserFreePlan,\r\n };\r\n};\r\n\r\nexport default usePurchasedPlans;\r\n","import FullPageLoading from '@/components/custom/FullPageLoading';\r\nimport usePurchasedPlans from '@/app/routes/Subscriptions/hooks/usePurchasedPlans';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport type { IFeatureFlagsResponse, OrganizationTypeResponse, SessionInfoResponse } from '@/lib/types';\r\nimport { getLocalStorage } from '@/lib/utils';\r\nimport AppContext from '@/store/AppContext';\r\nimport { useState, useEffect, useContext, type ReactNode } from 'react';\r\nimport { Navigate, useLocation } from 'react-router';\r\nimport type { ISubscriptionConfig } from '@/lib/billingsdk-config';\r\n\r\ninterface RequireAuthProps {\r\n children: ReactNode;\r\n}\r\n\r\nconst RequireAuth = ({ children }: RequireAuthProps) => {\r\n const [loading, setLoading] = useState(true);\r\n const location = useLocation();\r\n const { orgs, setOrgs, loggedInUser, setLoggedInUser, setActiveOrg, subscriptionConfig, setSubscriptionConfig, featureFlags, setFeatureFlags } =\r\n useContext(AppContext);\r\n const { loadPurchasedPlans } = usePurchasedPlans();\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n try {\r\n await new Promise((resolve) => setTimeout(resolve, 200));\r\n\r\n const featuresFlg = (await getAxiosInstance().get('/feature-flags')) as IFeatureFlagsResponse;\r\n setFeatureFlags(featuresFlg.featureFlags);\r\n\r\n const sessionResponse = (await getAxiosInstance().get('/check-session')) as SessionInfoResponse;\r\n const isAuthed = !!sessionResponse.sessionInfo?.id;\r\n\r\n setLoggedInUser({\r\n email: sessionResponse.user.user_email,\r\n id: sessionResponse.sessionInfo?.id,\r\n fname: sessionResponse.user.user_fname,\r\n lname: sessionResponse.user.user_lname,\r\n mobNo: String(sessionResponse.user.user_mobile_no),\r\n });\r\n\r\n if (isAuthed === true) {\r\n if (featuresFlg.featureFlags.ff_enable_paid_subscription) {\r\n await loadPurchasedPlans(true);\r\n }\r\n\r\n if (featuresFlg.featureFlags.ff_enable_teams) {\r\n const orgsRes = (await getAxiosInstance().get('organization')) as OrganizationTypeResponse;\r\n const fetchedOrgs = orgsRes?.orgs || [];\r\n setOrgs(fetchedOrgs);\r\n\r\n const activeOrgId = getLocalStorage('activeOrgId');\r\n let lastSelectedOrg = fetchedOrgs[0];\r\n if (activeOrgId) {\r\n lastSelectedOrg = fetchedOrgs.find((org) => String(org.org_id) === activeOrgId) || lastSelectedOrg;\r\n }\r\n setActiveOrg(lastSelectedOrg);\r\n }\r\n }\r\n\r\n if (featuresFlg.featureFlags.ff_enable_paid_subscription && 'plans' in subscriptionConfig === false) {\r\n const subscriptionConfigResponse = (await getAxiosInstance().get('/get-subscription-config')) as ISubscriptionConfig;\r\n setSubscriptionConfig(subscriptionConfigResponse);\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n fetchData();\r\n }, []);\r\n\r\n if (loading) {\r\n return <FullPageLoading />;\r\n }\r\n\r\n if (!loggedInUser?.id) {\r\n return <Navigate to=\"/login\" state={{ from: location }} replace />;\r\n }\r\n\r\n if (featureFlags.ff_enable_teams && orgs.length === 0 && !location.pathname.includes('infrastructure')) {\r\n return (\r\n <Navigate\r\n to={featureFlags.ff_enable_paid_subscription ? '/infrastructure/manage-subscription' : '/infrastructure'}\r\n state={{ from: location }}\r\n replace\r\n />\r\n );\r\n }\r\n\r\n // if (orgs.length === 0 && !location.pathname.includes('/infrastructure/manage-subscription')) {\r\n // return <Navigate to=\"/infrastructure/manage-subscription\" state={{ from: location }} replace />;\r\n // }\r\n\r\n return children;\r\n};\r\n\r\nexport default RequireAuth;\r\n","import { createBrowserRouter, RouterProvider, type RouteObject } from 'react-router';\nimport { useContext, lazy, Suspense } from 'react';\nimport AppContext from '@/store/AppContext';\nimport RequireAuth from './routes/components/RequireAuth';\nimport FullPageLoading from '../components/custom/FullPageLoading';\n\n// Lazy load all route components\nconst Auth = lazy(() => import('./routes/auth/components/Auth'));\nconst LoginForm = lazy(() => import('./routes/auth/LoginForm'));\nconst RegistrationForm = lazy(() => import('./routes/auth/RegistrationForm'));\nconst Dashboard = lazy(() => import('./routes/Dashboard/Dashboard'));\nconst NotFound = lazy(() => import('./routes/NotFound'));\nconst ForgotPasswordForm = lazy(() => import('./routes/auth/ForgotPasswordForm'));\nconst OrgSetup = lazy(() => import('./routes/OrgSetup/OrgSetup'));\nconst CreateOrg = lazy(() => import('./routes/OrgSetup/CreateOrg'));\nconst JoinOrg = lazy(() => import('./routes/OrgSetup/JoinOrg'));\nconst OrgRootLayout = lazy(() => import('./routes/OrgSetup/components/OrgRootLayout'));\nconst ManageOrgs = lazy(() => import('./routes/OrgSetup/ManageOrgs'));\nconst PricingTbl = lazy(() => import('./routes/Subscriptions/PricingPg').then((m) => ({ default: m.PricingTbl })));\nconst SubscriptionMgmt = lazy(() => import('./routes/Subscriptions/SubscriptionMgmt'));\nconst Checkout = lazy(() => import('./routes/Subscriptions/Checkout'));\nconst PaymentHistory = lazy(() => import('./routes/Subscriptions/PaymentHistory'));\nconst GeneralSettingsPg = lazy(() => import('./routes/Dashboard/components/Settings/GeneralSettingsPg'));\n\nexport interface IRoutes {\n appRoutes: RouteObject[];\n publicRoutes?: RouteObject[];\n}\n\nfunction Routes({ appRoutes, publicRoutes = [] }: IRoutes) {\n const { featureFlags } = useContext(AppContext);\n\n const router = createBrowserRouter([\n {\n path: '/',\n element: (\n <RequireAuth>\n <Dashboard />\n </RequireAuth>\n ),\n children: [\n ...appRoutes,\n {\n path: 'app/general-settings',\n Component: GeneralSettingsPg,\n },\n {\n path: 'app/*',\n element: <NotFound canShowHeader={false} />,\n },\n ],\n },\n ...(featureFlags.ff_enable_paid_subscription === false\n ? []\n : [\n {\n path: 'plans',\n Component: PricingTbl,\n },\n ]),\n ...publicRoutes,\n {\n path: 'infrastructure',\n element: (\n <RequireAuth>\n <OrgRootLayout />\n </RequireAuth>\n ),\n children: [\n ...(featureFlags.ff_enable_teams === false\n ? []\n : [\n {\n index: true,\n Component: OrgSetup,\n },\n {\n path: 'create-new-org',\n Component: CreateOrg,\n },\n {\n path: 'edit-org/:orgId',\n Component: CreateOrg,\n },\n {\n path: 'user-invitations',\n Component: JoinOrg,\n },\n {\n path: 'manage-infra',\n Component: ManageOrgs,\n },\n ]),\n ...(featureFlags.ff_enable_paid_subscription === false\n ? []\n : [\n {\n path: 'manage-subscription',\n Component: SubscriptionMgmt,\n },\n {\n path: 'checkout',\n Component: Checkout,\n },\n {\n path: 'payment-history',\n Component: PaymentHistory,\n },\n ]),\n ],\n },\n {\n Component: Auth,\n children: [\n {\n path: 'login',\n Component: LoginForm,\n },\n {\n path: 'forgot-password',\n Component: ForgotPasswordForm,\n },\n {\n path: 'register',\n Component: RegistrationForm,\n },\n ],\n },\n {\n path: '*',\n Component: NotFound,\n },\n ]);\n return (\n <Suspense fallback={<FullPageLoading />}>\n <RouterProvider router={router} />\n </Suspense>\n );\n}\n\nexport default Routes;\n","import * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { XIcon } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean;\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n );\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n );\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn('text-lg leading-none font-semibold', className)}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","import * as React from 'react';\r\nimport { Slot } from '@radix-ui/react-slot';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nimport { cn } from '@/lib/utils';\r\nimport LoadingCmp from '../custom/LoadingCmp';\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90',\r\n destructive:\r\n 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\r\n outline:\r\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\r\n secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80',\r\n ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\r\n link: 'text-primary underline-offset-4 hover:underline',\r\n linkNoUnderline: 'text-primary underline-offset-4',\r\n },\r\n size: {\r\n default: 'h-8 px-4 py-2 has-[>svg]:px-3',\r\n sm: 'h-7 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\r\n lg: 'h-9 rounded-md px-6 has-[>svg]:px-4',\r\n icon: 'size-9',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n size: 'default',\r\n },\r\n },\r\n);\r\n\r\nfunction InnerButton({\r\n className,\r\n variant,\r\n size,\r\n asChild = false,\r\n ...props\r\n}: React.ComponentProps<'button'> &\r\n VariantProps<typeof buttonVariants> & {\r\n asChild?: boolean;\r\n }) {\r\n const Comp = asChild ? Slot : 'button';\r\n return (\r\n <Comp\r\n data-slot=\"button\"\r\n className={cn(buttonVariants({ variant, size, className }), 'cursor-pointer')}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\ninterface CustomProps {\r\n loading?: boolean;\r\n}\r\n\r\nfunction Button({\r\n loading = false,\r\n children,\r\n ...props\r\n}: React.ComponentProps<'button'> &\r\n VariantProps<typeof buttonVariants> & {\r\n asChild?: boolean;\r\n } & CustomProps) {\r\n return (\r\n <InnerButton {...props} disabled={loading || props.disabled}>\r\n {loading && <LoadingCmp />}\r\n {children}\r\n </InnerButton>\r\n );\r\n}\r\n\r\nexport { Button, buttonVariants };\r\n","import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog';\r\nimport type { JSX, ReactNode } from 'react';\r\n\r\ninterface DialogWrapperProps {\r\n open: boolean;\r\n setIsOpen: (isOpen: boolean) => void;\r\n header: string;\r\n children: ReactNode;\r\n actionsJSX: JSX.Element;\r\n disableOutsideClick?: boolean;\r\n dlgContentClsName?: string;\r\n}\r\n\r\nconst DialogWrapper = ({ open, setIsOpen, header, children, actionsJSX, disableOutsideClick = false, dlgContentClsName }: DialogWrapperProps) => {\r\n return (\r\n <Dialog open={open} onOpenChange={(isOpen) => setIsOpen(isOpen === true)}>\r\n <DialogContent\r\n aria-describedby={'dialog-content'}\r\n onPointerDownOutside={(e) => {\r\n if (disableOutsideClick) {\r\n e.preventDefault();\r\n }\r\n }}\r\n className={dlgContentClsName}\r\n >\r\n <DialogHeader>\r\n <DialogTitle>{header}</DialogTitle>\r\n </DialogHeader>\r\n {children}\r\n <DialogFooter>{actionsJSX}</DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n};\r\n\r\nexport default DialogWrapper;\r\n","import AppContext from '@/store/AppContext';\r\nimport { useContext, type JSX } from 'react';\r\n\r\nexport interface AlertConfigs {\r\n text: JSX.Element | string;\r\n onClose?: (result: 'CONFIRM' | 'CANCEL') => void;\r\n type: 'ALERT' | 'CONFIRM';\r\n}\r\n\r\nconst useAlertDialog = () => {\r\n const appLevelContext = useContext(AppContext);\r\n\r\n const showAlertBox = (newOptions: AlertConfigs) => {\r\n appLevelContext.setAlertDlgOptions({\r\n ...newOptions,\r\n open: true,\r\n });\r\n };\r\n\r\n const closeAlertBox = () => {\r\n appLevelContext.setAlertDlgOptions({\r\n ...appLevelContext.alertDlgOptions,\r\n open: false,\r\n });\r\n };\r\n\r\n const showAlertDlgPromise = async (newOptions: AlertConfigs) => {\r\n return new Promise((resolve, reject) => {\r\n showAlertBox({\r\n ...newOptions,\r\n async onClose(result) {\r\n if (result !== 'CONFIRM') {\r\n reject(result);\r\n return;\r\n }\r\n resolve(result);\r\n },\r\n });\r\n });\r\n };\r\n\r\n return {\r\n showAlertBox,\r\n closeAlertBox,\r\n showAlertDlgPromise,\r\n };\r\n};\r\n\r\nexport default useAlertDialog;\r\n","import { DialogDescription } from '@/components/ui/dialog';\r\nimport { Button } from '@/components/ui/button';\r\nimport DialogWrapper from './DialogWrapper';\r\nimport useAlertDialog from '@/hooks/useAlertDialog';\r\nimport type { JSX } from 'react';\r\n\r\nexport interface AlertDialogOptionsProps {\r\n open: boolean;\r\n text: JSX.Element | string;\r\n onClose?: (result: 'CONFIRM' | 'CANCEL') => void;\r\n type: 'ALERT' | 'CONFIRM';\r\n}\r\n\r\ninterface AlertDialogProps {\r\n options: AlertDialogOptionsProps;\r\n}\r\n\r\nconst AlertDialog = ({ options }: AlertDialogProps) => {\r\n const dlg = useAlertDialog();\r\n\r\n const closeDlg = () => {\r\n dlg.closeAlertBox();\r\n if (options.onClose) options.onClose('CANCEL');\r\n };\r\n\r\n const confirmDlg = () => {\r\n dlg.closeAlertBox();\r\n if (options.onClose) options.onClose('CONFIRM');\r\n };\r\n\r\n return (\r\n <DialogWrapper\r\n open={options.open}\r\n setIsOpen={closeDlg}\r\n header={options.type === 'ALERT' ? 'Alert' : 'Confirmation'}\r\n actionsJSX={\r\n <>\r\n <Button onClick={closeDlg} variant={'ghost'}>\r\n Cancel\r\n </Button>\r\n {options.type === 'CONFIRM' && <Button onClick={confirmDlg}>Confirm</Button>}\r\n </>\r\n }\r\n >\r\n <DialogDescription className=\"mt-3\">{options.text}</DialogDescription>\r\n </DialogWrapper>\r\n );\r\n};\r\n\r\nexport default AlertDialog;\r\n","import { appInfo } from '../config/app-config';\n\nexport const ROLES = {\n READ: 0,\n ADMIN: 1,\n WRITE: 2,\n Is_ADMIN: function (roleId: number) {\n return roleId === this.ADMIN;\n },\n CAN_WRITE: function (roleId: number) {\n return roleId === this.WRITE || roleId === this.ADMIN;\n },\n CAN_READ: function (roleId: number) {\n return roleId === this.READ || roleId === this.WRITE || roleId === this.ADMIN;\n },\n\n DISPLAY_TEXT: function (roleId: number) {\n const textMap = {\n [this.READ]: 'Read',\n [this.WRITE]: 'Read / Write',\n [this.ADMIN]: appInfo.account_type_txt.singular + ' Admin',\n };\n\n return textMap[roleId] || '';\n },\n\n IS_VALID_ROLE_ID: function (roleId: number) {\n return roleId === this.READ || roleId === this.ADMIN || roleId === this.WRITE;\n },\n\n GET_LIST: function () {\n return [\n { id: this.READ.toString(), text: this.DISPLAY_TEXT(this.READ) },\n { id: this.WRITE.toString(), text: this.DISPLAY_TEXT(this.WRITE) },\n { id: this.ADMIN.toString(), text: this.DISPLAY_TEXT(this.ADMIN) },\n ];\n },\n};\n\nexport const updateRolesEnum = (newRoles: any) => {\n Object.assign(ROLES, newRoles);\n};\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nfunction Table({ className, ...props }: React.ComponentProps<'table'>) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full overflow-x-auto flex-1\">\n <table\n data-slot=\"table\"\n className={cn('w-full caption-bottom text-sm', className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<'thead'>) {\n return <thead data-slot=\"table-header\" className={cn('[&_tr]:border-b', className)} {...props} />;\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<'tbody'>) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn('[&_tr:last-child]:border-0', className)}\n {...props}\n />\n );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn('bg-muted/50 border-t font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<'tr'>) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n 'hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<'th'>) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n 'text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<'td'>) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n 'p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TableCaption({ className, ...props }: React.ComponentProps<'caption'>) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn('text-muted-foreground mt-4 text-sm', className)}\n {...props}\n />\n );\n}\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Card({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card\"\n className={cn(\n \"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\"leading-none font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-6\", className)}\n {...props}\n />\n );\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\"flex items-center px-6 [.border-t]:pt-6\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n};\n","import * as React from \"react\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\r\n return (\r\n <input\r\n type={type}\r\n data-slot=\"input\"\r\n className={cn(\r\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\r\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\r\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Input }\r\n","import * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n","import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import * as React from \"react\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Switch({\n className,\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(\n \"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","import * as React from 'react';\r\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\nfunction TooltipProvider({\r\n delayDuration = 0,\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\r\n return (\r\n <TooltipPrimitive.Provider\r\n data-slot=\"tooltip-provider\"\r\n delayDuration={delayDuration}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction Tooltip({ delayDuration, ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\r\n return (\r\n <TooltipProvider delayDuration={delayDuration}>\r\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\r\n </TooltipProvider>\r\n );\r\n}\r\n\r\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\r\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\r\n}\r\n\r\nfunction TooltipContent({\r\n className,\r\n sideOffset = 0,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\r\n return (\r\n <TooltipPrimitive.Portal>\r\n <TooltipPrimitive.Content\r\n data-slot=\"tooltip-content\"\r\n sideOffset={sideOffset}\r\n className={cn(\r\n 'bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <TooltipPrimitive.Arrow className=\"bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\r\n </TooltipPrimitive.Content>\r\n </TooltipPrimitive.Portal>\r\n );\r\n}\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\r\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90',\n secondary: 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90',\n destructive:\n 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline: 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground',\n success: 'border-transparent bg-primary/10 text-primary [a&]:hover:bg-primary/20',\n failure: 'border-transparent bg-destructive/10 text-destructive [a&]:hover:bg-destructive/20',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<'span'> & VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'span';\n\n return <Comp data-slot=\"badge\" className={cn(badgeVariants({ variant }), className)} {...props} />;\n}\n\nexport { Badge, badgeVariants };\n","import * as React from 'react';\r\nimport * as SeparatorPrimitive from '@radix-ui/react-separator';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\nfunction Separator({ className, orientation = 'horizontal', decorative = true, ...props }: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\r\n return (\r\n <SeparatorPrimitive.Root\r\n data-slot=\"separator\"\r\n decorative={decorative}\r\n orientation={orientation}\r\n className={cn(\r\n 'bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport { Separator };\r\n","import * as React from 'react';\r\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\r\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\nfunction DropdownMenu({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\r\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\r\n}\r\n\r\nfunction DropdownMenuPortal({\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\r\n return <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />;\r\n}\r\n\r\nfunction DropdownMenuTrigger({\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\r\n return <DropdownMenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />;\r\n}\r\n\r\nfunction DropdownMenuContent({\r\n className,\r\n sideOffset = 4,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\r\n return (\r\n <DropdownMenuPrimitive.Portal>\r\n <DropdownMenuPrimitive.Content\r\n data-slot=\"dropdown-menu-content\"\r\n sideOffset={sideOffset}\r\n className={cn(\r\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n </DropdownMenuPrimitive.Portal>\r\n );\r\n}\r\n\r\nfunction DropdownMenuGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\r\n return <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />;\r\n}\r\n\r\nfunction DropdownMenuItem({\r\n className,\r\n inset,\r\n variant = 'default',\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\r\n inset?: boolean;\r\n variant?: 'default' | 'destructive';\r\n}) {\r\n return (\r\n <DropdownMenuPrimitive.Item\r\n data-slot=\"dropdown-menu-item\"\r\n data-inset={inset}\r\n data-variant={variant}\r\n className={cn(\r\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\r\n className,\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction DropdownMenuCheckboxItem({\r\n className,\r\n children,\r\n checked,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\r\n return (\r\n <DropdownMenuPrimitive.CheckboxItem\r\n data-slot=\"dropdown-menu-checkbox-item\"\r\n className={cn(\r\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\r\n className,\r\n )}\r\n checked={checked}\r\n {...props}\r\n >\r\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <CheckIcon className=\"size-4\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.CheckboxItem>\r\n );\r\n}\r\n\r\nfunction DropdownMenuRadioGroup({\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\r\n return <DropdownMenuPrimitive.RadioGroup data-slot=\"dropdown-menu-radio-group\" {...props} />;\r\n}\r\n\r\nfunction DropdownMenuRadioItem({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\r\n return (\r\n <DropdownMenuPrimitive.RadioItem\r\n data-slot=\"dropdown-menu-radio-item\"\r\n className={cn(\r\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\r\n className,\r\n )}\r\n {...props}\r\n >\r\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\r\n <DropdownMenuPrimitive.ItemIndicator>\r\n <CircleIcon className=\"size-2 fill-current\" />\r\n </DropdownMenuPrimitive.ItemIndicator>\r\n </span>\r\n {children}\r\n </DropdownMenuPrimitive.RadioItem>\r\n );\r\n}\r\n\r\nfunction DropdownMenuLabel({\r\n className,\r\n inset,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\r\n inset?: boolean;\r\n}) {\r\n return (\r\n <DropdownMenuPrimitive.Label\r\n data-slot=\"dropdown-menu-label\"\r\n data-inset={inset}\r\n className={cn('px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction DropdownMenuSeparator({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\r\n return (\r\n <DropdownMenuPrimitive.Separator\r\n data-slot=\"dropdown-menu-separator\"\r\n className={cn('bg-border -mx-1 my-1 h-px', className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction DropdownMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) {\r\n return (\r\n <span\r\n data-slot=\"dropdown-menu-shortcut\"\r\n className={cn('text-muted-foreground ml-auto text-xs tracking-widest', className)}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nfunction DropdownMenuSub({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\r\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\r\n}\r\n\r\nfunction DropdownMenuSubTrigger({\r\n className,\r\n inset,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\r\n inset?: boolean;\r\n}) {\r\n return (\r\n <DropdownMenuPrimitive.SubTrigger\r\n data-slot=\"dropdown-menu-sub-trigger\"\r\n data-inset={inset}\r\n className={cn(\r\n 'focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8',\r\n className,\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <ChevronRightIcon className=\"ml-auto size-4\" />\r\n </DropdownMenuPrimitive.SubTrigger>\r\n );\r\n}\r\n\r\nfunction DropdownMenuSubContent({\r\n className,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\r\n return (\r\n <DropdownMenuPrimitive.SubContent\r\n data-slot=\"dropdown-menu-sub-content\"\r\n className={cn(\r\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg',\r\n className,\r\n )}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\nexport {\r\n DropdownMenu,\r\n DropdownMenuPortal,\r\n DropdownMenuTrigger,\r\n DropdownMenuContent,\r\n DropdownMenuGroup,\r\n DropdownMenuLabel,\r\n DropdownMenuItem,\r\n DropdownMenuCheckboxItem,\r\n DropdownMenuRadioGroup,\r\n DropdownMenuRadioItem,\r\n DropdownMenuSeparator,\r\n DropdownMenuShortcut,\r\n DropdownMenuSub,\r\n DropdownMenuSubTrigger,\r\n DropdownMenuSubContent,\r\n};\r\n","import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Textarea({ className, ...props }: React.ComponentProps<'textarea'>) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n 'border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","import * as React from 'react';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\nfunction Tabs({ className, orientation = 'horizontal', ...props }: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn('group/tabs flex gap-2 data-[orientation=horizontal]:flex-col', className)}\n {...props}\n />\n );\n}\n\nconst tabsListVariants = cva(\n 'rounded-lg p-[3px] group-data-[orientation=horizontal]/tabs:h-9 data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col',\n {\n variants: {\n variant: {\n default: 'bg-muted',\n line: 'gap-1 bg-transparent',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nfunction TabsList({\n className,\n variant = 'default',\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> & VariantProps<typeof tabsListVariants>) {\n return <TabsPrimitive.List data-slot=\"tabs-list\" data-variant={variant} className={cn(tabsListVariants({ variant }), className)} {...props} />;\n}\n\nfunction TabsTrigger({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring text-foreground/60 hover:text-foreground dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n 'group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent',\n 'data-[state=active]:bg-background dark:data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 data-[state=active]:text-foreground',\n 'after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TabsContent({ className, ...props }: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return <TabsPrimitive.Content data-slot=\"tabs-content\" className={cn('flex-1 outline-none', className)} {...props} />;\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants };\n","import LoadingCmp from './LoadingCmp';\r\n\r\nconst LoadingMask = () => {\r\n return (\r\n <div className=\"absolute inset-0 flex items-center justify-center\">\r\n <LoadingCmp /> &nbsp;Loading...\r\n </div>\r\n );\r\n};\r\n\r\nexport default LoadingMask;\r\n","import type { HTMLAttributes } from 'react';\r\nimport LoadingMask from '../LoadingMask';\r\n\r\ninterface FlexColsLayoutProps extends HTMLAttributes<HTMLDivElement> {\r\n className?: string;\r\n layout?: 'horizontal' | 'vertical';\r\n loading?: boolean;\r\n doNotAppendFlex1?: boolean;\r\n responsive?: boolean;\r\n}\r\n\r\nconst FlexColsLayout = ({ className, layout = 'vertical', loading, doNotAppendFlex1 = false, responsive = false, ...props }: FlexColsLayoutProps) => {\r\n const layoutCls = layout === 'horizontal' ? (responsive === true ? 'sm:flex-row flex-col' : 'flex-row') : 'flex-col';\r\n const flex1 = doNotAppendFlex1 ? '' : 'flex-1';\r\n\r\n const container = (cls?: string) => (\r\n <div className={`${flex1} flex ${layoutCls} items-stretch overflow-auto ${cls || ''} ${className}`} {...props} />\r\n );\r\n\r\n if (!loading) {\r\n return container();\r\n }\r\n\r\n const loadingCls = loading ? 'pointer-events-none opacity-50' : '';\r\n return (\r\n <div className=\"relative flex-1\">\r\n {loading && <LoadingMask />}\r\n {container(loadingCls)}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FlexColsLayout;\r\n","import * as React from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined);\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n mql.addEventListener('change', onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n return !!isMobile;\n}\n","import React, { useState } from 'react';\r\nimport DialogWrapper from './DialogWrapper';\r\nimport { Button } from '../ui';\r\nimport { Menu } from 'lucide-react';\r\nimport { useIsMobile } from '@/hooks/useIsMobile';\r\n\r\nexport interface ToolbarProps {\r\n leftItems?: React.ReactNode[];\r\n centerItems?: React.ReactNode[];\r\n rightItems?: React.ReactNode[];\r\n className?: string;\r\n style?: React.CSSProperties;\r\n menuProps?: object;\r\n}\r\n\r\nexport const Toolbar: React.FC<ToolbarProps> = ({ leftItems = [], centerItems = [], rightItems = [], className = '', style = {} }) => {\r\n const isMobile = useIsMobile();\r\n const [dialogOpen, setDialogOpen] = useState(false);\r\n\r\n // Combine all items for menu in mobile\r\n const allMenuItems = [...leftItems, ...centerItems, ...rightItems];\r\n\r\n return (\r\n <div className={`flex items-center w-full ${className}`} style={{ minHeight: 48, ...style }}>\r\n {isMobile ? (\r\n <div className=\"flex w-full justify-end items-center\">\r\n <Button type=\"button\" onClick={() => setDialogOpen(true)}>\r\n <Menu />\r\n </Button>\r\n <DialogWrapper open={dialogOpen} setIsOpen={setDialogOpen} header={'Menu'} actionsJSX={<></>} disableOutsideClick={false}>\r\n <div className=\"flex flex-col gap-5 mt-2\">\r\n {allMenuItems.map((item, idx) => (\r\n <div key={idx}>{item}</div>\r\n ))}\r\n </div>\r\n </DialogWrapper>\r\n </div>\r\n ) : (\r\n <>\r\n {leftItems.length > 0 && <div className=\"flex flex-1 items-center gap-2 justify-start px-1\">{leftItems}</div>}\r\n {centerItems.length > 0 && <div className=\"flex flex-1 items-center gap-2 justify-center px-1\">{centerItems}</div>}\r\n {rightItems.length > 0 && <div className=\"flex flex-1 items-center gap-2 justify-end px-1\">{rightItems}</div>}\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import { Button } from '@/components/ui/button';\r\nimport { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';\r\nimport { Input } from '@/components/ui/input';\r\nimport { ChevronDown, RefreshCcw } from 'lucide-react';\r\nimport type { Table } from '@tanstack/react-table';\r\nimport type { columnProp } from './DataTable';\r\nimport FlexColsLayout from '../Layouts/FlexColsLayout';\r\nimport { useIsMobile } from '@/hooks/useIsMobile';\r\nimport { Toolbar } from '../Toolbar';\r\n\r\nexport interface DataTableToolbarProp {\r\n canShowSearchField: boolean;\r\n searchFieldConfig?: {\r\n placeholder?: string;\r\n searchField?: string;\r\n };\r\n canShowColumnsBtn: boolean;\r\n additionalJSX: React.ReactNode[];\r\n refreshBtn?: {\r\n canShow: boolean;\r\n onClick: () => void;\r\n };\r\n}\r\n\r\ninterface DataTableToolbarInternalProps<TData> {\r\n table: Table<TData>;\r\n rawColumns: columnProp[];\r\n}\r\n\r\nfunction DataTableToolbar<TData>({\r\n table,\r\n canShowSearchField = true,\r\n searchFieldConfig = {},\r\n canShowColumnsBtn = false,\r\n additionalJSX,\r\n rawColumns,\r\n refreshBtn = {\r\n canShow: false,\r\n onClick: () => {},\r\n },\r\n}: DataTableToolbarProp & DataTableToolbarInternalProps<TData>) {\r\n const getColumnById = (id: string) => rawColumns.find((col) => col.id === id);\r\n const isMobile = useIsMobile();\r\n\r\n return (\r\n <FlexColsLayout className=\"px-1 py-2 gap-2\" layout={isMobile ? 'vertical' : 'horizontal'} doNotAppendFlex1={true}>\r\n <Toolbar\r\n leftItems={[\r\n canShowSearchField && searchFieldConfig.searchField ? (\r\n <Input\r\n key=\"searchField\"\r\n placeholder={searchFieldConfig.placeholder}\r\n value={(table.getColumn(searchFieldConfig.searchField)?.getFilterValue() as string) ?? ''}\r\n onChange={(event) => {\r\n const column = table.getColumn(searchFieldConfig.searchField as string);\r\n column?.setFilterValue(event.target.value);\r\n }}\r\n className=\"max-w-sm\"\r\n />\r\n ) : (\r\n <></>\r\n ),\r\n\r\n refreshBtn.canShow && (\r\n <Button variant={'ghost'} key=\"refreshBtn\" onClick={refreshBtn.onClick}>\r\n <RefreshCcw /> Refresh\r\n </Button>\r\n ),\r\n ]}\r\n rightItems={[\r\n canShowColumnsBtn && (\r\n <DropdownMenu key=\"columnsBtnDropDown\">\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"ghost\" key=\"columnsBtn\">\r\n Columns <ChevronDown />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"end\">\r\n {table\r\n .getAllColumns()\r\n .filter((column) => column.getCanHide() && getColumnById(column.id)?.enableHiding)\r\n .map((column) => {\r\n return (\r\n <DropdownMenuCheckboxItem\r\n key={column.id}\r\n checked={column.getIsVisible()}\r\n onCheckedChange={(value) => column.toggleVisibility(!!value)}\r\n >\r\n {getColumnById(column.id)?.headerText || ''}\r\n </DropdownMenuCheckboxItem>\r\n );\r\n })}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n ),\r\n ...additionalJSX,\r\n ]}\r\n />\r\n </FlexColsLayout>\r\n );\r\n}\r\n\r\nexport default DataTableToolbar;\r\n","import * as React from \"react\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n MoreHorizontalIcon,\n} from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Button, buttonVariants } from \"@/components/ui/button\";\n\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n );\n}\n\nfunction PaginationContent({\n className,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n );\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />;\n}\n\ntype PaginationLinkProps = {\n isActive?: boolean;\n} & Pick<React.ComponentProps<typeof Button>, \"size\"> &\n React.ComponentProps<\"a\">;\n\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) {\n return (\n <a\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n \"cursor-pointer\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction PaginationPrevious({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pl-2.5\", className)}\n {...props}\n >\n <ChevronLeftIcon />\n <span className=\"hidden sm:block\">Previous</span>\n </PaginationLink>\n );\n}\n\nfunction PaginationNext({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5 sm:pr-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">Next</span>\n <ChevronRightIcon />\n </PaginationLink>\n );\n}\n\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n );\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n};\n","import {\r\n Pagination,\r\n PaginationContent,\r\n PaginationEllipsis,\r\n PaginationItem,\r\n PaginationLink,\r\n PaginationNext,\r\n PaginationPrevious,\r\n} from \"@/components/ui/pagination\";\r\nimport { createIndexedArray } from \"@/lib/utils\";\r\nimport React, { useMemo } from \"react\";\r\n\r\ninterface PaginationWrapperProps {\r\n totalCount: number;\r\n activePage: number;\r\n pageSize: number;\r\n onPageChange: (pageNo: number) => void;\r\n}\r\n\r\nconst PaginationWrapper = ({\r\n totalCount,\r\n activePage,\r\n pageSize,\r\n onPageChange,\r\n}: PaginationWrapperProps) => {\r\n const totalPages = useMemo(\r\n () => Math.ceil(totalCount / pageSize),\r\n [totalCount, pageSize]\r\n );\r\n\r\n const handleOnPageChange = (newPageNo: number) => {\r\n if (newPageNo < 0 || newPageNo >= totalPages) return;\r\n onPageChange(newPageNo);\r\n };\r\n\r\n const disabledCls = \"opacity-50 cursor-not-allowed\";\r\n\r\n const paginationArr = createIndexedArray(totalPages).filter(\r\n (pageNo) =>\r\n (pageNo < activePage + 3 && pageNo > activePage - 3) ||\r\n pageNo === 0 ||\r\n pageNo === totalPages - 1\r\n );\r\n\r\n return (\r\n <Pagination className=\"text-secondary-foreground\">\r\n <PaginationContent>\r\n <PaginationItem>\r\n <PaginationPrevious\r\n className={activePage === 0 ? disabledCls : \"\"}\r\n onClick={() => handleOnPageChange(activePage - 1)}\r\n />\r\n </PaginationItem>\r\n\r\n {paginationArr.map((pageNo, index) => {\r\n //checking if all consecutive numbers are there, if not then adding ellipse.\r\n\r\n let ellipse = null;\r\n if (index > 0 && pageNo - paginationArr[index - 1] !== 1) {\r\n ellipse = (\r\n <PaginationItem>\r\n <PaginationEllipsis />\r\n </PaginationItem>\r\n );\r\n }\r\n return (\r\n <React.Fragment key={pageNo}>\r\n {ellipse}\r\n <PaginationItem\r\n className={\r\n activePage === pageNo\r\n ? \"bg-primary text-primary-foreground rounded-2xl hover:bg-primary\"\r\n : \"\"\r\n }\r\n >\r\n <PaginationLink onClick={() => handleOnPageChange(pageNo)}>\r\n {pageNo + 1}\r\n </PaginationLink>\r\n </PaginationItem>\r\n </React.Fragment>\r\n );\r\n })}\r\n\r\n <PaginationItem>\r\n <PaginationNext\r\n className={activePage === totalPages - 1 ? disabledCls : \"\"}\r\n onClick={() => handleOnPageChange(activePage + 1)}\r\n />\r\n </PaginationItem>\r\n </PaginationContent>\r\n </Pagination>\r\n );\r\n};\r\n\r\nexport default PaginationWrapper;\r\n","import type { Table } from '@tanstack/react-table';\r\nimport PaginationWrapper from '../PaginationWrapper';\r\n\r\ninterface DataTablePaginationProp<TData> {\r\n pagination: {\r\n pageIndex: number;\r\n pageSize: number;\r\n };\r\n totalCount: number;\r\n table: Table<TData>;\r\n}\r\n\r\nconst DataTablePagination = <TData,>({\r\n pagination,\r\n totalCount,\r\n table,\r\n}: DataTablePaginationProp<TData>) => {\r\n return (\r\n <div className=\"flex items-center justify-end space-x-2 pt-4\">\r\n <PaginationWrapper\r\n totalCount={totalCount}\r\n activePage={pagination.pageIndex}\r\n onPageChange={(pageNo: number) => {\r\n table.setPageIndex(pageNo);\r\n }}\r\n pageSize={pagination.pageSize}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default DataTablePagination;\r\n","import * as React from 'react';\r\nimport {\r\n type ColumnDef,\r\n type ColumnFiltersState,\r\n flexRender,\r\n getCoreRowModel,\r\n getFilteredRowModel,\r\n getPaginationRowModel,\r\n getSortedRowModel,\r\n type SortingState,\r\n useReactTable,\r\n type VisibilityState,\r\n} from '@tanstack/react-table';\r\nimport { ArrowUpDown, Check, MoreHorizontal, X } from 'lucide-react';\r\n\r\nimport { Button } from '@/components/ui/button';\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuTrigger,\r\n} from '@/components/ui/dropdown-menu';\r\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';\r\nimport DataTableToolbar, { type DataTableToolbarProp } from './DataTableToolbar';\r\nimport DataTablePagination from './DataTablePagination';\r\nimport { formatISODateWithTime24H, isFunction } from '@/lib/utils';\r\nimport LoadingMask from '../LoadingMask';\r\nimport FlexColsLayout from '../Layouts/FlexColsLayout';\r\n\r\nexport interface columnProp {\r\n id: string;\r\n headerText: string;\r\n enableSorting: boolean;\r\n enableHiding: boolean;\r\n type?: 'boolean' | 'date' | 'string';\r\n editable?: boolean;\r\n renderer?: (record: unknown, cellValue: unknown) => unknown;\r\n}\r\n\r\ninterface ActionProp<TData> {\r\n id: string;\r\n headerText: string;\r\n onClick?: (record: TData) => void;\r\n}\r\n\r\ninterface DataTableProps<TData> {\r\n data: TData[];\r\n columns: columnProp[];\r\n actions?: ActionProp<TData>[];\r\n toolbarConfig?: DataTableToolbarProp;\r\n loading?: boolean;\r\n canShowToolbar?: boolean;\r\n canShowPagination?: boolean;\r\n}\r\n\r\nfunction DataTable<TData extends object>({\r\n data,\r\n columns,\r\n actions,\r\n toolbarConfig,\r\n loading = false,\r\n canShowToolbar = true,\r\n canShowPagination = true,\r\n}: DataTableProps<TData>) {\r\n const [sorting, setSorting] = React.useState<SortingState>([]);\r\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>([]);\r\n const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({});\r\n const [rowSelection, setRowSelection] = React.useState({});\r\n\r\n const tableColumns: ColumnDef<TData>[] = columns.map((columnRec) => {\r\n return {\r\n accessorKey: columnRec.id,\r\n header: ({ column }) => {\r\n if (!columnRec.enableSorting) {\r\n return <span>{columnRec.headerText}</span>;\r\n }\r\n\r\n return (\r\n <Button variant=\"ghost\" onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}>\r\n {columnRec.headerText}\r\n <ArrowUpDown />\r\n </Button>\r\n );\r\n },\r\n cell: ({ row }) => {\r\n const cellValue = row.getValue(columnRec.id);\r\n\r\n if (isFunction(columnRec.renderer)) {\r\n return columnRec.renderer(row, cellValue);\r\n }\r\n\r\n let result;\r\n\r\n if (columnRec.type === 'boolean') {\r\n result = cellValue ? <Check size={20} /> : <X size={18} />;\r\n } else if (columnRec.type === 'date') {\r\n result = formatISODateWithTime24H(cellValue as string);\r\n } else {\r\n result = String(cellValue);\r\n }\r\n\r\n return <div>{result}</div>;\r\n },\r\n };\r\n });\r\n\r\n if (actions && actions.length > 0) {\r\n tableColumns.unshift({\r\n id: 'actions',\r\n enableHiding: false,\r\n cell: ({ row }) => {\r\n const record = row.original;\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"secondary\" className=\"h-5 w-8 p-0\">\r\n <span className=\"sr-only\">Open menu</span>\r\n <MoreHorizontal />\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent align=\"start\">\r\n <DropdownMenuLabel>Actions</DropdownMenuLabel>\r\n\r\n {actions.map((menuAction) =>\r\n menuAction.headerText === 'SEPARATOR' ? (\r\n <DropdownMenuSeparator key={menuAction.id} />\r\n ) : (\r\n <DropdownMenuItem key={menuAction.id} onClick={() => menuAction.onClick && menuAction.onClick(record)}>\r\n {menuAction.headerText}\r\n </DropdownMenuItem>\r\n ),\r\n )}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n },\r\n });\r\n }\r\n\r\n const [pagination, setPagination] = React.useState({\r\n pageIndex: 0,\r\n pageSize: 100,\r\n });\r\n\r\n const table = useReactTable({\r\n data,\r\n columns: tableColumns,\r\n onSortingChange: setSorting,\r\n onColumnFiltersChange: setColumnFilters,\r\n getCoreRowModel: getCoreRowModel(),\r\n getSortedRowModel: getSortedRowModel(),\r\n getFilteredRowModel: getFilteredRowModel(),\r\n onColumnVisibilityChange: setColumnVisibility,\r\n onRowSelectionChange: setRowSelection,\r\n ...(canShowPagination && {\r\n getPaginationRowModel: getPaginationRowModel(),\r\n onPaginationChange: setPagination,\r\n }),\r\n state: {\r\n sorting,\r\n columnFilters,\r\n columnVisibility,\r\n rowSelection,\r\n pagination,\r\n },\r\n });\r\n\r\n const loadingCls = loading ? 'pointer-events-none opacity-50' : '';\r\n return (\r\n <FlexColsLayout className=\"w-full\">\r\n {canShowToolbar && (\r\n <DataTableToolbar\r\n table={table}\r\n rawColumns={columns}\r\n canShowSearchField={true}\r\n canShowColumnsBtn={true}\r\n {...toolbarConfig}\r\n additionalJSX={toolbarConfig?.additionalJSX || []}\r\n />\r\n )}\r\n {loading && <LoadingMask />}\r\n <FlexColsLayout className={`rounded-md border overflow-auto ${loadingCls}`}>\r\n <Table>\r\n <TableHeader className=\"sticky top-0 bg-sidebar\">\r\n {table.getHeaderGroups().map((headerGroup) => (\r\n <TableRow key={headerGroup.id}>\r\n {headerGroup.headers.map((header) => {\r\n return (\r\n <TableHead key={header.id}>\r\n {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}\r\n </TableHead>\r\n );\r\n })}\r\n </TableRow>\r\n ))}\r\n </TableHeader>\r\n <TableBody className=\"flex-1\">\r\n {table.getRowModel().rows?.length ? (\r\n table.getRowModel().rows.map((row) => (\r\n <TableRow key={row.id} data-state={row.getIsSelected() && 'selected'}>\r\n {row.getVisibleCells().map((cell) => (\r\n <TableCell key={cell.id}>{flexRender(cell.column.columnDef.cell, cell.getContext())}</TableCell>\r\n ))}\r\n </TableRow>\r\n ))\r\n ) : (\r\n <TableRow>\r\n <TableCell colSpan={actions && actions.length > 0 ? columns.length + 1 : columns.length} className=\"h-24 text-center\">\r\n No results.\r\n </TableCell>\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </FlexColsLayout>\r\n {canShowPagination && <DataTablePagination pagination={pagination} totalCount={data.length} table={table} />}\r\n </FlexColsLayout>\r\n );\r\n}\r\n\r\nexport default React.memo(DataTable);\r\n","import { mapIncrementBy2 } from '@/lib/utils';\r\nimport type { JSX } from 'react';\r\n\r\ninterface ITabularLayout {\r\n child: JSX.Element[];\r\n className?: string;\r\n rowCls?: string;\r\n leftCls?: string;\r\n rightCls?: string;\r\n}\r\n\r\nconst TabularLayout = ({ child, className, rowCls, leftCls, rightCls }: ITabularLayout) => {\r\n return (\r\n <div className={`w-full ${className || ''}`}>\r\n {mapIncrementBy2(child, (firstEl, secondEl, index) => (\r\n <div key={index + 'tabularLayout'} className={`flex w-full ${rowCls || ''}`}>\r\n <div className={`flex-shrink-0 ${leftCls || ''}`}>{firstEl}</div>\r\n <div className={`flex-1 min-w-0 ${rightCls || ''}`}>{secondEl}</div>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nexport default TabularLayout;\r\n","import type { HTMLAttributes } from 'react';\r\n\r\ninterface ITypographyHeading extends HTMLAttributes<HTMLHeadElement> {\r\n className?: string;\r\n}\r\n\r\nexport function TypographyHeading({ className, ...props }: ITypographyHeading) {\r\n return <h4 className={`scroll-m-20 text-xl font-semibold tracking-tight ${className || ''}`} {...props} />;\r\n}\r\n","export function TypographyP({ ...props }) {\r\n return <p className=\"leading-7 [&:not(:first-child)]:mt-6\" {...props} />;\r\n}\r\n","import * as React from \"react\"\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Accordion({\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"border-b last:border-b-0\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm\"\n {...props}\n >\n <div className={cn(\"pt-0 pb-4\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n","import type React from 'react';\r\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '../ui/accordion';\r\n\r\ninterface IAccordionWrapperProps {\r\n title: React.ReactNode | string;\r\n children: React.ReactNode | string;\r\n}\r\n\r\nconst AccordionWrapper = ({ title, children }: IAccordionWrapperProps) => {\r\n return (\r\n <Accordion type=\"single\" collapsible>\r\n <AccordionItem value=\"item-1\">\r\n <AccordionTrigger>{title}</AccordionTrigger>\r\n <AccordionContent>{children}</AccordionContent>\r\n </AccordionItem>\r\n </Accordion>\r\n );\r\n};\r\n\r\nexport default AccordionWrapper;\r\n","import { NavLink, type NavLinkProps } from 'react-router';\r\n\r\ninterface ILinkWrapper {\r\n className?: string;\r\n disabled?: boolean;\r\n removeAllStyles?: boolean;\r\n}\r\n\r\nconst LocalEmptySpan = ({ ...props }) => <span {...props} />;\r\n\r\nconst LinkWrapper = ({ className, disabled, removeAllStyles = false, ...props }: ILinkWrapper & NavLinkProps) => {\r\n const CustomComponent = disabled ? LocalEmptySpan : NavLink;\r\n\r\n const systemCls = disabled ? 'opacity-40 cursor-not-allowed' : 'cursor-pointer hover:underline';\r\n\r\n return <CustomComponent className={(className || '') + ' ' + (removeAllStyles ? '' : systemCls)} {...props} />;\r\n};\r\n\r\nexport default LinkWrapper;\r\n","import LinkWrapper from './LinkWrapper';\r\n\r\ninterface BigSquareProps {\r\n children: React.ReactNode;\r\n toPath: string;\r\n disabled?: boolean;\r\n className?: string;\r\n}\r\nconst BigSquare = ({ children, toPath, disabled, className, ...props }: BigSquareProps) => {\r\n return (\r\n <LinkWrapper\r\n to={toPath}\r\n disabled={disabled}\r\n className={\r\n 'h-40 p-5 w-60 border-2 border-primary rounded-4xl font-semibold flex flex-col justify-center hover:bg-accent ' +\r\n className\r\n }\r\n {...props}\r\n >\r\n {children}\r\n </LinkWrapper>\r\n );\r\n};\r\n\r\nexport default BigSquare;\r\n","import type { JSX } from 'react';\r\n\r\ninterface HeaderTextProps {\r\n children: string | JSX.Element;\r\n}\r\n\r\nconst HeaderText = ({ children }: HeaderTextProps) => {\r\n return <h3 className=\"text-lg font-medium\">{children}</h3>;\r\n};\r\n\r\nexport default HeaderText;\r\n","import { Button } from '@/components/ui/button';\r\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\r\nimport { InfoIcon } from 'lucide-react';\r\nimport type { ReactNode } from 'react';\r\n\r\ninterface InfoButtonProps {\r\n children: ReactNode;\r\n side: 'right' | 'left' | 'top' | 'bottom';\r\n}\r\n\r\nconst InfoButton = ({ children, side }: InfoButtonProps) => {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <span className=\"ml-2 align-middle cursor-pointer\">\r\n <Button variant={'link'} className=\"-ml-5\" type=\"button\" tabIndex={-1}>\r\n <InfoIcon />\r\n </Button>\r\n </span>\r\n </TooltipTrigger>\r\n <TooltipContent side={side}>{children}</TooltipContent>\r\n </Tooltip>\r\n );\r\n};\r\n\r\nexport default InfoButton;\r\n","import type { JSX } from 'react';\r\nimport { Label } from '../ui/label';\r\n\r\ninterface ListPanelInf {\r\n title: string;\r\n description: string;\r\n control?: JSX.Element;\r\n labelCls?: string;\r\n className?: string;\r\n}\r\n\r\nconst ListPanel = ({ title, description, control, labelCls = '', className = '' }: ListPanelInf) => {\r\n return (\r\n <div className={`flex flex-row items-center justify-between rounded-lg border p-4 shadow-sm ${className}`}>\r\n <div className=\"flex-1 space-y-2\">\r\n <Label className={`cursor-pointer ${labelCls}`}>{title}</Label>\r\n <Label className={`font-normal text-gray-500 cursor-pointer ${labelCls}`}>{description}</Label>\r\n </div>\r\n <div>{control}</div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default ListPanel;\r\n","import { Crown } from 'lucide-react';\r\n\r\ninterface IPremiumHighlighter {\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst PremiumHighlighter = ({ children }: IPremiumHighlighter) => {\r\n return (\r\n <span\r\n className={`premium-icon-wrapper relative inline-flex items-center ${\r\n children ? 'gap-1' : ''\r\n } px-1.5 py-1.5 rounded-lg bg-gradient-to-br from-amber-400 via-amber-500 to-amber-600 bg-[length:200%_200%] text-xs font-semibold text-white transition-all duration-300 ease-in-out overflow-hidden hover:scale-105 hover:shadow-[0_0_20px_rgba(251,191,36,0.6),0_0_40px_rgba(251,191,36,0.3)] dark:from-amber-900 dark:via-amber-700 dark:to-amber-600 dark:bg-[length:200%_200%]`}\r\n >\r\n <Crown size={14} className=\"premium-crown relative z-10 flex-shrink-0 drop-shadow-[0_2px_4px_rgba(0,0,0,0.2)] text-white\" strokeWidth={2.5} />\r\n <span className=\"relative z-10\">{children}</span>\r\n </span>\r\n );\r\n};\r\n\r\nexport default PremiumHighlighter;\r\n","import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\r\n\r\n// interface IItem {\r\n// value: string;\r\n// label: string;\r\n// }\r\n\r\ninterface ISelectListWrapper {\r\n placeholder?: string;\r\n value?: string;\r\n onValueChange?: (value: string) => void;\r\n triggerClassName?: string;\r\n valueField?: string;\r\n labelField?: string;\r\n items: Record<string, unknown>[];\r\n id?: string;\r\n}\r\n\r\nconst SelectListWrapper = ({\r\n placeholder,\r\n items,\r\n value,\r\n onValueChange,\r\n triggerClassName = 'w-[180px]',\r\n valueField = 'value',\r\n labelField = 'label',\r\n id,\r\n ...props\r\n}: ISelectListWrapper) => {\r\n return (\r\n <Select\r\n value={value}\r\n onValueChange={(newValue: string) => {\r\n onValueChange?.(newValue);\r\n }}\r\n >\r\n <SelectTrigger className={triggerClassName} {...props} id={id}>\r\n <SelectValue placeholder={placeholder} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {items.map((item) => (\r\n <SelectItem key={item[valueField] as string} value={item[valueField] as string}>\r\n {item[labelField] as string | React.ReactNode}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n );\r\n};\r\n\r\nexport default SelectListWrapper;\r\n","import { useRef, useState } from 'react';\r\nimport { TooltipContent, TooltipTrigger, Tooltip } from '../ui/tooltip';\r\n\r\nexport interface ITooltipProps {\r\n children: React.ReactNode;\r\n content: React.ReactNode;\r\n side?: 'top' | 'right' | 'bottom' | 'left';\r\n triggerOn?: 'default' | 'click';\r\n delayDuration?: number;\r\n canShowTooltip?: boolean;\r\n contentProps?: React.ComponentProps<typeof TooltipContent>;\r\n rootProps?: React.ComponentProps<typeof Tooltip>;\r\n triggerProps?: React.ComponentProps<typeof TooltipTrigger>;\r\n}\r\n\r\nexport const TooltipWrapper = ({\r\n content,\r\n side = 'bottom',\r\n rootProps,\r\n contentProps,\r\n triggerProps,\r\n children,\r\n canShowTooltip = true,\r\n delayDuration = 100,\r\n triggerOn = 'default',\r\n}: ITooltipProps) => {\r\n // If canShowTooltip is true AND triggerOn is \"default\", then ShadCN will manage the state internally (undefined).\r\n // Otherwise, we manage the open state manually.\r\n const [open, setOpen] = useState<boolean | undefined>(() => {\r\n if (triggerOn === 'default') {\r\n return canShowTooltip ? undefined : false;\r\n }\r\n return false;\r\n });\r\n\r\n const triggerComponentRef = useRef<HTMLButtonElement | null>(null);\r\n\r\n const isTooltipTriggerClicked = (event?: Event) => {\r\n const target = event?.target as HTMLElement;\r\n\r\n return target && triggerComponentRef.current && triggerComponentRef.current?.contains(target);\r\n };\r\n\r\n const closeTooltip = (event?: Event) => {\r\n if (triggerOn !== 'click') return;\r\n\r\n // Prevent closing if the click is on the trigger itself\r\n // The trigger's onClick will handle the toggle\r\n if (isTooltipTriggerClicked(event)) return;\r\n\r\n setOpen(false);\r\n };\r\n\r\n return (\r\n <Tooltip open={open} delayDuration={delayDuration} {...rootProps}>\r\n <TooltipTrigger\r\n data-testid=\"tooltip-trigger\"\r\n asChild\r\n ref={triggerComponentRef}\r\n onClick={() => {\r\n if (triggerOn === 'click') {\r\n setOpen(canShowTooltip && !open);\r\n }\r\n }}\r\n {...triggerProps}\r\n >\r\n {children}\r\n </TooltipTrigger>\r\n <TooltipContent side={side} data-testid=\"tooltip-content\" onPointerDownOutside={closeTooltip} onEscapeKeyDown={closeTooltip} {...contentProps}>\r\n {content}\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useEditor, EditorContent, BubbleMenu, FloatingMenu, mergeAttributes } from '@tiptap/react';\r\nimport StarterKit from '@tiptap/starter-kit';\r\nimport Underline from '@tiptap/extension-underline';\r\nimport Link from '@tiptap/extension-link';\r\nimport Placeholder from '@tiptap/extension-placeholder';\r\nimport BubbleMenuExtension from '@tiptap/extension-bubble-menu';\r\nimport FloatingMenuExtension from '@tiptap/extension-floating-menu';\r\nimport {\r\n Bold,\r\n Italic,\r\n Underline as UnderlineIcon,\r\n List,\r\n Sparkles,\r\n Heading1,\r\n Heading2,\r\n Quote,\r\n ListOrdered,\r\n Link as LinkIcon,\r\n Check,\r\n X,\r\n} from 'lucide-react';\r\nimport { Button, Separator, Input } from '../ui';\r\nimport { cn } from '@/lib/utils';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\n\r\nconst isUrl = (text: string) => {\r\n try {\r\n const url = new URL(text);\r\n return url.protocol === 'http:' || url.protocol === 'https:';\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\nexport interface RichTextEditorProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n onAICall?: (selectedText: string, fullText: string) => void;\r\n placeholder?: string;\r\n className?: string;\r\n minHeight?: string | number;\r\n id?: string;\r\n enableSlashMenu?: boolean;\r\n canShowAIOptions?: boolean;\r\n classNameEditor?: string;\r\n readingMode?: boolean;\r\n}\r\n\r\nexport const RichTextEditor: React.FC<RichTextEditorProps> = ({\r\n value,\r\n onChange,\r\n onAICall,\r\n placeholder = 'Type / for commands or start writing...',\r\n className: classNameRoot = '',\r\n classNameEditor = '',\r\n minHeight = 'unset',\r\n id = '',\r\n enableSlashMenu = false,\r\n canShowAIOptions = false,\r\n readingMode = false,\r\n}) => {\r\n const fetchAndUpdateLinkMetadata = (url: string) => {\r\n if (!editor) return;\r\n\r\n // Generate a unique marker to find this specific link in the editor\r\n const markerId = `link-${Math.random().toString(36).slice(2, 9)}`;\r\n\r\n // Show only the URL text during loading (no icons)\r\n editor.chain().focus().insertContent(`<a href=\"${url}\" data-marker=\"${markerId}\">${url}</a>`).run();\r\n\r\n // Fetch metadata\r\n getAxiosInstance()\r\n .get(`/link-metadata?url=${encodeURIComponent(url)}`)\r\n .then((res: any) => {\r\n if (!res) return;\r\n const { title, image = `https://www.google.com/s2/favicons?domain=${url}`, description } = res;\r\n const finalTitle = title || url;\r\n\r\n // Find the node by marker in the document structure\r\n let foundPos = -1;\r\n let nodeSize = 0;\r\n\r\n editor.state.doc.descendants((node, pos) => {\r\n if (node.isText) {\r\n const mark = node.marks.find((m) => m.type.name === 'link' && m.attrs['data-marker'] === markerId);\r\n if (mark) {\r\n foundPos = pos;\r\n nodeSize = node.nodeSize;\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n\r\n if (foundPos !== -1) {\r\n editor\r\n .chain()\r\n .deleteRange({ from: foundPos, to: foundPos + nodeSize })\r\n .insertContent(`<a href=\"${url}\" data-image=\"${image || ''}\" data-description=\"${description || ''}\">${finalTitle}</a>`)\r\n .run();\r\n }\r\n })\r\n .catch(() => {\r\n // Fallback: remove marker but keep URL text\r\n editor.state.doc.descendants((node, pos) => {\r\n if (node.isText) {\r\n const mark = node.marks.find((m) => m.type.name === 'link' && m.attrs['data-marker'] === markerId);\r\n if (mark) {\r\n editor\r\n .chain()\r\n .deleteRange({ from: pos, to: pos + node.nodeSize })\r\n .insertContent(`<a href=\"${url}\">${url}</a>`)\r\n .run();\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n });\r\n };\r\n\r\n const editor = useEditor({\r\n editable: !readingMode,\r\n extensions: [\r\n StarterKit.configure({\r\n heading: {\r\n levels: [1, 2, 3],\r\n },\r\n }),\r\n Underline,\r\n Link.extend({\r\n inclusive: false,\r\n addAttributes() {\r\n return {\r\n ...this.parent?.(),\r\n 'data-marker': {\r\n default: null,\r\n parseHTML: (element) => element.getAttribute('data-marker'),\r\n renderHTML: (attributes) => {\r\n if (!attributes['data-marker']) return {};\r\n return { 'data-marker': attributes['data-marker'] };\r\n },\r\n },\r\n 'data-image': {\r\n default: null,\r\n parseHTML: (element) => element.getAttribute('data-image'),\r\n renderHTML: (attributes) => {\r\n if (!attributes['data-image']) return {};\r\n return { 'data-image': attributes['data-image'] };\r\n },\r\n },\r\n 'data-description': {\r\n default: null,\r\n parseHTML: (element) => element.getAttribute('data-description'),\r\n renderHTML: (attributes) => {\r\n if (!attributes['data-description']) return {};\r\n return { 'data-description': attributes['data-description'] };\r\n },\r\n },\r\n style: {\r\n default: null,\r\n parseHTML: (element) => element.getAttribute('style'),\r\n renderHTML: (attributes) => {\r\n if (!attributes.style) return {};\r\n return { style: attributes.style };\r\n },\r\n },\r\n };\r\n },\r\n renderHTML({ HTMLAttributes }) {\r\n const { 'data-image': dataImage, 'data-description': dataDescription, ...rest } = HTMLAttributes;\r\n const mergedAttrs = mergeAttributes(this.options.HTMLAttributes, rest, {\r\n 'data-image': dataImage,\r\n 'data-description': dataDescription,\r\n title: dataDescription || '', // Add description as title attribute for tooltip\r\n });\r\n\r\n if (dataImage) {\r\n return [\r\n 'a',\r\n mergedAttrs,\r\n [\r\n 'img',\r\n {\r\n src: dataImage,\r\n width: '16',\r\n height: '16',\r\n },\r\n ],\r\n ['span', 0],\r\n ];\r\n }\r\n return ['a', mergedAttrs, 0];\r\n },\r\n }).configure({\r\n openOnClick: false,\r\n autolink: true,\r\n HTMLAttributes: {},\r\n }),\r\n Placeholder.configure({\r\n placeholder,\r\n emptyEditorClass: 'is-editor-empty',\r\n }),\r\n ...(enableSlashMenu ? [BubbleMenuExtension] : []),\r\n FloatingMenuExtension,\r\n ],\r\n content: value,\r\n onUpdate: ({ editor }) => {\r\n onChange(editor.getHTML());\r\n },\r\n editorProps: {\r\n attributes: {\r\n class: cn('prose dark:prose-invert max-w-none focus:outline-none min-h-full', 'selection:bg-primary/30'),\r\n id,\r\n },\r\n handlePaste: (_, event) => {\r\n const text = event.clipboardData?.getData('text/plain');\r\n if (text && isUrl(text)) {\r\n fetchAndUpdateLinkMetadata(text);\r\n return true;\r\n }\r\n return false;\r\n },\r\n },\r\n });\r\n\r\n // Keep editor content in sync with external value\r\n useEffect(() => {\r\n if (editor && value !== editor.getHTML()) {\r\n editor.commands.setContent(value);\r\n }\r\n }, [value, editor]);\r\n\r\n // Update editable state when readingMode changes\r\n useEffect(() => {\r\n if (editor) {\r\n editor.setEditable(!readingMode);\r\n }\r\n }, [editor, readingMode]);\r\n\r\n if (!editor) {\r\n return null;\r\n }\r\n\r\n const [isLinkEditorOpen, setIsLinkEditorOpen] = React.useState(false);\r\n const [linkInput, setLinkInput] = React.useState('');\r\n\r\n const handleAIAction = () => {\r\n const { from, to } = editor.state.selection;\r\n const selectedText = editor.state.doc.textBetween(from, to, ' ');\r\n const fullText = editor.getText();\r\n if (onAICall) {\r\n onAICall(selectedText, fullText);\r\n }\r\n };\r\n\r\n const setLink = () => {\r\n // If empty input, remove link\r\n if (linkInput === '') {\r\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\r\n } else {\r\n // Add https:// if missing and not a relative/local link\r\n let url = linkInput;\r\n if (!/^https?:\\/\\//i.test(url) && !url.startsWith('/') && !url.startsWith('#')) {\r\n url = 'https://' + url;\r\n }\r\n\r\n const { empty } = editor.state.selection;\r\n\r\n if (empty) {\r\n fetchAndUpdateLinkMetadata(url);\r\n } else {\r\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\r\n }\r\n }\r\n setIsLinkEditorOpen(false);\r\n setLinkInput('');\r\n };\r\n\r\n const handleLinkClick = () => {\r\n const previousUrl = editor.getAttributes('link').href;\r\n setLinkInput(previousUrl || '');\r\n setIsLinkEditorOpen(true);\r\n };\r\n\r\n // Handle Ctrl+K\r\n useEffect(() => {\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'k') {\r\n if (readingMode) return;\r\n e.preventDefault();\r\n handleLinkClick();\r\n }\r\n };\r\n window.addEventListener('keydown', handleKeyDown);\r\n return () => window.removeEventListener('keydown', handleKeyDown);\r\n }, [editor]);\r\n\r\n const getMenuButtonClass = (active: boolean) =>\r\n cn(\r\n 'h-8 w-8 p-0 transition-all duration-200',\r\n active ? 'bg-primary text-primary-foreground hover:bg-primary/90' : 'hover:bg-accent hover:text-accent-foreground',\r\n );\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'group relative w-full border rounded-md bg-transparent dark:bg-input/30 transition-[color,box-shadow] outline-none shadow-xs',\r\n 'border-input focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px] text-sm',\r\n classNameRoot,\r\n )}\r\n style={{ minHeight }}\r\n >\r\n {/* Scrollable Content Area */}\r\n <div\r\n className={cn('px-3 py-2 h-full', readingMode ? 'cursor-default' : 'cursor-text', classNameEditor)}\r\n onClick={() => !readingMode && editor.chain().focus().run()}\r\n >\r\n {/* Selection Toolbar (Bubble Menu) */}\r\n {!readingMode && (\r\n <BubbleMenu\r\n editor={editor}\r\n tippyOptions={{\r\n duration: 150,\r\n animation: 'shift-away',\r\n onHidden: () => setIsLinkEditorOpen(false),\r\n }}\r\n className=\"flex items-center gap-0.5 bg-popover/90 backdrop-blur-md border border-border rounded-lg shadow-xl p-1 overflow-hidden animate-in fade-in zoom-in duration-200\"\r\n >\r\n {isLinkEditorOpen ? (\r\n <div className=\"flex items-center gap-1 px-1\" onClick={(e) => e.stopPropagation()}>\r\n <Input\r\n type=\"text\"\r\n value={linkInput}\r\n onChange={(e) => setLinkInput(e.target.value)}\r\n placeholder=\"Paste or type a link...\"\r\n className=\"h-7 w-48 text-xs border-none focus-visible:ring-0 bg-transparent\"\r\n autoFocus\r\n onKeyDown={(e) => {\r\n e.stopPropagation();\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n setLink();\r\n }\r\n if (e.key === 'Escape') {\r\n setIsLinkEditorOpen(false);\r\n }\r\n }}\r\n />\r\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={setLink} className=\"h-7 w-7 p-0\">\r\n <Check className=\"h-3.5 w-3.5\" />\r\n </Button>\r\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setIsLinkEditorOpen(false)} className=\"h-7 w-7 p-0\">\r\n <X className=\"h-3.5 w-3.5\" />\r\n </Button>\r\n </div>\r\n ) : (\r\n <>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => editor.chain().focus().toggleBold().run()}\r\n className={getMenuButtonClass(editor.isActive('bold'))}\r\n >\r\n <Bold className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => editor.chain().focus().toggleItalic().run()}\r\n className={getMenuButtonClass(editor.isActive('italic'))}\r\n >\r\n <Italic className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => editor.chain().focus().toggleUnderline().run()}\r\n className={getMenuButtonClass(editor.isActive('underline'))}\r\n >\r\n <UnderlineIcon className=\"h-4 w-4\" />\r\n </Button>\r\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={handleLinkClick} className={getMenuButtonClass(editor.isActive('link'))}>\r\n <LinkIcon className=\"h-4 w-4\" />\r\n </Button>\r\n <Separator orientation=\"vertical\" className=\"h-4 mx-1\" />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => editor.chain().focus().toggleBulletList().run()}\r\n className={getMenuButtonClass(editor.isActive('bulletList'))}\r\n >\r\n <List className=\"h-4 w-4\" />\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .toggleBlockquote()\r\n .run();\r\n }}\r\n className={getMenuButtonClass(editor.isActive('blockquote'))}\r\n >\r\n <Quote className=\"h-4 w-4\" />\r\n </Button>\r\n {canShowAIOptions && (\r\n <>\r\n <Separator orientation=\"vertical\" className=\"h-4 mx-1\" />\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleAIAction}\r\n className=\"h-8 px-2 flex items-center gap-1.5 text-primary hover:bg-primary/10 transition-colors\"\r\n >\r\n <Sparkles className=\"h-4 w-4 fill-primary/20 animate-pulse\" />\r\n <span className=\"text-xs font-semibold\">AI Edit</span>\r\n </Button>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </BubbleMenu>\r\n )}\r\n\r\n {/* Slash Command / Floating Menu */}\r\n {enableSlashMenu && !readingMode && (\r\n <FloatingMenu\r\n editor={editor}\r\n tippyOptions={{\r\n duration: 150,\r\n placement: 'bottom-start',\r\n offset: [0, 8],\r\n }}\r\n shouldShow={({ state }: { state: any }) => {\r\n const { selection } = state;\r\n const { $from } = selection;\r\n\r\n // Show only if line is empty OR only contains '/'\r\n const currentLine = $from.nodeBefore?.text || '';\r\n const isAtLineStart = $from.parentOffset === 1 && currentLine === '/';\r\n\r\n return isAtLineStart;\r\n }}\r\n className=\"flex flex-col min-w-[180px] bg-popover border border-border rounded-lg shadow-2xl p-1.5 animate-in slide-in-from-top-2 duration-200 z-50\"\r\n >\r\n <div className=\"px-2 py-1.5 text-[10px] font-bold text-muted-foreground uppercase tracking-wider\">Quick Actions</div>\r\n\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .toggleHeading({ level: 1 })\r\n .run();\r\n }}\r\n icon={<Heading1 className=\"h-4 w-4\" />}\r\n label=\"Heading 1\"\r\n shortcut=\"H1\"\r\n />\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .toggleHeading({ level: 2 })\r\n .run();\r\n }}\r\n icon={<Heading2 className=\"h-4 w-4\" />}\r\n label=\"Heading 2\"\r\n shortcut=\"H2\"\r\n />\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .toggleBulletList()\r\n .run();\r\n }}\r\n icon={<List className=\"h-4 w-4\" />}\r\n label=\"Bullet List\"\r\n shortcut=\"-\"\r\n />\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .toggleOrderedList()\r\n .run();\r\n }}\r\n icon={<ListOrdered className=\"h-4 w-4\" />}\r\n label=\"Ordered List\"\r\n shortcut=\"1.\"\r\n />\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .toggleBlockquote()\r\n .run();\r\n }}\r\n icon={<Quote className=\"h-4 w-4\" />}\r\n label=\"Quote\"\r\n shortcut=\">\"\r\n />\r\n\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .run();\r\n handleLinkClick();\r\n }}\r\n icon={<LinkIcon className=\"h-4 w-4\" />}\r\n label=\"Hyperlink\"\r\n shortcut=\"K\"\r\n />\r\n\r\n <Separator className=\"my-1\" />\r\n\r\n {canShowAIOptions && (\r\n <SlashMenuItem\r\n onClick={() => {\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from: editor.state.selection.from - 1, to: editor.state.selection.from })\r\n .run();\r\n handleAIAction();\r\n }}\r\n icon={<Sparkles className=\"h-4 w-4 text-primary\" />}\r\n label=\"AI Assistant\"\r\n className=\"text-primary hover:bg-primary/10\"\r\n />\r\n )}\r\n </FloatingMenu>\r\n )}\r\n\r\n <EditorContent editor={editor} />\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\ninterface SlashMenuItemProps {\r\n onClick: () => void;\r\n icon: React.ReactNode;\r\n label: string;\r\n shortcut?: string;\r\n className?: string;\r\n}\r\n\r\nconst SlashMenuItem: React.FC<SlashMenuItemProps> = ({ onClick, icon, label, shortcut, className }) => (\r\n <button\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onClick();\r\n }}\r\n className={cn(\r\n 'flex items-center justify-between w-full px-2 py-1.5 text-sm rounded-md transition-colors',\r\n 'hover:bg-accent hover:text-accent-foreground text-left',\r\n className,\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"flex items-center justify-center w-6 h-6 rounded-md bg-muted/50\">{icon}</div>\r\n <span>{label}</span>\r\n </div>\r\n {shortcut && <span className=\"text-[10px] text-muted-foreground bg-muted px-1.5 py-0.5 rounded uppercase font-medium\">{shortcut}</span>}\r\n </button>\r\n);\r\n\r\nexport default RichTextEditor;\r\n","import { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { useEffect, useState } from 'react';\r\n\r\nconst useFetchData = <T>(url: string) => {\r\n const [response, setResponse] = useState<T | null>(null);\r\n const [loading, setLoading] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n setLoading(true);\r\n\r\n try {\r\n const lResponse = await getAxiosInstance().get(url);\r\n setResponse(lResponse as unknown as T);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n fetchData();\r\n }, [url]);\r\n\r\n return { loading, response };\r\n};\r\n\r\nexport default useFetchData;\r\n","import { Outlet } from 'react-router';\r\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\r\nimport { cn } from '@/lib/utils';\r\nimport { appInfo } from '../../../../config/app-config';\r\n\r\nexport default function Auth() {\r\n return (\r\n <div className=\"bg-muted flex min-h-svh flex-col items-center justify-center gap-6 p-6 md:p-10\">\r\n <div className=\"flex w-full max-w-sm flex-col gap-6\">\r\n <span className=\"flex items-center gap-2 self-center font-medium\">\r\n <div className=\"bg-primary text-primary-foreground flex size-6 items-center justify-center rounded-md\">\r\n <appInfo.logo className=\"size-4\" />\r\n </div>\r\n {appInfo.appName}\r\n </span>\r\n <div className={cn('flex flex-col gap-6')}>\r\n <Card>\r\n <CardHeader className=\"text-center\">\r\n <CardTitle className=\"text-xl\">Welcome</CardTitle>\r\n <CardDescription>Please fill the below details to continue</CardDescription>\r\n </CardHeader>\r\n <CardContent>\r\n <Outlet />\r\n </CardContent>\r\n </Card>\r\n <div className=\"text-muted-foreground *:[a]:hover:text-primary text-center text-xs text-balance *:[a]:underline *:[a]:underline-offset-4\">\r\n By clicking continue, you agree to our <a>Terms of Service</a> and <a>Privacy Policy</a>.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Label } from '@/components/ui/label';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showErrorToast, showSuccessToast } from '@/lib/toast-helper';\r\nimport type { LoginCmd } from '@/lib/types';\r\nimport { errorLogger, getFormDataByFormEl, isEmailValid, setLocalStorage } from '@/lib/utils';\r\nimport { useEffect, useRef, useState, useTransition } from 'react';\r\nimport { NavLink, useLocation, useNavigate } from 'react-router';\r\nimport { Turnstile, type TurnstileInstance } from '@marsidev/react-turnstile';\r\nimport { appInfo } from '@/config/app-config';\r\n\r\nexport default function LoginForm() {\r\n const emailField = useRef<HTMLInputElement>(null);\r\n const navigate = useNavigate();\r\n const [isPending, startTransition] = useTransition();\r\n const location = useLocation();\r\n const [turnstileToken, setTurnstileToken] = useState<string>('');\r\n const turnstileRef = useRef<TurnstileInstance>(null);\r\n\r\n const from = location.state?.from;\r\n const navigateTo = from ? `${from.pathname}${from.search}${from.hash}` : '/';\r\n const gridCls = 'grid gap-1';\r\n\r\n useEffect(() => {\r\n emailField?.current?.focus();\r\n }, []);\r\n\r\n const handleOnSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n\r\n if (!turnstileToken) {\r\n showErrorToast({\r\n header: 'Captcha not completed',\r\n description: 'Please complete the captcha to proceed.',\r\n });\r\n return;\r\n }\r\n\r\n const data = getFormDataByFormEl(event.currentTarget);\r\n\r\n const reqObj = {\r\n username: data.email,\r\n password: data.password,\r\n turnstileToken,\r\n };\r\n\r\n if (isEmailValid(reqObj.username as string) === false) {\r\n showErrorToast({\r\n header: 'Email is not valid.',\r\n description: 'Kindly recheck the email and try again.',\r\n });\r\n return;\r\n }\r\n\r\n startTransition(async () => {\r\n try {\r\n const response: LoginCmd = await getAxiosInstance().post('/login', reqObj);\r\n\r\n const { api = '' } = response;\r\n\r\n if (!api) {\r\n showErrorToast({\r\n header: 'Something went wrong!',\r\n description: 'API Key not found.',\r\n });\r\n errorLogger('API key not found in login command.');\r\n return;\r\n }\r\n\r\n showSuccessToast({\r\n header: 'Welcome Back!',\r\n description: 'Login Successful.',\r\n });\r\n\r\n setLocalStorage('apiKey', api);\r\n navigate(navigateTo);\r\n } catch (error) {\r\n // Failed login - reset Turnstile to generate new token\r\n turnstileRef.current?.reset();\r\n setTurnstileToken('');\r\n\r\n errorLogger(error);\r\n }\r\n });\r\n };\r\n\r\n return (\r\n <div className=\"grid gap-6\">\r\n <div className=\"after:border-border relative text-center text-sm after:absolute after:inset-0 after:top-1/2 after:z-0 after:flex after:items-center after:border-t\">\r\n <span className=\"bg-card text-muted-foreground relative z-10 px-2\">Login</span>\r\n </div>\r\n\r\n <form onSubmit={handleOnSubmit} className=\"grid gap-6\">\r\n <div className={gridCls}>\r\n <Label htmlFor=\"email\">Email *</Label>\r\n <Input id=\"email\" type=\"email\" placeholder=\"mail@example.com\" name=\"email\" ref={emailField} required />\r\n </div>\r\n <div className={gridCls}>\r\n <Label htmlFor=\"password\">Password *</Label>\r\n <Input id=\"password\" type=\"password\" name=\"password\" placeholder=\"**********\" required />\r\n <NavLink to=\"/forgot-password\" className=\"ml-auto text-sm underline-offset-4 hover:underline cursor-pointer\">\r\n Forgot your password?\r\n </NavLink>\r\n </div>\r\n <div className=\"text-center\">\r\n <Turnstile ref={turnstileRef} siteKey={appInfo.cloudFareKey} onSuccess={(token) => setTurnstileToken(token)} />\r\n </div>\r\n <Button type=\"submit\" className=\"w-full\" size={'lg'} loading={isPending}>\r\n Login\r\n </Button>\r\n </form>\r\n\r\n <div className=\"text-center text-sm\">\r\n Don&apos;t have an account?{' '}\r\n <NavLink to=\"/register\">\r\n <span className=\"underline underline-offset-4\">Register</span>\r\n </NavLink>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import InfoButton from '@/components/custom/InfoButton';\r\n\r\nconst PasswordPolicyIBtn = () => {\r\n return (\r\n <InfoButton side=\"right\">\r\n <h5>Password Policy:</h5>\r\n <ul>\r\n <li>Password must be at least 8 characters long.</li>\r\n <li>Password must contain at least one uppercase letter.</li>\r\n <li>Password must contain at least one lowercase letter.</li>\r\n <li>Password must contain at least one number.</li>\r\n <li>Password must contain at least one special character.</li>\r\n </ul>\r\n </InfoButton>\r\n );\r\n};\r\n\r\nexport default PasswordPolicyIBtn;\r\n","import { useImperativeHandle, useRef, useTransition, type Ref } from 'react';\r\nimport { sendOTP, type sendOTPInf } from '../utils/auth-lib';\r\nimport { errorLogger, getFormDataByFormEl } from '@/lib/utils';\r\nimport { Label } from '@/components/ui/label';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Button } from '@/components/ui/button';\r\n\r\ninterface SendOTPProps {\r\n handleOnOTPSent: (reqObj: { email: string }) => void;\r\n ref: Ref<any>;\r\n gridCls: string;\r\n hidden: boolean;\r\n path: string;\r\n}\r\n\r\nconst SendOTP = ({ handleOnOTPSent, ref, gridCls, hidden, path }: SendOTPProps) => {\r\n const emailField = useRef<HTMLInputElement>(null);\r\n const [isPending, startTransition] = useTransition();\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => {\r\n return {\r\n focus() {\r\n emailField.current?.focus();\r\n },\r\n };\r\n },\r\n [],\r\n );\r\n\r\n const handleOnEmailSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n const data: Record<string, FormDataEntryValue> = getFormDataByFormEl(event.currentTarget);\r\n\r\n const reqObj: sendOTPInf = {\r\n email: (data.email as string) || '',\r\n };\r\n\r\n startTransition(async () => {\r\n try {\r\n await sendOTP(path, reqObj);\r\n\r\n handleOnOTPSent(reqObj);\r\n } catch (error) {\r\n errorLogger(error);\r\n }\r\n });\r\n };\r\n\r\n return (\r\n <form onSubmit={handleOnEmailSubmit} className={`grid gap-5 ${hidden && 'hidden'}`}>\r\n <div className={gridCls}>\r\n <Label htmlFor=\"email\">Email *</Label>\r\n <Input id=\"email\" type=\"email\" name=\"email\" placeholder=\"mail@example.com\" ref={emailField} required />\r\n </div>\r\n <Button type=\"submit\" className=\"w-full\" loading={isPending}>\r\n Generate OTP\r\n </Button>\r\n </form>\r\n );\r\n};\r\n\r\nexport default SendOTP;\r\n","import { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showErrorToast, showSuccessToast } from '@/lib/toast-helper';\r\nimport { errorLogger, isEmailValid } from '@/lib/utils';\r\n\r\ninterface responseInf {\r\n message: string;\r\n}\r\n\r\nexport interface sendOTPInf {\r\n email: string;\r\n}\r\n\r\nexport const sendOTP = async (path: string, reqObj: sendOTPInf) => {\r\n if (isEmailValid(reqObj.email) === false) {\r\n throw showErrorToast({\r\n header: 'Email is not valid.',\r\n description: 'Kindly recheck the email and try again.',\r\n });\r\n }\r\n\r\n try {\r\n const response: responseInf = await getAxiosInstance().post('/send-otp/' + path, reqObj);\r\n\r\n showSuccessToast({\r\n header: response.message || 'OTP has been sent successfully',\r\n description: 'Kindly enter below details to continue.',\r\n });\r\n } catch (error) {\r\n errorLogger(error);\r\n throw error;\r\n }\r\n};\r\n","import * as React from \"react\"\nimport { OTPInput, OTPInputContext } from \"input-otp\"\nimport { MinusIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction InputOTP({\n className,\n containerClassName,\n ...props\n}: React.ComponentProps<typeof OTPInput> & {\n containerClassName?: string\n}) {\n return (\n <OTPInput\n data-slot=\"input-otp\"\n containerClassName={cn(\n \"flex items-center gap-2 has-disabled:opacity-50\",\n containerClassName\n )}\n className={cn(\"disabled:cursor-not-allowed\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-otp-group\"\n className={cn(\"flex items-center\", className)}\n {...props}\n />\n )\n}\n\nfunction InputOTPSlot({\n index,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n index: number\n}) {\n const inputOTPContext = React.useContext(OTPInputContext)\n const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}\n\n return (\n <div\n data-slot=\"input-otp-slot\"\n data-active={isActive}\n className={cn(\n \"data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]\",\n className\n )}\n {...props}\n >\n {char}\n {hasFakeCaret && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <div className=\"animate-caret-blink bg-foreground h-4 w-px duration-1000\" />\n </div>\n )}\n </div>\n )\n}\n\nfunction InputOTPSeparator({ ...props }: React.ComponentProps<\"div\">) {\n return (\n <div data-slot=\"input-otp-separator\" role=\"separator\" {...props}>\n <MinusIcon />\n </div>\n )\n}\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\n","import { InputOTP, InputOTPGroup, InputOTPSlot } from '@/components/ui/input-otp';\r\nimport { Label } from '@/components/ui/label';\r\nimport { useCountdown } from '@/hooks/useCountDown';\r\nimport type { Ref } from 'react';\r\n\r\ninterface InputOTPFieldProps {\r\n className: string;\r\n inputOTPField: Ref<any>;\r\n otp: string;\r\n setOtp: (otp: string) => void;\r\n onChangeEmailClick: () => void;\r\n}\r\n\r\nconst InputOTPField = ({ className, inputOTPField, otp, setOtp, onChangeEmailClick }: InputOTPFieldProps) => {\r\n const secondLeft = useCountdown();\r\n return (\r\n <div className={className}>\r\n <Label htmlFor=\"otp\">Enter OTP *</Label>\r\n\r\n <InputOTP maxLength={4} name=\"otp\" id=\"otp\" ref={inputOTPField} value={otp} onChange={setOtp}>\r\n <InputOTPGroup>\r\n <InputOTPSlot index={0} />\r\n <InputOTPSlot index={1} />\r\n <InputOTPSlot index={2} />\r\n <InputOTPSlot index={3} />\r\n </InputOTPGroup>\r\n </InputOTP>\r\n <span className=\"text-xs underline-offset-4 italic\">\r\n {secondLeft > 0 ? (\r\n <span className=\"muted-foreground\">You can resend the OTP in {secondLeft} seconds.</span>\r\n ) : (\r\n <span className=\"hover:underline cursor-pointer\" onClick={() => onChangeEmailClick()}>\r\n Didn't receive the OTP? Send again.\r\n </span>\r\n )}\r\n </span>\r\n </div>\r\n );\r\n};\r\n\r\nexport default InputOTPField;\r\n","import { useState, useEffect } from \"react\";\r\n\r\n// Returns seconds left; starts from initial value and counts down to 0\r\nexport function useCountdown(initialSeconds = 30) {\r\n const [secondsLeft, setSecondsLeft] = useState(initialSeconds);\r\n\r\n useEffect(() => {\r\n if (secondsLeft > 0) {\r\n const timer = setTimeout(() => setSecondsLeft(secondsLeft - 1), 1000);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [secondsLeft]);\r\n\r\n return secondsLeft;\r\n}\r\n","import { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Label } from '@/components/ui/label';\r\nimport { appInfo } from '@/config/app-config';\r\nimport { showErrorToast, showSuccessToast } from '@/lib/toast-helper';\r\nimport { errorLogger, getFormDataByFormEl, validatePassword } from '@/lib/utils';\r\nimport { useEffect, useRef, useState, useTransition } from 'react';\r\nimport { NavLink, useNavigate } from 'react-router';\r\nimport PasswordPolicyIBtn from './components/PasswordPolicyIBtn';\r\nimport SendOTP from './components/SendOTP';\r\nimport InputOTPField from './components/InputOTPField';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\n\r\nexport default function RegistrationForm() {\r\n const sendOTPCmp = useRef<HTMLInputElement>(null);\r\n const gridCls = 'grid gap-1';\r\n const inputOTPFieldRef = useRef<HTMLInputElement>(null);\r\n const [isOTPGenerated, setIsOTPGenerated] = useState(false);\r\n const [otp, setOtp] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [isPending, startTransition] = useTransition();\r\n const navigate = useNavigate();\r\n\r\n const handleOnSubmit = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n if (!otp) {\r\n showErrorToast({\r\n header: 'OTP Required!',\r\n description: 'Please enter your OTP and try again.',\r\n });\r\n inputOTPFieldRef.current?.focus();\r\n return;\r\n }\r\n\r\n const reqObj = getFormDataByFormEl(event.currentTarget);\r\n reqObj.otp = otp;\r\n reqObj.user_email = email;\r\n\r\n const isValid = validatePassword(reqObj.user_password as string);\r\n\r\n if (isValid.valid === false) {\r\n showErrorToast({\r\n header: 'Password Policy',\r\n description: isValid.message,\r\n });\r\n return;\r\n }\r\n\r\n startTransition(async () => {\r\n try {\r\n await getAxiosInstance().post('user-registration', reqObj);\r\n\r\n showSuccessToast({\r\n header: `Welcome to ${appInfo.appName}`,\r\n description: 'Registration successful! Please log in to continue.',\r\n });\r\n\r\n navigate('/login');\r\n } catch (error) {\r\n errorLogger(error);\r\n }\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (isOTPGenerated) {\r\n inputOTPFieldRef.current?.focus();\r\n } else {\r\n sendOTPCmp?.current?.focus();\r\n }\r\n }, [isOTPGenerated]);\r\n\r\n const reSendOTP = () => {\r\n setIsOTPGenerated(false);\r\n };\r\n\r\n return (\r\n <div className=\"grid gap-5\">\r\n <div className=\"after:border-border relative text-center text-sm after:absolute after:inset-0 after:top-1/2 after:z-0 after:flex after:items-center after:border-t\">\r\n <span className=\"bg-card text-muted-foreground relative z-10 px-2\">User Registration</span>\r\n </div>\r\n\r\n <SendOTP\r\n ref={sendOTPCmp}\r\n handleOnOTPSent={(reqObj) => {\r\n setIsOTPGenerated(true);\r\n setEmail(reqObj.email);\r\n }}\r\n gridCls={gridCls}\r\n hidden={isOTPGenerated}\r\n path=\"new-registration\"\r\n />\r\n\r\n {isOTPGenerated && (\r\n <form onSubmit={handleOnSubmit} className={`grid gap-5`}>\r\n <div className={gridCls}>\r\n <Label htmlFor=\"emailOTPGenerated\">Email *</Label>\r\n <Input id=\"emailOTPGenerated\" type=\"email\" name=\"email\" placeholder=\"mail@example.com\" value={email} disabled required />\r\n <span className=\"ml-auto text-xs underline-offset-4 hover:underline cursor-pointer italic\" onClick={reSendOTP}>\r\n Change Email\r\n </span>\r\n </div>\r\n\r\n <InputOTPField className={gridCls} inputOTPField={inputOTPFieldRef} otp={otp} setOtp={setOtp} onChangeEmailClick={reSendOTP} />\r\n\r\n <div className=\"flex gap-4\">\r\n <div className={gridCls + ' flex-1'}>\r\n <Label htmlFor=\"firstName\">First Name *</Label>\r\n <Input id=\"firstName\" name=\"user_fname\" type=\"text\" required />\r\n </div>\r\n <div className={gridCls + ' flex-1'}>\r\n <Label htmlFor=\"lastName\">Last Name *</Label>\r\n <Input id=\"lastName\" name=\"user_lname\" type=\"text\" required />\r\n </div>\r\n </div>\r\n <div className={gridCls}>\r\n <Label htmlFor=\"mobile\">Mobile No</Label>\r\n <Input id=\"mobile\" type=\"number\" name=\"user_mobile_no\" placeholder=\"98******88\" />\r\n </div>\r\n <div className={gridCls}>\r\n <Label htmlFor=\"password\">\r\n Set Password * <PasswordPolicyIBtn />\r\n </Label>\r\n <Input id=\"password\" name=\"user_password\" type=\"password\" placeholder=\"**********\" required />\r\n </div>\r\n <Button type=\"submit\" className=\"w-full\" size={'lg'} loading={isPending}>\r\n Create account\r\n </Button>\r\n </form>\r\n )}\r\n\r\n <div className=\"text-center text-sm\">\r\n Already have an account?{' '}\r\n <NavLink to=\"/login\">\r\n <span className=\"underline underline-offset-4\">Login</span>\r\n </NavLink>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\";\n\nfunction Collapsible({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />;\n}\n\nfunction CollapsibleTriggerWrapper({\n isCollapsible,\n ...props\n}: {\n isCollapsible: boolean;\n children?: React.ReactNode;\n} & React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n if (isCollapsible)\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n );\n\n return <>{props.children}</>;\n}\n\nfunction CollapsibleTrigger({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n );\n}\n\nfunction CollapsibleContent({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return (\n <CollapsiblePrimitive.CollapsibleContent\n data-slot=\"collapsible-content\"\n {...props}\n />\n );\n}\n\nexport {\n Collapsible,\n CollapsibleTrigger,\n CollapsibleTriggerWrapper,\n CollapsibleContent,\n};\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { PanelLeftIcon } from 'lucide-react';\n\nimport { useIsMobile } from '@/hooks/useIsMobile';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Separator } from '@/components/ui/separator';\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '@/components/ui/sheet';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nconst SIDEBAR_COOKIE_NAME = 'sidebar_state';\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;\nconst SIDEBAR_WIDTH = '16rem';\nconst SIDEBAR_WIDTH_MOBILE = '18rem';\nconst SIDEBAR_WIDTH_ICON = '3rem';\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'l';\n\ntype SidebarContextProps = {\n state: 'expanded' | 'collapsed';\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.');\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n\n // This sets the cookie to keep the sidebar state.\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n },\n [setOpenProp, open],\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? 'expanded' : 'collapsed';\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn('group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full', className)}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & {\n side?: 'left' | 'right';\n variant?: 'sidebar' | 'floating' | 'inset';\n collapsible?: 'offcanvas' | 'icon' | 'none';\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === 'none') {\n return (\n <div data-slot=\"sidebar\" className={cn('bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col', className)} {...props}>\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n 'relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)',\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex',\n side === 'left'\n ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'\n : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\n // Adjust the padding for floating and inset variants.\n variant === 'floating' || variant === 'inset'\n ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn('size-7', className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex',\n 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n 'bg-background relative flex w-full flex-1 flex-col',\n 'md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return <Input data-slot=\"sidebar-input\" data-sidebar=\"input\" className={cn('bg-background h-8 w-full shadow-none', className)} {...props} />;\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sidebar-header\" data-sidebar=\"header\" className={cn('flex flex-col gap-2 p-2', className)} {...props} />;\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sidebar-footer\" data-sidebar=\"footer\" className={cn('flex flex-col gap-2 p-2', className)} {...props} />;\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return <Separator data-slot=\"sidebar-separator\" data-sidebar=\"separator\" className={cn('bg-sidebar-border mx-2 w-auto', className)} {...props} />;\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn('flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden', className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sidebar-group\" data-sidebar=\"group\" className={cn('relative flex w-full min-w-0 flex-col p-2', className)} {...props} />;\n}\n\nfunction SidebarGroupLabel({ className, asChild = false, ...props }: React.ComponentProps<'div'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n 'text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({ className, asChild = false, ...props }: React.ComponentProps<'button'> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sidebar-group-content\" data-sidebar=\"group-content\" className={cn('w-full text-sm', className)} {...props} />;\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {\n return <ul data-slot=\"sidebar-menu\" data-sidebar=\"menu\" className={cn('flex w-full min-w-0 flex-col gap-1', className)} {...props} />;\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {\n return <li data-slot=\"sidebar-menu-item\" data-sidebar=\"menu-item\" className={cn('group/menu-item relative', className)} {...props} />;\n}\n\nconst sidebarMenuButtonVariants = cva(\n 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',\n outline:\n 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',\n },\n size: {\n default: 'h-8 text-sm',\n sm: 'h-7 text-xs',\n lg: 'h-12 text-sm group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isExpanded = false,\n variant = 'default',\n size = 'default',\n tooltip,\n className,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n isExpanded?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot : 'button';\n // const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isExpanded}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n // hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',\n // Increases the hit area of the button on mobile.\n 'after:absolute after:-inset-2 md:after:hidden',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none',\n 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=default]/menu-button:top-1.5',\n 'peer-data-[size=lg]/menu-button:top-2.5',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<'div'> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n 'border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {\n return <li data-slot=\"sidebar-menu-sub-item\" data-sidebar=\"menu-sub-item\" className={cn('group/menu-sub-item relative', className)} {...props} />;\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = 'md',\n isExpanded = false,\n className,\n ...props\n}: React.ComponentProps<'a'> & {\n asChild?: boolean;\n size?: 'sm' | 'md';\n isExpanded?: boolean;\n}) {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isExpanded}\n className={cn(\n 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',\n 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground',\n size === 'sm' && 'text-xs',\n size === 'md' && 'text-sm',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n};\n","import { ChevronRight } from 'lucide-react';\n\nimport { Collapsible, CollapsibleContent, CollapsibleTriggerWrapper } from '@/components/ui/collapsible';\nimport {\n SidebarGroup,\n SidebarGroupLabel,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n} from '@/components/ui/sidebar';\nimport { NavLink, useLocation } from 'react-router';\nimport { getModuleNameFromUrl, isSameNavItem } from '@/lib/utils';\nimport type { NavGroup, NavItem } from '@/lib/types';\n\ninterface NavMainProps {\n navItems: NavGroup[];\n}\n\nexport function NavMain({ navItems }: NavMainProps) {\n const location = useLocation();\n const moduleName = location.pathname;\n const currentPath = getModuleNameFromUrl(moduleName);\n\n const getModuleLink = (path: string) => `app/${path}`;\n\n const selectedItemCls = `bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground`;\n\n const getSidebarMenuBtn = (item: NavItem) => {\n const sidebarMenuBtn = (\n <SidebarMenuButton tooltip={item.title} className={'cursor-pointer ' + (isSameNavItem(currentPath, item.url || '') ? selectedItemCls : '')}>\n {item.icon && <item.icon />}\n <span>{item.title}</span>\n {item.items && <ChevronRight className=\"ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90\" />}\n </SidebarMenuButton>\n );\n\n if (!item.url) {\n return sidebarMenuBtn;\n }\n\n return (\n <NavLink to={getModuleLink(item.url)} className=\"w-full\">\n {sidebarMenuBtn}\n </NavLink>\n );\n };\n\n return (\n <>\n {navItems.map((navItem) => (\n <SidebarGroup key={navItem.title}>\n <SidebarGroupLabel>{navItem.title}</SidebarGroupLabel>\n <SidebarMenu>\n {navItem.items.map((item) => {\n const hasSelectedSubItem = item.items && item.items.some((subItem) => isSameNavItem(currentPath, subItem.url));\n\n return (\n <Collapsible key={item.title} asChild defaultOpen={hasSelectedSubItem} className=\"group/collapsible\">\n <SidebarMenuItem>\n <CollapsibleTriggerWrapper isCollapsible={!!item.items} asChild>\n {getSidebarMenuBtn(item)}\n </CollapsibleTriggerWrapper>\n <CollapsibleContent>\n <SidebarMenuSub>\n {item.items?.map((subItem) => (\n <SidebarMenuSubItem key={subItem.title}>\n <SidebarMenuSubButton asChild className={isSameNavItem(currentPath, subItem.url) ? selectedItemCls : ''}>\n <NavLink to={getModuleLink(subItem.url)} title={subItem.title}>\n <span>{subItem.title}</span>\n </NavLink>\n </SidebarMenuSubButton>\n </SidebarMenuSubItem>\n ))}\n </SidebarMenuSub>\n </CollapsibleContent>\n </SidebarMenuItem>\n </Collapsible>\n );\n })}\n </SidebarMenu>\n </SidebarGroup>\n ))}\n </>\n );\n}\n","import * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted flex size-full items-center justify-center rounded-full\",\n className\n )}\n {...props}\n />\n );\n}\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import { useState, useEffect, useContext } from 'react';\r\nimport DialogWrapper from '@/components/custom/DialogWrapper';\r\nimport { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Label } from '@/components/ui/label';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showSuccessToast } from '@/lib/toast-helper';\r\nimport AppContext from '@/store/AppContext';\r\nimport type { IUserData } from '@/lib/types';\r\nimport { generatePublicId } from '@/lib/utils';\r\nimport { LoadingCmp } from '@/components/custom';\r\n\r\ninterface IUserAccount {\r\n isDialogOpen: boolean;\r\n setIsDialogOpen: (open: boolean) => void;\r\n}\r\n\r\nconst UserAccount = ({ isDialogOpen, setIsDialogOpen }: IUserAccount) => {\r\n const { loggedInUser, setLoggedInUser } = useContext(AppContext);\r\n const [loading, setLoading] = useState(false);\r\n const [saving, setSaving] = useState(false);\r\n\r\n const [userData, setUserData] = useState<IUserData | null>(null);\r\n const [formData, setFormData] = useState<Partial<IUserData>>({});\r\n\r\n useEffect(() => {\r\n if (isDialogOpen) {\r\n fetchUserData();\r\n }\r\n }, [isDialogOpen]);\r\n\r\n const fetchUserData = async () => {\r\n setLoading(true);\r\n try {\r\n // const response = await getAxiosInstance().get('/user/profile');\r\n // setUserData(response);\r\n // setFormData(response);\r\n\r\n const data: IUserData = {\r\n user_id: loggedInUser.id,\r\n user_email: loggedInUser.email,\r\n user_mobile_no: loggedInUser.mobNo?.toString() || '',\r\n user_fname: loggedInUser.fname || '',\r\n user_lname: loggedInUser.lname || '',\r\n user_is_active: true,\r\n created_at: new Date().toISOString(),\r\n updated_at: new Date().toISOString(),\r\n };\r\n\r\n setUserData(data);\r\n setFormData(data);\r\n } catch (error) {\r\n console.error('Error fetching user data:', error);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleInputChange = (field: keyof IUserData, value: string | boolean) => {\r\n setFormData((prev) => ({\r\n ...prev,\r\n [field]: value,\r\n }));\r\n };\r\n\r\n const handleSave = async () => {\r\n setSaving(true);\r\n try {\r\n const reqBody = {\r\n user_mobile_no: formData.user_mobile_no,\r\n user_fname: formData.user_fname,\r\n user_lname: formData.user_lname,\r\n };\r\n\r\n await getAxiosInstance().put(`/user-profile/${formData.user_id}`, reqBody);\r\n showSuccessToast({\r\n header: 'Success',\r\n description: 'User profile updated successfully',\r\n });\r\n setUserData(formData as IUserData);\r\n\r\n setLoggedInUser({\r\n ...loggedInUser,\r\n mobNo: formData.user_mobile_no,\r\n fname: formData.user_fname,\r\n lname: formData.user_lname,\r\n });\r\n\r\n setIsDialogOpen(false);\r\n } catch (error) {\r\n console.error('Error saving user data:', error);\r\n } finally {\r\n setSaving(false);\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n setFormData(userData || {});\r\n setIsDialogOpen(false);\r\n };\r\n\r\n return (\r\n <DialogWrapper\r\n open={isDialogOpen}\r\n setIsOpen={setIsDialogOpen}\r\n header=\"Edit User Profile\"\r\n disableOutsideClick={true}\r\n actionsJSX={\r\n <div className=\"flex gap-3\">\r\n <Button variant=\"outline\" onClick={handleCancel} disabled={saving}>\r\n Cancel\r\n </Button>\r\n <Button onClick={handleSave} loading={saving}>\r\n Save Changes\r\n </Button>\r\n </div>\r\n }\r\n >\r\n {loading ? (\r\n <div className=\"flex items-center justify-center py-8\">\r\n <div className=\"text-muted-foreground flex items-center gap-1\">\r\n <LoadingCmp />\r\n Loading user data...\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4 mt-4\">\r\n {/* User ID - Read Only */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"user_id\">User ID</Label>\r\n <Input id=\"user_id\" value={formData.user_id ? generatePublicId(formData.user_id) : ''} disabled className=\"bg-muted\" />\r\n </div>\r\n\r\n {/* Email */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"user_email\">Email</Label>\r\n <Input id=\"user_email\" type=\"email\" value={formData.user_email || ''} placeholder=\"Enter email address\" disabled className=\"bg-muted\" />\r\n </div>\r\n\r\n {/* Mobile Number */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"user_mobile_no\">Mobile Number</Label>\r\n <Input\r\n id=\"user_mobile_no\"\r\n type=\"number\"\r\n value={formData.user_mobile_no || ''}\r\n onChange={(e) => handleInputChange('user_mobile_no', e.target.value)}\r\n placeholder=\"Enter mobile number\"\r\n />\r\n </div>\r\n\r\n {/* First Name */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"user_fname\">First Name</Label>\r\n <Input\r\n id=\"user_fname\"\r\n value={formData.user_fname || ''}\r\n onChange={(e) => handleInputChange('user_fname', e.target.value)}\r\n placeholder=\"Enter first name\"\r\n />\r\n </div>\r\n\r\n {/* Last Name */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"user_lname\">Last Name</Label>\r\n <Input\r\n id=\"user_lname\"\r\n value={formData.user_lname || ''}\r\n onChange={(e) => handleInputChange('user_lname', e.target.value)}\r\n placeholder=\"Enter last name\"\r\n />\r\n </div>\r\n\r\n {/* Active Status - Read Only */}\r\n {/* <div className=\"space-y-2\">\r\n <Label htmlFor=\"user_is_active\">Account Status</Label>\r\n <Input id=\"user_is_active\" value={formData.user_is_active ? 'Active' : 'Inactive'} disabled className=\"bg-muted\" />\r\n </div> */}\r\n\r\n {/* Created At - Read Only */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"created_at\">Joined On</Label>\r\n <Input id=\"created_at\" value={formData.created_at ? new Date(formData.created_at).toLocaleString() : ''} disabled className=\"bg-muted\" />\r\n </div>\r\n\r\n {/* Updated At - Read Only */}\r\n {/* <div className=\"space-y-2\">\r\n <Label htmlFor=\"updated_at\">Last Updated</Label>\r\n <Input id=\"updated_at\" value={formData.updated_at ? new Date(formData.updated_at).toLocaleString() : ''} disabled className=\"bg-muted\" />\r\n </div> */}\r\n </div>\r\n )}\r\n </DialogWrapper>\r\n );\r\n};\r\n\r\nexport default UserAccount;\r\n","import { BadgeCheck, ChevronsUpDown, CircleUserRound, CreditCard, LogOut, Sparkle } from 'lucide-react';\n\nimport { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport { SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar } from '@/components/ui/sidebar';\nimport { setLocalStorage } from '@/lib/utils';\nimport { useNavigate } from 'react-router';\nimport LinkWrapper from '../custom/LinkWrapper';\nimport { useContext, useState } from 'react';\nimport AppContext from '@/store/AppContext';\nimport { isFreePlan } from '@/app/routes/Subscriptions/utils/subscription-utils';\nimport UserAccount from '@/app/UserAccount';\n\nexport function NavUser({ fname, lname, email, avatar }: { fname: string; lname: string; email: string; avatar: string }) {\n const navigate = useNavigate();\n const { isMobile } = useSidebar();\n const { activePlan, featureFlags } = useContext(AppContext);\n const fullName = `${fname} ${lname}`;\n const [isAccountDialogOpen, setIsAccountDialogOpen] = useState(false);\n\n return (\n <>\n <UserAccount isDialogOpen={isAccountDialogOpen} setIsDialogOpen={setIsAccountDialogOpen} />\n <SidebarMenu>\n <SidebarMenuItem>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <SidebarMenuButton size=\"lg\" className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\">\n <Avatar className=\"h-8 w-8 rounded-lg\">\n <AvatarImage src={avatar} alt={fullName} />\n <AvatarFallback className=\"rounded-lg\">\n {fname[0].toLocaleUpperCase()}\n {lname[0].toLocaleUpperCase()}\n </AvatarFallback>\n </Avatar>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">{fullName}</span>\n <span className=\"truncate text-xs\">{email}</span>\n </div>\n <ChevronsUpDown className=\"ml-auto size-4\" />\n </SidebarMenuButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n className=\"w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg\"\n side={isMobile ? 'bottom' : 'right'}\n align=\"end\"\n sideOffset={4}\n >\n <DropdownMenuLabel className=\"p-0 font-normal\">\n <div className=\"flex items-center gap-2 px-1 py-1.5 text-left text-sm\">\n <Avatar className=\"h-8 w-8 rounded-lg\">\n <AvatarImage src={avatar} alt={fullName} />\n <AvatarFallback className=\"rounded-lg\">\n {fname[0].toLocaleUpperCase()}\n {lname[0].toLocaleUpperCase()}\n </AvatarFallback>\n </Avatar>\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">{fullName}</span>\n <span className=\"truncate text-xs\">{email}</span>\n </div>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={() => setIsAccountDialogOpen(true)}>\n <CircleUserRound />\n Your Profile\n </DropdownMenuItem>\n {featureFlags.ff_enable_paid_subscription ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem\n onClick={() => {\n setTimeout(\n () => {\n navigate('/plans');\n },\n isMobile ? 500 : 0,\n );\n }}\n >\n <Sparkle />\n {isFreePlan(activePlan) ? 'Upgrade to premium' : 'View Plans'}\n </DropdownMenuItem>\n </DropdownMenuGroup>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem\n onClick={() => {\n setTimeout(\n () => {\n navigate('/infrastructure/manage-subscription');\n },\n isMobile ? 500 : 0,\n );\n }}\n >\n <BadgeCheck />\n Subscriptions\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => {\n setTimeout(\n () => {\n navigate('/infrastructure/payment-history');\n },\n isMobile ? 500 : 0,\n );\n }}\n >\n <CreditCard />\n Payment History\n </DropdownMenuItem>\n {/* <DropdownMenuItem>\n <Bell />\n Notifications\n </DropdownMenuItem> */}\n </DropdownMenuGroup>\n </>\n ) : null}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={() => {\n setLocalStorage('apiKey', '');\n navigate('/login');\n }}\n >\n <LogOut />\n Log out\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </SidebarMenuItem>\n </SidebarMenu>\n </>\n );\n}\n","// import PremiumHighlighter from '@/components/custom/PremiumHighlighter';\r\nimport { TooltipWrapper } from '@/components/custom/TooltipWrapper';\r\nimport { Badge } from '@/components/ui';\r\nimport { appInfo } from '@/config/app-config';\r\nimport type { purchasedPlansInf } from '@/lib/types';\r\nimport AppContext from '@/store/AppContext';\r\n// import { SparkleIcon } from 'lucide-react';\r\nimport { useContext } from 'react';\r\nimport { isFreePlan } from '../utils/subscription-utils';\r\n\r\ninterface IPremiumIcon {\r\n purchasedPlan: purchasedPlansInf;\r\n}\r\n\r\nconst PremiumIcon = ({ purchasedPlan }: IPremiumIcon) => {\r\n const { subscriptionConfig, featureFlags } = useContext(AppContext);\r\n\r\n if (!featureFlags.ff_enable_paid_subscription) return null;\r\n\r\n const plan = subscriptionConfig.plans.find((p) => p.id === purchasedPlan.plan_id);\r\n if (!plan) return null;\r\n\r\n const isFree = isFreePlan(purchasedPlan);\r\n\r\n return (\r\n <TooltipWrapper\r\n delayDuration={20}\r\n content={\r\n <>\r\n This {appInfo.account_type_txt.singular.toLocaleLowerCase()} is on a \"{plan.title}\" plan.\r\n </>\r\n }\r\n side=\"right\"\r\n >\r\n <div>\r\n {/* <PremiumHighlighter /> */}\r\n {/* <SparkleIcon /> */}\r\n <Badge variant={'success'}>{isFree ? 'Free' : 'Premium'}</Badge>\r\n </div>\r\n </TooltipWrapper>\r\n );\r\n};\r\n\r\nexport default PremiumIcon;\r\n","import React, { useContext } from 'react';\r\nimport { ChevronsUpDown, FolderKanban, Pen, Plus, UserRoundPlus, Users2 } from 'lucide-react';\r\n\r\nimport {\r\n DropdownMenu,\r\n DropdownMenuContent,\r\n DropdownMenuItem,\r\n DropdownMenuLabel,\r\n DropdownMenuSeparator,\r\n DropdownMenuTrigger,\r\n} from '@/components/ui/dropdown-menu';\r\n\r\nimport { SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar } from '@/components/ui/sidebar';\r\n\r\nimport AppContext from '@/store/AppContext';\r\nimport { useNavigate } from 'react-router';\r\nimport { appInfo } from '@/config/app-config';\r\nimport { generatePublicId, isValidId } from '@/lib/utils';\r\nimport { ROLES } from '@/lib/enums';\r\nimport { TooltipWrapper } from '../custom/TooltipWrapper';\r\nimport { showErrorToast } from '@/lib/toast-helper';\r\nimport PremiumIcon from '@/app/routes/Subscriptions/components/PremiumIcon';\r\n\r\ninterface OrgSwitcherMenuProps {\r\n text: React.ReactNode;\r\n link: string;\r\n icon: React.ReactNode;\r\n disabled?: boolean;\r\n tooltip?: string;\r\n addTopSeparator?: boolean;\r\n key: string;\r\n}\r\n\r\nexport function OrgSwitcher() {\r\n const { isMobile, setOpenMobile } = useSidebar();\r\n const { orgs, activeOrg, setActiveOrg } = useContext(AppContext);\r\n const navigate = useNavigate();\r\n\r\n const getOrgSpecificOptions = () => {\r\n const options: OrgSwitcherMenuProps[] = [];\r\n\r\n if (activeOrg && isValidId(activeOrg?.org_id || 0)) {\r\n const isAdmin = ROLES.Is_ADMIN(activeOrg?.role_id || NaN);\r\n options.push(\r\n {\r\n text: <>Invite team members</>,\r\n link: `/infrastructure/edit-org/${generatePublicId(activeOrg?.org_id || 0)}`,\r\n disabled: !isAdmin,\r\n icon: <UserRoundPlus className=\"size-4\" />,\r\n tooltip: isAdmin\r\n ? `Invite peoples to \"${activeOrg.org_name}\" ${appInfo.account_type_txt.singular.toLocaleLowerCase()}`\r\n : `You are not an admin for \"${\r\n activeOrg.org_name\r\n }\" ${appInfo.account_type_txt.singular.toLocaleLowerCase()}, Only admins can invite peoples.`,\r\n key: 'invite-peoples',\r\n },\r\n {\r\n text: <>Edit {appInfo.account_type_txt.singular.toLocaleLowerCase()}</>,\r\n link: `/infrastructure/edit-org/${generatePublicId(activeOrg?.org_id || 0)}`,\r\n disabled: !isAdmin,\r\n icon: <Pen className=\"size-4\" />,\r\n tooltip: isAdmin\r\n ? `Edit \"${activeOrg.org_name}\" ${appInfo.account_type_txt.singular.toLocaleLowerCase()} details`\r\n : `You are not an admin for \"${\r\n activeOrg.org_name\r\n }\" ${appInfo.account_type_txt.singular.toLocaleLowerCase()}, Only admins can invite peoples.`,\r\n key: 'edit-org',\r\n },\r\n );\r\n }\r\n\r\n options.push(\r\n {\r\n addTopSeparator: true,\r\n text: <>Create new {appInfo.account_type_txt.singular.toLocaleLowerCase()}</>,\r\n link: '/infrastructure/create-new-org',\r\n icon: <Plus className=\"size-4\" />,\r\n key: 'create-new-org',\r\n },\r\n {\r\n text: <>View all {appInfo.account_type_txt.plural.toLocaleLowerCase()}</>,\r\n link: '/infrastructure/manage-infra',\r\n icon: <FolderKanban className=\"size-4\" />,\r\n key: 'view-all-orgs',\r\n },\r\n {\r\n addTopSeparator: true,\r\n text: <>Check invites</>,\r\n link: 'infrastructure/user-invitations',\r\n icon: <UserRoundPlus className=\"size-4\" />,\r\n key: 'check-invitations',\r\n },\r\n );\r\n\r\n return (\r\n <>\r\n {options.map((rec) => {\r\n return (\r\n <TooltipWrapper key={rec.key} content={<>{rec.tooltip}</>} side=\"right\" canShowTooltip={!!rec.tooltip}>\r\n <div key={rec.key}>\r\n {rec.addTopSeparator ? <DropdownMenuSeparator /> : null}\r\n <DropdownMenuItem\r\n key={rec.link}\r\n className=\"gap-2 p-2 cursor-pointer\"\r\n // disabled={rec.disabled}\r\n onClick={() => {\r\n setOpenMobile(false);\r\n setTimeout(\r\n () => {\r\n if (rec.disabled) {\r\n showErrorToast({\r\n header: 'Action not allowed!',\r\n description: rec.tooltip || 'You cannot access this option',\r\n });\r\n return;\r\n }\r\n navigate(rec.link);\r\n },\r\n isMobile ? 500 : 0,\r\n );\r\n }}\r\n >\r\n <div className=\"flex size-6 items-center justify-center rounded-md border bg-transparent\" title={rec.tooltip}>\r\n {rec.icon}\r\n </div>\r\n <div className=\"text-muted-foreground font-medium\">{rec.text}</div>\r\n </DropdownMenuItem>\r\n </div>\r\n </TooltipWrapper>\r\n );\r\n })}\r\n </>\r\n );\r\n };\r\n\r\n return (\r\n <SidebarMenu>\r\n <SidebarMenuItem>\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <SidebarMenuButton size=\"lg\" className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\">\r\n <div className=\"flex aspect-square size-8 items-center justify-center rounded-lg\">\r\n {activeOrg?.logo ? <activeOrg.logo className=\"size-4\" /> : <Users2 className=\"size-4\" />}\r\n </div>\r\n\r\n {activeOrg ? (\r\n <TooltipWrapper content={activeOrg.org_name + ' - ' + activeOrg.org_external_id} side=\"right\" canShowTooltip={true}>\r\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\r\n <span className=\"truncate font-medium\">{activeOrg.org_name}</span>\r\n <span className=\"truncate text-xs\">{activeOrg.org_external_id}</span>\r\n </div>\r\n </TooltipWrapper>\r\n ) : (\r\n <div className=\"truncate text-xs\">No Active {appInfo.account_type_txt.singular}, select one.</div>\r\n )}\r\n\r\n {activeOrg?.active_purchased_plan && (\r\n <div className=\"flex items-center justify-center rounded-md border\">\r\n <PremiumIcon purchasedPlan={activeOrg.active_purchased_plan} />\r\n </div>\r\n )}\r\n <ChevronsUpDown className=\"ml-auto\" />\r\n </SidebarMenuButton>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent\r\n className=\"w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg\"\r\n align=\"start\"\r\n side={isMobile ? 'bottom' : 'right'}\r\n sideOffset={4}\r\n >\r\n <DropdownMenuLabel className=\"text-muted-foreground text-xs\">{appInfo.account_type_txt.plural}</DropdownMenuLabel>\r\n {orgs.map((org) => (\r\n <DropdownMenuItem key={org.org_id} onClick={() => setActiveOrg(org)} className=\"gap-2 p-2\">\r\n {org.logo ? (\r\n <div className=\"flex size-6 items-center justify-center rounded-md border\">\r\n <org.logo className=\"size-3.5 shrink-0\" />\r\n </div>\r\n ) : (\r\n <></>\r\n )}\r\n {org.org_name}\r\n {org.active_purchased_plan && (\r\n <div className=\"ml-auto flex items-center justify-center rounded-md border\">\r\n <PremiumIcon purchasedPlan={org.active_purchased_plan} />\r\n </div>\r\n )}\r\n {/* <DropdownMenuShortcut></DropdownMenuShortcut> */}\r\n </DropdownMenuItem>\r\n ))}\r\n <DropdownMenuSeparator />\r\n {getOrgSpecificOptions()}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n </SidebarMenuItem>\r\n </SidebarMenu>\r\n );\r\n}\r\n","import { SidebarMenu, SidebarMenuButton, SidebarMenuItem } from '@/components/ui/sidebar';\nimport { appInfo } from '@/config/app-config';\nimport { NavLink } from 'react-router';\n\nexport function AppHeader() {\n return (\n <SidebarMenu>\n <NavLink to={'/'}>\n <SidebarMenuItem>\n <SidebarMenuButton size=\"lg\" className=\"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground\">\n {/* <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\">\n <appInfo.logo className=\"size-4\" />\n </div> */}\n <div className=\"w-10 h-10 bg-sidebar-primary text-sidebar-primary-foreground rounded-lg flex items-center justify-center\">\n <appInfo.logo />\n </div>\n\n <div className=\"grid flex-1 text-left text-sm leading-tight\">\n <span className=\"truncate font-medium\">{appInfo.appName}</span>\n <span className=\"truncate text-xs\">v{appInfo.version}</span>\n </div>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </NavLink>\n </SidebarMenu>\n );\n}\n","import * as React from 'react';\nimport { NavMain } from '@/components/side-bar/nav-main';\nimport { NavUser } from '@/components/side-bar/nav-user';\nimport { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarRail } from '@/components/ui/sidebar';\n// import { appInfo } from \"../lib/app-config\";\nimport { OrgSwitcher } from '@/components/side-bar/org-switcher';\nimport { AppHeader } from './app-header';\nimport { navigationItems } from '@/lib/nav-menu';\nimport AppContext from '@/store/AppContext';\n\n// This is sample data.\nconst data = navigationItems;\n\nexport function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {\n const { loggedInUser, featureFlags } = React.useContext(AppContext);\n\n return (\n <Sidebar collapsible=\"icon\" {...props}>\n <SidebarHeader>\n <AppHeader />\n {featureFlags.ff_enable_teams && <OrgSwitcher />}\n </SidebarHeader>\n <SidebarContent>\n <NavMain navItems={data.navMain} />\n </SidebarContent>\n <SidebarFooter>\n <NavUser\n email={loggedInUser?.email || ''}\n fname={loggedInUser?.fname || ''}\n lname={loggedInUser?.lname || ''}\n avatar={'/avatars/shadcn.jpg'}\n />\n </SidebarFooter>\n <SidebarRail />\n </Sidebar>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Breadcrumb({ ...props }: React.ComponentProps<\"nav\">) {\n return <nav aria-label=\"breadcrumb\" data-slot=\"breadcrumb\" {...props} />;\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n}) {\n const Comp = asChild ? Slot : \"a\";\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"hover:text-foreground transition-colors\", className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"text-foreground font-normal\", className)}\n {...props}\n />\n );\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n );\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"flex size-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"size-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n );\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n};\n","import { findNavMenu, getModuleNameFromUrl } from '@/lib/utils';\r\nimport { useLocation } from 'react-router';\r\n\r\nconst useSelectedNavItem = () => {\r\n const location = useLocation();\r\n const currentPath = location.pathname;\r\n\r\n if (!currentPath || currentPath === '/')\r\n return {\r\n title: 'Dashboard',\r\n };\r\n\r\n const moduleName = getModuleNameFromUrl(currentPath);\r\n const selectedNavItem = findNavMenu(moduleName);\r\n\r\n if (!selectedNavItem) {\r\n return {\r\n title: 'Not Found',\r\n url: 'notFound',\r\n };\r\n }\r\n\r\n return selectedNavItem;\r\n};\r\n\r\nexport default useSelectedNavItem;\r\n","import { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator } from '@/components/ui/breadcrumb';\r\nimport type { NavItem } from '@/lib/types';\r\nimport type { JSX } from 'react';\r\nimport { Fragment } from 'react';\r\nimport useSelectedNavItem from '@/hooks/useSelectedNavItem';\r\n\r\nconst AppBreadcrumb = () => {\r\n const selectedNavItem = useSelectedNavItem();\r\n\r\n const getBreadcrumbItem = (navItem: NavItem, isRoot: boolean): JSX.Element[] => {\r\n let result: JSX.Element[] = [];\r\n\r\n result.push(\r\n <Fragment key={navItem.title}>\r\n <BreadcrumbItem>\r\n {isRoot ? <BreadcrumbPage>{navItem.title}</BreadcrumbPage> : <BreadcrumbLink>{navItem.title}</BreadcrumbLink>}\r\n </BreadcrumbItem>\r\n {!isRoot && <BreadcrumbSeparator />}\r\n </Fragment>,\r\n );\r\n\r\n if (navItem.parent) {\r\n result = [getBreadcrumbItem(navItem.parent, false), ...result].flat();\r\n }\r\n\r\n return result;\r\n };\r\n\r\n return (\r\n <Breadcrumb>\r\n <BreadcrumbList>{getBreadcrumbItem(selectedNavItem, true)}</BreadcrumbList>\r\n </Breadcrumb>\r\n );\r\n};\r\n\r\nexport default AppBreadcrumb;\r\n","import { showSuccessToast, showWarningToast } from '@/lib/toast-helper';\r\nimport type { OrganizationType, TeamMembersDetails } from '@/lib/types';\r\nimport { generatePublicId } from '@/lib/utils';\r\nimport { useNavigate } from 'react-router';\r\nimport { appInfo } from '@/config/app-config';\r\nimport useAlertDialog from '@/hooks/useAlertDialog';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { ROLES } from '@/lib/enums';\r\nimport AppContext from '@/store/AppContext';\r\nimport { useContext } from 'react';\r\n\r\nconst useOrgHelper = () => {\r\n const navigate = useNavigate();\r\n const dlg = useAlertDialog();\r\n const { activeOrg, loggedInUser } = useContext(AppContext);\r\n\r\n const editOrganization = (org: OrganizationType) => {\r\n if (!ROLES.Is_ADMIN(org.role_id)) {\r\n showWarningToast({\r\n header: 'Alert',\r\n description: (\r\n <>\r\n You are not allowed to edit the <b>{org.org_name}</b> {appInfo.account_type_txt.singular.toLocaleLowerCase()}.\r\n </>\r\n ),\r\n });\r\n return;\r\n }\r\n\r\n navigate('/infrastructure/edit-org/' + generatePublicId(org.org_id));\r\n };\r\n\r\n const handleOnDeleteUnregisteredUser = (user: Partial<TeamMembersDetails>, orgId: number) => {\r\n const { id, email } = user;\r\n\r\n return new Promise((resolve, reject) => {\r\n dlg.showAlertBox({\r\n type: 'CONFIRM',\r\n text: `Are you sure you want to remove \"${email}\" user from your ${appInfo.account_type_txt.singular}?`,\r\n async onClose(result) {\r\n if (result !== 'CONFIRM') {\r\n reject();\r\n return;\r\n }\r\n\r\n const reqData = {\r\n invited_users_id: id,\r\n org_id: orgId,\r\n };\r\n\r\n try {\r\n const result = await getAxiosInstance().delete('/org-member/unregistered-user-invitation', {\r\n data: reqData,\r\n });\r\n\r\n showSuccessToast({\r\n description: `${email} has been successfully removed from the team.`,\r\n });\r\n\r\n resolve(result);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n },\r\n });\r\n });\r\n };\r\n\r\n const isActiveOrgCreatedByMe = () => {\r\n return Number(activeOrg?.org_created_by) === Number(loggedInUser.id);\r\n };\r\n\r\n return {\r\n editOrganization,\r\n handleOnDeleteUnregisteredUser,\r\n isActiveOrgCreatedByMe,\r\n };\r\n};\r\n\r\nexport default useOrgHelper;\r\n","import AppContext from '@/store/AppContext';\r\nimport { useContext } from 'react';\r\nimport { useSidebar } from '@/components/ui/sidebar';\r\nimport { useNavigate } from 'react-router';\r\nimport PremiumHighlighter from '@/components/custom/PremiumHighlighter';\r\nimport usePurchasedPlans from '../hooks/usePurchasedPlans';\r\nimport useOrgHelper from '../../OrgSetup/hooks/useOrgHelper';\r\n\r\nconst UpgradeToPro = () => {\r\n const { featureFlags } = useContext(AppContext);\r\n const { isMobile, setOpenMobile } = useSidebar();\r\n const navigate = useNavigate();\r\n const { isActiveOrgFreePlan, isUserFreePlan } = usePurchasedPlans();\r\n const { isActiveOrgCreatedByMe } = useOrgHelper();\r\n\r\n if (featureFlags.ff_enable_paid_subscription === false) {\r\n return null;\r\n }\r\n\r\n const onBtnClick = () => {\r\n if (isMobile) {\r\n setOpenMobile(false);\r\n }\r\n // navigate('/infrastructure/manage-subscription');\r\n navigate('/plans');\r\n };\r\n\r\n if (isUserFreePlan() && (!featureFlags.ff_enable_teams || (isActiveOrgFreePlan() && isActiveOrgCreatedByMe()))) {\r\n return (\r\n <button onClick={onBtnClick}>\r\n <PremiumHighlighter>{'Upgrade to premium'}</PremiumHighlighter>\r\n </button>\r\n );\r\n }\r\n\r\n // return (\r\n // <Button variant=\"linkNoUnderline\" size=\"sm\" className=\"bg-primary/20 hover:bg-primary/10\" onClick={onBtnClick}>\r\n // <Sparkles /> {plan?.title} Plan\r\n // </Button>\r\n // );\r\n return null;\r\n};\r\n\r\nexport default UpgradeToPro;\r\n","import { AppSidebar } from '@/components/side-bar/app-sidebar';\r\nimport { Separator } from '@/components/ui/separator';\r\nimport { SidebarInset, SidebarProvider, SidebarTrigger } from '@/components/ui/sidebar';\r\nimport { Outlet } from 'react-router';\r\nimport AppBreadcrumb from './components/AppBreadcrumb';\r\nimport UpgradeToPro from '@/app/routes/Subscriptions/components/UpgradeToPro';\r\nimport { useIsMobile } from '@/hooks/useIsMobile';\r\n\r\nexport default function Dashboard() {\r\n const isMobile = useIsMobile();\r\n return (\r\n <SidebarProvider>\r\n <AppSidebar />\r\n <SidebarInset className=\"h-screen\">\r\n <header className=\"flex py-4 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12 bg-background\">\r\n <div className=\"flex items-center gap-2 px-4\">\r\n <SidebarTrigger className=\"-ml-1\" />\r\n <Separator orientation=\"vertical\" className=\"mr-2 data-[orientation=vertical]:h-4\" />\r\n <AppBreadcrumb />\r\n </div>\r\n <div className=\"flex-1\" />\r\n <div className=\"flex items-center gap-2 px-4\">{isMobile ? <></> : <UpgradeToPro />}</div>\r\n </header>\r\n <div className=\"flex items-stretch flex-col flex-1 overflow-auto\">\r\n <Outlet />\r\n </div>\r\n </SidebarInset>\r\n </SidebarProvider>\r\n );\r\n}\r\n","import { appInfo } from '@/config/app-config';\r\nimport { NavLink } from 'react-router';\r\n\r\nconst NotFound: React.FC<{ canShowHeader?: boolean }> = ({ canShowHeader = true }) => {\r\n return (\r\n <div className=\"flex flex-col stretch justify-center gap-4 items-center flex-1 p-5\">\r\n {canShowHeader && (\r\n <>\r\n <h1 className=\"text-3xl font-bold text-primary p-0\">{appInfo.appName}</h1>\r\n <p className=\"text-sm\">{appInfo.appDescription}</p>\r\n </>\r\n )}\r\n <div className=\"flex flex-col justify-center\">\r\n <div className=\"text-muted-foreground mb-4 text-sm\">404 Page Not Found</div>\r\n <NavLink to=\"/\" className=\"p-2 bg-primary text-primary-foreground rounded-md transition-colors text-sm\">\r\n Go to Homepage\r\n </NavLink>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default NotFound;\r\n","import { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Label } from '@/components/ui/label';\r\nimport { showErrorToast, showSuccessToast } from '@/lib/toast-helper';\r\nimport { errorLogger, getFormDataByFormEl, validatePassword } from '@/lib/utils';\r\nimport { useEffect, useImperativeHandle, useRef, useState, useTransition, type Ref } from 'react';\r\nimport { NavLink, useNavigate } from 'react-router';\r\nimport PasswordPolicyIBtn from './components/PasswordPolicyIBtn';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport SendOTP from './components/SendOTP';\r\nimport InputOTPField from './components/InputOTPField';\r\n\r\ninterface ResetFormProps {\r\n ref: Ref<{}>;\r\n gridCls: string;\r\n onChangeEmailClick: () => void;\r\n email: string;\r\n}\r\n\r\nconst ResentForm = ({ ref, gridCls, onChangeEmailClick, email }: ResetFormProps) => {\r\n const [otp, setOtp] = useState('');\r\n const [isPending, startTransition] = useTransition();\r\n const navigate = useNavigate();\r\n const inputOTPFieldRef = useRef<HTMLInputElement>(null);\r\n\r\n const handleOnSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n\r\n if (!otp) {\r\n showErrorToast({\r\n header: 'OTP Required!',\r\n description: 'Please enter your OTP and try again.',\r\n });\r\n inputOTPFieldRef.current?.focus();\r\n return;\r\n }\r\n\r\n const reqObj = getFormDataByFormEl(event.currentTarget);\r\n reqObj.otp = otp;\r\n reqObj.user_email = email;\r\n\r\n const isValid = validatePassword(reqObj.password as string);\r\n\r\n if (isValid.valid === false) {\r\n showErrorToast({\r\n header: 'Password Policy',\r\n description: isValid.message,\r\n });\r\n return;\r\n }\r\n\r\n if (reqObj.password !== reqObj.user_password) {\r\n showErrorToast({\r\n header: 'Password and Confirm Password fields contain different passwords.',\r\n description: '',\r\n });\r\n return;\r\n }\r\n\r\n startTransition(async () => {\r\n try {\r\n delete reqObj.password;\r\n\r\n await getAxiosInstance().put('/reset-password', reqObj);\r\n\r\n showSuccessToast({\r\n header: 'Your password has been reset successfully!',\r\n description: 'Please log in using your new password.',\r\n });\r\n\r\n navigate('/login');\r\n } catch (error) {\r\n errorLogger(error);\r\n }\r\n });\r\n };\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => {\r\n return {\r\n focus() {\r\n inputOTPFieldRef.current?.focus();\r\n },\r\n };\r\n },\r\n [],\r\n );\r\n\r\n return (\r\n <form onSubmit={handleOnSubmit} className=\"grid gap-6\">\r\n <div className={gridCls}>\r\n <Label htmlFor=\"emailOTPGenerated\">Email *</Label>\r\n <Input id=\"emailOTPGenerated\" type=\"email\" name=\"user_email\" placeholder=\"mail@example.com\" value={email} disabled required />\r\n <span className=\"ml-auto text-xs underline-offset-4 hover:underline cursor-pointer italic\" onClick={() => onChangeEmailClick()}>\r\n Change Email\r\n </span>\r\n </div>\r\n\r\n <InputOTPField className={gridCls} inputOTPField={inputOTPFieldRef} otp={otp} setOtp={setOtp} onChangeEmailClick={onChangeEmailClick} />\r\n\r\n <div className={gridCls}>\r\n <Label htmlFor=\"password\">\r\n New Password * <PasswordPolicyIBtn />\r\n </Label>\r\n <Input id=\"password\" type=\"password\" name=\"password\" placeholder=\"**********\" required />\r\n </div>\r\n <div className={gridCls}>\r\n <Label htmlFor=\"cnf-password\">Confirm Password *</Label>\r\n <Input id=\"cnf-password\" type=\"password\" name=\"user_password\" placeholder=\"**********\" required />\r\n </div>\r\n <Button type=\"submit\" className=\"w-full\" size={'lg'} loading={isPending}>\r\n Reset Password\r\n </Button>\r\n </form>\r\n );\r\n};\r\n\r\nexport default function ForgotPasswordForm() {\r\n const sendOTPCmp = useRef<HTMLInputElement>(null);\r\n const resetFormCmp = useRef<HTMLInputElement>(null);\r\n const [isOTPGenerated, setIsOTPGenerated] = useState(false);\r\n const [email, setEmail] = useState('');\r\n const gridCls = 'grid gap-1';\r\n\r\n useEffect(() => {\r\n if (isOTPGenerated) {\r\n resetFormCmp.current?.focus();\r\n } else {\r\n sendOTPCmp?.current?.focus();\r\n }\r\n }, [isOTPGenerated]);\r\n\r\n return (\r\n <div className=\"grid gap-6\">\r\n <div className=\"after:border-border relative text-center text-sm after:absolute after:inset-0 after:top-1/2 after:z-0 after:flex after:items-center after:border-t\">\r\n <span className=\"bg-card text-muted-foreground relative z-10 px-2\">Forgot Password</span>\r\n </div>\r\n\r\n <SendOTP\r\n ref={sendOTPCmp}\r\n handleOnOTPSent={(reqObj) => {\r\n setIsOTPGenerated(true);\r\n setEmail(reqObj.email);\r\n }}\r\n gridCls={gridCls}\r\n hidden={isOTPGenerated}\r\n path=\"forgot-password\"\r\n />\r\n\r\n {isOTPGenerated && <ResentForm ref={resetFormCmp} gridCls={gridCls} onChangeEmailClick={() => setIsOTPGenerated(false)} email={email} />}\r\n\r\n <div className=\"text-center text-sm\">\r\n Already have an account?{' '}\r\n <NavLink to=\"/login\">\r\n <span className=\"underline underline-offset-4\">Login</span>\r\n </NavLink>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import BigSquare from '@/components/custom/BigSquare';\r\nimport { appInfo } from '@/config/app-config';\r\nimport AppContext from '@/store/AppContext';\r\nimport { useContext } from 'react';\r\n\r\nconst OrgSetup = () => {\r\n const { orgs } = useContext(AppContext);\r\n\r\n return (\r\n <div className=\"mt-5\">\r\n <div className=\"flex flex-row justify-center gap-6\">\r\n <BigSquare toPath={'create-new-org'} className=\"text-center\">\r\n Create new {appInfo.account_type_txt.singular.toLocaleLowerCase()}\r\n </BigSquare>\r\n\r\n <BigSquare toPath={'user-invitations'} className=\"text-center\">\r\n Accept/Reject Invitations\r\n </BigSquare>\r\n </div>\r\n <div className=\"flex flex-row justify-center gap-6 mt-5\">\r\n <BigSquare toPath={'manage-infra'} className={'text-center'} disabled={orgs.length <= 0}>\r\n Manage {appInfo.account_type_txt.plural.toLocaleLowerCase()}\r\n </BigSquare>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default OrgSetup;\r\n","import { SelectListWrapper } from '@/components/custom';\r\nimport { ROLES } from '@/lib/enums';\r\n\r\ninterface IRolesCmb {\r\n value: string;\r\n setValue: (value: string) => void;\r\n id: string;\r\n}\r\n\r\nconst RolesCmb = ({ value, setValue, id }: IRolesCmb) => {\r\n return (\r\n <SelectListWrapper\r\n valueField=\"id\"\r\n labelField=\"text\"\r\n placeholder=\"Specify Role\"\r\n items={ROLES.GET_LIST()}\r\n value={value}\r\n onValueChange={(value) => {\r\n setValue(value);\r\n }}\r\n triggerClassName=\"w-[180px]\"\r\n id={id}\r\n />\r\n );\r\n};\r\n\r\nexport default RolesCmb;\r\n","import DataTable from '@/components/custom/DataTable/DataTable';\r\nimport DialogWrapper from '@/components/custom/DialogWrapper';\r\nimport InfoButton from '@/components/custom/InfoButton';\r\nimport FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport { TypographyP } from '@/components/custom/Typography/TypographyP';\r\nimport { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Label } from '@/components/ui/label';\r\nimport { Textarea } from '@/components/ui/textarea';\r\nimport useAlertDialog from '@/hooks/useAlertDialog';\r\nimport { appInfo } from '@/config/app-config';\r\nimport { ROLES } from '@/lib/enums';\r\nimport { showErrorToast, showSuccessToast, showWarningToast } from '@/lib/toast-helper';\r\nimport type { EmailProcessingResult, TeamMembersDetails } from '@/lib/types';\r\nimport { isEmailValid, processEmailsWithValidation, INVITATION_ENUMS } from '@/lib/utils';\r\nimport AppContext from '@/store/AppContext';\r\nimport { Files, Pencil, Plus, Trash } from 'lucide-react';\r\nimport { useContext, useEffect, useState } from 'react';\r\nimport RolesCmb from './RolesCmb';\r\n\r\ninterface IncludedUsersProps {\r\n teamMembers: TeamMembersDetails[];\r\n setTeamMembers: (teamMembers: TeamMembersDetails[]) => void;\r\n inactiveUsers: TeamMembersDetails[];\r\n}\r\n\r\nconst canAllowEmailEdit = (record: TeamMembersDetails | undefined, editingRowId: string | number | undefined) => {\r\n return (\r\n editingRowId === -1 ||\r\n // record?.user_opinion === INVITATION_ENUMS.INVITED ||\r\n record?.user_opinion === INVITATION_ENUMS.NOT_SAVED\r\n );\r\n};\r\n\r\nconst IncludedUsers = ({ teamMembers, setTeamMembers, inactiveUsers }: IncludedUsersProps) => {\r\n const [processedEmailsTextArea, setProcessedEmailsTextArea] = useState<EmailProcessingResult>();\r\n const [bulkRole, setBulkRole] = useState(NaN);\r\n\r\n const dlg = useAlertDialog();\r\n\r\n const [editingRowId, setEditingRowId] = useState<string | number | undefined>();\r\n const [isBulkWindowOpen, setIsBulkWindowOpen] = useState<boolean>(false);\r\n const [singleRecFields, setSingleRecFields] = useState<TeamMembersDetails>({\r\n email: '',\r\n role_id: ROLES.READ,\r\n user_opinion: INVITATION_ENUMS.INVITED,\r\n id: '',\r\n });\r\n const { loggedInUser } = useContext(AppContext);\r\n\r\n const addUniqueTeamMembers = (tMembers: TeamMembersDetails[]) => {\r\n const uniqueEmails: { [key: string]: number } = {};\r\n\r\n const newTeamMembers = [...(teamMembers ?? []), ...tMembers];\r\n newTeamMembers.forEach((tMemberRec) => {\r\n const emailKey = tMemberRec.email as string;\r\n\r\n uniqueEmails[emailKey] = uniqueEmails[emailKey] ? uniqueEmails[emailKey]++ : 1;\r\n });\r\n\r\n const result = newTeamMembers.filter((rec) => {\r\n uniqueEmails[rec.email]--;\r\n return uniqueEmails[rec.email] === 0;\r\n });\r\n\r\n setTeamMembers(result);\r\n\r\n return newTeamMembers.length === result.length;\r\n };\r\n\r\n const addBulkEmails = () => {\r\n const { validEmails } = processedEmailsTextArea || {};\r\n\r\n if (!validEmails?.length || validEmails?.length <= 0)\r\n return showWarningToast({\r\n description: 'Please add comma separated emails, then press Continue button',\r\n });\r\n\r\n const data = validEmails.map((email: string) => ({\r\n email,\r\n role_id: bulkRole,\r\n id: email,\r\n user_opinion: INVITATION_ENUMS.INVITED,\r\n }));\r\n\r\n addUniqueTeamMembers(data);\r\n setProcessedEmailsTextArea(undefined);\r\n setIsBulkWindowOpen(false);\r\n\r\n showSuccessToast({\r\n description: `${validEmails?.length} emails has been added.`,\r\n });\r\n };\r\n\r\n const validateFields = (rec: TeamMembersDetails) => {\r\n if (!rec || !rec.email || isEmailValid(rec.email) === false) {\r\n showErrorToast({\r\n description: `Invalid email, please enter correct email and try again.`,\r\n });\r\n return false;\r\n }\r\n\r\n if (!ROLES.IS_VALID_ROLE_ID(rec.role_id)) {\r\n showErrorToast({\r\n description: `Invalid role selected. Please select a valid role and try again.`,\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const addNewTeamMember = () => {\r\n if (!validateFields(singleRecFields)) {\r\n return;\r\n }\r\n\r\n const isAdded = addUniqueTeamMembers([\r\n {\r\n ...singleRecFields,\r\n id: singleRecFields.email,\r\n user_opinion: INVITATION_ENUMS.NOT_SAVED,\r\n },\r\n ]);\r\n\r\n if (!isAdded) {\r\n showErrorToast({\r\n description: `This email is already exists in list: ${singleRecFields.email}`,\r\n });\r\n return;\r\n }\r\n\r\n setEditingRowId(undefined);\r\n };\r\n\r\n const updateTeamMember = () => {\r\n if (!validateFields(singleRecFields)) {\r\n return;\r\n }\r\n\r\n const recordWithSameEmail = teamMembers?.find((teamMemberRec) => {\r\n return teamMemberRec.email === singleRecFields.email && teamMemberRec.id !== editingRowId;\r\n });\r\n\r\n if (recordWithSameEmail) {\r\n showWarningToast({\r\n description: `This email is already exists in list: ${singleRecFields.email}`,\r\n });\r\n return;\r\n }\r\n\r\n const newTeamMembers = [...(teamMembers || [])];\r\n const record = newTeamMembers.find((teamMemberRec) => teamMemberRec.id === editingRowId);\r\n\r\n if (!record) {\r\n showErrorToast({ description: 'Record not found to update, something went wrong!' });\r\n return;\r\n }\r\n\r\n record.email = singleRecFields.email;\r\n record.role_id = singleRecFields.role_id;\r\n\r\n setTeamMembers(newTeamMembers);\r\n setEditingRowId(undefined);\r\n };\r\n\r\n useEffect(() => {\r\n if (!editingRowId) {\r\n setSingleRecFields({\r\n email: '',\r\n role_id: NaN,\r\n user_opinion: INVITATION_ENUMS.INVITED,\r\n id: '',\r\n });\r\n return;\r\n }\r\n\r\n if (editingRowId === -1) return;\r\n\r\n const rec = teamMembers?.find((teamMemberRec) => teamMemberRec.id === editingRowId);\r\n if (!rec) {\r\n showErrorToast({ description: 'Something went wrong, please reload and try again.' });\r\n return;\r\n }\r\n\r\n setSingleRecFields({\r\n email: rec.email,\r\n role_id: rec.role_id,\r\n user_opinion: rec.user_opinion,\r\n id: rec.id || rec.email,\r\n });\r\n }, [editingRowId]);\r\n\r\n return (\r\n <FlexColsLayout layout=\"vertical\" className=\"gap-2\">\r\n {isBulkWindowOpen && (\r\n <DialogWrapper\r\n open={true}\r\n setIsOpen={setIsBulkWindowOpen}\r\n header=\"Bulk Add Users\"\r\n actionsJSX={<Button onClick={addBulkEmails}>Add users</Button>}\r\n >\r\n <FlexColsLayout layout=\"horizontal\" className=\"gap-2\">\r\n <Textarea\r\n id=\"includeUsers\"\r\n placeholder=\"Enter comma separated emailIds like mail1@temp.com, mail2@temp.com\"\r\n className=\"w-full min-h-[80px] max-h-[500px] mr-1\"\r\n onChange={(e) => setProcessedEmailsTextArea(processEmailsWithValidation(e.target.value))}\r\n />\r\n <span>\r\n <InfoButton side=\"right\">Enter comma separated emailIds like mail1@temp.com, mail2@temp.com</InfoButton>\r\n </span>\r\n </FlexColsLayout>\r\n <span className=\"mb-5\">\r\n <span className=\"text-success\">Valid Emails: {processedEmailsTextArea?.validEmails.length || 0}</span>,{' '}\r\n <span className=\"text-failure\">Invalid Emails: {processedEmailsTextArea?.invalidEmails.length || 0}</span>\r\n </span>\r\n\r\n <div className=\"flex flex-row gap-2\">\r\n {/* <Input\r\n type=\"checkbox\"\r\n id=\"areAdmins\"\r\n className=\"w-4\"\r\n checked={areAdmins}\r\n onChange={(e) => setAreAdmins(e.target.checked)}\r\n /> */}\r\n <Label htmlFor=\"roles\">Role *</Label>\r\n <RolesCmb\r\n id=\"bulk-roles\"\r\n value={bulkRole?.toString() || ''}\r\n setValue={(newVal) => {\r\n setBulkRole(Number(newVal));\r\n }}\r\n />\r\n </div>\r\n </DialogWrapper>\r\n )}\r\n {editingRowId && (\r\n <DialogWrapper\r\n open={true}\r\n setIsOpen={(val) => {\r\n setEditingRowId(val === false ? undefined : editingRowId);\r\n }}\r\n header={editingRowId === -1 ? 'Add User' : 'Edit User'}\r\n actionsJSX={\r\n <Button type=\"button\" onClick={editingRowId === -1 ? addNewTeamMember : updateTeamMember}>\r\n Update\r\n </Button>\r\n }\r\n >\r\n <div className=\"flex flex-col p-5 gap-5\">\r\n <div className=\"flex flex-col gap-2\">\r\n <Label htmlFor=\"email\">Email *</Label>\r\n <Input\r\n id=\"email\"\r\n type=\"email\"\r\n placeholder=\"mail@example.com\"\r\n value={singleRecFields.email}\r\n disabled={canAllowEmailEdit(singleRecFields, editingRowId) === false}\r\n onChange={(e) =>\r\n setSingleRecFields((prev) => ({\r\n ...prev,\r\n email: e.target.value,\r\n }))\r\n }\r\n />\r\n </div>\r\n <div className=\"flex flex-col gap-2 \">\r\n {/* <Input\r\n type=\"checkbox\"\r\n id=\"isAdmin\"\r\n className=\"w-4\"\r\n checked={singleRecFields.isAdmin}\r\n onChange={(e) =>\r\n setSingleRecFields((prev) => ({\r\n ...prev,\r\n isAdmin: e.target.checked,\r\n }))\r\n }\r\n /> */}\r\n <Label htmlFor=\"roles\">Role *</Label>\r\n <RolesCmb\r\n id=\"roles\"\r\n value={singleRecFields.role_id?.toString() || ''}\r\n setValue={(newVal) => {\r\n setSingleRecFields((prev) => ({\r\n ...prev,\r\n role_id: Number(newVal),\r\n }));\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </DialogWrapper>\r\n )}\r\n <DataTable\r\n canShowToolbar={true}\r\n canShowPagination={false}\r\n data={teamMembers || []}\r\n toolbarConfig={{\r\n canShowSearchField: false,\r\n canShowColumnsBtn: false,\r\n additionalJSX: [\r\n <Button\r\n variant=\"secondary\"\r\n type=\"button\"\r\n onClick={() => {\r\n // const newNode = {\r\n // email: '',\r\n // isAdmin: false,\r\n // id: generateRandom4Digits().toString(),\r\n // };\r\n // setTeamMembers((prev) => [...(prev ?? []), newNode]);\r\n setEditingRowId(-1);\r\n }}\r\n >\r\n <Plus /> Add User\r\n </Button>,\r\n\r\n <Button\r\n variant=\"outline\"\r\n type=\"button\"\r\n onClick={() => {\r\n setIsBulkWindowOpen(true);\r\n }}\r\n >\r\n <Files /> Bulk Add\r\n </Button>,\r\n ],\r\n }}\r\n columns={[\r\n {\r\n id: 'email',\r\n headerText: 'Email',\r\n enableSorting: false,\r\n enableHiding: false,\r\n editable: true,\r\n },\r\n {\r\n id: 'role_id',\r\n headerText: 'Role',\r\n enableSorting: false,\r\n enableHiding: false,\r\n editable: true,\r\n type: 'string',\r\n renderer(_, cellValue) {\r\n return ROLES.DISPLAY_TEXT(cellValue as number);\r\n },\r\n },\r\n {\r\n id: 'user_opinion',\r\n headerText: 'Status',\r\n enableSorting: false,\r\n enableHiding: false,\r\n type: 'boolean',\r\n editable: false,\r\n renderer(record: any) {\r\n const { user_opinion } = record.original;\r\n return INVITATION_ENUMS.getDisplay(user_opinion);\r\n },\r\n },\r\n {\r\n id: 'joinedOn',\r\n headerText: 'Joined On',\r\n enableSorting: false,\r\n enableHiding: false,\r\n type: 'date',\r\n editable: true,\r\n },\r\n {\r\n id: 'actions',\r\n headerText: 'Actions',\r\n enableSorting: false,\r\n enableHiding: false,\r\n renderer(record: any) {\r\n const { id: rowId } = record?.original;\r\n return (\r\n <>\r\n <Button\r\n variant={'ghost'}\r\n onClick={() => {\r\n const record = teamMembers?.find((record) => record.id === rowId);\r\n const fullName = record?.fname || record?.lname ? `${record?.fname} ${record?.lname}` : record?.email;\r\n\r\n if (record?.email === loggedInUser?.email) {\r\n showWarningToast({\r\n header: `Not allowed to edit \"${fullName}\"`,\r\n description: `If you want to leave this ${appInfo.account_type_txt.singular.toLocaleLowerCase()}, go to \"Manage ${\r\n appInfo.account_type_txt.singular\r\n },\" open the actions menu (three dots), and click \"Leave ${appInfo.account_type_txt.singular}.\"`,\r\n });\r\n return;\r\n }\r\n\r\n if (canAllowEmailEdit(record, undefined) === false) {\r\n //showing just waring here..\r\n showWarningToast({\r\n header: `Not allowed to edit email \"${fullName}\", however you can update its administrative privileges.`,\r\n description: `The invitation has been already sent. If you do not want this user as a team member, you can delete them and correct one.`,\r\n });\r\n // return;\r\n }\r\n\r\n setEditingRowId(rowId);\r\n }}\r\n type=\"button\"\r\n >\r\n <Pencil />\r\n </Button>\r\n\r\n <Button\r\n variant={'ghost'}\r\n onClick={() => {\r\n const record = teamMembers?.find((record) => record.id === rowId);\r\n const fullName = record?.fname || record?.lname ? `${record?.fname} ${record?.lname}` : record?.email;\r\n\r\n if (record?.email === loggedInUser?.email) {\r\n showWarningToast({\r\n header: `Not allowed to remove \"${fullName}\"`,\r\n description: `If you want to leave this ${appInfo.account_type_txt.singular}, go to \"Manage ${appInfo.account_type_txt.singular},\" open the actions menu (three dots), and click \"Leave ${appInfo.account_type_txt.singular}.\"`,\r\n });\r\n return;\r\n }\r\n\r\n dlg.showAlertBox({\r\n type: 'CONFIRM',\r\n text: `Are you sure you want to remove \"${fullName}\" user?`,\r\n async onClose(result) {\r\n if (result !== 'CONFIRM') {\r\n return;\r\n }\r\n\r\n setTeamMembers(teamMembers?.filter((record) => record.id !== rowId));\r\n },\r\n });\r\n }}\r\n type=\"button\"\r\n >\r\n <Trash />\r\n </Button>\r\n </>\r\n );\r\n },\r\n },\r\n ]}\r\n />\r\n {inactiveUsers.length > 0 && (\r\n <>\r\n <TypographyP className={'mt-5 leading-normal font-semibold'}>Following users are inactive/deleted.</TypographyP>\r\n <ol>\r\n {inactiveUsers.map((user, index) => (\r\n <li key={user.email}>\r\n {index + 1}.&nbsp;\r\n {user.email}&nbsp;\r\n {ROLES.DISPLAY_TEXT(user.role_id)}\r\n </li>\r\n ))}\r\n </ol>\r\n </>\r\n )}\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default IncludedUsers;\r\n","import FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport TabularLayout from '@/components/custom/Layouts/TabularLayout';\r\nimport { TypographyHeading } from '@/components/custom/Typography/TypographyHeading';\r\nimport { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { getFormDataByFormEl, isObjectEmpty, isTruthyValue, isValidId, undoPublicId } from '@/lib/utils';\r\nimport AppContext from '@/store/AppContext';\r\nimport { Label } from '@radix-ui/react-label';\r\nimport { useContext, useEffect, useRef, useState } from 'react';\r\nimport { useNavigate, useParams } from 'react-router';\r\nimport IncludedUsers from './components/IncludedUsers';\r\nimport type { OrganizationType, OrganizationTypeResponse, responseTeamMembersInf, TeamMembersDetails } from '@/lib/types';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showErrorToast, showSuccessToast } from '@/lib/toast-helper';\r\nimport { APP_INFO_ACCOUNT_TYPE, appInfo } from '@/config/app-config';\r\nimport { ROLES } from '@/lib/enums';\r\nimport { TypographyP } from '@/components/custom/Typography/TypographyP';\r\nimport { Trash } from 'lucide-react';\r\nimport useOrgHelper from './hooks/useOrgHelper';\r\nimport { Separator } from '@/components/ui/separator';\r\nimport PremiumIcon from '../Subscriptions/components/PremiumIcon';\r\n\r\nconst CreateOrg = () => {\r\n const navigate = useNavigate();\r\n\r\n const { orgId = '' } = useParams();\r\n const [id, setId] = useState<number>(() => {\r\n return orgId ? undoPublicId(parseInt(orgId, 10)) : -1;\r\n });\r\n\r\n const [canShowTeamMembers, setCanShowTeamMembers] = useState(false);\r\n const [teamMembers, setTeamMembers] = useState<TeamMembersDetails[]>([]);\r\n const [unregisteredUsers, setUnregisteredUsers] = useState<Partial<TeamMembersDetails>[]>([]);\r\n const [inactiveUsers, setInactiveUsers] = useState<TeamMembersDetails[]>([]);\r\n const [areTeamMembersLoading, setAreTeamMembersLoading] = useState<boolean | string>(false);\r\n const initializedTeamMembers = useRef<TeamMembersDetails[]>([]);\r\n const [unregisteredUserLoading, setUnregisteredUsersLoading] = useState<boolean>();\r\n\r\n const { orgs, setOrgs, loggedInUser } = useContext(AppContext);\r\n const orgRecord = id > -1 ? orgs.find((rec) => rec.org_id === id) : null;\r\n const isEditMode = id > -1 || orgRecord;\r\n\r\n const { handleOnDeleteUnregisteredUser } = useOrgHelper();\r\n\r\n useEffect(() => {\r\n if (!isEditMode) return;\r\n\r\n const convertServerToLocalFields = (members: responseTeamMembersInf[]) => {\r\n return members.map((rec) => ({\r\n id: rec.user_id,\r\n email: rec.user_email,\r\n role_id: rec.role_id,\r\n user_opinion: rec.user_opinion,\r\n fname: rec.user_fname,\r\n lname: rec.user_lname,\r\n joinedOn: rec.joined_on,\r\n }));\r\n };\r\n\r\n const fetchTeamMembers = async () => {\r\n setAreTeamMembersLoading('Fetching Team Members');\r\n try {\r\n const responseTeamMembers: {\r\n orgMembers: responseTeamMembersInf[];\r\n unregisteredUsers: Partial<responseTeamMembersInf>[];\r\n } = await getAxiosInstance().get(`org-member/${id}`);\r\n\r\n const orgMembers = responseTeamMembers.orgMembers.filter((rec) => isTruthyValue(rec.is_active));\r\n\r\n const tMembers: TeamMembersDetails[] = convertServerToLocalFields(orgMembers);\r\n\r\n const unregistered = responseTeamMembers.unregisteredUsers.map((rec) => ({\r\n role_id: rec.role_id,\r\n email: rec.email,\r\n id: rec.invited_users_id,\r\n }));\r\n\r\n const inactiveUsers_deleted = responseTeamMembers.orgMembers.filter((rec) => !isTruthyValue(rec.is_active));\r\n\r\n setTeamMembers(tMembers);\r\n setCanShowTeamMembers(true);\r\n setUnregisteredUsers(unregistered);\r\n setInactiveUsers(convertServerToLocalFields(inactiveUsers_deleted));\r\n initializedTeamMembers.current = structuredClone(tMembers);\r\n } finally {\r\n setAreTeamMembersLoading(false);\r\n }\r\n };\r\n\r\n fetchTeamMembers();\r\n }, [isEditMode, id]);\r\n\r\n const putData = (newRecord: OrganizationType) => {\r\n const reqData: Partial<OrganizationType> = {},\r\n oldData = orgRecord;\r\n\r\n if (newRecord.org_name !== oldData?.org_name && newRecord.org_name) {\r\n reqData.org_name = newRecord.org_name;\r\n }\r\n if (newRecord.org_address !== oldData?.org_address && newRecord.org_address) {\r\n reqData.org_address = newRecord.org_address;\r\n }\r\n if (newRecord.org_state !== oldData?.org_state && newRecord.org_state) {\r\n reqData.org_state = newRecord.org_state;\r\n }\r\n if (newRecord.org_country !== oldData?.org_country && newRecord.org_country) {\r\n reqData.org_country = newRecord.org_country;\r\n }\r\n if (newRecord.org_external_id !== oldData?.org_external_id && newRecord.org_external_id) {\r\n reqData.org_external_id = newRecord.org_external_id;\r\n }\r\n\r\n if (isObjectEmpty(reqData)) {\r\n return;\r\n }\r\n\r\n return getAxiosInstance().put(`/organization/${orgRecord?.org_id}`, reqData);\r\n };\r\n\r\n const postData = async (newRecord: OrganizationType) => {\r\n const reqData = {\r\n org_name: newRecord.org_name,\r\n org_address: newRecord.org_address,\r\n org_state: newRecord.org_state,\r\n org_country: newRecord.org_country,\r\n org_external_id: newRecord.org_external_id,\r\n };\r\n\r\n return getAxiosInstance().post(`/organization`, reqData);\r\n };\r\n\r\n const handleOnSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault();\r\n\r\n setAreTeamMembersLoading('Saving...');\r\n\r\n try {\r\n let orgId = orgRecord?.org_id;\r\n\r\n const data = getFormDataByFormEl(event.currentTarget) as unknown as OrganizationType;\r\n // console.log('old orgData:', orgRecord);\r\n // console.log('new orgData:', data);\r\n if (isEditMode) {\r\n //if error, then below code will not execute.\r\n await putData(data);\r\n } else {\r\n const res = (await postData(data)) as unknown as { insertedOrgId: string };\r\n orgId = parseInt(res.insertedOrgId, 10);\r\n\r\n if (isValidId(orgId) === false) {\r\n showErrorToast({\r\n description: `No response received from the ${appInfo.account_type_txt.singular.toLocaleLowerCase()} service. Returning to the Manage ${\r\n appInfo.account_type_txt.singular\r\n } page.`,\r\n });\r\n setTimeout(() => {\r\n navigate('/infrastructure/manage-infra');\r\n }, 1000);\r\n }\r\n }\r\n\r\n const handleSuccess = (isTeamMemberAdded: boolean) => {\r\n showSuccessToast({\r\n description: `${appInfo.account_type_txt.singular} has been ${isEditMode ? 'updated' : 'created'} successfully.${\r\n isTeamMemberAdded ? ' Team members have also been updated successfully and sent invitation emails.' : ''\r\n }`,\r\n });\r\n\r\n navigate('/infrastructure/manage-infra');\r\n };\r\n\r\n if (!canShowTeamMembers) return handleSuccess(false);\r\n\r\n try {\r\n const initialValues = initializedTeamMembers.current;\r\n // console.log('original: ', initializedTeamMembers.current);\r\n // console.log('new', teamMembers);\r\n\r\n const needToRemoveTeamMembers = initialValues.filter((rec) => !teamMembers.find((teamMemberRec) => rec.email === teamMemberRec.email));\r\n // console.log('needToRemoveTeamMembers', needToRemoveTeamMembers);\r\n if (needToRemoveTeamMembers && needToRemoveTeamMembers.length > 0) {\r\n const reqParams = {\r\n org_id: orgId,\r\n users: needToRemoveTeamMembers.map((rec) => ({\r\n user_id: rec.id,\r\n // is_admin: rec.isAdmin,\r\n })),\r\n };\r\n\r\n await getAxiosInstance().delete('/org-member', { data: reqParams });\r\n }\r\n\r\n const needToUpdate = teamMembers.filter((rec) => {\r\n const tMemberRec = initialValues.find((teamMemberRec) => rec.id === teamMemberRec.id);\r\n\r\n if (!tMemberRec) return false; //here means, this record might be deleted.\r\n if (tMemberRec.role_id === rec.role_id) return false; //nothing has changed.\r\n\r\n return true;\r\n });\r\n\r\n // console.log('needToUpdate', needToUpdate);\r\n if (needToUpdate && needToUpdate.length > 0) {\r\n const reqParams = {\r\n org_id: orgId,\r\n users: needToUpdate.map((rec) => ({\r\n user_id: rec.id,\r\n role_id: rec.role_id,\r\n })),\r\n };\r\n\r\n await getAxiosInstance().put('/org-member', reqParams);\r\n }\r\n\r\n const needToNewAddTeamMembers = teamMembers.filter((teamMemberRec) => !initialValues.find((rec) => rec.email === teamMemberRec.email));\r\n if (needToNewAddTeamMembers && needToNewAddTeamMembers.length > 0) {\r\n const reqParams = {\r\n org_id: orgId,\r\n included_users: needToNewAddTeamMembers.map((rec) => ({\r\n email: rec.email,\r\n role_id: rec.role_id,\r\n })),\r\n };\r\n\r\n await getAxiosInstance().post('/org-member/by-emails', reqParams);\r\n }\r\n // console.log('needToNewAddTeamMembers', needToNewAddTeamMembers);\r\n\r\n handleSuccess(true);\r\n } finally {\r\n setId(orgId || -1);\r\n }\r\n } finally {\r\n setAreTeamMembersLoading(false);\r\n const orgsRes = (await getAxiosInstance().get('organization')) as OrganizationTypeResponse;\r\n setOrgs(orgsRes?.orgs || []);\r\n }\r\n };\r\n\r\n const defaultOrgName = isEditMode\r\n ? orgRecord?.org_name\r\n : `${loggedInUser?.fname}'s ${appInfo.account_type_txt.singular} ${orgs.length >= 1 ? orgs.length + 1 : ''}`;\r\n\r\n return (\r\n <FlexColsLayout className=\"pb-5 sm:px-0 px-5 pt-5\">\r\n <FlexColsLayout layout=\"horizontal\">\r\n <span className=\"md:flex-1 flex-none\"></span>\r\n <FlexColsLayout className=\"flex-4 max-w-4xl pr-5 sm:pl-0 pl-2 overflow-visible\">\r\n <TypographyHeading className=\"text-center pl-5 gap-1\">\r\n <span className=\"inline-flex items-center gap-2\">\r\n {isEditMode\r\n ? `Editing \"${orgRecord?.org_name}\" ${appInfo.account_type_txt.singular}`\r\n : `Create new ${appInfo.account_type_txt.singular}`}\r\n {isEditMode && orgRecord?.active_purchased_plan ? <PremiumIcon purchasedPlan={orgRecord?.active_purchased_plan} /> : null}\r\n </span>\r\n </TypographyHeading>\r\n\r\n <form onSubmit={handleOnSubmit}>\r\n <TabularLayout\r\n className=\"w-full pr-1 mt-2 text-sm\"\r\n leftCls=\"w-32 sm:w-36 md:w-40 w-full sm:w-40 text-left sm:text-right pr-0 sm:pr-2 pt-3 sm:pt-7\"\r\n rightCls=\"pt-1 sm:pt-5\"\r\n rowCls=\"flex-col sm:flex-row\"\r\n child={[\r\n <Label htmlFor=\"orgName\" className=\"font-medium\">\r\n {appInfo.account_type_txt.singular} Name * :\r\n </Label>,\r\n <Input\r\n id=\"orgName\"\r\n name=\"org_name\"\r\n type=\"text\"\r\n required\r\n className=\"w-full\"\r\n defaultValue={orgRecord?.org_name ?? defaultOrgName}\r\n autoFocus\r\n />,\r\n\r\n ...(appInfo.account_type_txt.value === APP_INFO_ACCOUNT_TYPE.ORG\r\n ? [\r\n <Label htmlFor=\"address\" className=\"font-medium\">\r\n Address * :\r\n </Label>,\r\n <Input id=\"address\" name=\"org_address\" type=\"text\" required className=\"w-full\" defaultValue={orgRecord?.org_address ?? ''} />,\r\n\r\n <Label htmlFor=\"state\" className=\"font-medium\">\r\n State * :\r\n </Label>,\r\n <Input id=\"state\" name=\"org_state\" type=\"text\" required className=\"w-full\" defaultValue={orgRecord?.org_state ?? ''} />,\r\n <Label htmlFor=\"country\" className=\"font-medium\">\r\n Country * :\r\n </Label>,\r\n <Input id=\"country\" name=\"org_country\" type=\"text\" required className=\"w-full\" defaultValue={orgRecord?.org_country ?? ''} />,\r\n ]\r\n : []),\r\n\r\n <Label htmlFor=\"org_external_id\" className=\"font-medium\">\r\n External Id (optional) :\r\n </Label>,\r\n <Input id=\"org_external_id\" name=\"org_external_id\" type=\"text\" className=\"w-full\" defaultValue={orgRecord?.org_external_id ?? ''} />,\r\n\r\n <></>,\r\n <FlexColsLayout layout=\"horizontal\">\r\n <Input\r\n id=\"doIncludeUsers\"\r\n type=\"checkbox\"\r\n className=\"w-4\"\r\n checked={canShowTeamMembers}\r\n onChange={(e) => setCanShowTeamMembers(e.target.checked)}\r\n />\r\n <Label htmlFor=\"doIncludeUsers\" className=\"font-medium mt-2 ml-1\">\r\n Would you like to invite your team-members in this {appInfo.account_type_txt.singular}?\r\n </Label>\r\n </FlexColsLayout>,\r\n ...(canShowTeamMembers\r\n ? [\r\n <Label htmlFor=\"includeUsers\" className=\"font-medium\">\r\n Team Members:\r\n </Label>,\r\n\r\n <IncludedUsers teamMembers={teamMembers} setTeamMembers={setTeamMembers} inactiveUsers={inactiveUsers} />,\r\n ]\r\n : []),\r\n\r\n <></>,\r\n <div className=\"flex gap-2 pt-2\">\r\n <Button type=\"submit\" className=\"flex-1 sm:flex-none\" loading={!!areTeamMembersLoading}>\r\n {areTeamMembersLoading ? areTeamMembersLoading : 'Save'}\r\n </Button>\r\n <Button type=\"button\" variant=\"outline\" className=\"flex-1 sm:flex-none\" onClick={() => navigate(-1)}>\r\n Cancel\r\n </Button>\r\n {/* <Button type=\"reset\" variant=\"outline\" className=\"flex-1 sm:flex-none\">\r\n Reset\r\n </Button> */}\r\n </div>,\r\n <></>,\r\n <></>,\r\n\r\n <></>,\r\n <>{unregisteredUsers.length > 0 && <Separator />}</>,\r\n\r\n <>{unregisteredUsers.length > 0 && 'Unregistered Users:'}</>,\r\n <>\r\n {unregisteredUsers.length > 0 && (\r\n <FlexColsLayout loading={unregisteredUserLoading}>\r\n <TypographyP className={'mt-2 leading-normal font-semibold'}>\r\n Following users are unregistered. We have sent them invitation emails; once they accept, they will be part of this{' '}\r\n {appInfo.account_type_txt.singular.toLocaleLowerCase()}.\r\n </TypographyP>\r\n <ol>\r\n {unregisteredUsers.map((user, index) => (\r\n <li key={user.email} className=\"mt-1\">\r\n <span className=\"inline-flex group\">\r\n <span>\r\n {index + 1}.&nbsp;\r\n {user.email}, (role: &nbsp;\r\n {ROLES.DISPLAY_TEXT(user.role_id as number)})\r\n </span>\r\n {/* <span title=\"Edit\">\r\n <Pencil\r\n size={'15px'}\r\n className=\"opacity-40 group-hover:opacity-60 hover:opacity-100 ml-1 mt-0.5 cursor-pointer\"\r\n onClick={() => console.log('123')}\r\n />\r\n </span> */}\r\n <span title=\"Delete\">\r\n <Trash\r\n size={'15px'}\r\n className=\"opacity-40 group-hover:opacity-60 hover:opacity-100 ml-1 mt-0.5 cursor-pointer\"\r\n onClick={async () => {\r\n try {\r\n setUnregisteredUsersLoading(true);\r\n await handleOnDeleteUnregisteredUser(user, id);\r\n\r\n const copyUsers = [...unregisteredUsers];\r\n copyUsers.splice(index, 1);\r\n setUnregisteredUsers(copyUsers);\r\n } finally {\r\n setUnregisteredUsersLoading(false);\r\n }\r\n }}\r\n />\r\n </span>\r\n </span>\r\n </li>\r\n ))}\r\n </ol>\r\n </FlexColsLayout>\r\n )}\r\n </>,\r\n ]}\r\n />\r\n </form>\r\n </FlexColsLayout>\r\n <span className=\"md:flex-1 flex-none\"></span>\r\n </FlexColsLayout>\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default CreateOrg;\r\n","import FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport TabularLayout from '@/components/custom/Layouts/TabularLayout';\r\nimport LinkWrapper from '@/components/custom/LinkWrapper';\r\nimport LoadingCmp from '@/components/custom/LoadingCmp';\r\nimport { TypographyP } from '@/components/custom/Typography/TypographyP';\r\nimport { Button } from '@/components/ui/button';\r\nimport { Label } from '@/components/ui/label';\r\nimport useAlertDialog from '@/hooks/useAlertDialog';\r\nimport useFetchData from '@/hooks/useFetchData';\r\nimport { appInfo } from '@/config/app-config';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showSuccessToast } from '@/lib/toast-helper';\r\nimport type { IEachInvitation, IInvitationsResponse, OrganizationTypeResponse } from '@/lib/types';\r\nimport { formatISODateWithTime24H, isTruthyValue, INVITATION_ENUMS } from '@/lib/utils';\r\nimport AppContext from '@/store/AppContext';\r\nimport { Check, X } from 'lucide-react';\r\nimport { useContext, useState } from 'react';\r\n\r\nconst JoinOrg = () => {\r\n const { loading: fetchingInvitations, response: invitationsResponse } = useFetchData<IInvitationsResponse>('/invitation');\r\n\r\n const dlg = useAlertDialog();\r\n\r\n const invitations = invitationsResponse?.invites.filter((rec) => rec.user_opinion !== INVITATION_ENUMS.ACCEPTED);\r\n\r\n const [isSaving, setIsSaving] = useState(-1);\r\n\r\n const { setOrgs } = useContext(AppContext);\r\n\r\n const respondToInvitation = async (selectedOption: (typeof INVITATION_ENUMS)[keyof typeof INVITATION_ENUMS], org: IEachInvitation) => {\r\n if (!org) return;\r\n try {\r\n const orgId = parseInt(org.org_id, 10);\r\n setIsSaving(orgId);\r\n\r\n const reqJson = {\r\n org_id: orgId,\r\n user_opinion: selectedOption,\r\n };\r\n\r\n await getAxiosInstance().put('/invitation', reqJson);\r\n\r\n const orgsRes = (await getAxiosInstance().get('organization')) as OrganizationTypeResponse;\r\n setOrgs(orgsRes?.orgs || []);\r\n\r\n //locally setting this flag, to filter out the invitations\r\n org.user_opinion = INVITATION_ENUMS.ACCEPTED;\r\n\r\n showSuccessToast({\r\n description: `Invitation for ${org.org_name} ${appInfo.account_type_txt.singular} has been ${\r\n selectedOption === INVITATION_ENUMS.ACCEPTED ? 'accepted' : 'rejected'\r\n } successfully.`,\r\n });\r\n } finally {\r\n setIsSaving(-1);\r\n }\r\n };\r\n\r\n const contentJSX = () => {\r\n if (fetchingInvitations) {\r\n return (\r\n <span>\r\n <FlexColsLayout layout=\"horizontal\" className=\"text-center mt-5 justify-center items-center\">\r\n <LoadingCmp />\r\n </FlexColsLayout>\r\n </span>\r\n );\r\n }\r\n\r\n if (!invitations || invitations.length <= 0) {\r\n return (\r\n <TypographyP className=\"text-center mt-5\">\r\n You don't have any invitations from any {appInfo.account_type_txt.singular.toLocaleLowerCase()}.\r\n </TypographyP>\r\n );\r\n }\r\n\r\n const rows = invitations\r\n .filter((rec) => isTruthyValue(rec.org_user_is_active))\r\n .map((rec) => [\r\n <Label className=\"font-normal\">\r\n <span className=\"font-semibold\">{rec.org_name},</span>sent on &nbsp;\r\n {formatISODateWithTime24H(rec.sent_at)}\r\n </Label>,\r\n <FlexColsLayout className=\"gap-1 justify-end pr-3\" layout=\"horizontal\">\r\n <Button\r\n onClick={() => respondToInvitation(INVITATION_ENUMS.ACCEPTED, rec)}\r\n loading={isSaving === parseInt(rec.org_id, 10)}\r\n disabled={isSaving !== -1}\r\n className=\"bg-green-500 hover:bg-green-600\"\r\n >\r\n <Check /> Accept\r\n </Button>\r\n <Button\r\n variant={'destructive'}\r\n loading={isSaving === parseInt(rec.org_id, 10)}\r\n disabled={isSaving !== -1}\r\n onClick={() => {\r\n dlg.showAlertBox({\r\n type: 'CONFIRM',\r\n text: `Are you sure you want to reject this ${appInfo.account_type_txt.singular.toLocaleLowerCase()} request? You can't re-join until an administrator invites you again.`,\r\n async onClose(result) {\r\n if (result !== 'CONFIRM') {\r\n return;\r\n }\r\n\r\n respondToInvitation(INVITATION_ENUMS.REJECTED, rec);\r\n },\r\n });\r\n }}\r\n >\r\n <X /> Reject\r\n </Button>\r\n </FlexColsLayout>,\r\n ]);\r\n\r\n return (\r\n <TabularLayout\r\n className=\"w-full mt-5 text-sm border-b-1\"\r\n leftCls=\"w-full sm:w-100 text-left sm:text-right pt-3\"\r\n rightCls=\"sm:pt-0 pt-2\"\r\n rowCls=\"flex-col sm:flex-row border-t-1 p-2 hover:bg-muted\"\r\n child={rows.flat()}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <FlexColsLayout layout=\"horizontal\">\r\n <span className=\"md:flex-1 flex-none\"></span>\r\n <FlexColsLayout className=\"flex-4 max-w-4xl mt-5\">\r\n {/* <TypographyHeading className=\"text-center pl-4\">Invitations</TypographyHeading> */}\r\n <FlexColsLayout>\r\n {contentJSX()}\r\n <span className=\"mt-5 text-center\">\r\n <Button className=\"mt-5\" variant={'link'}>\r\n <LinkWrapper to={'/infrastructure/manage-infra'}>View all {appInfo.account_type_txt.plural.toLocaleLowerCase()}</LinkWrapper>\r\n </Button>\r\n </span>\r\n </FlexColsLayout>\r\n </FlexColsLayout>\r\n <span className=\"md:flex-1 flex-none\"></span>\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default JoinOrg;\r\n","import { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Separator } from \"@/components/ui/separator\"\n\nconst buttonGroupVariants = cva(\n \"flex w-fit items-stretch [&>*]:focus-visible:z-10 [&>*]:focus-visible:relative [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md has-[>[data-slot=button-group]]:gap-2\",\n {\n variants: {\n orientation: {\n horizontal:\n \"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none\",\n vertical:\n \"flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n }\n)\n\nfunction ButtonGroup({\n className,\n orientation,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof buttonGroupVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"button-group\"\n data-orientation={orientation}\n className={cn(buttonGroupVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupText({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot : \"div\"\n\n return (\n <Comp\n className={cn(\n \"bg-muted flex items-center gap-2 rounded-md border px-4 text-sm font-medium shadow-xs [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"button-group-separator\"\n orientation={orientation}\n className={cn(\n \"bg-input relative !m-0 self-stretch data-[orientation=vertical]:h-auto\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n ButtonGroup,\n ButtonGroupSeparator,\n ButtonGroupText,\n buttonGroupVariants,\n}\n","import FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport { Button } from '@/components/ui/button';\r\nimport { ButtonGroup } from '@/components/ui/button-group';\r\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';\r\nimport { useIsMobile } from '@/hooks/useIsMobile';\r\nimport { appInfo } from '@/config/app-config';\r\nimport AppContext from '@/store/AppContext';\r\nimport { ArrowLeft, LogOut, Menu, X } from 'lucide-react';\r\nimport { useContext } from 'react';\r\nimport { NavLink, Outlet, useLocation, useNavigate } from 'react-router';\r\n\r\nconst OrgRootLayout = () => {\r\n const { orgs, featureFlags } = useContext(AppContext);\r\n const forceOrgJoin = featureFlags.ff_enable_teams && orgs.length === 0;\r\n const location = useLocation();\r\n const navigate = useNavigate();\r\n const isMobile = useIsMobile();\r\n\r\n const canShowBackBtn = () => {\r\n if (location.pathname === '/infrastructure') return false;\r\n return true;\r\n };\r\n\r\n const navItems = [\r\n ...(featureFlags.ff_enable_teams\r\n ? [\r\n {\r\n title: appInfo.account_type_txt.plural,\r\n url: '/infrastructure/manage-infra',\r\n },\r\n {\r\n title: 'Invitations',\r\n url: '/infrastructure/user-invitations',\r\n },\r\n ]\r\n : []),\r\n ...(featureFlags.ff_enable_paid_subscription\r\n ? [\r\n {\r\n title: 'Subscriptions',\r\n url: '/infrastructure/manage-subscription',\r\n },\r\n {\r\n title: 'Payment History',\r\n url: '/infrastructure/payment-history',\r\n },\r\n ]\r\n : []),\r\n ];\r\n\r\n const canShowNavItems = () => {\r\n return navItems.some((item) => item.url === location.pathname);\r\n };\r\n\r\n return (\r\n <FlexColsLayout className=\"h-screen sm:pt-10 pt-5\">\r\n <div className=\"scroll-m-20 text-xl inline-flex gap-2 px-5 pb-5\">\r\n {canShowBackBtn() && (\r\n <Button variant={'ghost'} onClick={() => navigate(-1)}>\r\n <ArrowLeft size={20} /> Back\r\n </Button>\r\n )}\r\n <span className=\"flex-1\"></span>\r\n <div className=\"bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg\">\r\n <appInfo.logo className=\"size-4\" />\r\n </div>\r\n <div className=\"grid text-left leading-tight items-center text-foreground font-semibold tracking-tight\">{appInfo.appName}</div>\r\n <span className=\"flex-1\"></span>\r\n {forceOrgJoin ? (\r\n <NavLink to=\"/login\">\r\n <Button variant={'ghost'}>\r\n <LogOut />\r\n Log out\r\n </Button>\r\n </NavLink>\r\n ) : (\r\n <NavLink to={'/'}>\r\n <Button variant={'ghost'} title=\"close\">\r\n <X size={20} />\r\n </Button>\r\n </NavLink>\r\n )}\r\n </div>\r\n {canShowNavItems() && (\r\n <FlexColsLayout doNotAppendFlex1={true} className=\"mx-auto mb-4\">\r\n {isMobile ? (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <Button variant=\"default\">\r\n <Menu />\r\n Menu\r\n </Button>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent>\r\n {navItems.map((item) => (\r\n <DropdownMenuItem key={item.title} onClick={() => navigate(item.url)}>\r\n {item.title}\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n ) : (\r\n <ButtonGroup>\r\n {navItems.map((item) => (\r\n <Button key={item.title} variant={location.pathname === item.url ? 'default' : 'outline'} onClick={() => navigate(item.url)}>\r\n {item.title}\r\n </Button>\r\n ))}\r\n </ButtonGroup>\r\n )}\r\n </FlexColsLayout>\r\n )}\r\n {/* <Separator /> */}\r\n <Outlet />\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default OrgRootLayout;\r\n","import DataTable from '@/components/custom/DataTable/DataTable';\r\nimport LinkWrapper from '@/components/custom/LinkWrapper';\r\nimport { Button } from '@/components/ui/button';\r\nimport useAlertDialog from '@/hooks/useAlertDialog';\r\nimport { APP_INFO_ACCOUNT_TYPE, appInfo } from '@/config/app-config';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { ROLES } from '@/lib/enums';\r\nimport { showSuccessToast, showWarningToast } from '@/lib/toast-helper';\r\nimport type { OrganizationType, OrganizationTypeResponse, purchasedPlansInf } from '@/lib/types';\r\nimport AppContext from '@/store/AppContext';\r\nimport { Check, Plus, X } from 'lucide-react';\r\nimport { useContext, useState } from 'react';\r\nimport useOrgHelper from './hooks/useOrgHelper';\r\nimport { INVITATION_ENUMS } from '@/lib/utils';\r\nimport FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport PremiumIcon from '../Subscriptions/components/PremiumIcon';\r\nimport { useNavigate } from 'react-router';\r\n\r\nconst ManageOrgs = () => {\r\n const { orgs, setOrgs, featureFlags, loggedInUser, setActiveOrg } = useContext(AppContext);\r\n const dlg = useAlertDialog();\r\n const [loading, setLoading] = useState(false);\r\n const navigate = useNavigate();\r\n const { editOrganization } = useOrgHelper();\r\n\r\n const reloadData = async () => {\r\n setLoading(true);\r\n try {\r\n const orgsRes = (await getAxiosInstance().get('organization')) as OrganizationTypeResponse;\r\n setOrgs(orgsRes?.orgs || []);\r\n } catch {\r\n setOrgs([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n // useEffect(() => {\r\n // reloadData();\r\n // }, []);\r\n\r\n return (\r\n <FlexColsLayout>\r\n <div className=\"flex-1 flex p-5 sm:px-10 px-4 flex-col sm:w-300 m:w-full w-full mx-auto\">\r\n {/* <TypographyHeading className=\"inline-flex mb-4\">\r\n <div className=\"p-1.5 sm:p-2 rounded-lg bg-primary/10 ring-1 ring-primary/20\">\r\n <UsersRound className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\r\n </div>\r\n <span className=\"ml-2\">{appInfo.account_type_txt.plural}</span>\r\n </TypographyHeading> */}\r\n <DataTable\r\n loading={loading}\r\n toolbarConfig={{\r\n canShowSearchField: true,\r\n searchFieldConfig: {\r\n placeholder: `Search by ${appInfo.account_type_txt.singular} Name...`,\r\n searchField: 'org_name',\r\n },\r\n canShowColumnsBtn: true,\r\n additionalJSX: [\r\n <LinkWrapper to={'/infrastructure/create-new-org'}>\r\n <Button variant=\"default\">\r\n <Plus /> Create new {appInfo.account_type_txt.singular}\r\n </Button>\r\n </LinkWrapper>,\r\n ],\r\n refreshBtn: {\r\n canShow: true,\r\n onClick: reloadData,\r\n },\r\n }}\r\n data={orgs}\r\n actions={[\r\n {\r\n id: 'actionId1',\r\n headerText: 'Edit',\r\n onClick: (record) => {\r\n const org = record as OrganizationType;\r\n editOrganization(org);\r\n },\r\n },\r\n {\r\n id: 'actionId2',\r\n headerText: 'Delete',\r\n onClick: (record) => {\r\n const org = record as OrganizationType;\r\n if (!ROLES.Is_ADMIN(org.role_id)) {\r\n showWarningToast({\r\n header: 'Alert',\r\n description: (\r\n <>\r\n You are not allowed to delete the <b>{org.org_name}</b> {appInfo.account_type_txt.singular}.\r\n </>\r\n ),\r\n });\r\n return;\r\n }\r\n dlg.showAlertBox({\r\n type: 'CONFIRM',\r\n text: `Are you sure you want to delete \"${org.org_name}\" ${appInfo.account_type_txt.singular.toLocaleLowerCase()}?`,\r\n async onClose(result) {\r\n if (result !== 'CONFIRM') {\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n try {\r\n const res: any = await getAxiosInstance().delete('organization/' + org.org_id);\r\n showSuccessToast({\r\n header: `${appInfo.account_type_txt.singular} has been deleted successfully.`,\r\n description: res.message,\r\n });\r\n\r\n await reloadData();\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n });\r\n },\r\n },\r\n {\r\n id: 'separate',\r\n headerText: 'SEPARATOR',\r\n },\r\n {\r\n id: 'actionId3',\r\n headerText: `Leave this ${appInfo.account_type_txt.singular.toLocaleLowerCase()}`,\r\n onClick: (record) => {\r\n const org = record as OrganizationType;\r\n // if (record.org_created_by === loggedInUser) {\r\n // }\r\n\r\n dlg.showAlertBox({\r\n type: 'CONFIRM',\r\n text: `Are you sure you want to leave this ${appInfo.account_type_txt.singular.toLocaleLowerCase()}? You can't re-join until an administrator invites you again.`,\r\n async onClose(result) {\r\n if (result !== 'CONFIRM') {\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n try {\r\n const reqJson = {\r\n org_id: org.org_id,\r\n user_opinion: INVITATION_ENUMS.LEFT,\r\n };\r\n await getAxiosInstance().put('invitation', reqJson);\r\n\r\n showSuccessToast({\r\n header: `You have successfully left this ${appInfo.account_type_txt.singular.toLocaleLowerCase()}.`,\r\n description: '',\r\n });\r\n\r\n await reloadData();\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n });\r\n },\r\n },\r\n {\r\n id: 'separate2',\r\n headerText: 'SEPARATOR',\r\n },\r\n {\r\n id: 'actionId4',\r\n headerText: 'Impersonate',\r\n onClick: (record) => {\r\n const org = record as OrganizationType;\r\n setActiveOrg(org);\r\n navigate('/');\r\n },\r\n },\r\n ]}\r\n columns={[\r\n ...(featureFlags.ff_enable_paid_subscription === false\r\n ? []\r\n : [\r\n {\r\n id: 'active_purchased_plan',\r\n headerText: '',\r\n enableSorting: false,\r\n enableHiding: false,\r\n type: 'string' as const,\r\n renderer(_: unknown, cellValue: unknown) {\r\n const purchasedPlan = cellValue as purchasedPlansInf;\r\n\r\n return <PremiumIcon purchasedPlan={purchasedPlan} />;\r\n },\r\n },\r\n ]),\r\n {\r\n id: 'org_name',\r\n headerText: `${appInfo.account_type_txt.singular} Name`,\r\n enableSorting: true,\r\n enableHiding: true,\r\n },\r\n ...(appInfo.account_type_txt.value === APP_INFO_ACCOUNT_TYPE.ORG\r\n ? [\r\n {\r\n id: 'org_address',\r\n headerText: 'Address',\r\n enableSorting: true,\r\n enableHiding: true,\r\n },\r\n {\r\n id: 'org_state',\r\n headerText: 'State',\r\n enableSorting: true,\r\n enableHiding: true,\r\n },\r\n {\r\n id: 'org_country',\r\n headerText: 'Country',\r\n enableSorting: true,\r\n enableHiding: true,\r\n },\r\n ]\r\n : []),\r\n {\r\n id: 'role_id',\r\n headerText: 'Role',\r\n enableSorting: true,\r\n enableHiding: true,\r\n type: 'string',\r\n renderer(_, cellValue) {\r\n return ROLES.DISPLAY_TEXT(cellValue as number);\r\n },\r\n },\r\n {\r\n id: 'org_created_by',\r\n headerText: 'Created By Me?',\r\n enableSorting: false,\r\n enableHiding: true,\r\n renderer(_, cellValue) {\r\n return Number(cellValue) === Number(loggedInUser.id) ? <Check /> : <X />;\r\n },\r\n },\r\n {\r\n id: 'updated_at',\r\n headerText: 'Updated On',\r\n enableSorting: true,\r\n enableHiding: true,\r\n type: 'date',\r\n },\r\n {\r\n id: 'created_at',\r\n headerText: 'Created On',\r\n enableSorting: true,\r\n enableHiding: true,\r\n type: 'date',\r\n },\r\n ]}\r\n />\r\n </div>\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default ManageOrgs;\r\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport { CircleIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction RadioGroup({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n return (\n <RadioGroupPrimitive.Root\n data-slot=\"radio-group\"\n className={cn(\"grid gap-3\", className)}\n {...props}\n />\n )\n}\n\nfunction RadioGroupItem({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Item>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-item\"\n className={cn(\n \"border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"relative flex items-center justify-center\"\n >\n <CircleIcon className=\"fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\n","'use client';\n\nimport { Check, Package, Award, Building2 } from 'lucide-react';\nimport { useState, useId } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { type Plan } from '@/lib/billingsdk-config';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/button';\nimport { Label } from '@/components/ui/label';\nimport { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';\nimport { Badge } from '@/components/ui/badge';\n\nconst sectionVariants = cva('py-32 relative overflow-hidden', {\n variants: {\n size: {\n small: 'py-12',\n medium: 'py-20',\n large: 'py-32',\n },\n theme: {\n minimal: 'bg-background',\n classic: 'bg-gradient-to-b from-background to-muted/20',\n },\n },\n defaultVariants: {\n size: 'medium',\n theme: 'minimal',\n },\n});\n\nconst titleVariants = cva('font-bold mb-4 text-foreground', {\n variants: {\n size: {\n small: 'text-3xl lg:text-4xl',\n medium: 'text-4xl lg:text-5xl',\n large: 'text-4xl lg:text-6xl',\n },\n theme: {\n minimal: '',\n classic: 'bg-gradient-to-r from-foreground to-muted-foreground bg-clip-text text-transparent',\n },\n },\n defaultVariants: {\n size: 'medium',\n theme: 'minimal',\n },\n});\n\nconst descriptionVariants = cva('text-muted-foreground max-w-3xl mx-auto mb-2', {\n variants: {\n size: {\n small: 'text-base lg:text-lg',\n medium: 'text-lg lg:text-xl',\n large: 'lg:text-xl',\n },\n theme: {\n minimal: '',\n classic: '',\n },\n },\n defaultVariants: {\n size: 'medium',\n theme: 'minimal',\n },\n});\n\nconst cardVariants = cva('relative h-full transition-all duration-300 rounded-lg border bg-card text-card-foreground', {\n variants: {\n size: {\n small: 'p-4',\n medium: 'p-5',\n large: 'p-6',\n },\n theme: {\n minimal: 'hover:bg-muted/30',\n classic: 'hover:shadow-xl backdrop-blur-sm bg-card/50 border-border/50',\n },\n highlight: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n theme: 'classic',\n highlight: true,\n className: 'ring-2 ring-primary/20 border-primary/30 bg-gradient-to-b from-primary/5 to-transparent relative overflow-hidden shadow-xl',\n },\n {\n theme: 'minimal',\n highlight: true,\n className: 'bg-muted/50 border-primary/20',\n },\n ],\n defaultVariants: {\n size: 'large',\n theme: 'minimal',\n highlight: false,\n },\n});\n\nconst toggleVariants = cva('flex h-11 w-fit shrink-0 items-center rounded-md p-1 text-lg', {\n variants: {\n theme: {\n minimal: 'bg-muted',\n classic: 'bg-muted/50 backdrop-blur-sm border border-border/50 shadow-lg',\n },\n },\n defaultVariants: {\n theme: 'minimal',\n },\n});\n\nconst priceTextVariants = cva('font-medium', {\n variants: {\n size: {\n small: 'text-2xl',\n medium: 'text-3xl',\n large: 'text-4xl',\n },\n theme: {\n minimal: '',\n classic: 'font-extrabold bg-gradient-to-r from-foreground to-muted-foreground bg-clip-text text-transparent',\n },\n },\n defaultVariants: {\n size: 'large',\n theme: 'minimal',\n },\n});\n\nconst buttonVariants = cva('w-full transition-all duration-300 hover:cursor-pointer', {\n variants: {\n theme: {\n minimal:\n 'shadow hover:bg-primary/90 h-9 py-2 group bg-primary text-primary-foreground ring-primary before:from-primary-foreground/20 after:from-primary-foreground/10 relative isolate inline-flex w-full items-center justify-center overflow-hidden rounded-md px-3 text-left text-sm font-medium ring-1 before:pointer-events-none before:absolute before:inset-0 before:-z-10 before:rounded-md before:bg-gradient-to-b before:opacity-80 before:transition-opacity before:duration-300 before:ease-[cubic-bezier(0.4,0.36,0,1)] after:pointer-events-none after:absolute after:inset-0 after:-z-10 after:rounded-md after:bg-gradient-to-b after:to-transparent after:mix-blend-overlay',\n classic:\n 'relative overflow-hidden bg-gradient-to-r from-primary to-primary/80 text-primary-foreground font-semibold py-3 px-6 rounded-lg hover:shadow-xl active:scale-95 border border-primary/20',\n },\n },\n defaultVariants: {\n theme: 'minimal',\n },\n});\n\nconst featureIconVariants = cva('flex-none h-[1lh]', {\n variants: {\n size: {\n small: 'size-3',\n medium: 'size-4',\n large: 'size-4',\n },\n theme: {\n minimal: 'text-primary',\n classic: 'text-primary',\n },\n },\n defaultVariants: {\n size: 'large',\n theme: 'minimal',\n },\n});\n\nexport interface PricingTableFourProps extends VariantProps<typeof sectionVariants> {\n plans: Plan[];\n title?: string;\n description?: string;\n subtitle?: string;\n onPlanSelect?: (planId: string, isYearly: boolean) => void;\n className?: string;\n showBillingToggle?: boolean;\n billingToggleLabels?: {\n monthly: string;\n yearly: string;\n };\n}\n\nconst defaultIcons = {\n starter: <Package className=\"w-4 h-4\" />,\n pro: <Award className=\"w-4 h-4\" />,\n enterprise: <Building2 className=\"w-4 h-4\" />,\n};\n\nexport function PricingTableFour({\n plans,\n title = 'Choose Your Perfect Plan',\n description = 'Transform your project with our comprehensive pricing options designed for every need.',\n subtitle,\n onPlanSelect,\n className,\n size = 'medium',\n theme = 'minimal',\n showBillingToggle = true,\n billingToggleLabels = {\n monthly: 'Monthly',\n yearly: 'Yearly',\n },\n}: PricingTableFourProps) {\n const [isAnnually, setIsAnnually] = useState(false);\n const uniqueId = useId();\n\n function calculateDiscount(monthlyPrice: string, yearlyPrice: string): number {\n const monthly = parseFloat(monthlyPrice);\n const yearly = parseFloat(yearlyPrice);\n\n if (monthlyPrice.toLowerCase() === 'custom' || yearlyPrice.toLowerCase() === 'custom' || isNaN(monthly) || isNaN(yearly) || monthly === 0) {\n return 0;\n }\n\n const discount = ((monthly * 12 - yearly) / (monthly * 12)) * 100;\n return Math.round(discount);\n }\n\n const yearlyPriceDiscount = plans.length ? Math.max(...plans.map((plan) => calculateDiscount(plan.monthlyPrice, plan.yearlyPrice))) : 0;\n\n const handlePlanSelect = (planId: string) => {\n onPlanSelect?.(planId, isAnnually);\n };\n\n const getPlanIcon = (planId: string) => {\n return defaultIcons[planId as keyof typeof defaultIcons] || <Package className=\"w-5 h-5\" />;\n };\n\n return (\n <section className={cn(sectionVariants({ size, theme }), className)}>\n {/* Classic theme background elements */}\n {theme === 'classic' && (\n <>\n <div className=\"absolute inset-0 bg-grid-pattern opacity-5\" />\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-96 h-96 bg-primary/5 rounded-full blur-3xl\" />\n <div className=\"absolute top-1/4 right-1/4 w-64 h-64 bg-secondary/5 rounded-full blur-2xl\" />\n </>\n )}\n\n <div className=\"container max-w-7xl mx-auto relative\">\n {/* Header */}\n <div className=\"text-center mb-12\">\n {subtitle && <p className=\"text-sm font-medium text-primary mb-3 tracking-wide uppercase\">{subtitle}</p>}\n <h2 className={cn(titleVariants({ size, theme }))}>{title}</h2>\n <p className={cn(descriptionVariants({ size, theme }))}>{description}</p>\n\n {showBillingToggle && (\n <div className={cn('flex justify-center mt-8 mx-auto', toggleVariants({ theme }))}>\n <RadioGroup\n defaultValue=\"monthly\"\n className=\"h-full grid-cols-2\"\n onValueChange={(value) => {\n setIsAnnually(value === 'annually');\n }}\n >\n <div className='has-[button[data-state=\"checked\"]]:bg-background h-full rounded-md transition-all'>\n <RadioGroupItem value=\"monthly\" id={`${uniqueId}-monthly`} className=\"peer sr-only\" />\n <Label\n htmlFor={`${uniqueId}-monthly`}\n className=\"text-muted-foreground peer-data-[state=checked]:text-primary flex h-full cursor-pointer items-center justify-center px-2 md:px-7 font-semibold transition-all hover:text-foreground\"\n >\n {billingToggleLabels.monthly}\n </Label>\n </div>\n <div className='has-[button[data-state=\"checked\"]]:bg-background h-full rounded-md transition-all'>\n <RadioGroupItem value=\"annually\" id={`${uniqueId}-annually`} className=\"peer sr-only\" />\n <Label\n htmlFor={`${uniqueId}-annually`}\n className=\"text-muted-foreground peer-data-[state=checked]:text-primary flex h-full cursor-pointer items-center justify-center gap-1 px-2 md:px-7 font-semibold transition-all hover:text-foreground\"\n >\n {billingToggleLabels.yearly}\n {yearlyPriceDiscount > 0 && (\n <span className=\"ml-1 rounded bg-primary/10 px-2 py-0.5 text-xs text-primary border border-primary/20 font-medium\">\n Save {yearlyPriceDiscount}%\n </span>\n )}\n </Label>\n </div>\n </RadioGroup>\n </div>\n )}\n </div>\n\n <div\n className={cn(\n 'grid gap-6',\n plans.length === 1 && 'grid-cols-1 max-w-md mx-auto',\n plans.length === 2 && 'grid-cols-1 md:grid-cols-2 max-w-4xl mx-auto',\n plans.length === 3 && 'grid-cols-1 md:grid-cols-3',\n plans.length >= 4 && 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4',\n )}\n >\n {plans.map((plan, index) => (\n <motion.div\n key={plan.id}\n className=\"relative group h-full\"\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{\n duration: 0.4,\n delay: index * 0.1,\n ease: 'easeOut',\n }}\n >\n {/* Popular badge */}\n {plan.badge && (\n <Badge\n className={cn(\n 'absolute -top-3 left-1/2 transform -translate-x-1/2 z-20',\n theme === 'classic'\n ? 'bg-gradient-to-r from-primary to-primary/80 text-primary-foreground border-primary/20 shadow-lg'\n : 'bg-primary text-primary-foreground',\n )}\n >\n {plan.badge}\n </Badge>\n )}\n\n {/* Classic theme highlight effect */}\n {theme === 'classic' && plan.highlight && (\n <div className=\"absolute -top-px left-1/2 -translate-x-1/2 w-32 h-px bg-gradient-to-r from-transparent via-primary to-transparent\" />\n )}\n\n <div className={cn(cardVariants({ size, theme, highlight: plan.highlight }))}>\n <div className=\"flex flex-col h-full\">\n {/* Icon and Title */}\n <div className=\"flex items-start gap-4 mb-4\">\n <div className=\"flex-1\">\n <h3 className={cn('text-xl font-bold mb-1', theme === 'classic' ? 'text-lg' : '')}>{plan.title}</h3>\n <p className={cn('text-sm text-muted-foreground', theme === 'classic' && 'text-foreground/80')}>{plan.description}</p>\n </div>\n <div\n className={cn(\n 'w-10 h-10 flex items-center rounded-lg justify-center flex-shrink-0',\n theme === 'classic' ? 'bg-primary/10 text-primary border border-primary/20' : 'bg-muted text-foreground border border-border',\n )}\n >\n {getPlanIcon(plan.id)}\n </div>\n </div>\n\n {/* Price */}\n <div className=\"mb-6\">\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={isAnnually ? 'year' : 'month'}\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.2 }}\n >\n {isAnnually ? (\n <div className=\"flex items-baseline gap-1\">\n <span className={cn(priceTextVariants({ size, theme }))}>\n {parseFloat(plan.yearlyPrice) >= 0 && plan.yearlyPrice.toLowerCase() !== 'custom' && <>{plan.currency}</>}\n {plan.yearlyPrice}\n </span>\n <span className=\"text-muted-foreground text-sm\">/year</span>\n {calculateDiscount(plan.monthlyPrice, plan.yearlyPrice) > 0 && (\n <span\n className={cn('text-xs ml-2', theme === 'classic' ? 'text-emerald-500 font-semibold' : 'text-primary font-medium')}\n >\n {calculateDiscount(plan.monthlyPrice, plan.yearlyPrice)}% off\n </span>\n )}\n </div>\n ) : (\n <div className=\"flex items-baseline gap-1\">\n <span className={cn(priceTextVariants({ size, theme }))}>\n {parseFloat(plan.monthlyPrice) >= 0 && plan.monthlyPrice.toLowerCase() !== 'custom' && <>{plan.currency}</>}\n {plan.monthlyPrice}\n </span>\n <span className=\"text-muted-foreground text-sm\">/month</span>\n </div>\n )}\n </motion.div>\n </AnimatePresence>\n </div>\n\n {/* CTA Button */}\n <div className=\"mb-6\">\n <Button\n onClick={() => handlePlanSelect(plan.id)}\n className={cn(\n buttonVariants({ theme }),\n !plan.highlight && theme === 'minimal' && 'bg-secondary hover:bg-secondary/80 text-secondary-foreground',\n )}\n variant={plan.highlight ? 'default' : 'secondary'}\n >\n {plan.buttonText}\n {theme === 'classic' && plan.highlight && (\n <div className=\"absolute inset-0 bg-gradient-to-r from-white/0 via-white/10 to-white/0 translate-x-[-100%] hover:translate-x-[100%] transition-transform duration-700\" />\n )}\n </Button>\n </div>\n\n {/* Features */}\n <div className=\"flex-1\">\n <ul className=\"space-y-3\">\n {plan.features.map((feature, featureIndex) => (\n <motion.li\n key={featureIndex}\n className=\"flex gap-3 items-start\"\n initial={{ opacity: 0, x: -10 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ duration: 0.3, delay: featureIndex * 0.05 }}\n >\n <Check className={cn(featureIconVariants({ size, theme }))} />\n <span className={cn('text-sm', theme === 'classic' ? 'text-foreground/90' : 'text-muted-foreground')}>{feature.name}</span>\n </motion.li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </motion.div>\n ))}\n </div>\n </div>\n </section>\n );\n}\n","import { PricingTableFour } from '@/components/billingsdk/pricing-table-four';\r\nimport AccordionWrapper from '@/components/custom/AccordionWrapper';\r\nimport FullPageLoading from '@/components/custom/FullPageLoading';\r\nimport { TypographyHeading } from '@/components/custom/Typography/TypographyHeading';\r\nimport { appInfo } from '@/config/app-config';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport type { ISubscriptionConfig } from '@/lib/billingsdk-config';\r\nimport AppContext from '@/store/AppContext';\r\nimport { useContext, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router';\r\n\r\nexport function PricingTbl() {\r\n const navigate = useNavigate();\r\n const { subscriptionConfig, setSubscriptionConfig } = useContext(AppContext);\r\n const { plans, faqs } = subscriptionConfig;\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n if ('plans' in subscriptionConfig === false) {\r\n const subscriptionConfigResponse = (await getAxiosInstance().get('/get-subscription-config')) as ISubscriptionConfig;\r\n setSubscriptionConfig(subscriptionConfigResponse);\r\n }\r\n };\r\n fetchData();\r\n }, [setSubscriptionConfig, subscriptionConfig]);\r\n\r\n if ('plans' in subscriptionConfig === false) {\r\n return <FullPageLoading />;\r\n }\r\n\r\n return (\r\n <div className=\"px-5\">\r\n <PricingTableFour\r\n plans={plans}\r\n title=\"Choose Your Perfect Plan\"\r\n theme=\"classic\"\r\n description=\"Transform your project with our comprehensive pricing options designed for every need.\"\r\n subtitle={appInfo.appName}\r\n onPlanSelect={(planId: string, isYearly: boolean) => {\r\n navigate(`/infrastructure/checkout?plan=${planId}&billing=${isYearly ? 'yearly' : 'monthly'}`);\r\n }}\r\n size=\"small\"\r\n className=\"w-full\"\r\n showBillingToggle={true}\r\n billingToggleLabels={{\r\n monthly: 'Monthly',\r\n yearly: 'Yearly',\r\n }}\r\n />\r\n\r\n <div className=\"m-8 mx-auto max-w-200\">\r\n <TypographyHeading className=\"mb-2\">Need a custom plan?</TypographyHeading>\r\n <p className=\"text-muted-foreground\">Contact our sales team for tailored solutions that fit your organization&apos;s unique needs.</p>\r\n\r\n <TypographyHeading className=\"mb-2 mt-15 font-medium text-lg\">Frequently Asked Questions</TypographyHeading>\r\n <div className=\"mt-5\">\r\n {faqs.map((faq, index) => (\r\n <div className=\"border-t\" key={index}>\r\n <AccordionWrapper title={<h1 className=\"\">{faq.question}</h1>}>\r\n <div className=\"\">{faq.answer}</div>\r\n </AccordionWrapper>\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <TypographyHeading className=\"mb-2 mt-15 font-medium text-lg\">Still have questions?</TypographyHeading>\r\n <p className=\"text-muted-foreground\">\r\n Reach out to our support team at{' '}\r\n <a href={`mailto:${appInfo.supportEmail}`} className=\"text-primary underline\">\r\n {appInfo.supportEmail}\r\n </a>{' '}\r\n for personalized assistance.\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport { Button } from '@/components/ui/button';\nimport { Badge } from '@/components/ui/badge';\nimport { Dialog, DialogClose, DialogContent, DialogTitle, DialogTrigger } from '@/components/ui/dialog';\nimport { type Plan } from '@/lib/billingsdk-config';\nimport { cn } from '@/lib/utils';\nimport { X, Circle } from 'lucide-react';\n\nexport interface CancelSubscriptionDialogProps {\n title: string;\n description: string;\n plan: Plan;\n triggerButtonText?: string;\n leftPanelImageUrl?: string;\n warningTitle?: string;\n warningText?: string;\n keepButtonText?: string;\n continueButtonText?: string;\n finalTitle?: string;\n finalSubtitle?: string;\n finalWarningText?: string;\n goBackButtonText?: string;\n confirmButtonText?: string;\n onCancel: (planId: string) => Promise<void> | void;\n onKeepSubscription?: (planId: string) => Promise<void> | void;\n onDialogClose?: () => void;\n className?: string;\n}\n\nexport function CancelSubscriptionDialog({\n title,\n description,\n plan,\n triggerButtonText,\n leftPanelImageUrl,\n warningTitle,\n warningText,\n keepButtonText,\n continueButtonText,\n finalTitle,\n finalSubtitle,\n finalWarningText,\n goBackButtonText,\n confirmButtonText,\n onCancel,\n onKeepSubscription,\n onDialogClose,\n className,\n}: CancelSubscriptionDialogProps) {\n const [showConfirmation, setShowConfirmation] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleContinueCancellation = () => {\n setShowConfirmation(true);\n setError(null);\n };\n\n const handleConfirmCancellation = async () => {\n try {\n setIsLoading(true);\n setError(null);\n await onCancel(plan.id);\n handleDialogClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to cancel subscription');\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleKeepSubscription = async () => {\n try {\n setIsLoading(true);\n setError(null);\n if (onKeepSubscription) {\n await onKeepSubscription(plan.id);\n }\n handleDialogClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to keep subscription');\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleDialogClose = () => {\n setIsOpen(false);\n setShowConfirmation(false);\n setError(null);\n setIsLoading(false);\n onDialogClose?.();\n };\n\n const handleGoBack = () => {\n setShowConfirmation(false);\n setError(null);\n };\n\n // Handle keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!isOpen) return;\n\n if (event.key === 'Escape') {\n event.preventDefault();\n handleDialogClose();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen]);\n\n return (\n <Dialog\n open={isOpen}\n onOpenChange={(open) => {\n if (open) {\n setIsOpen(true);\n } else {\n handleDialogClose();\n }\n }}\n >\n <DialogTrigger asChild>\n <Button variant=\"outline\">{triggerButtonText || 'Cancel Subscription'}</Button>\n </DialogTrigger>\n <DialogContent\n className={cn(\n 'sm:max-w-[1000px] flex flex-col md:flex-row p-0 overflow-hidden text-foreground w-[95%] md:w-[100%]',\n leftPanelImageUrl ? '' : 'sm:max-w-[500px]',\n className,\n )}\n >\n <DialogTitle className=\"sr-only\">{title}</DialogTitle>\n <DialogClose\n className=\"absolute right-4 top-4 z-10 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\"\n onClick={handleDialogClose}\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogClose>\n {leftPanelImageUrl && (\n <div className=\"w-full md:w-1/2 min-h-[500px] relative hidden md:block overflow-hidden\">\n <img src={leftPanelImageUrl} alt=\"Cancel Subscription\" className=\"absolute inset-0 w-full h-full object-cover\" />\n <div className=\"absolute inset-0 bg-gradient-to-r from-transparent via-background/30 to-background/90 dark:block hidden\"></div>\n <div className=\"absolute inset-0 bg-gradient-to-t from-background/80 via-transparent to-background/20 dark:block hidden\"></div>\n </div>\n )}\n <div className={cn('py-6 px-4 flex flex-col gap-4', leftPanelImageUrl ? 'w-full md:w-1/2' : 'w-full')}>\n <div className=\"flex flex-col gap-2 text-center md:text-left\">\n <h2 className=\"md:text-2xl text-xl font-semibold\">{title}</h2>\n <p className=\"md:text-sm text-xs text-muted-foreground\">{description}</p>\n {error && (\n <div className=\"p-3 bg-destructive/10 border border-destructive/20 rounded-md\">\n <p className=\"text-sm text-destructive\">{error}</p>\n </div>\n )}\n </div>\n\n {/* Plan Details */}\n {!showConfirmation && (\n <div className=\"flex flex-col gap-4 p-4 bg-muted/50 rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"font-semibold text-lg\">{plan.title} Plan</span>\n <span className=\"text-sm text-muted-foreground\">Current subscription</span>\n </div>\n <Badge variant=\"secondary\">\n {parseFloat(plan.monthlyPrice) >= 0 ? `${plan.currency}${plan.monthlyPrice}/monthly` : `${plan.monthlyPrice}/monthly`}\n </Badge>\n </div>\n <div className=\"flex flex-col gap-2\">\n {plan.features.slice(0, 4).map((feature, index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <Circle className=\"w-2 h-2 fill-primary text-primary\" />\n <span className=\"text-sm text-muted-foreground\">{feature.name}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Warning Section */}\n {!showConfirmation && (warningTitle || warningText) && (\n <div className=\"p-4 bg-muted/30 border border-border rounded-lg\">\n {warningTitle && <h3 className=\"font-semibold text-foreground mb-2\">{warningTitle}</h3>}\n {warningText && <p className=\"text-sm text-muted-foreground\">{warningText}</p>}\n </div>\n )}\n {/* Action Buttons */}\n {!showConfirmation ? (\n <div className=\"flex flex-col sm:flex-row gap-3 mt-auto\">\n <Button className=\"flex-1\" onClick={handleKeepSubscription} disabled={isLoading}>\n {isLoading ? 'Processing...' : keepButtonText || 'Keep My Subscription'}\n </Button>\n <Button variant=\"destructive\" className=\"flex-1\" onClick={handleContinueCancellation} disabled={isLoading}>\n {continueButtonText || 'Continue Cancellation'}\n </Button>\n </div>\n ) : (\n <div className=\"flex flex-col gap-4 mt-auto\">\n <div className=\"text-center p-4 bg-muted/50 rounded-lg\">\n <h3 className=\"font-semibold mb-2 text-foreground\">{finalTitle || 'Final Confirmation'}</h3>\n <p className=\"text-sm text-muted-foreground mb-2\">{finalSubtitle || 'Are you sure you want to cancel your subscription?'}</p>\n <p className=\"text-sm text-destructive\">\n {finalWarningText || \"This action cannot be undone and you'll lose access to all premium features.\"}\n </p>\n </div>\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <Button variant=\"outline\" className=\"flex-1\" onClick={handleGoBack} disabled={isLoading}>\n {goBackButtonText || 'Go Back'}\n </Button>\n <Button variant=\"destructive\" className=\"flex-1\" onClick={handleConfirmCancellation} disabled={isLoading}>\n {isLoading ? 'Cancelling...' : confirmButtonText || 'Yes, Cancel Subscription'}\n </Button>\n </div>\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground\",\n },\n size: {\n default: \"h-9 px-2 min-w-9\",\n sm: \"h-8 px-1.5 min-w-8\",\n lg: \"h-10 px-2.5 min-w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n","'use client';\n\nimport { motion, AnimatePresence } from 'motion/react';\nimport { Button } from '@/components/ui/button';\nimport { Badge } from '@/components/ui/badge';\nimport { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';\nimport { Toggle } from '@/components/ui/toggle';\nimport { Label } from '@/components/ui/label';\nimport { type Plan } from '@/lib/billingsdk-config';\nimport { cn } from '@/lib/utils';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';\nimport { useState, useCallback } from 'react';\n\nexport interface UpdatePlanDialogProps {\n currentPlan: Plan;\n plans: Plan[];\n triggerText: string;\n onPlanChange: (planId: string, isYearly: boolean) => void;\n className?: string;\n title?: string;\n}\n\nconst easing = [0.4, 0, 0.2, 1] as const;\n\nexport function UpdatePlanDialog({ currentPlan, plans, onPlanChange, className, title, triggerText }: UpdatePlanDialogProps) {\n const [isYearly, setIsYearly] = useState(false);\n const [selectedPlan, setSelectedPlan] = useState<string | undefined>(undefined);\n const [isOpen, setIsOpen] = useState(false);\n\n const getCurrentPrice = useCallback((plan: Plan) => (isYearly ? `${plan.yearlyPrice}` : `${plan.monthlyPrice}`), [isYearly]);\n\n const handlePlanChange = useCallback((planId: string) => {\n setSelectedPlan((prev) => (prev === planId ? undefined : planId));\n }, []);\n\n const handleOpenChange = useCallback((open: boolean) => {\n setIsOpen(open);\n if (!open) {\n setSelectedPlan(undefined);\n }\n }, []);\n\n return (\n <Dialog open={isOpen} onOpenChange={handleOpenChange}>\n <DialogTrigger asChild>\n <Button>{triggerText || 'Update Plan'}</Button>\n </DialogTrigger>\n <DialogContent\n className={cn(\n 'gap-3 sm:gap-4 max-h-[95vh] sm:max-h-[90vh] flex flex-col text-foreground',\n 'w-[calc(100vw-2rem)] sm:w-full max-w-2xl',\n 'p-4 sm:p-6',\n className,\n )}\n >\n <DialogHeader className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 sm:gap-4 pb-2 sm:pb-0\">\n <DialogTitle className=\"text-lg sm:text-xl font-semibold\">{title || 'Upgrade Plan'}</DialogTitle>\n <div className=\"flex items-center gap-1.5 sm:gap-2 text-sm\">\n <Toggle\n size=\"sm\"\n pressed={!isYearly}\n onPressedChange={(pressed) => setIsYearly(!pressed)}\n className=\"px-3 sm:px-4 h-9 sm:h-10 text-xs sm:text-sm\"\n >\n Monthly\n </Toggle>\n <Toggle\n size=\"sm\"\n pressed={isYearly}\n onPressedChange={(pressed) => setIsYearly(pressed)}\n className=\"px-3 sm:px-4 h-9 sm:h-10 text-xs sm:text-sm\"\n >\n Yearly\n </Toggle>\n </div>\n </DialogHeader>\n <div\n className=\"flex-1 min-h-0 overflow-y-auto overflow-x-hidden -mx-4 sm:-mx-6 px-4 sm:px-6 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-muted [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:border-2 [&::-webkit-scrollbar-thumb]:border-transparent hover:[&::-webkit-scrollbar-thumb]:bg-muted-foreground/20\"\n style={{ scrollbarWidth: 'thin', scrollbarColor: 'hsl(var(--muted)) transparent' }}\n >\n {plans.length === 0 ? (\n <div className=\"flex items-center justify-center py-12 text-center\">\n <p className=\"text-sm text-muted-foreground\">No plans available</p>\n </div>\n ) : (\n <RadioGroup value={selectedPlan} onValueChange={handlePlanChange}>\n <div className=\"space-y-2.5 sm:space-y-3 pb-2 pr-0.5\">\n {plans.map((plan, index) => (\n <motion.div\n key={plan.id}\n layout\n initial={{ opacity: 0, y: 20 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{\n layout: { duration: 0.3, ease: easing },\n opacity: { delay: index * 0.05, duration: 0.3, ease: easing },\n y: { delay: index * 0.05, duration: 0.3, ease: easing },\n }}\n onClick={() => handlePlanChange(plan.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handlePlanChange(plan.id);\n }\n }}\n role=\"button\"\n tabIndex={0}\n aria-pressed={selectedPlan === plan.id}\n className={cn(\n 'relative rounded-lg sm:rounded-xl border cursor-pointer overflow-hidden transition-all duration-200',\n 'touch-manipulation focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2',\n selectedPlan === plan.id\n ? 'border-primary bg-gradient-to-br from-muted/60 to-muted/30 shadow-sm'\n : 'border-border hover:border-primary/50',\n )}\n >\n <motion.div layout=\"position\" className=\"p-3 sm:p-4\">\n <div className=\"flex items-start justify-between gap-2 sm:gap-3\">\n <div className=\"flex gap-2 sm:gap-3 min-w-0 flex-1\">\n <RadioGroupItem value={plan.id} id={plan.id} className=\"flex-shrink-0 pointer-events-none mt-0.5 sm:mt-1\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5 sm:gap-2 flex-wrap\">\n <Label htmlFor={plan.id} className=\"font-semibold sm:font-medium text-sm sm:text-base cursor-pointer leading-tight\">\n {plan.title}\n </Label>\n {plan.badge && (\n <Badge\n variant=\"secondary\"\n className=\"flex-shrink-0 text-[10px] sm:text-xs px-1.5 sm:px-2 py-0 sm:py-0.5 h-5 sm:h-auto\"\n >\n {plan.badge}\n </Badge>\n )}\n </div>\n <p className=\"text-[11px] sm:text-xs text-muted-foreground mt-1 leading-relaxed\">{plan.description}</p>\n {plan.features.length > 0 && (\n <div className=\"pt-2 sm:pt-3\">\n <div className=\"flex flex-wrap gap-1.5 sm:gap-2\">\n {plan.features.map((feature, featureIndex) => (\n <div\n key={featureIndex}\n className=\"flex items-center gap-1.5 sm:gap-2 px-2 py-1 rounded-md sm:rounded-lg bg-muted/20 border border-border/30 flex-shrink-0\"\n >\n <div className=\"w-1 h-1 sm:w-1.5 sm:h-1.5 rounded-full bg-primary flex-shrink-0\" />\n <span className=\"text-[10px] sm:text-xs text-muted-foreground whitespace-nowrap leading-none\">\n {feature.name}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n <div className=\"text-right flex-shrink-0 min-w-[60px] sm:min-w-[80px]\">\n <div className=\"text-base sm:text-xl font-bold sm:font-semibold leading-tight\">\n {parseFloat(getCurrentPrice(plan)) >= 0 ? `${plan.currency}${getCurrentPrice(plan)}` : getCurrentPrice(plan)}\n </div>\n <div className=\"text-[10px] sm:text-xs text-muted-foreground mt-0.5\">/{isYearly ? 'year' : 'month'}</div>\n </div>\n </div>\n </motion.div>\n\n <AnimatePresence initial={false}>\n {selectedPlan === plan.id && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{\n height: 'auto',\n opacity: 1,\n transition: {\n height: { duration: 0.3, ease: easing },\n opacity: { duration: 0.25, delay: 0.05, ease: easing },\n },\n }}\n exit={{\n height: 0,\n opacity: 0,\n transition: {\n height: { duration: 0.25, ease: easing },\n opacity: { duration: 0.15, ease: easing },\n },\n }}\n className=\"overflow-hidden\"\n >\n <motion.div\n initial={{ y: -8 }}\n animate={{\n y: 0,\n transition: { duration: 0.25, delay: 0.05, ease: easing },\n }}\n exit={{ y: -8 }}\n className=\"px-3 sm:px-4 pb-3 sm:pb-4\"\n >\n <Button\n className=\"w-full h-10 sm:h-11 text-sm sm:text-base font-medium touch-manipulation\"\n disabled={selectedPlan === currentPlan.id}\n onClick={(e) => {\n e.stopPropagation();\n onPlanChange(plan.id, isYearly);\n handleOpenChange(false);\n }}\n >\n {selectedPlan === currentPlan.id ? 'Current Plan' : 'Upgrade'}\n </Button>\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n ))}\n </div>\n </RadioGroup>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","'use client';\n\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Badge } from '@/components/ui/badge';\nimport { Separator } from '@/components/ui/separator';\nimport { Calendar, CreditCard, MoveUpRight } from 'lucide-react';\nimport type { CurrentPlan } from '@/lib/billingsdk-config';\nimport { cn } from '@/lib/utils';\nimport { CancelSubscriptionDialog, type CancelSubscriptionDialogProps } from '@/components/billingsdk/cancel-subscription-dialog';\nimport { UpdatePlanDialog, type UpdatePlanDialogProps } from '@/components/billingsdk/update-plan-dialog';\nimport { Button } from '../ui/button';\nimport LinkWrapper from '../custom/LinkWrapper';\n\nexport interface SubscriptionManagementProps {\n className?: string;\n currentPlan: CurrentPlan;\n cancelSubscription: CancelSubscriptionDialogProps;\n updatePlan: UpdatePlanDialogProps;\n canShowUpdatePlanBtn: boolean;\n canShowCancelPlanBtn: boolean;\n addMoreBtnProps?: AddMoreBtnProps;\n}\n\ninterface AddMoreBtnProps {\n text: React.ReactNode;\n buttonProps: React.ComponentProps<typeof Button>;\n canShow: boolean;\n}\n\nexport function SubscriptionManagement({\n className,\n currentPlan,\n cancelSubscription,\n updatePlan,\n canShowUpdatePlanBtn,\n addMoreBtnProps,\n canShowCancelPlanBtn,\n}: SubscriptionManagementProps) {\n return (\n <div className={cn('text-left w-full', className)}>\n <Card className=\"\">\n <CardHeader className=\"pb-4 sm:pb-6 px-4 sm:px-6\">\n <CardTitle className=\"flex items-center gap-2 sm:gap-3 text-lg sm:text-xl\">\n <div className=\"p-1.5 sm:p-2 rounded-lg bg-primary/10 ring-1 ring-primary/20\">\n <CreditCard className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n Current Subscription\n </CardTitle>\n <CardDescription className=\"text-sm sm:text-base\">Manage your billing and subscription settings</CardDescription>\n </CardHeader>\n\n <CardContent className=\"space-y-6 sm:space-y-8 px-4 sm:px-6\">\n {/* Current Plan Details with highlighted styling */}\n <div className=\"relative p-3 sm:p-4 rounded-xl bg-gradient-to-r from-muted/30 via-muted/20 to-muted/30 border border-border/50 overflow-hidden\">\n <div className=\"relative\">\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 sm:gap-0\">\n <div className=\"w-full\">\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-3 mb-2\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-lg sm:text-xl font-semibold\">{currentPlan.plan.title} Plan</h3>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge\n variant={currentPlan.status === 'active' ? 'default' : 'outline'}\n className=\"shadow-sm text-xs sm:text-sm bg-primary/90 hover:bg-primary border-0 font-medium\"\n >\n {currentPlan.type === `monthly`\n ? `${currentPlan.plan.currency}${currentPlan.plan.monthlyPrice}/month`\n : currentPlan.type === `yearly`\n ? `${currentPlan.plan.currency}${currentPlan.plan.yearlyPrice}/year`\n : `${currentPlan.price}`}\n </Badge>\n <Badge variant=\"outline\" className=\"shadow-sm text-xs sm:text-sm border-border/60 bg-background/50 backdrop-blur-sm\">\n {currentPlan.status}\n </Badge>\n </div>\n </div>\n <div className=\"relative\">\n <p className=\"text-xs sm:text-sm text-muted-foreground relative z-10\">{currentPlan.plan.description}</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <Separator className=\"my-4 sm:my-6 bg-gradient-to-r from-transparent via-border to-transparent\" />\n\n <div className=\"space-y-3 sm:space-y-4\">\n <h4 className=\"font-medium flex items-center gap-2 text-base sm:text-lg\">\n <div className=\"p-1 sm:p-1.5 rounded-md bg-muted ring-1 ring-border/50\">\n <Calendar className=\"h-3 w-3 sm:h-4 sm:w-4\" />\n </div>\n Billing Information\n </h4>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 sm:gap-6\">\n <div className=\"group p-2.5 sm:p-3 rounded-lg md:bg-gradient-to-tl bg-gradient-to-b from-muted to-background/10 border border-border/30 hover:border-border/60 transition-all duration-200\">\n <span className=\"text-xs sm:text-sm text-muted-foreground block mb-1\">Start Date</span>\n <div className=\"font-medium text-sm sm:text-base group-hover:text-primary transition-colors duration-200\">\n {currentPlan.startDate}\n </div>\n </div>\n <div className=\"group p-2.5 sm:p-3 rounded-lg md:bg-gradient-to-tl bg-gradient-to-b from-muted to-background/10 border border-border/30 hover:border-border/60 transition-all duration-200\">\n <span className=\"text-xs sm:text-sm text-muted-foreground block mb-1\">Plan Expiry Date</span>\n <div className=\"font-medium text-sm sm:text-base group-hover:text-primary transition-colors duration-200\">\n {currentPlan.expiryDate}\n </div>\n </div>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 sm:gap-6\">\n <div className=\"group p-2.5 sm:p-3 rounded-lg md:bg-gradient-to-tl bg-gradient-to-b from-muted to-background/10 border border-border/30 hover:border-border/60 transition-all duration-200\">\n <span className=\"text-xs sm:text-sm text-muted-foreground block mb-1\">Active Plan for</span>\n <div className=\"font-medium text-sm sm:text-base group-hover:text-primary transition-colors duration-200\">\n {currentPlan.activePlanFor} users\n </div>\n </div>\n <div className=\"group p-2.5 sm:p-3 rounded-lg md:bg-gradient-to-tr bg-gradient-to-b from-muted to-background/10 border border-border/30 hover:border-border/60 transition-all duration-200\">\n <span className=\"text-xs sm:text-sm text-muted-foreground block mb-1\">Total Paid Amount</span>\n <div className=\"font-medium text-sm sm:text-base group-hover:text-primary transition-colors duration-200\">\n {currentPlan.paidAmount}\n </div>\n </div>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 sm:gap-6\">\n <div className=\"group p-2.5 sm:p-3 rounded-lg md:bg-gradient-to-tr bg-gradient-to-b from-muted to-background/10 border border-border/30 hover:border-border/60 transition-all duration-200\">\n <span className=\"text-xs sm:text-sm text-muted-foreground block mb-1\">Payment method</span>\n <div className=\"font-medium text-sm sm:text-base group-hover:text-primary transition-colors duration-200\">\n {currentPlan.paymentMethod}\n </div>\n </div>\n <div className=\"group p-2.5 sm:p-3 rounded-lg md:bg-gradient-to-tr bg-gradient-to-b from-muted to-background/10 border border-border/30 hover:border-border/60 transition-all duration-200\">\n <span className=\"text-xs sm:text-sm text-muted-foreground block mb-1\">Order Id</span>\n <div className=\"font-medium text-sm sm:text-base group-hover:text-primary transition-colors duration-200\">\n {currentPlan.transactionId || 'N/A'}\n </div>\n </div>\n </div>\n </div>\n\n <Separator className=\"my-4 sm:my-6 bg-gradient-to-r from-transparent via-border to-transparent\" />\n\n <div className=\"flex flex-col sm:flex-row gap-3\">\n {canShowUpdatePlanBtn && <UpdatePlanDialog className=\"mx-0 shadow-lg hover:shadow-xl transition-all duration-200\" {...updatePlan} />}\n {addMoreBtnProps && addMoreBtnProps.canShow && <Button {...addMoreBtnProps.buttonProps}>{addMoreBtnProps.text}</Button>}\n {canShowCancelPlanBtn && (\n <CancelSubscriptionDialog className=\"mx-0 shadow-lg hover:shadow-xl transition-all duration-200\" {...cancelSubscription} />\n )}\n <LinkWrapper to={'/plans'}>\n <Button variant={'outline'}>\n Buy Upcoming Plan <MoveUpRight />\n </Button>\n </LinkWrapper>\n </div>\n\n <div className=\"pt-4 sm:pt-6\">\n <h4 className=\"font-medium mb-3 sm:mb-4 text-base sm:text-lg\">Current Plan Features</h4>\n <div className=\"flex flex-wrap gap-2 sm:gap-3\">\n {currentPlan.plan.features.map((feature, index) => (\n <div\n key={index}\n className=\"group flex items-center gap-2 p-2 sm:p-2 rounded-lg border border-border/80 hover:border-primary/30 hover:bg-primary/5 transition-all duration-200\"\n >\n <div className=\"w-1 h-1 sm:w-1.5 sm:h-1.5 rounded-full bg-primary flex-shrink-0 group-hover:bg-primary group-hover:scale-125 transition-all duration-200\"></div>\n <span className=\"text-xs sm:text-sm text-muted-foreground group-hover:text-foreground transition-colors duration-200\">\n {feature.name}\n </span>\n </div>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n","import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';\r\nimport { getCurrencySymbol } from '../utils/subscription-utils';\r\nimport { LogIn, type LucideIcon } from 'lucide-react';\r\nimport { Badge } from '@/components/ui/badge';\r\nimport { formatISODateWithTime24H } from '@/lib/utils';\r\nimport LinkWrapper from '@/components/custom/LinkWrapper';\r\nimport { Button } from '@/components/ui/button';\r\nimport { useContext } from 'react';\r\nimport type { purchasedPlansInf } from '@/lib/types';\r\nimport AppContext from '@/store/AppContext';\r\nimport PremiumHighlighter from '@/components/custom/PremiumHighlighter';\r\n\r\ninterface IUpcomingPlans {\r\n upcomingPlans: purchasedPlansInf[] | any[];\r\n Icon: LucideIcon;\r\n title: string;\r\n badgeText: string;\r\n isFreePlan?: boolean;\r\n}\r\n\r\nconst UpcomingPlans = ({ upcomingPlans, Icon, title, badgeText, isFreePlan = false }: IUpcomingPlans) => {\r\n const { subscriptionConfig, orgs, featureFlags } = useContext(AppContext);\r\n const { plans } = subscriptionConfig;\r\n\r\n return (\r\n <Card key=\"upcoming-plans\" className=\"mt-5\">\r\n <CardHeader>\r\n <CardTitle className=\"flex items-center gap-2 sm:gap-3 text-lg sm:text-xl\">\r\n <div className=\"p-1.5 sm:p-2 rounded-lg bg-primary/10 ring-1 ring-primary/20\">\r\n <Icon className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\r\n </div>\r\n {title}\r\n </CardTitle>\r\n </CardHeader>\r\n <CardContent>\r\n <div className=\"flex flex-wrap gap-2 sm:gap-3\">\r\n {upcomingPlans.length ? (\r\n upcomingPlans.map((purchasedPlan) => {\r\n const plan = plans.find((p) => p.id === purchasedPlan.plan_id);\r\n\r\n return (\r\n <div\r\n key={purchasedPlan.z_order_id}\r\n className=\"w-full relative p-3 sm:p-4 rounded-xl bg-gradient-to-r from-muted/30 via-muted/20 to-muted/30 border border-border/50 overflow-hidden\"\r\n >\r\n <div className=\"relative\">\r\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 sm:gap-0\">\r\n <div className=\"w-full\">\r\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-3 mb-2\">\r\n <div className=\"flex items-center gap-2\">\r\n <h3 className=\"text-lg sm:text-xl font-semibold\">{plan?.title} Plan</h3>\r\n </div>\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n <Badge\r\n variant={purchasedPlan.status === 'active' ? 'default' : 'outline'}\r\n className=\"shadow-sm text-xs sm:text-sm bg-primary/90 hover:bg-primary border-0 font-medium text-primary-foreground\"\r\n >\r\n {getCurrencySymbol(purchasedPlan.z_currency)}\r\n {purchasedPlan.amount}\r\n </Badge>\r\n <Badge variant=\"outline\" className=\"shadow-sm text-xs sm:text-sm border-border/60 bg-background/50 backdrop-blur-sm\">\r\n {badgeText}\r\n </Badge>\r\n </div>\r\n </div>\r\n {isFreePlan ? (\r\n <>\r\n <div className=\"mt-5\">\r\n <LinkWrapper to={'/plans'}>\r\n {/* <Button className={'mt-5'}>\r\n <SparkleIcon /> \r\n Purchase Plan\r\n </Button> */}\r\n <PremiumHighlighter>{'Upgrade to premium'}</PremiumHighlighter>\r\n </LinkWrapper>\r\n\r\n {featureFlags.ff_enable_teams && orgs.length === 0 && (\r\n <LinkWrapper to={'/infrastructure/create-new-org'}>\r\n <Button className={'ml-2'} variant={'outline'}>\r\n <LogIn /> Continue with Free Plan\r\n </Button>\r\n </LinkWrapper>\r\n )}\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"relative\">\r\n <span className=\"text-xs sm:text-sm text-muted-foreground relative z-10\">\r\n <p>\r\n {purchasedPlan.for_no_users} Users for {purchasedPlan.for_months} Months\r\n </p>\r\n <p>Start Date: {formatISODateWithTime24H(purchasedPlan.startAt)}</p>\r\n <p>End Date: {formatISODateWithTime24H(purchasedPlan.endAt)}</p>\r\n <p>Order Id: {purchasedPlan.z_order_id}</p>\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })\r\n ) : (\r\n <p className=\"text-center text-muted-foreground\">No {badgeText} Plans</p>\r\n )}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n};\r\n\r\nexport default UpcomingPlans;\r\n","'use client';\n\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { CheckCircle2 } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from '@/components/ui/dialog';\nimport { Button } from '@/components/ui/button';\n\nexport interface PaymentSuccessDialogProps {\n title?: string;\n subtitle?: string;\n currencySymbol?: string;\n price: string;\n productName: string;\n proceedButtonText?: string;\n backButtonText?: string;\n onProceed?: () => void;\n onBack?: () => void;\n className?: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport interface PaymentSuccessDialogRef {\n open: () => void;\n close: () => void;\n}\n\ntype ConfettiPiece = {\n id: number;\n x: number;\n xEnd: number;\n delay: number;\n rotation: number;\n size: number;\n colorVar: string; // CSS var name like --primary, --accent\n};\n\nexport const PaymentSuccessDialog = forwardRef<PaymentSuccessDialogRef, PaymentSuccessDialogProps>(function PaymentSuccessDialog(\n {\n title = 'Congratulations!',\n subtitle = 'Your payment was successful.',\n currencySymbol = '$',\n price,\n productName,\n proceedButtonText = 'Proceed',\n backButtonText = 'Back',\n onProceed,\n onBack,\n className,\n open,\n onOpenChange,\n },\n ref,\n) {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(false);\n const openState = isControlled ? (open as boolean) : internalOpen;\n const setOpenState = (value: boolean) => {\n if (isControlled) {\n onOpenChange?.(value);\n } else {\n setInternalOpen(value);\n }\n };\n useImperativeHandle(\n ref,\n () => ({\n open: () => setOpenState(true),\n close: () => setOpenState(false),\n }),\n [isControlled, onOpenChange],\n );\n const [confettiActive, setConfettiActive] = useState(false);\n\n useEffect(() => {\n if (openState) {\n setConfettiActive(true);\n const t = setTimeout(() => setConfettiActive(false), 2200);\n return () => clearTimeout(t);\n }\n setConfettiActive(false);\n }, [openState]);\n\n const confetti: ConfettiPiece[] = useMemo(() => {\n const pieces: ConfettiPiece[] = [];\n const colors = ['--primary', '--accent', '--secondary'];\n for (let i = 0; i < 42; i++) {\n const startX = Math.random() * 100;\n const drift = (Math.random() - 0.5) * 24; // -12% to +12%\n pieces.push({\n id: i,\n x: startX,\n xEnd: Math.max(0, Math.min(100, startX + drift)),\n delay: Math.random() * 0.4,\n rotation: Math.random() * 360,\n size: 6 + Math.round(Math.random() * 6),\n colorVar: colors[i % colors.length],\n });\n }\n return pieces;\n }, []);\n\n return (\n <Dialog open={openState} onOpenChange={setOpenState}>\n <DialogContent className={cn('w-[95%] sm:max-w-[560px] p-0 overflow-hidden text-foreground', className)}>\n <div className=\"relative\">\n <div className=\"p-7 flex flex-col items-center text-center gap-5\">\n <div className=\"relative\">\n <motion.div\n className=\"absolute inset-0 -z-10 mx-auto size-20 rounded-full blur-xl\"\n style={{ background: 'var(--primary)', opacity: 0.12 }}\n initial={{ scale: 0.9, opacity: 0 }}\n animate={{ scale: 1, opacity: 0.12 }}\n transition={{ duration: 0.5, ease: 'easeOut' }}\n />\n <div className=\"relative\">\n <div className=\"size-16 rounded-full bg-primary/10 flex items-center justify-center border border-primary/30 shadow-sm\">\n <CheckCircle2 className=\"size-10 text-primary\" />\n </div>\n <motion.span\n className=\"absolute inset-0 rounded-full border-2 border-primary/30\"\n initial={{ scale: 0.9, opacity: 0.5 }}\n animate={{ scale: 1.25, opacity: 0 }}\n transition={{ duration: 1.2, repeat: Infinity, ease: 'easeOut' }}\n />\n <motion.span\n className=\"absolute inset-0 rounded-full border-2 border-accent/30\"\n initial={{ scale: 0.9, opacity: 0.5 }}\n animate={{ scale: 1.6, opacity: 0 }}\n transition={{ duration: 1.6, repeat: Infinity, ease: 'easeOut', delay: 0.2 }}\n />\n </div>\n </div>\n\n <DialogHeader className=\"text-center\">\n <DialogTitle className=\"text-2xl font-semibold\">{title}</DialogTitle>\n </DialogHeader>\n <p className=\"text-sm text-muted-foreground max-w-[38ch]\">{subtitle}</p>\n\n <div className=\"flex flex-col items-center gap-1\">\n <motion.div\n className=\"text-4xl font-semibold tracking-tight\"\n initial={{ y: 6, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{ type: 'spring', stiffness: 280, damping: 22 }}\n >\n {currencySymbol}\n {price}\n </motion.div>\n <div className=\"text-xs text-muted-foreground\">Paid for {productName}</div>\n </div>\n\n <DialogFooter className=\"w-full flex-col sm:flex-col gap-3 mt-1\">\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={() => {\n onBack?.();\n setOpenState(false);\n }}\n >\n {backButtonText}\n </Button>\n <Button\n className=\"w-full\"\n onClick={() => {\n onProceed?.();\n setOpenState(false);\n }}\n >\n {proceedButtonText}\n </Button>\n </DialogFooter>\n </div>\n\n <AnimatePresence>\n {confettiActive && (\n <motion.div className=\"pointer-events-none absolute inset-0\" initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }}>\n {confetti.map((c) => (\n <motion.span\n key={c.id}\n className=\"absolute block rounded-[2px]\"\n style={{\n left: `${c.x}%`,\n top: '-16px',\n width: c.size,\n height: c.size * 0.6,\n backgroundColor: `var(${c.colorVar})`,\n }}\n initial={{ y: -20, rotate: c.rotation }}\n animate={{ y: 360 + Math.random() * 80, x: `${c.xEnd}%`, rotate: c.rotation + 720 }}\n transition={{ duration: 1.8 + Math.random() * 0.8, delay: c.delay, ease: 'easeOut' }}\n />\n ))}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </DialogContent>\n </Dialog>\n );\n});\n","import DialogWrapper from '@/components/custom/DialogWrapper';\r\nimport { Button } from '@/components/ui/button';\r\nimport { Input } from '@/components/ui/input';\r\nimport { Label } from '@/components/ui/label';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport { showErrorToast } from '@/lib/toast-helper';\r\nimport type { ICreateOrderResponse } from '@/lib/types';\r\nimport AppContext from '@/store/AppContext';\r\nimport { useContext, useState, useMemo, useTransition } from 'react';\r\nimport { invokeRazorPay } from '../utils/subscription-utils';\r\nimport { useRazorpay } from 'react-razorpay';\r\nimport { PaymentSuccessDialog } from '@/components/billingsdk/payment-success-dialog';\r\nimport { useNavigate } from 'react-router';\r\nimport usePurchasedPlans from '../hooks/usePurchasedPlans';\r\n\r\ninterface AddMoreUsersDialogProps {\r\n isOpen: boolean;\r\n setIsOpen: (isOpen: boolean) => void;\r\n purchasePlanId: number;\r\n}\r\n\r\nconst AddMoreUsersDialog = ({ isOpen, setIsOpen, purchasePlanId }: AddMoreUsersDialogProps) => {\r\n const { purchasePlans, subscriptionConfig, loggedInUser } = useContext(AppContext);\r\n const { plans, CURRENCY_SYMBOL, CURRENCY } = subscriptionConfig;\r\n const [numberOfUsers, setNumberOfUsers] = useState<number>(1);\r\n const [isTransitionGoingOn, startTransition] = useTransition();\r\n const { Razorpay } = useRazorpay();\r\n const { loadPurchasedPlans } = usePurchasedPlans();\r\n const navigate = useNavigate();\r\n const [paymentSuccessDialogOpen, setPaymentSuccessDialogOpen] = useState(false);\r\n\r\n // Find the purchased plan details\r\n const purchasedPlan = useMemo(() => purchasePlans.find((plan) => plan.purchased_id === purchasePlanId), [purchasePlans, purchasePlanId]);\r\n\r\n // Find the plan configuration\r\n const planConfig = useMemo(() => plans.find((p) => p.id === purchasedPlan?.plan_id), [plans, purchasedPlan]);\r\n\r\n // Calculate the amount based on number of users\r\n const calculatedAmount = useMemo(() => {\r\n if (!purchasedPlan || !planConfig) return 0;\r\n\r\n // Determine if it's monthly or yearly based on for_months\r\n const isYearly = purchasedPlan.for_months === 12;\r\n const pricePerUser = isYearly ? parseFloat(planConfig.yearlyPrice) : parseFloat(planConfig.monthlyPrice);\r\n\r\n return pricePerUser * numberOfUsers;\r\n }, [purchasedPlan, planConfig, numberOfUsers]);\r\n\r\n const handleAddUsers = () => {\r\n setIsOpen(false);\r\n\r\n startTransition(async () => {\r\n try {\r\n await new Promise((resolve) => setTimeout(resolve, 200));\r\n\r\n const createdOrderResponse: ICreateOrderResponse = await getAxiosInstance().post('payment-gateway/add-more-users-order', {\r\n purchased_id: purchasePlanId,\r\n currency: CURRENCY,\r\n for_no_users: numberOfUsers,\r\n });\r\n\r\n await invokeRazorPay(\r\n calculatedAmount,\r\n CURRENCY,\r\n createdOrderResponse,\r\n {\r\n name: `${loggedInUser.fname} ${loggedInUser.lname}`,\r\n email: loggedInUser.email,\r\n contact: loggedInUser.mobNo?.toString() || '',\r\n },\r\n Razorpay,\r\n );\r\n\r\n setIsOpen(true);\r\n setPaymentSuccessDialogOpen(true);\r\n } catch (e) {\r\n setIsOpen(true);\r\n\r\n showErrorToast({\r\n header: 'Failed to add users.',\r\n description: 'Please try again later or contact support if the issue persists.',\r\n });\r\n } finally {\r\n loadPurchasedPlans();\r\n }\r\n });\r\n };\r\n\r\n const handleCancel = () => {\r\n setNumberOfUsers(1);\r\n setIsOpen(false);\r\n };\r\n\r\n if (!purchasedPlan || !planConfig) {\r\n showErrorToast({\r\n header: 'Failed to load plan details.',\r\n description: 'Please try again later or contact support if the issue persists.',\r\n });\r\n return null;\r\n }\r\n\r\n return (\r\n <DialogWrapper\r\n open={isOpen}\r\n setIsOpen={setIsOpen}\r\n disableOutsideClick\r\n header={`Add More Users in ${planConfig.title}`}\r\n actionsJSX={\r\n <>\r\n <Button variant=\"outline\" onClick={handleCancel}>\r\n Cancel\r\n </Button>\r\n <Button onClick={handleAddUsers} disabled={numberOfUsers < 1} loading={isTransitionGoingOn}>\r\n Make Payment\r\n </Button>\r\n </>\r\n }\r\n >\r\n <div className=\"space-y-4 pt-4\">\r\n {/* Sub-header with Order ID */}\r\n <div className=\"text-sm text-muted-foreground\">\r\n <p>\r\n <span className=\"font-medium\">Order ID:</span> {purchasedPlan.z_order_id}\r\n </p>\r\n <p>\r\n <span className=\"font-medium\">Current Users:</span> {purchasedPlan.for_no_users}\r\n </p>\r\n <p>\r\n <span className=\"font-medium\">Plan Duration:</span> {purchasedPlan.for_months === 12 ? 'Yearly' : 'Monthly'}\r\n </p>\r\n </div>\r\n\r\n {/* Input field for number of users */}\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"numberOfUsers\">Number of Users to Add</Label>\r\n <Input\r\n id=\"numberOfUsers\"\r\n type=\"number\"\r\n min=\"1\"\r\n value={numberOfUsers}\r\n onChange={(e) => setNumberOfUsers(Math.max(1, parseInt(e.target.value) || 1))}\r\n placeholder=\"Enter number of users\"\r\n />\r\n </div>\r\n\r\n {/* Amount calculation display */}\r\n <div className=\"rounded-lg bg-muted p-4 space-y-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm font-medium\">Price per user:</span>\r\n <span className=\"text-sm\">\r\n {CURRENCY_SYMBOL}\r\n {purchasedPlan.for_months === 12 ? planConfig.yearlyPrice : planConfig.monthlyPrice}\r\n </span>\r\n </div>\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"text-sm font-medium\">Number of users:</span>\r\n <span className=\"text-sm\">{numberOfUsers}</span>\r\n </div>\r\n <div className=\"border-t pt-2 mt-2\">\r\n <div className=\"flex justify-between items-center\">\r\n <span className=\"font-semibold\">Total Amount:</span>\r\n <span className=\"text-lg font-bold text-primary\">\r\n {CURRENCY_SYMBOL}\r\n {calculatedAmount.toFixed(2)}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <PaymentSuccessDialog\r\n open={paymentSuccessDialogOpen}\r\n onOpenChange={(isOpen) => {\r\n setPaymentSuccessDialogOpen(isOpen);\r\n\r\n if (!isOpen) {\r\n navigate('/infrastructure/payment-history');\r\n }\r\n }}\r\n price={calculatedAmount.toFixed(2)}\r\n currencySymbol={CURRENCY_SYMBOL}\r\n productName={planConfig.title}\r\n proceedButtonText=\"Go to Dashboard\"\r\n backButtonText=\"Go to Payment History\"\r\n onProceed={() => navigate('/')}\r\n onBack={() => navigate('/infrastructure/payment-history')}\r\n />\r\n </DialogWrapper>\r\n );\r\n};\r\n\r\nexport default AddMoreUsersDialog;\r\n","import { getDisplayPaymentMethod, isFreePlan } from './utils/subscription-utils';\r\nimport { useNavigate } from 'react-router';\r\nimport FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport { SubscriptionManagement } from '@/components/billingsdk/subscription-management';\r\nimport { useContext, useMemo, useState } from 'react';\r\nimport AppContext from '@/store/AppContext';\r\nimport { formatISODateWithTime24H } from '@/lib/utils';\r\nimport { CreditCard, GalleryVerticalEnd, History } from 'lucide-react';\r\nimport UpcomingPlans from './components/UpcomingPlans';\r\nimport AddMoreUsersDialog from './components/AddMoreUsersDialog';\r\n\r\nconst SubscriptionMgmt = () => {\r\n const navigate = useNavigate();\r\n const { activePlan, purchasePlans, subscriptionConfig } = useContext(AppContext);\r\n const { plans, CURRENCY_SYMBOL } = subscriptionConfig;\r\n const [isDialogOpen, setIsDialogOpen] = useState(false);\r\n\r\n const activePurchasedPlan = plans.find((p) => p.id === activePlan?.plan_id) || plans[0];\r\n\r\n const upcomingPlans = useMemo(\r\n () => purchasePlans.filter((purchasePlan) => purchasePlan.status === 'paid' && new Date(purchasePlan.startAt) > new Date()).reverse(),\r\n [purchasePlans],\r\n );\r\n const historyPlans = useMemo(\r\n () => purchasePlans.filter((purchasePlan) => purchasePlan.status === 'paid' && new Date(purchasePlan.endAt) < new Date()),\r\n [purchasePlans],\r\n );\r\n\r\n const freePlan = !activePlan || isFreePlan(activePlan);\r\n\r\n return (\r\n <FlexColsLayout>\r\n <div className=\"pb-5 sm:pl-20 px-2 w-200 mx-auto\">\r\n {!freePlan ? (\r\n <>\r\n <SubscriptionManagement\r\n currentPlan={{\r\n plan: activePurchasedPlan,\r\n type: activePlan.for_months === 12 ? 'yearly' : 'monthly',\r\n startDate: formatISODateWithTime24H(activePlan.startAt),\r\n expiryDate: formatISODateWithTime24H(activePlan.endAt),\r\n paymentMethod: getDisplayPaymentMethod(activePlan.z_payment_method),\r\n activePlanFor: activePlan.for_no_users,\r\n paidAmount: `${CURRENCY_SYMBOL}${activePlan.amount}`,\r\n status: 'active',\r\n transactionId: (() => {\r\n const orderIds = [activePlan.z_order_id];\r\n\r\n if (activePlan.updatedRecords)\r\n activePlan.updatedRecords.forEach((record) => {\r\n if (record.status !== 'paid') return;\r\n orderIds.push(record.z_order_id);\r\n });\r\n\r\n return orderIds.join(', ');\r\n })(),\r\n }}\r\n canShowCancelPlanBtn={false}\r\n cancelSubscription={{\r\n title: 'Cancel Subscription',\r\n description: 'Are you sure you want to cancel your subscription?',\r\n plan: activePurchasedPlan,\r\n onCancel: (planId) => console.log('Subscription cancelled for plan:', planId),\r\n onKeepSubscription: (planId) => console.log('Subscription kept for plan:', planId),\r\n }}\r\n addMoreBtnProps={{\r\n text: 'Add more users to your plan',\r\n buttonProps: {\r\n // onClick: () => navigate('/infrastructure/checkout?purchasePlanId=' + activePlan.purchased_id),\r\n onClick: () => setIsDialogOpen(true),\r\n },\r\n canShow: activePlan.for_no_users < activePurchasedPlan.maxUserRequired,\r\n }}\r\n canShowUpdatePlanBtn={false}\r\n updatePlan={{\r\n currentPlan: activePurchasedPlan,\r\n plans: plans,\r\n triggerText: 'Change Plan',\r\n onPlanChange: (planId, isYearly) => {\r\n navigate(`/infrastructure/checkout?plan=${planId}&billing=${isYearly ? 'yearly' : 'monthly'}`);\r\n },\r\n }}\r\n />\r\n <AddMoreUsersDialog isOpen={isDialogOpen} setIsOpen={setIsDialogOpen} purchasePlanId={activePlan.purchased_id} />\r\n </>\r\n ) : (\r\n <UpcomingPlans upcomingPlans={[activePlan]} Icon={CreditCard} title=\"Current Subscription\" badgeText=\"Active\" isFreePlan />\r\n )}\r\n\r\n <UpcomingPlans upcomingPlans={upcomingPlans} Icon={GalleryVerticalEnd} title=\"Upcoming Plans\" badgeText=\"Upcoming\" />\r\n <UpcomingPlans upcomingPlans={historyPlans} Icon={History} title=\"Expired Plans\" badgeText=\"Expired\" />\r\n </div>\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default SubscriptionMgmt;\r\n","import { getAxiosInstance } from '@/lib/axios-utils';\r\nimport type { ICountries, ICountry } from '@/lib/types';\r\nimport { getLocalStorage, setLocalStorage } from '@/lib/utils';\r\nimport { useEffect, useState } from 'react';\r\n\r\nconst useCountries = (): ICountry[] => {\r\n const [countries, setCountries] = useState<ICountry[]>([]);\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n const saved = getLocalStorage('countries');\r\n if (saved) {\r\n try {\r\n const parsed = JSON.parse(saved) as unknown;\r\n if (Array.isArray(parsed)) {\r\n setCountries(parsed as ICountry[]);\r\n return;\r\n }\r\n } catch {\r\n // ignore parse error and fall back to network request\r\n }\r\n }\r\n\r\n const response = (await getAxiosInstance().get('get-countries')) as ICountries;\r\n const lCountries = response.countries ?? [];\r\n if (lCountries.length > 0) {\r\n setLocalStorage('countries', JSON.stringify(lCountries));\r\n }\r\n\r\n setCountries(lCountries);\r\n };\r\n\r\n fetchData();\r\n }, []);\r\n\r\n return countries;\r\n};\r\n\r\nexport default useCountries;\r\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n","import FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\nimport SelectListWrapper from '@/components/custom/SelectListWrapper';\r\nimport { TypographyHeading } from '@/components/custom/Typography/TypographyHeading';\r\nimport { Navigate, useNavigate, useSearchParams } from 'react-router';\r\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\r\nimport { Label } from '@/components/ui/label';\r\nimport { Input } from '@/components/ui/input';\r\nimport useCountries from '@/hooks/useCountries';\r\nimport { Textarea } from '@/components/ui/textarea';\r\nimport { Button } from '@/components/ui/button';\r\nimport { AlertCircleIcon, ArrowRight } from 'lucide-react';\r\nimport LinkWrapper from '@/components/custom/LinkWrapper';\r\nimport { useContext, useRef, useState } from 'react';\r\nimport { useRazorpay } from 'react-razorpay';\r\nimport { getAxiosInstance } from '@/lib/axios-utils';\r\nimport AppContext from '@/store/AppContext';\r\nimport { showErrorToast } from '@/lib/toast-helper';\r\nimport { PaymentSuccessDialog } from '@/components/billingsdk/payment-success-dialog';\r\nimport type { ICreateOrderResponse } from '@/lib/types';\r\nimport { isEmailValid } from '@/lib/utils';\r\nimport usePurchasedPlans from '@/app/routes/Subscriptions/hooks/usePurchasedPlans';\r\nimport { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';\r\nimport { invokeRazorPay, isFreePlan } from './utils/subscription-utils';\r\n\r\nconst Checkout = () => {\r\n const { Razorpay } = useRazorpay();\r\n const { loggedInUser, subscriptionConfig, activePlan } = useContext(AppContext);\r\n const [searchParams] = useSearchParams();\r\n const selectedPlanId = searchParams.get('plan');\r\n const selectedBilling = searchParams.get('billing') || 'yearly';\r\n\r\n const countries = useCountries();\r\n\r\n const navigate = useNavigate();\r\n const [paymentSuccessDialogOpen, setPaymentSuccessDialogOpen] = useState(false);\r\n const [isPaymentLoading, setPaymentLoading] = useState(false);\r\n\r\n const { plans, CURRENCY, CURRENCY_SYMBOL } = subscriptionConfig;\r\n\r\n const selectedPlanRecord = plans.find((rec) => rec.id === selectedPlanId) || plans[0];\r\n const { minUserRequired, maxUserRequired } = selectedPlanRecord;\r\n\r\n const [billingPeriod, setBillingPeriod] = useState(selectedBilling);\r\n const [teamSize, setTimeSize] = useState(minUserRequired);\r\n\r\n //Total Calculation...\r\n const teamSizeForCalculation = teamSize <= minUserRequired ? minUserRequired : teamSize;\r\n\r\n const planAmount = billingPeriod === 'yearly' ? selectedPlanRecord.yearlyPrice : selectedPlanRecord.monthlyPrice;\r\n const totalFinalPrice = teamSizeForCalculation * parseFloat(planAmount);\r\n\r\n const largeAmountMonths = billingPeriod === 'yearly' ? 12 : 1;\r\n const monthlyPlanAmount = selectedPlanRecord.monthlyPrice;\r\n const subTotal = largeAmountMonths * teamSizeForCalculation * parseFloat(monthlyPlanAmount);\r\n\r\n const billingDetails = useRef({\r\n fullName: loggedInUser?.fname + ' ' + loggedInUser?.lname,\r\n country: '',\r\n address: '',\r\n email: loggedInUser?.email,\r\n mobileNo: loggedInUser?.mobNo?.toString(),\r\n });\r\n\r\n const { loadPurchasedPlans } = usePurchasedPlans();\r\n\r\n if (selectedPlanRecord.monthlyPrice === '0' || selectedPlanRecord.yearlyPrice === '0') {\r\n return <Navigate to=\"/\" />;\r\n }\r\n\r\n const handleOnPayNow = async () => {\r\n const validateBillingDetails = () => {\r\n const errors: { [key: string]: string } = {};\r\n const details = billingDetails.current;\r\n\r\n if (!details.fullName.trim()) {\r\n errors.fullName = 'Full Name is required.';\r\n }\r\n\r\n if (!details.country.trim()) {\r\n errors.country = 'Country is required.';\r\n }\r\n\r\n if (!details.address.trim()) {\r\n errors.address = 'Address is required.';\r\n } else if (details.address.trim().length < 5) {\r\n errors.address = 'Address must be at least 5 characters.';\r\n }\r\n\r\n if (!details.email.trim()) {\r\n errors.email = 'Email is required.';\r\n } else if (!isEmailValid(details.email)) {\r\n errors.email = 'Email is invalid.';\r\n }\r\n\r\n if (!details.mobileNo?.toString().trim()) {\r\n errors.mobileNo = 'Mobile Number is required.';\r\n } else if (\r\n !/^\\d+$/.test(details.mobileNo?.toString()) ||\r\n details.mobileNo?.toString().trim().length < 10 ||\r\n details.mobileNo?.toString().trim().length > 15\r\n ) {\r\n errors.mobileNo = 'Mobile Number is invalid (must be 10-15 digits).';\r\n }\r\n\r\n return errors;\r\n };\r\n\r\n const validationErrors = validateBillingDetails();\r\n if (Object.keys(validationErrors).length > 0) {\r\n Object.values(validationErrors)\r\n .reverse()\r\n .forEach((errorMsg) =>\r\n showErrorToast({\r\n header: 'Invalid Billing Details',\r\n description: errorMsg,\r\n }),\r\n );\r\n return;\r\n }\r\n\r\n try {\r\n setPaymentLoading(true);\r\n\r\n const createdOrderResponse: ICreateOrderResponse = await getAxiosInstance().post('payment-gateway/create-order', {\r\n planId: selectedPlanRecord.id,\r\n // amount: totalFinalPrice,\r\n currency: CURRENCY,\r\n // for_months: billingPeriod === 'yearly' ? 12 : 1,\r\n billingPeriod: billingPeriod || 'yearly',\r\n for_no_users: teamSizeForCalculation,\r\n\r\n billing_name: billingDetails.current.fullName,\r\n billing_email: billingDetails.current.email,\r\n billing_contact_no: billingDetails.current.mobileNo,\r\n billing_address: billingDetails.current.address,\r\n billing_country: billingDetails.current.country,\r\n });\r\n\r\n const billerInfo = billingDetails.current;\r\n\r\n await invokeRazorPay(\r\n totalFinalPrice,\r\n CURRENCY,\r\n createdOrderResponse,\r\n {\r\n name: billerInfo.fullName || `${loggedInUser.fname} ${loggedInUser.lname}`,\r\n email: billerInfo.email || loggedInUser.email,\r\n contact: billerInfo.mobileNo?.toString() || loggedInUser.mobNo?.toString() || '',\r\n },\r\n Razorpay,\r\n );\r\n\r\n setPaymentSuccessDialogOpen(true);\r\n } catch (e: unknown) {\r\n showErrorToast({\r\n header: 'Payment Failed!',\r\n description: (e as Error)?.message,\r\n });\r\n } finally {\r\n await loadPurchasedPlans();\r\n setPaymentLoading(false);\r\n }\r\n };\r\n\r\n const getAlert = () => {\r\n if (isFreePlan(activePlan)) return null;\r\n\r\n return (\r\n <Alert variant=\"default\" className=\"mb-5\">\r\n <AlertCircleIcon />\r\n <AlertTitle>You currently have an active paid plan.</AlertTitle>\r\n <AlertDescription>\r\n <p>\r\n Please be aware that this purchase is for an upcoming plan. Check your{' '}\r\n <LinkWrapper className=\"text-primary\" to={'/infrastructure/manage-subscription'}>\r\n current subscription\r\n </LinkWrapper>\r\n .\r\n </p>\r\n </AlertDescription>\r\n </Alert>\r\n );\r\n };\r\n\r\n return (\r\n <FlexColsLayout className=\"pb-5\" responsive>\r\n <div className=\"sm:mx-auto mx-1 px-5\">\r\n <TypographyHeading className=\"mb-4\">\r\n Checkout \"{selectedPlanRecord.title}\" Plan{' '}\r\n <LinkWrapper className={'text-xs text-primary'} to={'/plans'}>\r\n Change Plan\r\n </LinkWrapper>\r\n </TypographyHeading>\r\n {getAlert()}\r\n <FlexColsLayout layout=\"horizontal\" className=\"gap-5\" responsive>\r\n <FlexColsLayout layout=\"vertical\" className=\"sm:w-150 w-full gap-5\" doNotAppendFlex1 responsive>\r\n <Card>\r\n <CardHeader>\r\n <CardTitle>Specify billing period and team size</CardTitle>\r\n <CardDescription>With yearly plans, you can save up to 17%.</CardDescription>\r\n </CardHeader>\r\n <CardContent>\r\n <div className=\"grid gap-6\">\r\n <div className=\"grid gap-2\">\r\n <Label>Billing period *</Label>\r\n <SelectListWrapper\r\n triggerClassName=\"w-full\"\r\n placeholder=\"Select billing period\"\r\n items={[\r\n { value: 'monthly', label: `Monthly - ${selectedPlanRecord.planDisplayCost?.monthly}` },\r\n { value: 'yearly', label: `Yearly - ${selectedPlanRecord.planDisplayCost?.yearly}` },\r\n ]}\r\n value={billingPeriod}\r\n onValueChange={(value) => setBillingPeriod(value)}\r\n />\r\n </div>\r\n {minUserRequired > 1 ? (\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"teamSize\">\r\n Team Size (This should be {minUserRequired} or &gt; {minUserRequired}) *\r\n </Label>\r\n <Input\r\n type=\"number\"\r\n id=\"teamSize\"\r\n placeholder=\"\"\r\n min={minUserRequired}\r\n max={maxUserRequired}\r\n value={teamSize}\r\n onChange={(e) => setTimeSize(Math.max(minUserRequired, parseInt(e.target.value) || minUserRequired))}\r\n />\r\n </div>\r\n ) : (\r\n <></>\r\n )}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n\r\n <Card>\r\n <CardHeader>\r\n <CardTitle>Billing Details</CardTitle>\r\n <CardDescription>To finalize your subscription, kindly complete your details.</CardDescription>\r\n </CardHeader>\r\n <CardContent>\r\n <div className=\"grid gap-6\">\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"fullName\">Full Name *</Label>\r\n <Input\r\n onChange={(e) => (billingDetails.current.fullName = e.currentTarget.value)}\r\n id=\"fullName\"\r\n type=\"text\"\r\n placeholder=\"\"\r\n name=\"fullName\"\r\n defaultValue={loggedInUser?.fname + ' ' + loggedInUser?.lname}\r\n />\r\n </div>\r\n\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"country\">Country *</Label>\r\n <SelectListWrapper\r\n valueField=\"countryCode\"\r\n labelField=\"countryName\"\r\n triggerClassName=\"w-full\"\r\n placeholder=\"\"\r\n items={countries as unknown as Record<string, unknown>[]}\r\n // value={selectedBilling || undefined}\r\n onValueChange={(value) => {\r\n billingDetails.current.country = value;\r\n }}\r\n />\r\n </div>\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"address\">Address *</Label>\r\n <Textarea onChange={(e) => (billingDetails.current.address = e.target.value)} id=\"address\" placeholder=\"\" />\r\n </div>\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"email\">Email *</Label>\r\n <Input\r\n defaultValue={loggedInUser?.email}\r\n onChange={(e) => (billingDetails.current.email = e.target.value)}\r\n id=\"email\"\r\n type=\"email\"\r\n placeholder=\"\"\r\n name=\"email\"\r\n />\r\n </div>\r\n <div className=\"grid gap-2\">\r\n <Label htmlFor=\"mobileNo\">Mobile No *</Label>\r\n <Input\r\n onChange={(e) => (billingDetails.current.mobileNo = e.target.value)}\r\n id=\"mobileNo\"\r\n type=\"number\"\r\n placeholder=\"\"\r\n name=\"mobileNo\"\r\n defaultValue={loggedInUser?.mobNo}\r\n />\r\n </div>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n </FlexColsLayout>\r\n <FlexColsLayout layout=\"vertical\" className=\"sm:w-80 w-full\" doNotAppendFlex1 responsive>\r\n <Card>\r\n <CardHeader>\r\n <CardTitle>Summary</CardTitle>\r\n </CardHeader>\r\n <CardContent>\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-muted-foreground\">Subtotal</span>\r\n <span className=\"tabular-nums\">\r\n {CURRENCY_SYMBOL}\r\n {subTotal.toFixed(2)}\r\n </span>\r\n </div>\r\n\r\n {/* {billingPeriod === 'yearly' ? ( */}\r\n <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-muted-foreground\">Discount (Yearly)</span>\r\n <span className=\"tabular-nums\">\r\n - {CURRENCY_SYMBOL}\r\n {(subTotal - totalFinalPrice).toFixed(2)}\r\n </span>\r\n </div>\r\n {/* ) : (\r\n <></>\r\n )} */}\r\n\r\n {/* <div className=\"flex items-center justify-between text-sm\">\r\n <span className=\"text-muted-foreground\">Subtotal</span>\r\n <span className=\"tabular-nums\">${subtotal.toFixed(2)}</span>\r\n </div> */}\r\n\r\n <div className=\"flex items-center justify-between border-t pt-2\">\r\n <span className=\"font-medium\">Total</span>\r\n <span className=\"text-xl font-semibold tabular-nums\">\r\n {CURRENCY_SYMBOL}\r\n {totalFinalPrice.toFixed(2)}\r\n </span>\r\n </div>\r\n </div>\r\n </CardContent>\r\n </Card>\r\n <Button className=\"mt-5\" onClick={handleOnPayNow} loading={isPaymentLoading}>\r\n Make Payment <ArrowRight />\r\n </Button>\r\n </FlexColsLayout>\r\n </FlexColsLayout>\r\n </div>\r\n\r\n <PaymentSuccessDialog\r\n open={paymentSuccessDialogOpen}\r\n onOpenChange={(isOpen) => {\r\n setPaymentSuccessDialogOpen(isOpen);\r\n\r\n if (!isOpen) {\r\n navigate('/infrastructure/payment-history');\r\n }\r\n }}\r\n price={totalFinalPrice.toFixed(2)}\r\n currencySymbol={CURRENCY_SYMBOL}\r\n productName={selectedPlanRecord.title}\r\n proceedButtonText=\"Go to Dashboard\"\r\n backButtonText=\"Go to Payment History\"\r\n onProceed={() => navigate('/')}\r\n onBack={() => navigate('/infrastructure/payment-history')}\r\n />\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default Checkout;\r\n","'use client';\n\nimport { cn } from '@/lib/utils';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';\nimport { Table, TableBody, TableCell, TableCaption, TableHead, TableHeader, TableRow } from '@/components/ui/table';\nimport { Badge } from '@/components/ui/badge';\nimport { CalendarDays, Download, ReceiptText } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\n\nexport interface InvoiceItem {\n id: string;\n date: string;\n amount: string;\n status: 'paid' | 'refunded' | 'idle' | 'verified' | 'failed';\n invoiceUrl?: string;\n description?: string;\n transactionId?: string;\n}\n\ninterface InvoiceHistoryProps {\n className?: string;\n title?: string;\n description?: string;\n invoices: InvoiceItem[];\n onDownload?: (invoiceId: string) => void;\n}\n\nexport function InvoiceHistory({\n className,\n title = 'Invoice History',\n description = 'Your past invoices and payment receipts.',\n invoices,\n onDownload,\n}: InvoiceHistoryProps) {\n if (!invoices) return null;\n\n const statusBadge = (status: InvoiceItem['status']) => {\n switch (status) {\n case 'paid':\n return <Badge className=\"bg-emerald-600 text-emerald-50 border-emerald-700/40\">Paid</Badge>;\n case 'refunded':\n return <Badge variant=\"secondary\">Refunded</Badge>;\n case 'idle':\n return <Badge variant=\"outline\">Open</Badge>;\n case 'verified':\n return <Badge variant=\"outline\">Verified</Badge>;\n case 'failed':\n return <Badge variant=\"destructive\">Failed</Badge>;\n }\n };\n\n return (\n <Card className={cn('w-full', className)}>\n {(title || description) && (\n <CardHeader className=\"space-y-1\">\n {title && (\n <CardTitle className=\"text-base font-medium leading-tight truncate flex items-center gap-2 sm:gap-3 text-lg sm:text-xl\">\n <ReceiptText className=\"h-4 w-4 text-primary\" />\n {title}\n </CardTitle>\n )}\n {description && <CardDescription className=\"text-sm text-muted-foreground\">{description}</CardDescription>}\n </CardHeader>\n )}\n <CardContent>\n <Table>\n <TableCaption className=\"sr-only\">List of past invoices with dates, amounts, status and download actions</TableCaption>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[120px]\">Date</TableHead>\n <TableHead className=\"text-left\">Order ID</TableHead>\n <TableHead>Description</TableHead>\n <TableHead className=\"text-right\">Amount</TableHead>\n <TableHead className=\"text-right\">Status</TableHead>\n <TableHead className=\"text-right\">Action</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {invoices.length === 0 && (\n <TableRow>\n <TableCell colSpan={6} className=\"h-24 text-center text-muted-foreground\">\n No invoices yet\n </TableCell>\n </TableRow>\n )}\n {invoices.map((inv) => (\n <TableRow key={inv.id} className=\"group\">\n <TableCell className=\"text-muted-foreground\">\n <div className=\"inline-flex items-center gap-2\">\n <CalendarDays className=\"h-3.5 w-3.5\" />\n {inv.date}\n </div>\n </TableCell>\n <TableCell className=\"text-left\">{inv.transactionId}</TableCell>\n <TableCell className=\"max-w-[320px]\">\n <div className=\"truncate\" title={inv.description || 'Invoice'}>\n {inv.description || 'Invoice'}\n </div>\n </TableCell>\n <TableCell className=\"text-right font-medium\">{inv.amount}</TableCell>\n <TableCell className=\"text-right\">{statusBadge(inv.status)}</TableCell>\n <TableCell className=\"text-right\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 text-xs\"\n onClick={() => (inv.invoiceUrl ? window.open(inv.invoiceUrl, '_blank', 'noopener,noreferrer') : onDownload?.(inv.id))}\n aria-label={`Download invoice ${inv.id}`}\n >\n <Download className=\"h-3.5 w-3.5\" />\n Download\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n );\n}\n","import { InvoiceHistory, type InvoiceItem } from '@/components/billingsdk/invoice-history';\r\nimport { formatISODateWithTime24H } from '@/lib/utils';\r\nimport AppContext from '@/store/AppContext';\r\nimport { useContext } from 'react';\r\nimport { getCurrencySymbol } from './utils/subscription-utils';\r\nimport FlexColsLayout from '@/components/custom/Layouts/FlexColsLayout';\r\n\r\nconst PaymentHistory = () => {\r\n const { purchasePlans, subscriptionConfig } = useContext(AppContext);\r\n const { plans } = subscriptionConfig;\r\n\r\n const invoices: InvoiceItem[] = [];\r\n\r\n purchasePlans.forEach((plan) => {\r\n const activePlan = plans.find((p) => p.id === plan.plan_id);\r\n\r\n const invoiceItem = {\r\n id: plan.z_order_id,\r\n date: formatISODateWithTime24H(plan.purchased_at),\r\n amount: `${getCurrencySymbol(plan.z_currency)}${plan.old_purchased_amount || plan.amount} (${plan.z_currency})`,\r\n status: plan.status as InvoiceItem['status'],\r\n description: `${activePlan?.title} — ${plan.for_months} months, ${plan.old_purchased_for_no_users || plan.for_no_users} users`,\r\n // invoiceUrl: plan.invoiceUrl,\r\n transactionId: plan.z_order_id,\r\n };\r\n\r\n if (plan.updatedRecords) {\r\n plan.updatedRecords.forEach((record) => {\r\n invoices.push({\r\n id: record.z_order_id,\r\n date: formatISODateWithTime24H(record.updated_at),\r\n amount: `${getCurrencySymbol(record.z_currency)}${record.amount} (${record.z_currency})`,\r\n status: record.status as InvoiceItem['status'],\r\n description: `Added ${record.for_no_users} more users, in ${plan.z_order_id}`,\r\n // invoiceUrl: record.invoiceUrl,\r\n transactionId: record.z_order_id,\r\n });\r\n });\r\n }\r\n invoices.push(invoiceItem);\r\n });\r\n\r\n invoices.sort((a, b) => {\r\n const dateA = new Date(a.date).getTime();\r\n const dateB = new Date(b.date).getTime();\r\n return dateA - dateB;\r\n });\r\n\r\n return (\r\n <FlexColsLayout>\r\n <div className=\"w-full sm:max-w-250 mx-auto\">\r\n <InvoiceHistory\r\n title=\"Payment History\"\r\n description=\"Your past payment receipts.\"\r\n className=\"shadow-none border-none\"\r\n invoices={invoices.reverse()}\r\n />\r\n </div>\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default PaymentHistory;\r\n","import {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from \"@/components/ui/select\";\r\nimport useTheme from \"@/hooks/useTheme\";\r\n\r\nconst ThemeCmb = () => {\r\n const { theme, setTheme } = useTheme();\r\n\r\n return (\r\n <Select\r\n value={theme}\r\n onValueChange={(newTheme) => {\r\n setTheme(newTheme);\r\n }}\r\n >\r\n <SelectTrigger className=\"w-[180px]\">\r\n <SelectValue placeholder=\"Theme\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem value=\"light\">Light</SelectItem>\r\n <SelectItem value=\"dark\">Dark</SelectItem>\r\n <SelectItem value=\"system\">System</SelectItem>\r\n </SelectContent>\r\n </Select>\r\n );\r\n};\r\n\r\nexport default ThemeCmb;\r\n","import ListPanel from '@/components/custom/ListPanel';\r\nimport HeaderText from '@/components/custom/HeaderText';\r\nimport { Switch } from '@/components/ui/switch';\r\nimport ThemeCmb from './Components/ThemeCmb';\r\nimport { FlexColsLayout, LinkWrapper } from '@/components/custom';\r\nimport { appInfo } from '@/config/app-config';\r\nimport { SquareArrowOutUpRight } from 'lucide-react';\r\nimport { useContext } from 'react';\r\nimport AppContext from '@/store/AppContext';\r\n\r\nconst GeneralSettingsPg = () => {\r\n const { featureFlags } = useContext(AppContext);\r\n return (\r\n <FlexColsLayout className=\"pr-5 pl-5\">\r\n <div className=\"space-y-3\">\r\n <HeaderText>Email Settings</HeaderText>\r\n {/* <ListPanel title=\"Marketing emails\" description=\"Receive emails about new products, features, and more.\" control={<Switch />} /> */}\r\n <ListPanel title=\"Security emails\" description=\"Receive emails about your account security.\" control={<Switch checked={true} disabled />} />\r\n </div>\r\n\r\n <div className=\"space-y-3 mt-4\">\r\n <HeaderText>Theme</HeaderText>\r\n <ListPanel title=\"Specify theme\" description=\"Choose your preferred theme to enhance your reading experience.\" control={<ThemeCmb />} />\r\n </div>\r\n\r\n {featureFlags?.ff_enable_teams && (\r\n <div className=\"space-y-3 mt-4\">\r\n <HeaderText>\r\n <>{appInfo.account_type_txt.plural} Settings</>\r\n </HeaderText>\r\n\r\n <LinkWrapper to={'/infrastructure/manage-infra'}>\r\n <ListPanel\r\n title={`Manage ${appInfo.account_type_txt.plural}`}\r\n description={`Create and manage ${appInfo.account_type_txt.plural}, update ${appInfo.account_type_txt.singular} details, and invite members as needed.`}\r\n control={<SquareArrowOutUpRight />}\r\n labelCls=\"cursor-pointer\"\r\n />\r\n </LinkWrapper>\r\n <LinkWrapper to={'/infrastructure/user-invitations'}>\r\n <ListPanel\r\n title={`Check Invitations`}\r\n description={`View and respond to ${appInfo.account_type_txt.singular} invitations you have received.`}\r\n control={<SquareArrowOutUpRight />}\r\n labelCls=\"cursor-pointer\"\r\n className=\"mt-3\"\r\n />\r\n </LinkWrapper>\r\n </div>\r\n )}\r\n </FlexColsLayout>\r\n );\r\n};\r\n\r\nexport default GeneralSettingsPg;\r\n","const CenterAndMiddle = ({ className = '', children }: { className?: string; children: React.ReactNode }) => {\r\n return <div className={`flex-1 flex items-center justify-center ${className}`}>{children}</div>;\r\n};\r\n\r\nexport default CenterAndMiddle;\r\n","import { showSuccessToast } from '@/lib';\r\nimport { useState } from 'react';\r\nimport { Button, Textarea } from '../ui';\r\nimport { Check, Copy } from 'lucide-react';\r\n\r\nconst CopyTextField = ({ copyText }: { copyText: string }) => {\r\n const [copied, setCopied] = useState(false);\r\n\r\n const handleCopy = async (text: string) => {\r\n await navigator.clipboard.writeText(text);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 2000);\r\n showSuccessToast({ description: 'Copied to clipboard' });\r\n };\r\n\r\n return (\r\n <div className=\"flex gap-2\">\r\n <Textarea readOnly value={copyText} />\r\n <Button variant=\"outline\" size=\"icon\" onClick={() => handleCopy(copyText)} className=\"shrink-0\">\r\n <span className=\"flex items-center\">{copied ? <Check size={16} className=\"text-green-500\" /> : <Copy size={16} />}</span>\r\n </Button>\r\n </div>\r\n );\r\n};\r\n\r\nexport default CopyTextField;\r\n","import type React from 'react';\r\nimport { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '../ui';\r\nimport { ChevronDown } from 'lucide-react';\r\n\r\ninterface IDropdownItem {\r\n label: string | React.ReactNode;\r\n value: string;\r\n}\r\n\r\ninterface IDropdownBtnProps {\r\n label?: React.ReactNode;\r\n children?: React.ReactNode;\r\n items: IDropdownItem[];\r\n onItemSelect?: (item: IDropdownItem) => void;\r\n disabled?: boolean;\r\n}\r\n\r\nexport const DropdownBtn = ({ label, children, items, onItemSelect, disabled }: IDropdownBtnProps) => {\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild disabled={disabled}>\r\n {children ? (\r\n children\r\n ) : (\r\n <Button className=\"flex items-center gap-1\">\r\n {label} <ChevronDown size={15} />\r\n </Button>\r\n )}\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent>\r\n {items.map((item) => (\r\n <DropdownMenuItem key={item.value} onClick={() => onItemSelect?.(item)}>\r\n {item.label}\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n};\r\n","import { ChevronDown } from 'lucide-react';\r\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Label } from '../ui';\r\n\r\nexport interface IDropdownItem {\r\n label: string;\r\n value: string;\r\n}\r\n\r\ninterface IDropdownLblProps {\r\n label?: string;\r\n selectedRec: IDropdownItem;\r\n setSelectedRec: (value: IDropdownItem) => void;\r\n items: IDropdownItem[];\r\n}\r\n\r\nexport const DropdownLbl = ({ label, selectedRec, setSelectedRec, items }: IDropdownLblProps) => {\r\n return (\r\n <DropdownMenu>\r\n <DropdownMenuTrigger asChild>\r\n <div className=\"flex items-center gap-2\">\r\n {label && <Label className=\"whitespace-nowrap\">{label}</Label>}\r\n <span className=\"whitespace-nowrap text-primary flex items-center gap-1 text-sm cursor-pointer\">\r\n {selectedRec.label} <ChevronDown size={15} />\r\n </span>\r\n </div>\r\n </DropdownMenuTrigger>\r\n <DropdownMenuContent>\r\n {items.map((item) => (\r\n <DropdownMenuItem key={item.value} onClick={() => setSelectedRec(item)}>\r\n {item.label}\r\n </DropdownMenuItem>\r\n ))}\r\n </DropdownMenuContent>\r\n </DropdownMenu>\r\n );\r\n};\r\n","import { Toaster } from '@/components/ui/sonner';\nimport Routes, { type IRoutes } from './app/Routes';\nimport AppContext from './store/AppContext';\nimport './App.css';\nimport useTheme from './hooks/useTheme';\nimport { useCallback, useState } from 'react';\nimport AlertDialog, { type AlertDialogOptionsProps } from './components/custom/AlertDialog';\nimport { defaultAlertConfig, setLocalStorage } from './lib/utils';\nimport type { loggedInUserInf, OrganizationType, purchasedPlansInf } from './lib/types';\nimport type { ISubscriptionConfig } from './lib/billingsdk-config';\n\ninterface IAppProps extends IRoutes {\n appRoutes: IRoutes['appRoutes'];\n publicRoutes?: IRoutes['publicRoutes'];\n}\n\nfunction App({ appRoutes, publicRoutes }: IAppProps) {\n useTheme();\n const [alertDlgOptions, setAlertDlgOptions] = useState<AlertDialogOptionsProps>(defaultAlertConfig);\n\n const [orgs, setOrgs] = useState<OrganizationType[]>([]);\n const [loggedInUser, setLoggedInUser] = useState<loggedInUserInf>();\n const [activeOrg, setActiveOrg] = useState<OrganizationType>();\n const [purchasePlans, setPurchasePlans] = useState<purchasedPlansInf[]>([]);\n const [activePlan, setActivePlan] = useState<purchasedPlansInf>();\n const [subscriptionConfig, setSubscriptionConfig] = useState<ISubscriptionConfig>({} as ISubscriptionConfig);\n const [featureFlags, setFeatureFlags] = useState<Record<string, boolean>>({});\n\n const setActiveOrgHandler = useCallback(\n (org: OrganizationType) => {\n if (!org) return;\n\n setLocalStorage('activeOrgId', String(org.org_id));\n setActiveOrg(org);\n },\n [setActiveOrg],\n );\n\n return (\n <AppContext.Provider\n value={{\n alertDlgOptions,\n setAlertDlgOptions,\n orgs,\n setOrgs,\n loggedInUser: loggedInUser || ({} as loggedInUserInf),\n setLoggedInUser,\n activeOrg,\n setActiveOrg: setActiveOrgHandler,\n purchasePlans,\n setPurchasePlans,\n activePlan,\n setActivePlan,\n subscriptionConfig,\n setSubscriptionConfig,\n featureFlags,\n setFeatureFlags,\n }}\n >\n <Routes appRoutes={appRoutes} publicRoutes={publicRoutes} />\n <Toaster />\n <AlertDialog options={alertDlgOptions} />\n </AppContext.Provider>\n );\n}\n\nexport default App;\n","import { cn } from \"@/lib/utils\"\r\n\r\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\r\n return (\r\n <div\r\n data-slot=\"skeleton\"\r\n className={cn(\"bg-accent animate-pulse rounded-md\", className)}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Skeleton }\r\n","import { TabsContent } from '@radix-ui/react-tabs';\r\nimport { Tabs, TabsList, TabsTrigger } from '../ui';\r\n\r\ninterface ITabsWrapperProps {\r\n tabs: {\r\n title: React.ReactNode;\r\n content: React.ReactNode;\r\n value: string;\r\n }[];\r\n variant?: 'default' | 'line';\r\n defaultValue?: string;\r\n}\r\nconst TabsWrapper = ({ tabs, variant, defaultValue }: ITabsWrapperProps) => {\r\n return (\r\n <Tabs defaultValue={defaultValue}>\r\n <TabsList variant={variant}>\r\n {tabs.map((tab) => (\r\n <TabsTrigger key={tab.value} value={tab.value}>\r\n {tab.title}\r\n </TabsTrigger>\r\n ))}\r\n </TabsList>\r\n\r\n {tabs.map((tab) => (\r\n <TabsContent key={tab.value} value={tab.value}>\r\n {tab.content}\r\n </TabsContent>\r\n ))}\r\n </Tabs>\r\n );\r\n};\r\nexport default TabsWrapper;\r\n","import { useBlocker } from 'react-router';\r\nimport AlertDialog from './AlertDialog';\r\nimport { useEffect } from 'react';\r\n\r\nconst UrlChangesGuard = ({ isDirty, setDirty }: { isDirty: boolean; setDirty: (dirty: boolean) => void }) => {\r\n const blocker = useBlocker(isDirty);\r\n\r\n useEffect(() => {\r\n const handler = (e: BeforeUnloadEvent) => {\r\n if (!isDirty) return;\r\n e.preventDefault();\r\n e.returnValue = '';\r\n };\r\n\r\n window.addEventListener('beforeunload', handler);\r\n return () => window.removeEventListener('beforeunload', handler);\r\n }, [isDirty]);\r\n\r\n if (blocker.state === 'blocked') {\r\n return (\r\n <AlertDialog\r\n options={{\r\n open: true,\r\n text: 'Are you sure you want to leave this page?',\r\n type: 'CONFIRM',\r\n onClose: (result: 'CONFIRM' | 'CANCEL') => {\r\n if (result === 'CONFIRM') {\r\n blocker?.proceed();\r\n setDirty(false);\r\n } else {\r\n blocker?.reset();\r\n }\r\n },\r\n }}\r\n />\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default UrlChangesGuard;\r\n"],"names":["navigationItems","navMain","title","items","icon","SquarePen","url","Bookmark","BookOpen","Settings2","virtualChildOf","loadRecursiveChild","elements","result","parent","forEach","el","otherProps","push","APP_INFO_ACCOUNT_TYPE","TEAM","ORG","appInfo","appId","appName","appDescription","logo","NotebookText","version","account_type_txt","singular","plural","value","supportEmail","cloudFareKey","razorPayKey","themeColor","serverUrl","cn","inputs","twMerge","clsx","getFormDataByFormEl","formEl","formData","FormData","Object","fromEntries","entries","processKey","key","setLocalStorage","localStorage","setItem","getLocalStorage","getItem","isSameNavItem","activeUrl","urlPath","find","vc","id","parentId","findNavMenu","moduleName","flatNavMap","navTree","undefined","getFlatNavigationItems","navItem","virtualChild","createIndexedArray","n","Array","from","length","_v","i","defaultAlertConfig","open","type","text","validatePassword","password","hasUpperCase","test","hasLowerCase","hasNumber","hasSpecialChar","valid","message","errorLogger","error","console","isEmailValid","email","arrayEmail","String","toLowerCase","match","isArray","processEmailsWithValidation","textareaValue","validEmails","invalidEmails","totalProcessed","emailList","replace","split","map","trim","filter","convertServerDateToJS","serverDateStr","Date","formatISODateWithTime24H","isoString","use12hr","date","day","getDate","padStart","month","getMonth","year","getFullYear","hours","getHours","minutes","getMinutes","ampm","hoursStr","MULTIPLIER","generatePublicId","privateId","undoPublicId","publicId","Math","floor","mapIncrementBy2","arr","callback","firstEl","secondEl","isFunction","isTruthyValue","INVITATION_ENUMS","freeze","NOT_SAVED","INVITED","ACCEPTED","REJECTED","LEFT","getDisplay","statusCode","this","isObjectEmpty","obj","keys","isValidId","parseInt","getModuleNameFromUrl","pathName","localStorageKey","useTheme","defaultTheme","getDefaultThemeSelected","theme","setTheme","useState","useEffect","root","window","document","documentElement","classList","remove","newTheme","matchMedia","matches","add","Toaster","props","_jsx","Sonner","position","style","AppContext","createContext","setAlertDlgOptions","alertDlgOptions","orgs","setOrgs","loggedInUser","setLoggedInUser","activeOrg","setActiveOrg","purchasePlans","setPurchasePlans","activePlan","setActivePlan","subscriptionConfig","setSubscriptionConfig","featureFlags","setFeatureFlags","LoadingCmp","Loader2Icon","className","FullPageLoading","_jsxs","children","showSuccessToast","header","description","toast","success","showErrorToast","showWarningToast","warning","axiosInstance","getAxiosInstance","axios","create","baseURL","headers","api","interceptors","request","use","config","response","data","errorRes","parseDbErrorMessageEnhanced","errorMsg","solution","tableNameMapping","auth_users_tbl","user_id","user_email","user_mobile_no","user_fname","user_lname","user_is_active","auth_organization_tbl","org_id","org_name","org_address","org_state","org_country","org_external_id","org_gst_in","org_is_deleted","org_created_by","auth_organization_users_tbl","org_user_id","org_user_role_id","org_user_is_active","user_opinion","auth_invited_users_tbl","invited_users_id","invited_user_role_id","invited_by_user_id","is_deleted","errorMessage","parsedMessage","matchAll","fullMatch","tableName","columnName","friendlyName","replaceAll","getCurrencySymbol","currency","isFreePlan","plan","plan_id","invokeRazorPay","totalFinalPrice","CURRENCY","createdOrderResponse","prefillObject","Razorpay","Promise","resolve","reject","options","amount","order_id","orderId","name","handler","async","post","razorpayPaymentId","razorpay_payment_id","razorpaySignature","razorpay_signature","prefill","color","modal","ondismiss","Error","razorpay","on","errorCode","code","errorDescription","errorReason","reason","paymentId","metadata","payment_id","catch","processPurchasedPlan","status","startAt","endAt","old_purchased_amount","Number","updatedRecords","updatedRecord","usePurchasedPlans","useContext","loadPurchasedPlans","useCallback","forceLoad","ff_enable_paid_subscription","purchasedPlans","get","reverse","isActiveOrgFreePlan","active_purchased_plan","isUserFreePlan","RequireAuth","loading","setLoading","location","useLocation","setTimeout","featuresFlg","sessionResponse","isAuthed","sessionInfo","user","fname","lname","mobNo","ff_enable_teams","orgsRes","fetchedOrgs","activeOrgId","lastSelectedOrg","org","subscriptionConfigResponse","fetchData","pathname","includes","Navigate","to","state","Auth","lazy","LoginForm","RegistrationForm","Dashboard","NotFound","ForgotPasswordForm","OrgSetup","CreateOrg","JoinOrg","OrgRootLayout","ManageOrgs","PricingTbl","then","PricingPg","m","default","SubscriptionMgmt","Checkout","PaymentHistory","GeneralSettingsPg","Routes","appRoutes","publicRoutes","router","createBrowserRouter","path","element","Component","canShowHeader","index","Suspense","fallback","RouterProvider","Dialog","DialogPrimitive","Root","DialogTrigger","Trigger","DialogPortal","Portal","DialogClose","Close","DialogOverlay","Overlay","DialogContent","showCloseButton","Content","XIcon","DialogHeader","DialogFooter","DialogTitle","Title","DialogDescription","Description","buttonVariants","cva","variants","variant","destructive","outline","secondary","ghost","link","linkNoUnderline","size","sm","lg","defaultVariants","InnerButton","asChild","Comp","Slot","Button","disabled","DialogWrapper","setIsOpen","actionsJSX","disableOutsideClick","dlgContentClsName","onOpenChange","isOpen","onPointerDownOutside","e","preventDefault","useAlertDialog","appLevelContext","showAlertBox","newOptions","closeAlertBox","showAlertDlgPromise","onClose","AlertDialog","dlg","closeDlg","_Fragment","onClick","ROLES","READ","ADMIN","WRITE","Is_ADMIN","roleId","CAN_WRITE","CAN_READ","DISPLAY_TEXT","IS_VALID_ROLE_ID","GET_LIST","toString","Table","TableHeader","TableBody","TableRow","TableHead","TableCell","TableCaption","Card","CardHeader","CardTitle","CardDescription","CardContent","Input","Label","LabelPrimitive","Select","SelectPrimitive","SelectValue","Value","SelectTrigger","Icon","ChevronDownIcon","SelectContent","SelectScrollUpButton","Viewport","SelectScrollDownButton","SelectItem","Item","ItemIndicator","CheckIcon","ItemText","ScrollUpButton","ChevronUpIcon","ScrollDownButton","Sheet","SheetPrimitive","SheetPortal","SheetOverlay","SheetContent","side","SheetHeader","SheetTitle","SheetDescription","Switch","SwitchPrimitive","Thumb","TooltipProvider","delayDuration","TooltipPrimitive","Provider","Tooltip","TooltipTrigger","TooltipContent","sideOffset","Arrow","badgeVariants","failure","Badge","Separator","orientation","decorative","SeparatorPrimitive","DropdownMenu","DropdownMenuPrimitive","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuGroup","Group","DropdownMenuItem","inset","DropdownMenuCheckboxItem","checked","CheckboxItem","DropdownMenuLabel","DropdownMenuSeparator","Textarea","Tabs","TabsPrimitive","tabsListVariants","line","TabsList","List","TabsTrigger","LoadingMask","FlexColsLayout","layout","doNotAppendFlex1","responsive","layoutCls","flex1","container","cls","loadingCls","useIsMobile","isMobile","setIsMobile","React","mql","onChange","innerWidth","addEventListener","removeEventListener","Toolbar","leftItems","centerItems","rightItems","dialogOpen","setDialogOpen","allMenuItems","minHeight","Menu","item","idx","DataTableToolbar","table","canShowSearchField","searchFieldConfig","canShowColumnsBtn","additionalJSX","rawColumns","refreshBtn","canShow","getColumnById","col","searchField","placeholder","getColumn","getFilterValue","event","column","setFilterValue","target","RefreshCcw","ChevronDown","align","getAllColumns","getCanHide","enableHiding","getIsVisible","onCheckedChange","toggleVisibility","headerText","Pagination","role","PaginationContent","PaginationItem","PaginationLink","isActive","PaginationPrevious","ChevronLeftIcon","PaginationNext","ChevronRightIcon","PaginationEllipsis","MoreHorizontalIcon","PaginationWrapper","totalCount","activePage","pageSize","onPageChange","totalPages","useMemo","ceil","handleOnPageChange","newPageNo","disabledCls","paginationArr","pageNo","ellipse","Fragment","DataTablePagination","pagination","pageIndex","setPageIndex","DataTable$1","memo","columns","actions","toolbarConfig","canShowToolbar","canShowPagination","sorting","setSorting","columnFilters","setColumnFilters","columnVisibility","setColumnVisibility","rowSelection","setRowSelection","tableColumns","columnRec","accessorKey","enableSorting","toggleSorting","getIsSorted","ArrowUpDown","cell","row","cellValue","getValue","renderer","Check","X","unshift","record","original","MoreHorizontal","menuAction","setPagination","useReactTable","onSortingChange","onColumnFiltersChange","getCoreRowModel","getSortedRowModel","getFilteredRowModel","onColumnVisibilityChange","onRowSelectionChange","getPaginationRowModel","onPaginationChange","getHeaderGroups","headerGroup","isPlaceholder","flexRender","columnDef","getContext","getRowModel","rows","getIsSelected","getVisibleCells","colSpan","TabularLayout","child","rowCls","leftCls","rightCls","TypographyHeading","TypographyP","Accordion","AccordionPrimitive","AccordionItem","AccordionTrigger","Header","AccordionContent","AccordionWrapper","collapsible","LocalEmptySpan","LinkWrapper","removeAllStyles","CustomComponent","NavLink","systemCls","BigSquare","toPath","HeaderText","InfoButton","tabIndex","InfoIcon","ListPanel","control","labelCls","PremiumHighlighter","Crown","strokeWidth","SelectListWrapper","onValueChange","triggerClassName","valueField","labelField","newValue","TooltipWrapper","content","rootProps","contentProps","triggerProps","canShowTooltip","triggerOn","setOpen","triggerComponentRef","useRef","closeTooltip","current","contains","isTooltipTriggerClicked","ref","onEscapeKeyDown","SlashMenuItem","label","shortcut","stopPropagation","useFetchData","setResponse","lResponse","Outlet","emailField","navigate","useNavigate","isPending","startTransition","useTransition","turnstileToken","setTurnstileToken","turnstileRef","navigateTo","search","hash","gridCls","focus","onSubmit","currentTarget","reqObj","username","reset","htmlFor","required","Turnstile","siteKey","onSuccess","token","PasswordPolicyIBtn","SendOTP","handleOnOTPSent","hidden","useImperativeHandle","sendOTP","InputOTP","containerClassName","OTPInput","InputOTPGroup","InputOTPSlot","inputOTPContext","OTPInputContext","char","hasFakeCaret","slots","InputOTPField","inputOTPField","otp","setOtp","onChangeEmailClick","secondLeft","initialSeconds","secondsLeft","setSecondsLeft","timer","clearTimeout","useCountdown","maxLength","sendOTPCmp","inputOTPFieldRef","isOTPGenerated","setIsOTPGenerated","setEmail","reSendOTP","isValid","user_password","Collapsible","CollapsiblePrimitive","CollapsibleTriggerWrapper","isCollapsible","CollapsibleTrigger","CollapsibleContent","SidebarContext","useSidebar","context","SidebarProvider","defaultOpen","openProp","setOpenProp","openMobile","setOpenMobile","_open","_setOpen","openState","cookie","toggleSidebar","handleKeyDown","metaKey","ctrlKey","contextValue","Sidebar","SidebarTrigger","PanelLeftIcon","SidebarRail","SidebarInset","SidebarHeader","SidebarFooter","SidebarContent","SidebarGroup","SidebarGroupLabel","SidebarMenu","SidebarMenuItem","sidebarMenuButtonVariants","SidebarMenuButton","isExpanded","tooltip","button","SidebarMenuSub","SidebarMenuSubItem","SidebarMenuSubButton","NavMain","navItems","currentPath","getModuleLink","selectedItemCls","getSidebarMenuBtn","sidebarMenuBtn","ChevronRight","hasSelectedSubItem","some","subItem","Avatar","AvatarPrimitive","AvatarImage","Image","AvatarFallback","Fallback","UserAccount","isDialogOpen","setIsDialogOpen","saving","setSaving","userData","setUserData","setFormData","fetchUserData","created_at","toISOString","updated_at","handleInputChange","field","prev","reqBody","put","toLocaleString","NavUser","avatar","fullName","isAccountDialogOpen","setIsAccountDialogOpen","src","alt","toLocaleUpperCase","ChevronsUpDown","CircleUserRound","Sparkle","BadgeCheck","CreditCard","LogOut","PremiumIcon","purchasedPlan","plans","p","isFree","toLocaleLowerCase","OrgSwitcher","Users2","isAdmin","role_id","NaN","UserRoundPlus","Pen","addTopSeparator","Plus","FolderKanban","rec","getOrgSpecificOptions","AppHeader","AppSidebar","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbPage","BreadcrumbSeparator","AppBreadcrumb","selectedNavItem","useSelectedNavItem","getBreadcrumbItem","isRoot","flat","useOrgHelper","editOrganization","handleOnDeleteUnregisteredUser","orgId","reqData","delete","isActiveOrgCreatedByMe","UpgradeToPro","onBtnClick","ResentForm","resetFormCmp","RolesCmb","setValue","canAllowEmailEdit","editingRowId","IncludedUsers","teamMembers","setTeamMembers","inactiveUsers","processedEmailsTextArea","setProcessedEmailsTextArea","bulkRole","setBulkRole","setEditingRowId","isBulkWindowOpen","setIsBulkWindowOpen","singleRecFields","setSingleRecFields","addUniqueTeamMembers","tMembers","uniqueEmails","newTeamMembers","tMemberRec","emailKey","validateFields","teamMemberRec","newVal","val","recordWithSameEmail","DataTable","Files","editable","_","rowId","Pencil","Trash","useParams","setId","canShowTeamMembers","setCanShowTeamMembers","unregisteredUsers","setUnregisteredUsers","setInactiveUsers","areTeamMembersLoading","setAreTeamMembersLoading","initializedTeamMembers","unregisteredUserLoading","setUnregisteredUsersLoading","orgRecord","isEditMode","convertServerToLocalFields","members","joinedOn","joined_on","responseTeamMembers","orgMembers","is_active","unregistered","inactiveUsers_deleted","structuredClone","fetchTeamMembers","defaultOrgName","newRecord","oldData","putData","res","postData","insertedOrgId","handleSuccess","isTeamMemberAdded","initialValues","needToRemoveTeamMembers","reqParams","users","needToUpdate","needToNewAddTeamMembers","included_users","defaultValue","autoFocus","copyUsers","splice","fetchingInvitations","invitationsResponse","invitations","invites","isSaving","setIsSaving","respondToInvitation","selectedOption","reqJson","sent_at","contentJSX","buttonGroupVariants","horizontal","vertical","ButtonGroup","forceOrgJoin","ArrowLeft","reloadData","RadioGroup","RadioGroupPrimitive","RadioGroupItem","Indicator","CircleIcon","sectionVariants","small","medium","large","minimal","classic","titleVariants","descriptionVariants","cardVariants","highlight","true","false","compoundVariants","toggleVariants","priceTextVariants","featureIconVariants","defaultIcons","starter","Package","pro","Award","enterprise","Building2","PricingTableFour","subtitle","onPlanSelect","showBillingToggle","billingToggleLabels","monthly","yearly","isAnnually","setIsAnnually","uniqueId","useId","calculateDiscount","monthlyPrice","yearlyPrice","parseFloat","isNaN","discount","round","yearlyPriceDiscount","max","motion","div","initial","opacity","y","animate","transition","duration","delay","ease","badge","planId","AnimatePresence","mode","exit","handlePlanSelect","buttonText","features","feature","featureIndex","li","x","faqs","isYearly","faq","question","answer","href","CancelSubscriptionDialog","triggerButtonText","leftPanelImageUrl","warningTitle","warningText","keepButtonText","continueButtonText","finalTitle","finalSubtitle","finalWarningText","goBackButtonText","confirmButtonText","onCancel","onKeepSubscription","onDialogClose","showConfirmation","setShowConfirmation","isLoading","setIsLoading","setError","handleDialogClose","slice","Circle","err","Toggle","TogglePrimitive","easing","UpdatePlanDialog","currentPlan","onPlanChange","triggerText","setIsYearly","selectedPlan","setSelectedPlan","getCurrentPrice","handlePlanChange","handleOpenChange","pressed","onPressedChange","scrollbarWidth","scrollbarColor","onKeyDown","height","SubscriptionManagement","cancelSubscription","updatePlan","canShowUpdatePlanBtn","addMoreBtnProps","canShowCancelPlanBtn","price","Calendar","startDate","expiryDate","activePlanFor","paidAmount","paymentMethod","transactionId","buttonProps","MoveUpRight","UpcomingPlans","upcomingPlans","badgeText","z_currency","LogIn","for_no_users","for_months","z_order_id","PaymentSuccessDialog","forwardRef","currencySymbol","productName","proceedButtonText","backButtonText","onProceed","onBack","isControlled","internalOpen","setInternalOpen","setOpenState","close","confettiActive","setConfettiActive","t","confetti","pieces","colors","startX","random","drift","xEnd","min","rotation","colorVar","background","scale","CheckCircle2","span","repeat","Infinity","stiffness","damping","c","left","top","width","backgroundColor","rotate","AddMoreUsersDialog","purchasePlanId","CURRENCY_SYMBOL","numberOfUsers","setNumberOfUsers","isTransitionGoingOn","useRazorpay","paymentSuccessDialogOpen","setPaymentSuccessDialogOpen","purchased_id","planConfig","calculatedAmount","contact","toFixed","activePurchasedPlan","purchasePlan","historyPlans","freePlan","z_payment_method","orderIds","join","log","maxUserRequired","GalleryVerticalEnd","History","alertVariants","Alert","AlertTitle","AlertDescription","searchParams","useSearchParams","selectedPlanId","selectedBilling","countries","setCountries","saved","parsed","JSON","parse","lCountries","stringify","useCountries","isPaymentLoading","setPaymentLoading","selectedPlanRecord","minUserRequired","billingPeriod","setBillingPeriod","teamSize","setTimeSize","teamSizeForCalculation","planAmount","largeAmountMonths","monthlyPlanAmount","subTotal","billingDetails","country","address","mobileNo","AlertCircleIcon","planDisplayCost","validationErrors","errors","details","validateBillingDetails","values","billing_name","billing_email","billing_contact_no","billing_address","billing_country","billerInfo","ArrowRight","InvoiceHistory","invoices","onDownload","statusBadge","ReceiptText","inv","CalendarDays","invoiceUrl","Download","invoiceItem","purchased_at","old_purchased_for_no_users","sort","a","b","getTime","ThemeCmb","SquareArrowOutUpRight","copyText","copied","setCopied","readOnly","navigator","clipboard","writeText","handleCopy","Copy","onItemSelect","selectedRec","setSelectedRec","RadioItem","Sub","SubContent","SubTrigger","onAICall","classNameRoot","classNameEditor","enableSlashMenu","canShowAIOptions","readingMode","fetchAndUpdateLinkMetadata","editor","markerId","chain","insertContent","run","encodeURIComponent","image","foundPos","nodeSize","doc","descendants","node","pos","isText","marks","attrs","deleteRange","useEditor","extensions","StarterKit","configure","heading","levels","Underline","Link","extend","inclusive","addAttributes","parseHTML","getAttribute","renderHTML","attributes","HTMLAttributes","dataImage","dataDescription","rest","mergedAttrs","mergeAttributes","openOnClick","autolink","Placeholder","emptyEditorClass","BubbleMenuExtension","FloatingMenuExtension","onUpdate","getHTML","editorProps","class","handlePaste","clipboardData","getData","URL","protocol","isUrl","commands","setContent","setEditable","isLinkEditorOpen","setIsLinkEditorOpen","linkInput","setLinkInput","handleAIAction","selection","selectedText","textBetween","fullText","getText","setLink","extendMarkRange","unsetLink","startsWith","empty","handleLinkClick","previousUrl","getAttributes","getMenuButtonClass","active","BubbleMenu","tippyOptions","animation","onHidden","toggleBold","Bold","toggleItalic","Italic","toggleUnderline","UnderlineIcon","LinkIcon","toggleBulletList","toggleBlockquote","Quote","Sparkles","FloatingMenu","placement","offset","shouldShow","$from","currentLine","nodeBefore","parentOffset","toggleHeading","level","Heading1","Heading2","toggleOrderedList","ListOrdered","EditorContent","setActiveOrgHandler","tabs","tab","TabsContent","isDirty","setDirty","blocker","useBlocker","returnValue","proceed","func","timeout","args","apply","diffInMs","diffInHours","diffInDays","toLocaleDateString","assign","info","newRoles","millSecs"],"mappings":"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"}