@strapi-community/plugin-better-auth-dashboard 1.0.0-alpha.5 → 1.0.0-alpha.7

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Root-BUuPFmkA.js","sources":["../../admin/src/client.ts","../../admin/src/hooks/useDashConfig.ts","../../admin/src/components/ConfirmDialog.tsx","../../admin/src/utils/dashContext.ts","../../admin/src/components/Drawer.tsx","../../admin/src/components/FormPrimitives.tsx","../../admin/src/components/MediaPickerField.tsx","../../admin/src/components/UserCombobox.tsx","../../admin/src/pages/Organizations/CreateOrganizationDialog.tsx","../../admin/src/components/RelationField.tsx","../../admin/src/components/DynamicField.tsx","../../admin/src/components/EditViewSidePanels.tsx","../../admin/src/hooks/useModelSchema.ts","../../admin/src/pages/Organizations/OrganizationDetail.tsx","../../admin/src/pages/Organizations/index.tsx","../../admin/src/components/Avatar.tsx","../../admin/src/pages/Overview/index.tsx","../../admin/src/hooks/useUsers.ts","../../admin/src/pages/Users/CreateUserDialog.tsx","../../admin/src/pages/Users/UserDetailDrawer.tsx","../../admin/src/pages/Users/index.tsx","../../admin/src/pages/App.tsx","../../admin/src/pages/Root.tsx"],"sourcesContent":["import type { dash } from \"@better-auth/infra\";\nimport { dashClient } from \"@better-auth/infra/client\";\nimport { createAuthClient, InferPlugin } from \"better-auth/client\";\n\n// better-auth's proxy defaults to GET when the request body is empty.\n// This plugin declares the correct method for all /dash/ POST endpoints so the\n// proxy never has to guess — avoiding the need for { fetchOptions: { method: \"POST\" } }\n// workarounds at each call site.\nconst dashPathMethods = (): {\n id: string;\n pathMethods: Record<string, \"GET\" | \"POST\">;\n} => ({\n id: \"dash-path-methods\",\n pathMethods: {\n \"/dash/organization/directory/create\": \"POST\",\n \"/dash/organization/directory/delete\": \"POST\",\n \"/dash/organization/directory/regenerate-token\": \"POST\",\n \"/dash/execute-adapter\": \"POST\",\n \"/dash/complete-invitation\": \"POST\",\n \"/dash/check-user-exists\": \"POST\",\n \"/dash/organization/invite-member\": \"POST\",\n \"/dash/organization/check-user-by-email\": \"POST\",\n \"/dash/organization/cancel-invitation\": \"POST\",\n \"/dash/organization/resend-invitation\": \"POST\",\n \"/dash/organization/add-member\": \"POST\",\n \"/dash/organization/remove-member\": \"POST\",\n \"/dash/organization/update-member-role\": \"POST\",\n \"/dash/organization/delete\": \"POST\",\n \"/dash/organization/delete-many\": \"POST\",\n \"/dash/organization/create\": \"POST\",\n \"/dash/organization/update\": \"POST\",\n \"/dash/organization/update-team\": \"POST\",\n \"/dash/organization/delete-team\": \"POST\",\n \"/dash/organization/create-team\": \"POST\",\n \"/dash/organization/add-team-member\": \"POST\",\n \"/dash/organization/remove-team-member\": \"POST\",\n \"/dash/sessions/revoke\": \"POST\",\n \"/dash/sessions/revoke-all\": \"POST\",\n \"/dash/sessions/revoke-many\": \"POST\",\n \"/dash/organization/:id/sso-provider/create\": \"POST\",\n \"/dash/organization/:id/sso-provider/update\": \"POST\",\n \"/dash/organization/:id/sso-provider/request-verification-token\": \"POST\",\n \"/dash/organization/:id/sso-provider/verify-domain\": \"POST\",\n \"/dash/organization/:id/sso-provider/delete\": \"POST\",\n \"/dash/organization/:id/sso-provider/mark-domain-verified\": \"POST\",\n \"/dash/enable-two-factor\": \"POST\",\n \"/dash/view-two-factor-totp-uri\": \"POST\",\n \"/dash/view-backup-codes\": \"POST\",\n \"/dash/disable-two-factor\": \"POST\",\n \"/dash/generate-backup-codes\": \"POST\",\n \"/dash/delete-user\": \"POST\",\n \"/dash/delete-many-users\": \"POST\",\n \"/dash/create-user\": \"POST\",\n \"/dash/set-password\": \"POST\",\n \"/dash/unlink-account\": \"POST\",\n \"/dash/update-user\": \"POST\",\n \"/dash/ban-user\": \"POST\",\n \"/dash/ban-many-users\": \"POST\",\n \"/dash/unban-user\": \"POST\",\n \"/dash/send-verification-email\": \"POST\",\n \"/dash/send-many-verification-emails\": \"POST\",\n \"/dash/send-reset-password-email\": \"POST\",\n },\n});\n\nconst STORAGE_KEYS = {\n TOKEN: \"jwtToken\",\n USER: \"userInfo\",\n};\n\n/**\n * Retrieves the value of a specified cookie.\n */\nexport const getCookieValue = (name: string): string | null => {\n let result = null;\n const cookieArray = document.cookie.split(\";\");\n cookieArray.forEach((cookie) => {\n const [key, value] = cookie.split(\"=\").map((item) => item.trim());\n if (key === name) {\n result = decodeURIComponent(value);\n }\n });\n return result;\n};\n\nexport const getToken = (): string | null | undefined => {\n const fromLocalStorage = localStorage.getItem(STORAGE_KEYS.TOKEN);\n if (fromLocalStorage) {\n return JSON.parse(fromLocalStorage) as string;\n }\n\n const fromCookie = getCookieValue(STORAGE_KEYS.TOKEN);\n return fromCookie ?? null;\n};\n\nexport function getAuthHeaders(): Record<string, string> {\n const token = getToken();\n return token ? { Authorization: `Bearer ${token}` } : {};\n}\n\n/**\n * Better Auth client pointed at the admin proxy (/auth).\n *\n * Auth is handled at the route level (Strapi JWT in Authorization header).\n * InferPlugin<ReturnType<typeof dash>> exposes all server-side dash() endpoints\n * with full TypeScript type inference.\n *\n * For endpoints that need JWT context (userId, organizationId, etc.), use the\n * withContext() helper from utils/dashContext.ts as the second argument.\n */\nexport const client = createAuthClient({\n baseURL: window.location.origin,\n basePath: \"/auth\",\n plugins: [\n dashClient(),\n dashPathMethods(),\n InferPlugin<ReturnType<typeof dash>>(),\n ],\n fetchOptions: {\n headers: getAuthHeaders(),\n },\n});\n","import { useQuery } from \"react-query\";\nimport { client } from \"../client\";\n\ntype RawConfig = Awaited<ReturnType<typeof client.dash.config>>;\nexport type DashConfig = NonNullable<RawConfig[\"data\"]>;\n\nexport function useDashConfig() {\n return useQuery<DashConfig, Error>({\n queryKey: [\"dash-config\"],\n queryFn: async () => {\n const result = await client.dash.config();\n if (result.error) {\n throw new Error(result.error.message ?? \"Failed to load config\");\n }\n return result.data as DashConfig;\n },\n staleTime: 5 * 60 * 1000,\n });\n}\n\n/**\n * Returns whether a plugin with the given ID is installed.\n */\nexport function hasPlugin(config: DashConfig | undefined, id: string): boolean {\n return config?.plugins.some((p: { id: string }) => p.id === id) ?? false;\n}\n","import { Button, Modal, Typography } from \"@strapi/design-system\";\n\ninterface ConfirmDialogProps {\n title: string;\n message: string;\n confirmLabel?: string;\n variant?: \"danger\" | \"default\";\n loading?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({\n title,\n message,\n confirmLabel = \"Confirm\",\n variant = \"danger\",\n loading = false,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n return (\n <Modal.Root\n defaultOpen\n onOpenChange={(open: boolean) => !open && onCancel()}\n >\n <Modal.Content>\n <Modal.Header>\n <Typography variant=\"beta\" tag=\"h2\">\n {title}\n </Typography>\n </Modal.Header>\n <Modal.Body>\n <Typography variant=\"omega\">{message}</Typography>\n </Modal.Body>\n <Modal.Footer>\n <Button variant=\"tertiary\" onClick={onCancel} disabled={loading}>\n Cancel\n </Button>\n <Button variant={variant} loading={loading} onClick={onConfirm}>\n {confirmLabel}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n );\n}\n","/**\n * Dash JWT context separation utilities.\n *\n * The dash() server plugin validates certain fields (userId, organizationId, etc.)\n * from the JWT payload via its jwtMiddleware, not from the request body.\n * To keep the HTTP payload clean, we encode these context fields in a dedicated\n * header so the auth-controller can inject them into the signed JWT separately.\n */\n\nexport const DASH_CONTEXT_HEADER = \"X-Dash-Context\";\n\n/**\n * Fields that the dash() jwtMiddleware reads from the JWT payload.\n * These are never part of the HTTP request body.\n */\nexport interface DashContext {\n userId?: string;\n sessionId?: string;\n organizationId?: string;\n memberId?: string;\n skipDefaultTeam?: boolean;\n}\n\n/**\n * Returns second-argument options for a better-auth client call that encode\n * the given context fields into the X-Dash-Context header.\n *\n * @example\n * // Fetching a specific user\n * await client.getDashUser({}, withContext({ userId }));\n *\n * @example\n * // Creating an org on behalf of a user\n * await client.createDashOrganization(\n * { name, slug },\n * withContext({ userId, skipDefaultTeam: false }),\n * );\n */\n/**\n * Returns a ClientFetchOption-shaped object (second arg to client methods)\n * that encodes the given context fields into the X-Dash-Context header.\n *\n * @example\n * await client.dash.user({}, withContext({ userId }));\n * await client.dash.organization.create({ name, slug }, withContext({ userId }));\n * // Combine with URL params:\n * await client.dash.organization[\":id\"]({}, { ...withContext({ organizationId }), params: { id: organizationId } });\n */\nexport const withContext = (ctx: DashContext) => ({\n headers: {\n [DASH_CONTEXT_HEADER]: btoa(JSON.stringify(ctx)),\n },\n});\n","import {\n Box,\n Flex,\n IconButton,\n Portal,\n Typography,\n} from \"@strapi/design-system\";\nimport { Cross } from \"@strapi/icons\";\nimport type { ReactNode } from \"react\";\nimport { useEffect } from \"react\";\nimport styled, { keyframes } from \"styled-components\";\n\nconst slideIn = keyframes`\n from { transform: translateX(100%); opacity: 0.6; }\n to { transform: translateX(0); opacity: 1; }\n`;\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`;\n\nconst Overlay = styled.div`\n position: absolute;\n inset: 0;\n background: rgba(33, 33, 52, 0.4);\n animation: ${fadeIn} 180ms ease;\n`;\n\nconst Panel = styled.div`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: min(760px, 95vw);\n display: flex;\n flex-direction: column;\n background: white;\n box-shadow: -8px 0 40px rgba(33, 33, 52, 0.18);\n animation: ${slideIn} 220ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n`;\n\ninterface DrawerProps {\n title: ReactNode;\n children: ReactNode;\n footer?: ReactNode;\n onClose: () => void;\n \"data-testid\"?: string;\n}\n\nexport function Drawer({\n title,\n children,\n footer,\n onClose,\n \"data-testid\": testId,\n}: DrawerProps) {\n useEffect(() => {\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }, []);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n return (\n <Portal>\n <div style={{ position: \"fixed\", inset: 0, zIndex: 200 }}>\n <Overlay onClick={onClose} aria-hidden=\"true\" />\n <Panel data-testid={testId}>\n <Flex\n justifyContent=\"space-between\"\n alignItems=\"center\"\n paddingTop={5}\n paddingBottom={5}\n paddingLeft={6}\n paddingRight={6}\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"0 0 1px 0\"\n style={{ flexShrink: 0 }}\n >\n <Typography variant=\"beta\" tag=\"h2\">\n {title}\n </Typography>\n <IconButton label=\"Close panel\" onClick={onClose}>\n <Cross />\n </IconButton>\n </Flex>\n\n <Box\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={6}\n paddingRight={6}\n style={{ flex: 1, overflowY: \"auto\" }}\n >\n {children}\n </Box>\n\n {footer && (\n <Flex\n justifyContent=\"flex-end\"\n gap={2}\n paddingTop={4}\n paddingBottom={4}\n paddingLeft={6}\n paddingRight={6}\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"1px 0 0 0\"\n style={{ flexShrink: 0 }}\n >\n {footer}\n </Flex>\n )}\n </Panel>\n </div>\n </Portal>\n );\n}\n","import styled from \"styled-components\";\n\n/** Subtle background card for grouping related form fields */\nexport const FormSection = styled.div`\n width: 100%;\n background: #f6f6f9;\n border-radius: 8px;\n padding: 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 14px;\n`;\n\n/**\n * Two-column edit layout: main form on the left, sidebar details on the right.\n * Used inside drawer tabs where fields and metadata sit side by side.\n */\nexport const EditLayout = styled.div`\n display: grid;\n grid-template-columns: minmax(0, 1fr) 256px;\n gap: 28px;\n align-items: start;\n padding-top: 24px;\n`;\n\n/** Right-hand sidebar inside an EditLayout */\nexport const EditSidebar = styled.div`\n display: flex;\n flex-direction: column;\n gap: 20px;\n position: sticky;\n top: 0;\n`;\n\n/** Small uppercase label for a form section */\nexport const SectionLabel = styled.p`\n font-size: 11px;\n font-weight: 700;\n color: #8e8ea9;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin: 0 0 4px;\n`;\n\n/** Subtle grid card for read-only metadata */\nexport const MetaCard = styled.div`\n background: #f6f6f9;\n border-radius: 8px;\n padding: 16px;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n`;\n\nexport const MetaItem = styled.div`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\nexport const MetaKey = styled.span`\n font-size: 11px;\n font-weight: 600;\n color: #8e8ea9;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n`;\n\nexport const MetaVal = styled.span`\n font-size: 13px;\n color: #32324d;\n`;\n\n/** Monospaced ID chip */\nexport const MonoChip = styled.code`\n display: inline;\n font-size: 11px;\n color: #4945ff;\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n word-break: break-all;\n background: #f0f0ff;\n padding: 2px 6px;\n border-radius: 3px;\n`;\n\n/** Inline badge for showing a provider name */\nexport const ProviderBadge = styled.span`\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n background: #f0f0ff;\n border: 1px solid #d9d8ff;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 600;\n color: #4945ff;\n text-transform: capitalize;\n`;\n\n/** Warning/danger info card */\nexport const WarnCard = styled.div`\n background: #fcecea;\n border: 1px solid #f5c0b8;\n border-radius: 8px;\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\n/** Success info card */\nexport const SuccessCard = styled.div`\n background: #eafbe7;\n border: 1px solid #c6efbd;\n border-radius: 8px;\n padding: 14px 16px;\n`;\n\n/** Preview pill — e.g. for expiry dates */\nexport const PreviewPill = styled.div`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #fff3d3;\n border: 1px solid #f5d97f;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 500;\n color: #8e6a00;\n width: fit-content;\n`;\n\n/** Linked account row */\nexport const AccountRow = styled.div`\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n background: white;\n border: 1px solid #dcdce4;\n border-radius: 8px;\n gap: 12px;\n`;\n\n/** Danger-tinted row for destructive actions */\nexport const DangerRow = styled(AccountRow)`\n background: #fef8f8;\n border-color: #f5c0b8;\n`;\n\n/** Role badge for organization memberships */\nexport const RoleBadge = styled.span<{ $role?: string }>`\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n text-transform: capitalize;\n background: ${(p) =>\n p.$role === \"owner\"\n ? \"#f0f0ff\"\n : p.$role === \"admin\"\n ? \"#eafbe7\"\n : \"#f5f5f9\"};\n border: 1px solid\n ${(p) =>\n p.$role === \"owner\"\n ? \"#d9d8ff\"\n : p.$role === \"admin\"\n ? \"#c6efbd\"\n : \"#dcdce4\"};\n color: ${(p) =>\n p.$role === \"owner\"\n ? \"#4945ff\"\n : p.$role === \"admin\"\n ? \"#2e8044\"\n : \"#666687\"};\n`;\n","import { Button, Field, Flex, TextInput } from \"@strapi/design-system\";\nimport { Images } from \"@strapi/icons\";\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport {\n getMediaLibraryComponent,\n type StrapiMediaFile,\n} from \"../utils/strapiApp\";\n\ninterface Props {\n label: string;\n value: string;\n onChange: (url: string) => void;\n hint?: string;\n placeholder?: string;\n name?: string;\n required?: boolean;\n}\n\nexport function MediaPickerField({\n label,\n value,\n onChange,\n hint,\n placeholder,\n name,\n required,\n}: Props) {\n const [showMedia, setShowMedia] = useState(false);\n const MediaLibraryDialog = getMediaLibraryComponent();\n\n const handleSelect = (assets: StrapiMediaFile[]) => {\n const asset = assets[0];\n if (!asset) return;\n const url =\n asset.formats?.small?.url ?? asset.formats?.thumbnail?.url ?? asset.url;\n onChange(url);\n setShowMedia(false);\n };\n\n return (\n <>\n <Field.Root style={{ width: \"100%\" }} hint={hint} required={required}>\n <Field.Label>{label}</Field.Label>\n <Flex gap={2} alignItems=\"center\">\n <div style={{ flex: 1, minWidth: 0 }}>\n <TextInput\n name={name}\n type=\"url\"\n value={value}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n onChange(e.target.value)\n }\n placeholder={placeholder}\n style={{ width: \"100%\" }}\n />\n </div>\n {MediaLibraryDialog && (\n <Button\n variant=\"secondary\"\n size=\"S\"\n startIcon={<Images />}\n onClick={() => setShowMedia(true)}\n style={{ flexShrink: 0 }}\n >\n Browse\n </Button>\n )}\n </Flex>\n {hint && <Field.Hint />}\n </Field.Root>\n\n {showMedia && MediaLibraryDialog && (\n <MediaLibraryDialog\n allowedTypes={[\"images\"]}\n multiple={false}\n onClose={() => setShowMedia(false)}\n onSelectAssets={handleSelect}\n />\n )}\n </>\n );\n}\n","import { Combobox, ComboboxOption, Field } from \"@strapi/design-system\";\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport { useQuery } from \"react-query\";\nimport { client } from \"../client\";\n\ninterface UserComboboxProps {\n label?: string;\n hint?: string;\n placeholder?: string;\n value: string;\n onChange: (userId: string) => void;\n error?: string;\n required?: boolean;\n}\n\nexport function UserCombobox({\n label = \"User\",\n hint,\n placeholder = \"Search users by email or name…\",\n value,\n onChange,\n error,\n required,\n}: UserComboboxProps) {\n const [search, setSearch] = useState(\"\");\n\n const { data, isLoading } = useQuery({\n queryKey: [\"user-combobox-search\", search],\n queryFn: async () => {\n const whereClause = search\n ? JSON.stringify([\n { field: \"email\", operator: \"contains\", value: search },\n ])\n : undefined;\n\n const result = await client.dash.listUsers({\n query: {\n limit: search ? 100 : 20,\n offset: 0,\n sortBy: \"createdAt\",\n sortOrder: \"desc\",\n ...(whereClause ? { where: whereClause } : {}),\n },\n });\n\n return result.data?.users ?? [];\n },\n keepPreviousData: true,\n });\n\n const users = data ?? [];\n\n return (\n <Field.Root hint={hint} error={error} style={{ width: \"100%\" }}>\n <Field.Label>{label}</Field.Label>\n <Combobox\n placeholder={placeholder}\n value={value}\n onChange={(val: string) => onChange(val)}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setSearch(e.target.value)\n }\n loading={isLoading}\n required={required}\n >\n {users.map((user) => (\n <ComboboxOption key={user.id} value={user.id}>\n {user.name} — {user.email}\n </ComboboxOption>\n ))}\n </Combobox>\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n}\n","import {\n Box,\n Button,\n Checkbox,\n Field,\n Flex,\n TextInput,\n Typography,\n} from \"@strapi/design-system\";\nimport { useNotification } from \"@strapi/strapi/admin\";\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport { useMutation, useQueryClient } from \"react-query\";\nimport { client } from \"../../client\";\nimport { Drawer } from \"../../components/Drawer\";\nimport { FormSection, SectionLabel } from \"../../components/FormPrimitives\";\nimport { MediaPickerField } from \"../../components/MediaPickerField\";\nimport { UserCombobox } from \"../../components/UserCombobox\";\nimport { withContext } from \"../../utils/dashContext\";\n\ninterface Props {\n teamsEnabled: boolean;\n onClose: () => void;\n}\n\nexport function CreateOrganizationDialog({ teamsEnabled, onClose }: Props) {\n const qc = useQueryClient();\n const { toggleNotification } = useNotification();\n\n const [name, setName] = useState(\"\");\n const [slug, setSlug] = useState(\"\");\n const [logo, setLogo] = useState(\"\");\n const [ownerId, setOwnerId] = useState(\"\");\n const [skipDefaultTeam, setSkipDefaultTeam] = useState(false);\n const [defaultTeamName, setDefaultTeamName] = useState(\"\");\n\n const createMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.organization.create(\n {\n name,\n slug,\n ...(logo ? { logo } : {}),\n ...(teamsEnabled && !skipDefaultTeam && defaultTeamName\n ? { defaultTeamName }\n : {}),\n },\n withContext({ userId: ownerId, skipDefaultTeam }),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Create failed\");\n return result.data;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: [\"dash-organizations\"] });\n toggleNotification({\n type: \"success\",\n message: \"Organization created successfully\",\n });\n onClose();\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to create organization\",\n });\n },\n });\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setName(val);\n if (!slug || slug === slugify(name)) {\n setSlug(slugify(val));\n }\n };\n\n const footer = (\n <>\n <Button variant=\"tertiary\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n loading={createMutation.isLoading}\n disabled={!name || !slug || !ownerId}\n onClick={() => createMutation.mutate()}\n >\n Create organization\n </Button>\n </>\n );\n\n return (\n <Drawer title=\"Create organization\" footer={footer} onClose={onClose}>\n <Flex direction=\"column\" gap={5}>\n {/* Details */}\n <FormSection>\n <SectionLabel>Details</SectionLabel>\n <Field.Root style={{ width: \"100%\" }} required>\n <Field.Label>Name</Field.Label>\n <TextInput\n name=\"name\"\n value={name}\n onChange={handleNameChange}\n placeholder=\"Acme Corp\"\n />\n </Field.Root>\n <Field.Root style={{ width: \"100%\" }} hint=\"Used in URLs\" required>\n <Field.Label>Slug</Field.Label>\n <TextInput\n name=\"slug\"\n value={slug}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setSlug(e.target.value)\n }\n placeholder=\"acme-corp\"\n />\n <Field.Hint />\n </Field.Root>\n <MediaPickerField\n label=\"Logo URL\"\n name=\"logo\"\n value={logo}\n onChange={setLogo}\n placeholder=\"https://example.com/logo.png\"\n hint=\"Optional — publicly accessible image URL\"\n />\n </FormSection>\n\n {/* Owner */}\n <FormSection>\n <SectionLabel>Owner</SectionLabel>\n <UserCombobox\n label=\"Owner\"\n hint=\"The user who will own and manage this organization\"\n value={ownerId}\n onChange={setOwnerId}\n required\n />\n </FormSection>\n\n {/* Default team (only when teams are enabled) */}\n {teamsEnabled && (\n <FormSection>\n <SectionLabel>Default team</SectionLabel>\n <Checkbox\n name=\"skipDefaultTeam\"\n checked={skipDefaultTeam}\n onCheckedChange={(checked: boolean) =>\n setSkipDefaultTeam(checked)\n }\n >\n Don't create a default team\n </Checkbox>\n {!skipDefaultTeam && (\n <Field.Root style={{ width: \"100%\" }}>\n <Field.Label>Default team name</Field.Label>\n <TextInput\n name=\"defaultTeamName\"\n value={defaultTeamName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setDefaultTeamName(e.target.value)\n }\n placeholder=\"Leave blank to use the system default\"\n />\n </Field.Root>\n )}\n {skipDefaultTeam && (\n <Box>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Members can be added to teams manually after the organization\n is created.\n </Typography>\n </Box>\n )}\n </FormSection>\n )}\n </Flex>\n </Drawer>\n );\n}\n\nfunction slugify(str: string): string {\n return str\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n","import {\n Combobox,\n ComboboxOption,\n Field,\n Flex,\n IconButton,\n Typography,\n} from \"@strapi/design-system\";\nimport { Trash } from \"@strapi/icons\";\nimport { useFetchClient } from \"@strapi/strapi/admin\";\nimport type React from \"react\";\nimport { useRef, useState } from \"react\";\nimport { useQuery } from \"react-query\";\nimport styled from \"styled-components\";\nimport type { StrapiAttribute } from \"../hooks/useModelSchema\";\n\nconst EntryRow = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 12px;\n width: 100%;\n box-sizing: border-box;\n background: #ffffff;\n border: 1px solid ${({ theme }) => (theme as unknown as Record<string, Record<string, string>>).colors?.neutral200 ?? \"#dcdce4\"};\n border-radius: 4px;\n min-width: 0;\n`;\n\nfunction getDisplayLabel(doc: Record<string, unknown>): string {\n for (const key of [\"name\", \"title\", \"email\", \"username\", \"label\", \"slug\"]) {\n const v = doc[key];\n if (typeof v === \"string\" && v.trim()) return v;\n }\n return String(doc.documentId ?? doc.id ?? \"\");\n}\n\ninterface SelectedDoc {\n documentId: string;\n label: string;\n}\n\nfunction normalizeValue(\n val: unknown,\n cache: Map<string, string>,\n): SelectedDoc[] {\n if (!val) return [];\n\n // Strapi Document Service set-format written by this component on change\n if (\n typeof val === \"object\" &&\n !Array.isArray(val) &&\n val !== null &&\n \"set\" in val\n ) {\n const items = ((val as { set?: unknown[] }).set ?? []) as Array<{\n documentId?: string;\n }>;\n return items\n .filter((item) => item?.documentId)\n .map((item) => ({\n documentId: item.documentId!,\n label: cache.get(item.documentId!) ?? item.documentId!,\n }));\n }\n\n // Populated document(s) returned by the db-controller\n const items = Array.isArray(val) ? val : [val];\n return (items as unknown[])\n .filter(\n (item): item is Record<string, unknown> =>\n typeof item === \"object\" && item !== null && \"documentId\" in item,\n )\n .map((item) => ({\n documentId: String(item.documentId),\n label: getDisplayLabel(item),\n }));\n}\n\nexport interface RelationFieldProps {\n name: string;\n label: string;\n attribute: StrapiAttribute;\n value: unknown;\n onChange: (name: string, value: unknown) => void;\n readOnly?: boolean;\n}\n\nexport function RelationField({\n name,\n label,\n attribute,\n value,\n onChange,\n readOnly = false,\n}: RelationFieldProps) {\n const { get } = useFetchClient();\n const cache = useRef(new Map<string, string>());\n const [search, setSearch] = useState(\"\");\n // Key trick: remount the \"add\" combobox after each selection to clear its input\n const [addKey, setAddKey] = useState(0);\n\n const target = attribute.target ?? \"\";\n const relationType = attribute.relation ?? \"manyToOne\";\n const isMulti = relationType === \"oneToMany\" || relationType === \"manyToMany\";\n\n const currentDocs = normalizeValue(value, cache.current);\n const selectedIds = new Set(currentDocs.map((d) => d.documentId));\n\n const { data: searchResults = [], isLoading } = useQuery({\n queryKey: [\"relation-search\", target, search],\n queryFn: async () => {\n const params = new URLSearchParams({\n uid: target,\n \"pagination[pageSize]\": \"50\",\n });\n if (search) params.set(\"filters[name][$containsi]\", search);\n\n const { data } = await get<{ results: Record<string, unknown>[] }>(\n `/better-auth-dashboard/db?${params}`,\n );\n const docs =\n (data as { results?: Record<string, unknown>[] }).results ?? [];\n\n for (const doc of docs) {\n if (doc.documentId) {\n cache.current.set(String(doc.documentId), getDisplayLabel(doc));\n }\n }\n\n return docs\n .map((doc) => ({\n documentId: String(doc.documentId ?? \"\"),\n label: getDisplayLabel(doc),\n }))\n .filter((d) => d.documentId);\n },\n keepPreviousData: true,\n enabled: !readOnly,\n });\n\n // Exclude already-selected from the dropdown for both single and multi\n const availableOptions = searchResults.filter(\n (r) => !selectedIds.has(r.documentId),\n );\n\n const commit = (ids: string[]) => {\n onChange(name, { set: ids.map((id) => ({ documentId: id })) });\n };\n\n const handleSelect = (val: string) => {\n if (!val) return;\n const opt = searchResults.find((r) => r.documentId === val);\n if (opt) cache.current.set(val, opt.label);\n if (isMulti) {\n if (selectedIds.has(val)) return;\n commit([...currentDocs.map((d) => d.documentId), val]);\n } else {\n commit([val]);\n }\n setSearch(\"\");\n setAddKey((k) => k + 1);\n };\n\n const handleRemove = (docId: string) => {\n commit(\n currentDocs\n .filter((d) => d.documentId !== docId)\n .map((d) => d.documentId),\n );\n };\n\n return (\n <Field.Root style={{ width: \"100%\" }}>\n <Field.Label>{label}</Field.Label>\n {!readOnly && (\n <Combobox\n key={addKey}\n value=\"\"\n onChange={(val: string) => handleSelect(val)}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setSearch(e.target.value)\n }\n loading={isLoading}\n placeholder=\"Search…\"\n >\n {availableOptions.map((opt) => (\n <ComboboxOption key={opt.documentId} value={opt.documentId}>\n {opt.label}\n </ComboboxOption>\n ))}\n </Combobox>\n )}\n {currentDocs.length > 0 && (\n <Flex\n direction=\"column\"\n gap={1}\n style={{ marginTop: 8, width: \"100%\" }}\n >\n {currentDocs.map((doc) => (\n <EntryRow key={doc.documentId}>\n <Typography\n variant=\"omega\"\n textColor=\"neutral800\"\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n minWidth: 0,\n }}\n >\n {doc.label}\n </Typography>\n {!readOnly && (\n <IconButton\n label=\"Remove\"\n size=\"S\"\n onClick={() => handleRemove(doc.documentId)}\n >\n <Trash />\n </IconButton>\n )}\n </EntryRow>\n ))}\n </Flex>\n )}\n </Field.Root>\n );\n}\n","import {\n Checkbox,\n Field,\n Flex,\n JSONInput,\n NumberInput,\n SingleSelect,\n SingleSelectOption,\n Textarea,\n TextInput,\n} from \"@strapi/design-system\";\nimport type React from \"react\";\nimport type { StrapiAttribute } from \"../hooks/useModelSchema\";\nimport { FormSection, SectionLabel } from \"./FormPrimitives\";\nimport { RelationField } from \"./RelationField\";\n\nexport interface AdditionalFieldDef {\n name: string;\n attribute: StrapiAttribute;\n}\n\ninterface DynamicFieldProps {\n field: AdditionalFieldDef;\n value: unknown;\n onChange: (name: string, value: unknown) => void;\n readOnly?: boolean;\n}\n\nfunction makeLabel(name: string) {\n return name\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (s) => s.toUpperCase())\n .trim();\n}\n\nconst fieldStyle = { width: \"100%\" };\n\nexport function DynamicField({\n field,\n value,\n onChange,\n readOnly = false,\n}: DynamicFieldProps) {\n const { name, attribute } = field;\n const { type, required, enum: enumValues } = attribute;\n const label = makeLabel(name);\n\n if (type === \"boolean\") {\n return (\n <Field.Root style={fieldStyle}>\n <Field.Label>{label}</Field.Label>\n <Checkbox\n checked={Boolean(value)}\n onCheckedChange={(checked: boolean) => onChange(name, checked)}\n disabled={readOnly}\n >\n {label}\n </Checkbox>\n </Field.Root>\n );\n }\n\n if (type === \"enumeration\" && Array.isArray(enumValues)) {\n return (\n <Field.Root style={fieldStyle}>\n <Field.Label>{label}</Field.Label>\n <SingleSelect\n value={value != null ? String(value) : \"\"}\n onChange={(v: string | number) => onChange(name, String(v))}\n disabled={readOnly}\n required={required}\n placeholder=\"—\"\n >\n {enumValues.map((opt) => (\n <SingleSelectOption key={opt} value={opt}>\n {opt}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n );\n }\n\n if (\n type === \"integer\" ||\n type === \"biginteger\" ||\n type === \"float\" ||\n type === \"decimal\"\n ) {\n return (\n <Field.Root style={fieldStyle}>\n <Field.Label>{label}</Field.Label>\n <NumberInput\n value={value != null ? Number(value) : undefined}\n onValueChange={(v: number | undefined) => onChange(name, v)}\n disabled={readOnly}\n required={required}\n />\n </Field.Root>\n );\n }\n\n if (type === \"json\") {\n const jsonStr =\n value == null\n ? \"\"\n : typeof value === \"string\"\n ? value\n : JSON.stringify(value, null, 2);\n return (\n <Field.Root style={fieldStyle}>\n <Field.Label>{label}</Field.Label>\n <JSONInput\n value={jsonStr}\n onChange={(v: string) => {\n try {\n onChange(name, JSON.parse(v));\n } catch {\n onChange(name, v);\n }\n }}\n disabled={readOnly}\n />\n </Field.Root>\n );\n }\n\n if (type === \"date\") {\n const dateStr =\n value instanceof Date\n ? value.toISOString().slice(0, 10)\n : typeof value === \"string\"\n ? value.slice(0, 10)\n : \"\";\n return (\n <Field.Root style={fieldStyle}>\n <Field.Label>{label}</Field.Label>\n <TextInput\n type=\"date\"\n value={dateStr}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n onChange(name, e.target.value)\n }\n disabled={readOnly}\n required={required}\n />\n </Field.Root>\n );\n }\n\n if (type === \"datetime\" || type === \"timestamp\") {\n const dtStr =\n value instanceof Date\n ? value.toISOString().slice(0, 16)\n : typeof value === \"string\"\n ? value.slice(0, 16)\n : \"\";\n return (\n <Field.Root style={fieldStyle}>\n <Field.Label>{label}</Field.Label>\n <TextInput\n type=\"datetime-local\"\n value={dtStr}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n onChange(name, e.target.value)\n }\n disabled={readOnly}\n required={required}\n />\n </Field.Root>\n );\n }\n\n if (type === \"text\" || type === \"richtext\") {\n return (\n <Field.Root style={fieldStyle}>\n <Field.Label>{label}</Field.Label>\n <Textarea\n value={value != null ? String(value) : \"\"}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n onChange(name, e.target.value)\n }\n disabled={readOnly}\n />\n </Field.Root>\n );\n }\n\n if (type === \"relation\") {\n return (\n <RelationField\n name={name}\n label={label}\n attribute={attribute}\n value={value}\n onChange={onChange}\n readOnly={readOnly}\n />\n );\n }\n\n // Default: string, email, uid, password, time, etc.\n const inputType =\n type === \"email\"\n ? \"email\"\n : type === \"password\"\n ? \"password\"\n : type === \"time\"\n ? \"time\"\n : \"text\";\n\n return (\n <Field.Root style={fieldStyle}>\n <Field.Label>{label}</Field.Label>\n <TextInput\n type={inputType}\n value={value != null ? String(value) : \"\"}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n onChange(name, e.target.value)\n }\n disabled={readOnly}\n required={required}\n />\n </Field.Root>\n );\n}\n\n// Types that should be skipped entirely in the dashboard\nconst SKIP_TYPES = new Set([\"media\", \"dynamiczone\", \"blocks\", \"component\"]);\n\ninterface CustomFieldsSectionProps {\n fields: AdditionalFieldDef[];\n data: Record<string, unknown>;\n onChange: (name: string, value: unknown) => void;\n}\n\nexport function CustomFieldsSection({\n fields,\n data,\n onChange,\n}: CustomFieldsSectionProps) {\n const renderable = fields.filter((f) => !SKIP_TYPES.has(f.attribute.type));\n if (renderable.length === 0) return null;\n\n return (\n <FormSection>\n <SectionLabel>Custom fields</SectionLabel>\n <Flex direction=\"column\" gap={4} alignItems=\"stretch\">\n {renderable.map((field) => (\n <DynamicField\n key={field.name}\n field={field}\n value={data[field.name]}\n onChange={onChange}\n />\n ))}\n </Flex>\n </FormSection>\n );\n}\n","import { getEditViewSidePanels } from \"../utils/editViewPanelRegistry\";\nimport { FormSection, SectionLabel } from \"./FormPrimitives\";\n\ninterface Props {\n model: string;\n documentId?: string;\n // biome-ignore lint/suspicious/noExplicitAny: document shape varies by entity type\n document?: Record<string, any>;\n}\n\nexport function EditViewSidePanels({ model, documentId, document }: Props) {\n const panels = getEditViewSidePanels(model);\n\n if (panels.length === 0) return null;\n\n return (\n <>\n {panels.map(({ id, title, Component }) => (\n <FormSection key={id}>\n <SectionLabel>{title}</SectionLabel>\n <Component\n model={model}\n documentId={documentId}\n document={document}\n />\n </FormSection>\n ))}\n </>\n );\n}\n","import { useFetchClient } from \"@strapi/strapi/admin\";\nimport { useQuery } from \"react-query\";\n\nexport interface StrapiAttribute {\n type: string;\n required?: boolean;\n unique?: boolean;\n default?: unknown;\n enum?: string[];\n target?: string;\n relation?: string;\n component?: string;\n repeatable?: boolean;\n pluginOptions?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport type ModelSchema = Record<string, StrapiAttribute>;\n\nconst SYSTEM_FIELDS = new Set([\n \"id\",\n \"documentId\",\n \"createdAt\",\n \"updatedAt\",\n \"publishedAt\",\n \"createdBy\",\n \"updatedBy\",\n \"locale\",\n \"localizations\",\n]);\n\nconst MODEL_UID: Record<string, string> = {\n user: \"plugin::better-auth.user\",\n organization: \"plugin::better-auth.organization\",\n};\n\ninterface ContentTypeDTO {\n uid: string;\n attributes: Record<string, StrapiAttribute>;\n}\n\nexport function useModelSchema(model: \"user\" | \"organization\") {\n const { get } = useFetchClient();\n\n return useQuery<ModelSchema, Error>({\n queryKey: [\"ba-model-schema\", model],\n queryFn: async () => {\n const { data } = await get<{ data: ContentTypeDTO[] }>(\n \"/content-manager/content-types\",\n );\n const uid = MODEL_UID[model];\n const contentType = data.data.find((ct) => ct.uid === uid);\n if (!contentType) throw new Error(`Content type ${uid} not found`);\n\n const attributes: ModelSchema = {};\n for (const [name, attr] of Object.entries(contentType.attributes)) {\n if (SYSTEM_FIELDS.has(name)) continue;\n if (\n attr.type === \"relation\" &&\n typeof attr.target === \"string\" &&\n (attr.target.startsWith(\"plugin::users-permissions\") ||\n attr.target.startsWith(\"admin::\"))\n )\n continue;\n const baOptions = attr.pluginOptions?.[\"better-auth\"] as\n | { managed?: boolean }\n | undefined;\n if (baOptions?.managed === true) continue;\n attributes[name] = attr;\n }\n return attributes;\n },\n staleTime: 10 * 60 * 1000,\n retry: false,\n });\n}\n","import {\n Alert,\n Box,\n Button,\n Field,\n Flex,\n Grid,\n IconButton,\n SingleSelect,\n SingleSelectOption,\n Tabs,\n TextInput,\n Typography,\n} from \"@strapi/design-system\";\nimport { Plus, Trash } from \"@strapi/icons\";\nimport { useFetchClient, useNotification } from \"@strapi/strapi/admin\";\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"react-query\";\nimport styled from \"styled-components\";\nimport { client } from \"../../client\";\nimport { ConfirmDialog } from \"../../components/ConfirmDialog\";\nimport { Drawer } from \"../../components/Drawer\";\nimport { CustomFieldsSection } from \"../../components/DynamicField\";\nimport { EditViewSidePanels } from \"../../components/EditViewSidePanels\";\nimport {\n AccountRow,\n EditLayout,\n EditSidebar,\n FormSection,\n MetaItem,\n MetaKey,\n MetaVal,\n MonoChip,\n ProviderBadge,\n SectionLabel,\n} from \"../../components/FormPrimitives\";\nimport { MediaPickerField } from \"../../components/MediaPickerField\";\nimport { UserCombobox } from \"../../components/UserCombobox\";\nimport { useModelSchema } from \"../../hooks/useModelSchema\";\nimport { withContext } from \"../../utils/dashContext\";\n\n// ─── Team row styled components ───────────────────────────────────────────────\n\nconst ExpandableRow = styled.div`\n width: 100%;\n background: white;\n border: 1px solid #dcdce4;\n border-radius: 8px;\n overflow: hidden;\n`;\n\nconst ExpandableRowHeader = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 14px;\n gap: 12px;\n cursor: pointer;\n &:hover {\n background: #fafafe;\n }\n`;\n\nconst ExpandableRowBody = styled.div`\n padding: 12px 14px;\n border-top: 1px solid #eaeaef;\n background: #fafafe;\n display: flex;\n flex-direction: column;\n gap: 10px;\n`;\n\n// ──────────────────────────────────────────────────────────────────────────────\n\nconst STANDARD_ORG_FIELDS = new Set([\n \"id\",\n \"name\",\n \"slug\",\n \"logo\",\n \"metadata\",\n \"memberCount\",\n \"createdAt\",\n \"updatedAt\",\n]);\n\ninterface Props {\n organizationId: string;\n teamsEnabled: boolean;\n onClose: () => void;\n}\n\nexport function OrganizationDetail({\n organizationId,\n teamsEnabled,\n onClose,\n}: Props) {\n const schemaQuery = useModelSchema(\"organization\");\n const qc = useQueryClient();\n const { toggleNotification } = useNotification();\n const { get, put } = useFetchClient();\n\n const orgQuery = useQuery({\n queryKey: [\"dash-org\", organizationId],\n queryFn: async () => {\n const result = await client.dash.organization[organizationId as \":id\"](\n {},\n withContext({ organizationId }),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Failed to load org\");\n return result.data;\n },\n });\n\n const membersQuery = useQuery({\n queryKey: [\"dash-org-members\", organizationId],\n queryFn: async () => {\n const result = await client.dash.organization[\n organizationId as \":id\"\n ].members({}, withContext({ organizationId }));\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n return result.data ?? [];\n },\n });\n\n const teamsQuery = useQuery({\n queryKey: [\"dash-org-teams\", organizationId],\n queryFn: async () => {\n if (!teamsEnabled) return [];\n const result = await client.dash.organization[\n organizationId as \":id\"\n ].teams({}, withContext({ organizationId }));\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n return (result.data ?? []) as Array<{\n id: string;\n name: string;\n organizationId: string;\n createdAt: Date;\n updatedAt?: Date;\n }>;\n },\n enabled: teamsEnabled,\n });\n\n const ssoQuery = useQuery({\n queryKey: [\"dash-org-sso\", organizationId],\n queryFn: async () => {\n const result = await client.dash.organization[\n organizationId as \":id\"\n ].ssoProviders({}, withContext({ organizationId }));\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n return result.data ?? [];\n },\n });\n\n const invitationsQuery = useQuery({\n queryKey: [\"dash-org-invitations\", organizationId],\n queryFn: async () => {\n const result = await client.dash.organization[\n organizationId as \":id\"\n ].invitations({}, withContext({ organizationId }));\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n return (result.data ?? []) as Array<{\n id: string;\n organizationId: string;\n email: string;\n role: string;\n status: \"pending\" | \"accepted\" | \"rejected\" | \"canceled\";\n inviterId: string;\n expiresAt: Date;\n createdAt: Date;\n teamId?: string | null;\n user: {\n id: string;\n name: string;\n email: string;\n image: string | null;\n } | null;\n }>;\n },\n });\n\n const strapiOrgQuery = useQuery({\n queryKey: [\"dash-strapi-org\", organizationId],\n enabled: !!orgQuery.data,\n queryFn: async () => {\n const { data } = await get<{ results: Record<string, unknown>[] }>(\n `/better-auth-dashboard/db?uid=plugin::better-auth.organization&filters[id][$eq]=${organizationId}&pagination[pageSize]=1`,\n );\n return (\n (data as { results?: Record<string, unknown>[] }).results?.[0] ?? null\n );\n },\n });\n\n const [activeTab, setActiveTab] = useState(\"details\");\n const [editName, setEditName] = useState<string | undefined>(undefined);\n const [editSlug, setEditSlug] = useState<string | undefined>(undefined);\n const [editLogo, setEditLogo] = useState<string | undefined>(undefined);\n const [editExtra, setEditExtra] = useState<Record<string, unknown>>({});\n const [confirmRemoveMemberId, setConfirmRemoveMemberId] = useState<\n string | null\n >(null);\n const [confirmDeleteTeamId, setConfirmDeleteTeamId] = useState<string | null>(\n null,\n );\n const [confirmDeleteSsoId, setConfirmDeleteSsoId] = useState<string | null>(\n null,\n );\n\n // Invite member form\n const [inviteEmail, setInviteEmail] = useState(\"\");\n const [inviteRole, setInviteRole] = useState(\"member\");\n const [confirmCancelInvitationId, setConfirmCancelInvitationId] = useState<\n string | null\n >(null);\n\n const handleExtraChange = (name: string, value: unknown) => {\n setEditExtra((prev) => ({ ...prev, [name]: value }));\n };\n\n const org = orgQuery.data;\n const extraData: Record<string, unknown> = {\n ...(strapiOrgQuery.data ?? {}),\n ...editExtra,\n };\n\n const updateOrgMutation = useMutation({\n mutationFn: async () => {\n const body: Record<string, unknown> = { ...editExtra };\n if (editName !== undefined) body.name = editName;\n if (editSlug !== undefined) body.slug = editSlug;\n if (editLogo !== undefined) body.logo = editLogo;\n\n const documentId = strapiOrgQuery.data?.documentId as string | undefined;\n if (!documentId)\n throw new Error(\"Could not resolve documentId for organization\");\n\n await put(\n `/better-auth-dashboard/db/${documentId}?uid=plugin::better-auth.organization`,\n body,\n );\n },\n onSuccess: async () => {\n await qc.invalidateQueries({\n queryKey: [\"dash-strapi-org\", organizationId],\n });\n qc.invalidateQueries({ queryKey: [\"dash-org\", organizationId] });\n qc.invalidateQueries({ queryKey: [\"dash-organizations\"] });\n qc.invalidateQueries({ queryKey: [\"dash-strapi-org\", organizationId] });\n setEditName(undefined);\n setEditSlug(undefined);\n setEditLogo(undefined);\n setEditExtra({});\n toggleNotification({\n type: \"success\",\n message: \"Organization updated successfully\",\n });\n onClose();\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Update failed\",\n });\n },\n });\n\n const [addUserId, setAddUserId] = useState(\"\");\n const [addRole, setAddRole] = useState(\"member\");\n\n const addMemberMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.organization.addMember(\n { userId: addUserId, role: addRole },\n withContext({ organizationId }),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Add member failed\");\n return result.data;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: [\"dash-org-members\", organizationId] });\n setAddUserId(\"\");\n setAddRole(\"member\");\n toggleNotification({ type: \"success\", message: \"Member added\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to add member\",\n });\n },\n });\n\n const removeMemberMutation = useMutation({\n mutationFn: async (memberId: string) => {\n const result = await client.dash.organization.removeMember(\n { memberId },\n withContext({ organizationId }),\n );\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n },\n onSuccess: () => {\n setConfirmRemoveMemberId(null);\n qc.invalidateQueries({ queryKey: [\"dash-org-members\", organizationId] });\n toggleNotification({ type: \"success\", message: \"Member removed\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to remove member\",\n });\n },\n });\n\n const updateRoleMutation = useMutation({\n mutationFn: async ({\n memberId,\n role,\n }: {\n memberId: string;\n role: string;\n }) => {\n const result = await client.dash.organization.updateMemberRole(\n { memberId, role },\n withContext({ organizationId }),\n );\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n return result.data;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: [\"dash-org-members\", organizationId] });\n toggleNotification({ type: \"success\", message: \"Role updated\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to update role\",\n });\n },\n });\n\n const [newTeamName, setNewTeamName] = useState(\"\");\n\n const createTeamMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.organization.createTeam(\n { name: newTeamName },\n withContext({ organizationId }),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Create team failed\");\n return result.data;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: [\"dash-org-teams\", organizationId] });\n setNewTeamName(\"\");\n toggleNotification({ type: \"success\", message: \"Team created\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to create team\",\n });\n },\n });\n\n const deleteTeamMutation = useMutation({\n mutationFn: async (teamId: string) => {\n const result = await client.dash.organization.deleteTeam(\n { teamId },\n withContext({ organizationId }),\n );\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n },\n onSuccess: () => {\n setConfirmDeleteTeamId(null);\n qc.invalidateQueries({ queryKey: [\"dash-org-teams\", organizationId] });\n toggleNotification({ type: \"success\", message: \"Team deleted\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to delete team\",\n });\n },\n });\n\n const deleteSsoMutation = useMutation({\n mutationFn: async (providerId: string) => {\n const result = await client.dash.organization[\n organizationId as \":id\"\n ].ssoProvider.delete({ providerId }, withContext({ organizationId }));\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n },\n onSuccess: () => {\n setConfirmDeleteSsoId(null);\n qc.invalidateQueries({ queryKey: [\"dash-org-sso\", organizationId] });\n toggleNotification({ type: \"success\", message: \"SSO provider deleted\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to delete SSO provider\",\n });\n },\n });\n\n const inviteMemberMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.organization.inviteMember(\n { email: inviteEmail, role: inviteRole, invitedBy: \"\" } as never,\n withContext({ organizationId }),\n );\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n return result.data;\n },\n onSuccess: () => {\n qc.invalidateQueries({\n queryKey: [\"dash-org-invitations\", organizationId],\n });\n setInviteEmail(\"\");\n setInviteRole(\"member\");\n toggleNotification({ type: \"success\", message: \"Invitation sent\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to invite\",\n });\n },\n });\n\n const cancelInvitationMutation = useMutation({\n mutationFn: async (invitationId: string) => {\n const result = await client.dash.organization.cancelInvitation(\n { invitationId } as never,\n withContext({ organizationId }),\n );\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n },\n onSuccess: () => {\n setConfirmCancelInvitationId(null);\n qc.invalidateQueries({\n queryKey: [\"dash-org-invitations\", organizationId],\n });\n toggleNotification({ type: \"success\", message: \"Invitation cancelled\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to cancel\",\n });\n },\n });\n\n const resendInvitationMutation = useMutation({\n mutationFn: async (invitationId: string) => {\n const result = await client.dash.organization.resendInvitation(\n { invitationId } as never,\n withContext({ organizationId }),\n );\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n },\n onSuccess: () => {\n toggleNotification({ type: \"success\", message: \"Invitation resent\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to resend\",\n });\n },\n });\n\n const members = membersQuery.data ?? [];\n const teams = teamsQuery.data ?? [];\n const ssoProviders = ssoQuery.data ?? [];\n const invitations = invitationsQuery.data ?? [];\n\n const hasOrgEdits =\n editName !== undefined ||\n editSlug !== undefined ||\n editLogo !== undefined ||\n Object.keys(editExtra).length > 0;\n\n const customFields = Object.entries(schemaQuery.data ?? {})\n .filter(([name]) => !STANDARD_ORG_FIELDS.has(name))\n .map(([name, attribute]) => ({ name, attribute }));\n\n const detailsFooter =\n activeTab === \"details\" ? (\n <>\n <Button\n variant=\"tertiary\"\n onClick={() => {\n setEditName(undefined);\n setEditSlug(undefined);\n setEditLogo(undefined);\n setEditExtra({});\n }}\n >\n Discard\n </Button>\n <Button\n disabled={!hasOrgEdits}\n loading={updateOrgMutation.isLoading}\n onClick={() => updateOrgMutation.mutate()}\n data-testid=\"save-org-btn\"\n >\n Save changes\n </Button>\n </>\n ) : undefined;\n\n return (\n <Drawer\n title={org?.name ?? \"Organization\"}\n footer={detailsFooter}\n onClose={onClose}\n data-testid=\"org-detail-drawer\"\n >\n {orgQuery.isLoading ? (\n <Typography textColor=\"neutral500\">Loading…</Typography>\n ) : orgQuery.isError ? (\n <Alert\n closeLabel=\"Close\"\n title=\"Failed to load organization\"\n variant=\"danger\"\n >\n {orgQuery.error instanceof Error\n ? orgQuery.error.message\n : \"An error occurred\"}\n </Alert>\n ) : (\n <Tabs.Root defaultValue=\"details\" onValueChange={setActiveTab}>\n <Tabs.List>\n <Tabs.Trigger value=\"details\">Details</Tabs.Trigger>\n <Tabs.Trigger value=\"members\" data-testid=\"org-members-tab\">\n Members ({members.length})\n </Tabs.Trigger>\n {teamsEnabled && (\n <Tabs.Trigger value=\"teams\">Teams ({teams.length})</Tabs.Trigger>\n )}\n <Tabs.Trigger value=\"invitations\">\n Invitations ({invitations.length})\n </Tabs.Trigger>\n <Tabs.Trigger value=\"sso\">SSO ({ssoProviders.length})</Tabs.Trigger>\n </Tabs.List>\n\n {/* ── Details ── */}\n <Tabs.Content value=\"details\">\n <EditLayout>\n {/* Left: editable fields */}\n <Flex direction=\"column\" gap={5}>\n <FormSection>\n <SectionLabel>Details</SectionLabel>\n <Field.Root style={{ width: \"100%\" }}>\n <Field.Label>Name</Field.Label>\n <TextInput\n value={editName ?? org?.name ?? \"\"}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditName(e.target.value)\n }\n data-testid=\"org-name-input\"\n />\n </Field.Root>\n <Field.Root hint=\"Used in URLs\" style={{ width: \"100%\" }}>\n <Field.Label>Slug</Field.Label>\n <TextInput\n value={editSlug ?? org?.slug ?? \"\"}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditSlug(e.target.value)\n }\n data-testid=\"org-slug-input\"\n />\n <Field.Hint />\n </Field.Root>\n <MediaPickerField\n label=\"Logo URL\"\n name=\"logo\"\n value={editLogo ?? org?.logo ?? \"\"}\n onChange={setEditLogo}\n placeholder=\"https://example.com/logo.png\"\n hint=\"Optional — publicly accessible image URL\"\n />\n </FormSection>\n\n <CustomFieldsSection\n fields={customFields}\n data={extraData}\n onChange={handleExtraChange}\n />\n </Flex>\n\n {/* Right: metadata */}\n <EditSidebar>\n <FormSection>\n <SectionLabel>Details</SectionLabel>\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 12,\n }}\n >\n <MetaItem style={{ gridColumn: \"1 / -1\" }}>\n <MetaKey>Organization ID</MetaKey>\n <MonoChip>{org?.id}</MonoChip>\n </MetaItem>\n <MetaItem>\n <MetaKey>Members</MetaKey>\n <MetaVal>{org?.memberCount ?? 0}</MetaVal>\n </MetaItem>\n <MetaItem>\n <MetaKey>Created</MetaKey>\n <MetaVal>\n {org?.createdAt\n ? new Date(org.createdAt).toLocaleDateString()\n : \"—\"}\n </MetaVal>\n </MetaItem>\n </div>\n </FormSection>\n <EditViewSidePanels\n model=\"plugin::better-auth.organization\"\n documentId={\n strapiOrgQuery.data?.documentId as string | undefined\n }\n document={strapiOrgQuery.data ?? undefined}\n />\n </EditSidebar>\n </EditLayout>\n </Tabs.Content>\n\n {/* ── Members ── */}\n <Tabs.Content value=\"members\">\n <Flex direction=\"column\" gap={5} paddingTop={6}>\n <FormSection>\n <SectionLabel>Add member</SectionLabel>\n <Grid.Root gap={3}>\n <Grid.Item col={8}>\n <UserCombobox\n label=\"User\"\n value={addUserId}\n onChange={setAddUserId}\n />\n </Grid.Item>\n <Grid.Item col={4}>\n <Field.Root>\n <Field.Label>Role</Field.Label>\n <SingleSelect\n value={addRole}\n onChange={(role: string | number) =>\n setAddRole(String(role))\n }\n aria-label=\"Member role\"\n >\n <SingleSelectOption value=\"member\">\n Member\n </SingleSelectOption>\n <SingleSelectOption value=\"admin\">\n Admin\n </SingleSelectOption>\n <SingleSelectOption value=\"owner\">\n Owner\n </SingleSelectOption>\n </SingleSelect>\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n <Box>\n <Button\n size=\"S\"\n startIcon={<Plus />}\n disabled={!addUserId}\n loading={addMemberMutation.isLoading}\n onClick={() => addMemberMutation.mutate()}\n data-testid=\"add-member-btn\"\n >\n Add member\n </Button>\n </Box>\n </FormSection>\n\n <FormSection>\n <SectionLabel>Members ({members.length})</SectionLabel>\n {membersQuery.isLoading ? (\n <Typography textColor=\"neutral500\">Loading…</Typography>\n ) : members.length === 0 ? (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n No members yet.\n </Typography>\n ) : (\n <Flex direction=\"column\" gap={2}>\n {members.map((member) => (\n <AccountRow key={member.id} data-testid=\"member-row\">\n <Flex\n direction=\"column\"\n gap={1}\n alignItems=\"flex-start\"\n style={{ flex: 1 }}\n >\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n {member.user?.name ?? \"Unknown\"}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {member.user?.email}\n </Typography>\n </Flex>\n <Flex gap={2} alignItems=\"center\">\n <Field.Root style={{ width: 110 }}>\n <SingleSelect\n value={member.role}\n onChange={(role: string | number) =>\n updateRoleMutation.mutate({\n memberId: member.id,\n role: String(role),\n })\n }\n size=\"S\"\n aria-label=\"Member role\"\n >\n <SingleSelectOption value=\"member\">\n Member\n </SingleSelectOption>\n <SingleSelectOption value=\"admin\">\n Admin\n </SingleSelectOption>\n <SingleSelectOption value=\"owner\">\n Owner\n </SingleSelectOption>\n </SingleSelect>\n </Field.Root>\n <IconButton\n label=\"Remove member\"\n onClick={() => setConfirmRemoveMemberId(member.id)}\n data-testid=\"remove-member-btn\"\n >\n <Trash />\n </IconButton>\n </Flex>\n </AccountRow>\n ))}\n </Flex>\n )}\n </FormSection>\n </Flex>\n </Tabs.Content>\n\n {/* ── Teams ── */}\n {teamsEnabled && (\n <Tabs.Content value=\"teams\">\n <Flex direction=\"column\" gap={5} paddingTop={6}>\n <FormSection>\n <SectionLabel>Create team</SectionLabel>\n <Flex gap={2} alignItems=\"flex-end\">\n <Box style={{ flex: 1 }}>\n <Field.Root>\n <Field.Label>Team name</Field.Label>\n <TextInput\n value={newTeamName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setNewTeamName(e.target.value)\n }\n placeholder=\"e.g. Engineering\"\n />\n </Field.Root>\n </Box>\n <Button\n startIcon={<Plus />}\n disabled={!newTeamName}\n loading={createTeamMutation.isLoading}\n onClick={() => createTeamMutation.mutate()}\n >\n Create\n </Button>\n </Flex>\n </FormSection>\n\n <FormSection>\n <SectionLabel>Teams ({teams.length})</SectionLabel>\n {teamsQuery.isLoading ? (\n <Typography textColor=\"neutral500\">Loading…</Typography>\n ) : teams.length === 0 ? (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n No teams yet.\n </Typography>\n ) : (\n <Flex direction=\"column\" gap={2}>\n {teams.map((team) => (\n <TeamRow\n key={team.id}\n team={team}\n organizationId={organizationId}\n onDelete={() => setConfirmDeleteTeamId(team.id)}\n />\n ))}\n </Flex>\n )}\n </FormSection>\n </Flex>\n </Tabs.Content>\n )}\n\n {/* ── SSO ── */}\n <Tabs.Content value=\"sso\">\n <Flex direction=\"column\" gap={5} paddingTop={6}>\n <FormSection>\n <SectionLabel>SSO providers</SectionLabel>\n {ssoQuery.isLoading ? (\n <Typography textColor=\"neutral500\">Loading…</Typography>\n ) : ssoProviders.length === 0 ? (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n No SSO providers configured.\n </Typography>\n ) : (\n <Flex direction=\"column\" gap={2}>\n {ssoProviders.map((provider) => (\n <AccountRow\n key={provider.id}\n data-testid=\"sso-provider-row\"\n >\n <Flex\n direction=\"column\"\n gap={1}\n alignItems=\"flex-start\"\n style={{ flex: 1 }}\n >\n <ProviderBadge>{provider.providerId}</ProviderBadge>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {provider.domain}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Issuer: {provider.issuer}\n </Typography>\n </Flex>\n <IconButton\n label=\"Delete SSO provider\"\n onClick={() =>\n setConfirmDeleteSsoId(provider.providerId)\n }\n >\n <Trash />\n </IconButton>\n </AccountRow>\n ))}\n </Flex>\n )}\n </FormSection>\n </Flex>\n </Tabs.Content>\n\n {/* ── Invitations ── */}\n <Tabs.Content value=\"invitations\">\n <Flex direction=\"column\" gap={5} paddingTop={6}>\n <FormSection>\n <SectionLabel>Invite member by email</SectionLabel>\n <Grid.Root gap={3}>\n <Grid.Item col={8}>\n <Field.Root>\n <Field.Label>Email address</Field.Label>\n <TextInput\n type=\"email\"\n value={inviteEmail}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setInviteEmail(e.target.value)\n }\n placeholder=\"user@example.com\"\n />\n </Field.Root>\n </Grid.Item>\n <Grid.Item col={4}>\n <Field.Root>\n <Field.Label>Role</Field.Label>\n <SingleSelect\n value={inviteRole}\n onChange={(v: string | number) =>\n setInviteRole(String(v))\n }\n aria-label=\"Invite role\"\n >\n <SingleSelectOption value=\"member\">\n Member\n </SingleSelectOption>\n <SingleSelectOption value=\"admin\">\n Admin\n </SingleSelectOption>\n <SingleSelectOption value=\"owner\">\n Owner\n </SingleSelectOption>\n </SingleSelect>\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n <Box>\n <Button\n size=\"S\"\n startIcon={<Plus />}\n disabled={!inviteEmail}\n loading={inviteMemberMutation.isLoading}\n onClick={() => inviteMemberMutation.mutate()}\n >\n Send invitation\n </Button>\n </Box>\n </FormSection>\n\n <FormSection>\n <SectionLabel>Invitations ({invitations.length})</SectionLabel>\n {invitationsQuery.isLoading ? (\n <Typography textColor=\"neutral500\">Loading…</Typography>\n ) : invitations.length === 0 ? (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n No invitations yet.\n </Typography>\n ) : (\n <Flex direction=\"column\" gap={2}>\n {invitations.map((inv) => {\n const statusColor: Record<string, string> = {\n pending: \"#f59e0b\",\n accepted: \"#5cb176\",\n rejected: \"#d02b20\",\n canceled: \"#8e8ea9\",\n };\n const color = statusColor[inv.status] ?? \"#8e8ea9\";\n const isPending = inv.status === \"pending\";\n return (\n <AccountRow key={inv.id}>\n <Flex\n direction=\"column\"\n gap={1}\n alignItems=\"flex-start\"\n style={{ flex: 1 }}\n >\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n {inv.user?.name ?? inv.email}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {inv.email} · role: {inv.role}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Expires{\" \"}\n {new Date(inv.expiresAt).toLocaleDateString()}\n </Typography>\n </Flex>\n <Flex gap={2} alignItems=\"center\">\n <MonoChip\n style={{\n color,\n borderColor: color,\n background: `${color}18`,\n }}\n >\n {inv.status}\n </MonoChip>\n {isPending && (\n <>\n <Button\n size=\"S\"\n variant=\"secondary\"\n loading={resendInvitationMutation.isLoading}\n onClick={() =>\n resendInvitationMutation.mutate(inv.id)\n }\n >\n Resend\n </Button>\n <IconButton\n label=\"Cancel invitation\"\n onClick={() =>\n setConfirmCancelInvitationId(inv.id)\n }\n >\n <Trash />\n </IconButton>\n </>\n )}\n </Flex>\n </AccountRow>\n );\n })}\n </Flex>\n )}\n </FormSection>\n </Flex>\n </Tabs.Content>\n </Tabs.Root>\n )}\n\n {confirmRemoveMemberId && (\n <ConfirmDialog\n title=\"Remove member\"\n message=\"Are you sure you want to remove this member from the organization?\"\n confirmLabel=\"Remove\"\n loading={removeMemberMutation.isLoading}\n onConfirm={() => removeMemberMutation.mutate(confirmRemoveMemberId)}\n onCancel={() => setConfirmRemoveMemberId(null)}\n />\n )}\n\n {confirmDeleteTeamId && (\n <ConfirmDialog\n title=\"Delete team\"\n message=\"Are you sure you want to delete this team? All team members will be removed. This action cannot be undone.\"\n confirmLabel=\"Delete\"\n loading={deleteTeamMutation.isLoading}\n onConfirm={() => deleteTeamMutation.mutate(confirmDeleteTeamId)}\n onCancel={() => setConfirmDeleteTeamId(null)}\n />\n )}\n\n {confirmDeleteSsoId && (\n <ConfirmDialog\n title=\"Delete SSO provider\"\n message=\"Are you sure you want to delete this SSO provider? Members using this provider will need to authenticate differently.\"\n confirmLabel=\"Delete\"\n loading={deleteSsoMutation.isLoading}\n onConfirm={() => deleteSsoMutation.mutate(confirmDeleteSsoId)}\n onCancel={() => setConfirmDeleteSsoId(null)}\n />\n )}\n\n {confirmCancelInvitationId && (\n <ConfirmDialog\n title=\"Cancel invitation\"\n message=\"Are you sure you want to cancel this invitation? The invite link will no longer work.\"\n confirmLabel=\"Cancel invitation\"\n loading={cancelInvitationMutation.isLoading}\n onConfirm={() =>\n cancelInvitationMutation.mutate(confirmCancelInvitationId)\n }\n onCancel={() => setConfirmCancelInvitationId(null)}\n />\n )}\n </Drawer>\n );\n}\n\nfunction TeamRow({\n team,\n organizationId,\n onDelete,\n}: {\n team: { id: string; name: string; organizationId: string; createdAt: Date };\n organizationId: string;\n onDelete: () => void;\n}) {\n const qc = useQueryClient();\n const [expanded, setExpanded] = useState(false);\n const [confirmRemoveTeamMemberId, setConfirmRemoveTeamMemberId] = useState<\n string | null\n >(null);\n\n const teamMembersQuery = useQuery({\n queryKey: [\"dash-team-members\", organizationId, team.id],\n queryFn: async () => {\n const result = await client.dash.organization[\n // @ts-expect-error\n organizationId as \":orgId\"\n ].teams[team.id as \":teamId\"].members(\n { params: { orgId: organizationId, teamId: team.id } },\n withContext({ organizationId }),\n );\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n return result.data ?? [];\n },\n enabled: expanded,\n });\n\n const [addUserId, setAddUserId] = useState(\"\");\n\n const addTeamMemberMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.organization.addTeamMember(\n { teamId: team.id, userId: addUserId },\n withContext({ organizationId }),\n );\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n return result.data;\n },\n onSuccess: () => {\n qc.invalidateQueries({\n queryKey: [\"dash-team-members\", organizationId, team.id],\n });\n setAddUserId(\"\");\n },\n });\n\n const removeTeamMemberMutation = useMutation({\n mutationFn: async (userId: string) => {\n const result = await client.dash.organization.removeTeamMember(\n { teamId: team.id, userId },\n withContext({ organizationId }),\n );\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n },\n onSuccess: () => {\n setConfirmRemoveTeamMemberId(null);\n qc.invalidateQueries({\n queryKey: [\"dash-team-members\", organizationId, team.id],\n });\n },\n });\n\n return (\n <ExpandableRow data-testid=\"team-row\">\n <ExpandableRowHeader onClick={() => setExpanded((e) => !e)}>\n <Flex\n direction=\"column\"\n gap={1}\n alignItems=\"flex-start\"\n style={{ flex: 1 }}\n >\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n {team.name}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {expanded ? \"Collapse\" : \"Expand\"} ·{\" \"}\n {teamMembersQuery.data?.length ?? \"—\"} members\n </Typography>\n </Flex>\n <Flex gap={2} alignItems=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral400\">\n {expanded ? \"▲\" : \"▼\"}\n </Typography>\n <Box onClick={(e: React.MouseEvent) => e.stopPropagation()}>\n <IconButton label=\"Delete team\" onClick={onDelete}>\n <Trash />\n </IconButton>\n </Box>\n </Flex>\n </ExpandableRowHeader>\n\n {expanded && (\n <ExpandableRowBody>\n <Flex gap={2} alignItems=\"flex-end\">\n <Box style={{ flex: 1 }}>\n <UserCombobox\n label=\"Add member to team\"\n value={addUserId}\n onChange={setAddUserId}\n />\n </Box>\n <Button\n size=\"S\"\n startIcon={<Plus />}\n disabled={!addUserId}\n loading={addTeamMemberMutation.isLoading}\n onClick={() => addTeamMemberMutation.mutate()}\n >\n Add\n </Button>\n </Flex>\n\n {teamMembersQuery.isLoading ? (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Loading…\n </Typography>\n ) : (teamMembersQuery.data ?? []).length === 0 ? (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n No members in this team.\n </Typography>\n ) : (\n <Flex direction=\"column\" gap={2}>\n {/* biome-ignore lint/suspicious/noExplicitAny: team member shape varies by config */}\n {(teamMembersQuery.data ?? []).map((tm: any) => (\n <AccountRow key={tm.id}>\n <Flex\n direction=\"column\"\n gap={1}\n alignItems=\"flex-start\"\n style={{ flex: 1 }}\n >\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n {tm.user?.name ?? tm.userId}\n </Typography>\n {tm.user?.email && (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {tm.user.email}\n </Typography>\n )}\n </Flex>\n <IconButton\n label=\"Remove from team\"\n onClick={() => setConfirmRemoveTeamMemberId(tm.userId)}\n >\n <Trash />\n </IconButton>\n </AccountRow>\n ))}\n </Flex>\n )}\n </ExpandableRowBody>\n )}\n\n {confirmRemoveTeamMemberId && (\n <ConfirmDialog\n title=\"Remove from team\"\n message=\"Are you sure you want to remove this member from the team?\"\n confirmLabel=\"Remove\"\n loading={removeTeamMemberMutation.isLoading}\n onConfirm={() =>\n removeTeamMemberMutation.mutate(confirmRemoveTeamMemberId)\n }\n onCancel={() => setConfirmRemoveTeamMemberId(null)}\n />\n )}\n </ExpandableRow>\n );\n}\n","import {\n Box,\n Button,\n Checkbox,\n Flex,\n IconButton,\n Loader,\n Searchbar,\n SearchForm,\n} from \"@strapi/design-system\";\nimport { Pencil, Plus, Trash } from \"@strapi/icons\";\nimport { useNotification } from \"@strapi/strapi/admin\";\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"react-query\";\nimport styled, { keyframes } from \"styled-components\";\nimport { client } from \"../../client\";\nimport { ConfirmDialog } from \"../../components/ConfirmDialog\";\nimport { withContext } from \"../../utils/dashContext\";\nimport { CreateOrganizationDialog } from \"./CreateOrganizationDialog\";\nimport { OrganizationDetail } from \"./OrganizationDetail\";\n\nconst PAGE_SIZE = 25;\n\n// ─── Animations ───────────────────────────────────────────────────────────────\n\nconst fadeUp = keyframes`\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n`;\n\n// ─── Layout ───────────────────────────────────────────────────────────────────\n\nconst Wrap = styled.div`\n padding: 28px 32px;\n background: #f6f6f9;\n min-height: 100%;\n display: flex;\n flex-direction: column;\n gap: 20px;\n`;\n\nconst PageHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;\n\nconst TitleBlock = styled.div`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\nconst PageTitle = styled.h1`\n margin: 0;\n font-size: 22px;\n font-weight: 800;\n color: #32324d;\n letter-spacing: -0.03em;\n`;\n\nconst PageSubtitle = styled.p`\n margin: 0;\n font-size: 12px;\n color: #8e8ea9;\n`;\n\n// ─── Table card ───────────────────────────────────────────────────────────────\n\nconst TableCard = styled.div`\n background: #ffffff;\n border: 1px solid #eaeaef;\n border-radius: 10px;\n overflow: hidden;\n`;\n\nconst Table = styled.table`\n width: 100%;\n border-collapse: collapse;\n`;\n\nconst TH = styled.th`\n text-align: left;\n padding: 10px 14px;\n font-size: 10px;\n font-weight: 700;\n color: #8e8ea9;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n border-bottom: 1px solid #eaeaef;\n background: #fafafa;\n white-space: nowrap;\n &:first-child { padding-left: 20px; }\n &:last-child { padding-right: 20px; }\n`;\n\nconst THCheck = styled(TH)`\n width: 44px;\n`;\n\nconst THActions = styled(TH)`\n width: 80px;\n`;\n\nconst TD = styled.td`\n padding: 11px 14px;\n font-size: 12px;\n color: #32324d;\n border-bottom: 1px solid #f5f5f9;\n vertical-align: middle;\n &:first-child { padding-left: 20px; }\n &:last-child { padding-right: 20px; }\n`;\n\nconst TDCheck = styled(TD)`\n width: 44px;\n`;\n\nconst TDActions = styled(TD)`\n width: 80px;\n`;\n\nconst TR = styled.tr<{ $selected?: boolean; $i?: number }>`\n animation: ${fadeUp} 280ms ease both;\n animation-delay: ${(p) => (p.$i ?? 0) * 25}ms;\n background: ${(p) => (p.$selected ? \"#f0f0ff\" : \"transparent\")};\n transition: background 120ms ease;\n &:hover td { background: ${(p) => (p.$selected ? \"#e8e8ff\" : \"#fafafe\")}; }\n &:last-child td { border-bottom: none; }\n`;\n\n// ─── Slug chip ────────────────────────────────────────────────────────────────\n\nconst SlugChip = styled.span`\n display: inline-block;\n background: #f5f5f9;\n color: #666687;\n border: 1px solid #eaeaef;\n border-radius: 6px;\n padding: 2px 6px;\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n font-size: 11px;\n`;\n\n// ─── Member count chip ────────────────────────────────────────────────────────\n\nconst CountChip = styled.span`\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 20px;\n font-size: 10px;\n font-weight: 700;\n background: #f0f0ff;\n color: #4945ff;\n`;\n\n// ─── Misc text ────────────────────────────────────────────────────────────────\n\nconst OrgName = styled.span`\n font-size: 12px;\n font-weight: 600;\n color: #32324d;\n`;\n\nconst DateText = styled.span`\n font-size: 11px;\n color: #b8b8c7;\n font-variant-numeric: tabular-nums;\n`;\n\n// ─── Toolbar ──────────────────────────────────────────────────────────────────\n\nconst Toolbar = styled.div`\n display: flex;\n align-items: flex-end;\n gap: 12px;\n`;\n\n// ─── Org avatar ───────────────────────────────────────────────────────────────\n\nconst OrgLogoFallback = styled.div<{ $bg: string; $fg: string }>`\n width: 30px;\n height: 30px;\n border-radius: 7px;\n background: ${(p) => p.$bg};\n color: ${(p) => p.$fg};\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n font-weight: 700;\n flex-shrink: 0;\n user-select: none;\n`;\n\nconst ORG_COLORS = [\n { bg: \"#EAF5FF\", fg: \"#0C75AF\" },\n { bg: \"#F0F0FF\", fg: \"#4945FF\" },\n { bg: \"#EAFBE7\", fg: \"#328048\" },\n { bg: \"#FFF3D3\", fg: \"#8E6A00\" },\n { bg: \"#FCECEA\", fg: \"#D02B20\" },\n { bg: \"#F6ECFC\", fg: \"#8312D1\" },\n];\n\nfunction OrgAvatar({ name, logo }: { name: string; logo?: string | null }) {\n if (logo) {\n return (\n <Box\n tag=\"img\"\n src={logo}\n alt=\"\"\n style={{\n width: 30,\n height: 30,\n borderRadius: 7,\n objectFit: \"cover\",\n flexShrink: 0,\n }}\n />\n );\n }\n const color = ORG_COLORS[(name.charCodeAt(0) || 0) % ORG_COLORS.length];\n const initials = name.slice(0, 2).toUpperCase();\n return (\n <OrgLogoFallback $bg={color.bg} $fg={color.fg}>\n {initials}\n </OrgLogoFallback>\n );\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\ninterface Props {\n teamsEnabled: boolean;\n}\n\nexport function OrganizationsPage({ teamsEnabled }: Props) {\n const qc = useQueryClient();\n const { toggleNotification } = useNotification();\n const [page, setPage] = useState(1);\n const [search, setSearch] = useState(\"\");\n const [searchInput, setSearchInput] = useState(\"\");\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [showCreate, setShowCreate] = useState(false);\n const [detailOrgId, setDetailOrgId] = useState<string | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [confirmDeleteMany, setConfirmDeleteMany] = useState(false);\n\n const offset = (page - 1) * PAGE_SIZE;\n\n const orgsQuery = useQuery({\n queryKey: [\"dash-organizations\", page, search],\n queryFn: async () => {\n const result = await client.dash.listOrganizations({\n query: {\n limit: PAGE_SIZE,\n offset,\n sortBy: \"createdAt\",\n sortOrder: \"desc\",\n ...(search ? { search } : {}),\n },\n });\n if (result.error)\n throw new Error(result.error.message ?? \"Failed to load organizations\");\n return result.data;\n },\n keepPreviousData: true,\n });\n\n const deleteMutation = useMutation({\n mutationFn: async (organizationId: string) => {\n const result = await client.dash.organization.delete(\n { organizationId },\n withContext({ organizationId }),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Delete failed\");\n },\n onSuccess: () => {\n setConfirmDelete(null);\n qc.invalidateQueries({ queryKey: [\"dash-organizations\"] });\n toggleNotification({ type: \"success\", message: \"Organization deleted\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to delete organization\",\n });\n },\n });\n\n const deleteManyMutation = useMutation({\n mutationFn: async (organizationIds: string[]) => {\n const result = await client.dash.organization.deleteMany(\n {},\n withContext({ organizationIds } as never),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Delete failed\");\n return result.data;\n },\n onSuccess: (_data, organizationIds) => {\n setConfirmDeleteMany(false);\n setSelected(new Set());\n qc.invalidateQueries({ queryKey: [\"dash-organizations\"] });\n toggleNotification({\n type: \"success\",\n message: `${organizationIds.length} organization${organizationIds.length !== 1 ? \"s\" : \"\"} deleted`,\n });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to delete organizations\",\n });\n },\n });\n\n const orgs =\n orgsQuery.data && \"organizations\" in orgsQuery.data\n ? orgsQuery.data.organizations\n : [];\n const total =\n orgsQuery.data && \"total\" in orgsQuery.data ? orgsQuery.data.total : 0;\n const pageCount = Math.ceil(total / PAGE_SIZE);\n\n const allSelected = orgs.length > 0 && orgs.every((o) => selected.has(o.id));\n const someSelected = selected.size > 0;\n\n const toggleSelect = (id: string) => {\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const handleSelectAll = () => {\n if (allSelected) setSelected(new Set());\n else setSelected(new Set(orgs.map((o) => o.id)));\n };\n\n const handleSearch = (e: React.FormEvent) => {\n e.preventDefault();\n setSearch(searchInput);\n setPage(1);\n };\n\n return (\n <Wrap data-testid=\"organizations-page\">\n <PageHeader>\n <TitleBlock>\n <PageTitle>Organizations</PageTitle>\n <PageSubtitle>{total.toLocaleString()} total</PageSubtitle>\n </TitleBlock>\n <Button\n startIcon={<Plus />}\n onClick={() => setShowCreate(true)}\n data-testid=\"create-org-btn\"\n >\n Create organization\n </Button>\n </PageHeader>\n\n <Toolbar>\n <SearchForm onSubmit={handleSearch}>\n <Searchbar\n clearLabel=\"Clear\"\n name=\"search\"\n placeholder=\"Search organizations…\"\n value={searchInput}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setSearchInput(e.target.value)\n }\n onClear={() => {\n setSearchInput(\"\");\n setSearch(\"\");\n setPage(1);\n }}\n >\n Search organizations\n </Searchbar>\n </SearchForm>\n\n {someSelected && (\n <Button\n variant=\"danger-light\"\n size=\"S\"\n onClick={() => setConfirmDeleteMany(true)}\n data-testid=\"delete-selected-orgs-btn\"\n >\n Delete {selected.size} selected\n </Button>\n )}\n </Toolbar>\n\n {orgsQuery.isError && (\n <div style={{ color: \"#d02b20\", fontSize: 12, padding: \"8px 0\" }}>\n {orgsQuery.error instanceof Error\n ? orgsQuery.error.message\n : \"An error occurred\"}\n </div>\n )}\n\n <TableCard>\n {orgsQuery.isLoading ? (\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>Loading organizations…</Loader>\n </Flex>\n ) : (\n <Table>\n <thead>\n <tr>\n <THCheck>\n <Checkbox\n checked={allSelected}\n onCheckedChange={handleSelectAll}\n aria-label=\"Select all\"\n />\n </THCheck>\n <TH>Name</TH>\n <TH>Slug</TH>\n <TH>Members</TH>\n <TH>Created</TH>\n <THActions />\n </tr>\n </thead>\n <tbody>\n {orgs.length === 0 ? (\n <tr>\n <TD\n colSpan={6}\n style={{\n textAlign: \"center\",\n padding: \"40px\",\n color: \"#8e8ea9\",\n }}\n data-testid=\"orgs-empty\"\n >\n {search\n ? `No organizations matching \"${search}\"`\n : \"No organizations found\"}\n </TD>\n </tr>\n ) : (\n orgs.map((org, i) => (\n <TR\n key={org.id}\n $selected={selected.has(org.id)}\n $i={i}\n data-testid=\"org-row\"\n >\n <TDCheck>\n <Checkbox\n checked={selected.has(org.id)}\n onCheckedChange={() => toggleSelect(org.id)}\n aria-label={`Select ${org.name}`}\n />\n </TDCheck>\n <TD>\n <Flex alignItems=\"center\" gap={2}>\n <OrgAvatar name={org.name} logo={org.logo} />\n <OrgName>{org.name}</OrgName>\n </Flex>\n </TD>\n <TD>\n <SlugChip>{org.slug}</SlugChip>\n </TD>\n <TD>\n <CountChip>{org.memberCount}</CountChip>\n </TD>\n <TD>\n <DateText>\n {new Date(org.createdAt).toLocaleDateString()}\n </DateText>\n </TD>\n <TDActions>\n <Flex gap={1} justifyContent=\"flex-end\">\n <IconButton\n label=\"Edit organization\"\n onClick={() => setDetailOrgId(org.id)}\n data-testid=\"edit-org-btn\"\n >\n <Pencil />\n </IconButton>\n <IconButton\n label=\"Delete organization\"\n onClick={() => setConfirmDelete(org.id)}\n data-testid=\"delete-org-btn\"\n >\n <Trash />\n </IconButton>\n </Flex>\n </TDActions>\n </TR>\n ))\n )}\n </tbody>\n </Table>\n )}\n </TableCard>\n\n {pageCount > 1 && (\n <Flex justifyContent=\"flex-end\">\n <Flex gap={2}>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n disabled={page === 1}\n onClick={() => setPage((p) => p - 1)}\n >\n Previous\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n disabled={page >= pageCount}\n onClick={() => setPage((p) => p + 1)}\n >\n Next\n </Button>\n </Flex>\n </Flex>\n )}\n\n {showCreate && (\n <CreateOrganizationDialog\n teamsEnabled={teamsEnabled}\n onClose={() => setShowCreate(false)}\n />\n )}\n\n {detailOrgId && (\n <OrganizationDetail\n organizationId={detailOrgId}\n teamsEnabled={teamsEnabled}\n onClose={() => setDetailOrgId(null)}\n />\n )}\n\n {confirmDelete && (\n <ConfirmDialog\n title=\"Delete organization\"\n message=\"Are you sure you want to delete this organization? All members and teams will be removed. This action cannot be undone.\"\n confirmLabel=\"Delete\"\n loading={deleteMutation.isLoading}\n onConfirm={() => deleteMutation.mutate(confirmDelete)}\n onCancel={() => setConfirmDelete(null)}\n />\n )}\n\n {confirmDeleteMany && (\n <ConfirmDialog\n title={`Delete ${selected.size} organization${selected.size !== 1 ? \"s\" : \"\"}`}\n message={`Are you sure you want to delete ${selected.size} organization${selected.size !== 1 ? \"s\" : \"\"}? This action cannot be undone.`}\n confirmLabel=\"Delete all\"\n loading={deleteManyMutation.isLoading}\n onConfirm={() => deleteManyMutation.mutate([...selected])}\n onCancel={() => setConfirmDeleteMany(false)}\n />\n )}\n </Wrap>\n );\n}\n","import { Box } from \"@strapi/design-system\";\nimport styled from \"styled-components\";\n\nconst PALETTE = [\n { bg: \"#EAF5FF\", fg: \"#0C75AF\" },\n { bg: \"#F0F0FF\", fg: \"#4945FF\" },\n { bg: \"#EAFBE7\", fg: \"#328048\" },\n { bg: \"#FFF3D3\", fg: \"#8E6A00\" },\n { bg: \"#FCECEA\", fg: \"#D02B20\" },\n { bg: \"#F6ECFC\", fg: \"#8312D1\" },\n { bg: \"#E8F8F5\", fg: \"#1A7F64\" },\n];\n\nconst Circle = styled.div<{ $bg: string; $fg: string; $size: number }>`\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n border-radius: 50%;\n background: ${(p) => p.$bg};\n color: ${(p) => p.$fg};\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: ${(p) => Math.round(p.$size * 0.38)}px;\n font-weight: 700;\n flex-shrink: 0;\n letter-spacing: -0.01em;\n user-select: none;\n`;\n\nfunction getColor(seed: string) {\n const code = (seed.charCodeAt(0) || 0) + (seed.charCodeAt(1) || 0);\n return PALETTE[code % PALETTE.length];\n}\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 0 || !parts[0]) return \"?\";\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nexport function Avatar({\n name,\n src,\n size = 32,\n}: {\n name: string;\n src?: string | null;\n size?: number;\n}) {\n if (src) {\n return (\n <Box\n tag=\"img\"\n src={src}\n alt=\"\"\n style={{\n width: size,\n height: size,\n borderRadius: \"50%\",\n objectFit: \"cover\",\n flexShrink: 0,\n display: \"block\",\n }}\n />\n );\n }\n const color = getColor(name || \"?\");\n return (\n <Circle $bg={color.bg} $fg={color.fg} $size={size}>\n {getInitials(name || \"?\")}\n </Circle>\n );\n}\n","import { Flex, Loader } from \"@strapi/design-system\";\nimport { useFetchClient } from \"@strapi/strapi/admin\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useQuery } from \"react-query\";\nimport styled, { keyframes } from \"styled-components\";\nimport { client } from \"../../client\";\nimport { Avatar } from \"../../components/Avatar\";\n\n// ─── Design tokens ────────────────────────────────────────────────────────────\n\nconst T = {\n bg: \"#f6f6f9\",\n bgCard: \"#ffffff\",\n bgCardHover: \"#f9f9fc\",\n border: \"#eaeaef\",\n borderHover: \"rgba(73,69,255,0.35)\",\n accent: \"#4945ff\",\n accentDim: \"rgba(73,69,255,0.1)\",\n green: \"#5cb176\",\n greenDim: \"rgba(92,177,118,0.12)\",\n amber: \"#d9822f\",\n amberDim: \"rgba(217,130,47,0.12)\",\n red: \"#d02b20\",\n redDim: \"rgba(208,43,32,0.1)\",\n purple: \"#8460b8\",\n purpleDim: \"rgba(132,96,184,0.12)\",\n textPrimary: \"#32324d\",\n textSecondary: \"#666687\",\n textMuted: \"#b8b8c7\",\n mono: `'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace`,\n};\n\n// ─── Keyframes ────────────────────────────────────────────────────────────────\n\nconst fadeUp = keyframes`\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n`;\n\n// ─── Layout ───────────────────────────────────────────────────────────────────\n\nconst Wrap = styled.div`\n padding: 28px 32px 48px;\n background: ${T.bg};\n min-height: 100%;\n display: flex;\n flex-direction: column;\n gap: 22px;\n`;\n\nconst SectionDivider = styled.div`\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: -6px;\n`;\n\nconst DivLabel = styled.span`\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.14em;\n text-transform: uppercase;\n color: ${T.textMuted};\n white-space: nowrap;\n`;\n\nconst DivLine = styled.div`\n flex: 1;\n height: 1px;\n background: ${T.border};\n`;\n\n// ─── Glass card ───────────────────────────────────────────────────────────────\n\nconst Card = styled.div<{ $delay?: number }>`\n background: ${T.bgCard};\n border: 1px solid ${T.border};\n border-radius: 12px;\n overflow: hidden;\n position: relative;\n animation: ${fadeUp} 380ms ease both;\n animation-delay: ${(p) => (p.$delay ?? 0) * 55}ms;\n transition: border-color 200ms, box-shadow 200ms;\n &:hover {\n border-color: ${T.borderHover};\n box-shadow: 0 0 0 1px ${T.borderHover}, 0 8px 32px rgba(124,109,250,0.07);\n }\n`;\n\n// ─── Period pill toggle ───────────────────────────────────────────────────────\n\nconst PillGroup = styled.div`\n display: flex;\n background: rgba(0,0,0,0.03);\n border: 1px solid ${T.border};\n border-radius: 9px;\n padding: 3px;\n gap: 2px;\n`;\n\nconst Pill = styled.button<{ $active: boolean }>`\n appearance: none;\n border: none;\n cursor: pointer;\n padding: 5px 16px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.03em;\n transition: background 180ms, color 180ms;\n background: ${(p) => (p.$active ? T.accent : \"transparent\")};\n color: ${(p) => (p.$active ? \"#fff\" : T.textSecondary)};\n &:hover {\n background: ${(p) => (p.$active ? T.accent : \"rgba(0,0,0,0.05)\")};\n color: ${(p) => (p.$active ? \"#fff\" : T.textPrimary)};\n }\n`;\n\n// ─── Stat strip ───────────────────────────────────────────────────────────────\n\nconst StatGrid = styled.div`\n display: grid;\n grid-template-columns: repeat(5, 1fr);\n gap: 10px;\n @media (max-width: 1200px) { grid-template-columns: repeat(3, 1fr); }\n`;\n\nconst StatCard = styled(Card)<{ $accent: string }>`\n padding: 18px 20px 0;\n &::after {\n content: '';\n position: absolute;\n top: 0; left: 0; right: 0;\n height: 2px;\n background: ${(p) => p.$accent};\n opacity: 0.75;\n }\n`;\n\nconst StatLabel = styled.div`\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n color: ${T.textMuted};\n margin-bottom: 10px;\n`;\n\nconst StatValue = styled.div`\n font-size: 30px;\n font-weight: 800;\n color: ${T.textPrimary};\n line-height: 1;\n letter-spacing: -0.045em;\n font-variant-numeric: tabular-nums;\n margin-bottom: 10px;\n`;\n\nconst TrendBadge = styled.span<{ $pos: boolean }>`\n display: inline-flex;\n align-items: center;\n gap: 3px;\n padding: 2px 8px;\n border-radius: 20px;\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.03em;\n background: ${(p) => (p.$pos ? T.greenDim : T.redDim)};\n color: ${(p) => (p.$pos ? T.green : T.red)};\n margin-bottom: 12px;\n`;\n\nconst SparkWrap = styled.div`\n height: 44px;\n margin: 0 -20px;\n`;\n\n// ─── Chart card ───────────────────────────────────────────────────────────────\n\nconst ChartCard = styled(Card)`\n padding: 20px 20px 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n`;\n\nconst ChartHeader = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-shrink: 0;\n`;\n\nconst ChartTitle = styled.div`\n font-size: 12px;\n font-weight: 700;\n color: ${T.textPrimary};\n letter-spacing: 0.01em;\n`;\n\nconst SeriesRow = styled.div`\n display: flex;\n align-items: center;\n gap: 6px;\n`;\n\nconst SeriesBtn = styled.button<{ $on: boolean; $c: string }>`\n appearance: none;\n border: 1px solid ${(p) => (p.$on ? `${p.$c}55` : T.border)};\n background: ${(p) => (p.$on ? `${p.$c}18` : \"transparent\")};\n color: ${(p) => (p.$on ? p.$c : T.textMuted)};\n font-size: 10px;\n font-weight: 600;\n padding: 3px 10px 3px 8px;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 5px;\n transition: all 160ms;\n &:hover {\n border-color: ${(p) => `${p.$c}88`};\n color: ${(p) => p.$c};\n background: ${(p) => `${p.$c}22`};\n }\n`;\n\nconst SDot = styled.span<{ $c: string }>`\n width: 6px; height: 6px;\n border-radius: 50%;\n background: ${(p) => p.$c};\n display: inline-block;\n flex-shrink: 0;\n`;\n\nconst HoverInfo = styled.div`\n font-size: 11px;\n color: ${T.textSecondary};\n font-variant-numeric: tabular-nums;\n font-family: ${T.mono};\n min-height: 15px;\n`;\n\n// ─── Two-panel row ────────────────────────────────────────────────────────────\n\nconst TwoPanel = styled.div<{ $ratio?: string }>`\n display: grid;\n grid-template-columns: ${(p) => p.$ratio ?? \"1fr 288px\"};\n gap: 10px;\n align-items: stretch;\n @media (max-width: 900px) { grid-template-columns: 1fr; }\n`;\n\n// ─── Feed card ────────────────────────────────────────────────────────────────\n\nconst FeedCard = styled(Card)`\n display: flex;\n flex-direction: column;\n overflow: hidden;\n`;\n\nconst FeedHead = styled.div`\n padding: 13px 16px 9px;\n border-bottom: 1px solid ${T.border};\n font-size: 11px;\n font-weight: 700;\n color: ${T.textPrimary};\n flex-shrink: 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\n\nconst FeedSelect = styled.select`\n appearance: none;\n border: 1px solid ${T.border};\n border-radius: 6px;\n background: ${T.bgCard};\n color: ${T.textSecondary};\n font-size: 10px;\n font-weight: 600;\n padding: 3px 22px 3px 8px;\n cursor: pointer;\n outline: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%23666687'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 7px center;\n transition: border-color 160ms;\n &:hover, &:focus { border-color: ${T.accent}; color: ${T.textPrimary}; }\n`;\n\nconst FeedScroll = styled.div`\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n &::-webkit-scrollbar { width: 4px; }\n &::-webkit-scrollbar-thumb { background: ${T.textMuted}; border-radius: 2px; }\n`;\n\nconst FeedItem = styled.div`\n padding: 9px 14px;\n border-bottom: 1px solid #f0f0f5;\n display: flex;\n flex-direction: column;\n gap: 3px;\n transition: background 130ms;\n &:hover { background: #fafaff; }\n &:last-child { border-bottom: none; }\n`;\n\nconst FeedTop = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n`;\n\nconst FeedName = styled.span`\n font-size: 11px;\n font-weight: 600;\n color: ${T.textPrimary};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst FeedEmail = styled.span`\n font-size: 10px;\n color: ${T.textSecondary};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: block;\n`;\n\nconst FeedMeta = styled.span`\n font-size: 9px;\n color: ${T.textMuted};\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n`;\n\n// ─── Retention chart ─────────────────────────────────────────────────────────\n\nconst RtnCard = styled(Card)`\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n`;\n\nconst RtnRow = styled.div<{ $hov: boolean }>`\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 4px 6px;\n border-radius: 7px;\n transition: background 130ms;\n background: ${(p) => (p.$hov ? \"#f0f0f6\" : \"transparent\")};\n cursor: default;\n`;\n\nconst RtnLabel = styled.span`\n font-size: 10px;\n color: ${T.textSecondary};\n min-width: 80px;\n text-align: right;\n white-space: nowrap;\n`;\n\nconst RtnSize = styled.span`\n font-size: 9px;\n color: ${T.textMuted};\n min-width: 52px;\n text-align: right;\n white-space: nowrap;\n font-variant-numeric: tabular-nums;\n`;\n\nconst RtnTrack = styled.div`\n flex: 1;\n height: 10px;\n background: #eaeaef;\n border-radius: 4px;\n overflow: hidden;\n`;\n\nconst RtnBar = styled.div<{ $w: number; $hue: number }>`\n width: ${(p) => Math.max(p.$w, 0.5)}%;\n height: 100%;\n background: hsl(${(p) => p.$hue}, 60%, 50%);\n border-radius: 4px;\n transition: width 0.55s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n`;\n\nconst RtnPct = styled.span<{ $hue: number }>`\n font-size: 10px;\n font-weight: 700;\n color: hsl(${(p) => p.$hue}, 60%, 60%);\n min-width: 38px;\n text-align: right;\n font-variant-numeric: tabular-nums;\n font-family: ${T.mono};\n`;\n\nconst RtnTip = styled.div`\n font-size: 10px;\n color: ${T.textSecondary};\n min-height: 14px;\n font-variant-numeric: tabular-nums;\n padding: 0 6px;\n`;\n\n// ─── Ring cards (active users) ────────────────────────────────────────────────\n\nconst RingGrid = styled.div`\n display: flex;\n flex-direction: column;\n gap: 10px;\n`;\n\nconst RingCard = styled(Card)`\n padding: 18px 20px;\n display: flex;\n align-items: center;\n gap: 16px;\n flex: 1;\n`;\n\nconst RingInfo = styled.div`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\nconst RingVal = styled.div`\n font-size: 24px;\n font-weight: 800;\n color: ${T.textPrimary};\n letter-spacing: -0.04em;\n font-variant-numeric: tabular-nums;\n line-height: 1;\n`;\n\nconst RingLabel = styled.div`\n font-size: 9px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n color: ${T.textMuted};\n`;\n\n// ─── Empty state ──────────────────────────────────────────────────────────────\n\nconst Empty = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 32px;\n color: ${T.textMuted};\n font-size: 12px;\n gap: 8px;\n`;\n\n// ─── Hooks ────────────────────────────────────────────────────────────────────\n\nfunction useCountUp(target: number, duration = 850) {\n const [count, setCount] = useState(0);\n const prevRef = useRef(0);\n\n useEffect(() => {\n let raf: number;\n let start = 0;\n const from = prevRef.current;\n const diff = target - from;\n const step = (ts: number) => {\n if (!start) start = ts;\n const progress = Math.min((ts - start) / duration, 1);\n const eased = 1 - (1 - progress) ** 3;\n setCount(Math.round(from + eased * diff));\n if (progress < 1) raf = requestAnimationFrame(step);\n else prevRef.current = target;\n };\n raf = requestAnimationFrame(step);\n return () => cancelAnimationFrame(raf);\n }, [target, duration]);\n\n return count;\n}\n\n// ─── Sparkline ────────────────────────────────────────────────────────────────\n\nfunction Sparkline({\n data,\n color,\n id,\n}: {\n data: number[];\n color: string;\n id: string;\n}) {\n const W = 300;\n const H = 44;\n if (data.length < 2) return <svg width=\"100%\" height={H} />;\n const min = Math.min(...data);\n const max = Math.max(...data, min + 1);\n const pts = data.map((v, i) => ({\n x: (i / (data.length - 1)) * W,\n y: H - 3 - ((v - min) / (max - min)) * (H - 8),\n }));\n const line = pts.reduce((a, p, i) => {\n if (i === 0) return `M ${p.x} ${p.y}`;\n const pr = pts[i - 1];\n const cx = (pr.x + p.x) / 2;\n return `${a} C ${cx} ${pr.y} ${cx} ${p.y} ${p.x} ${p.y}`;\n }, \"\");\n const area = `${line} L ${pts.at(-1)!.x} ${H} L 0 ${H} Z`;\n const gid = `spk-${id}`;\n return (\n <svg\n width=\"100%\"\n height={H}\n viewBox={`0 0 ${W} ${H}`}\n preserveAspectRatio=\"none\"\n aria-hidden={true}\n >\n <defs>\n <linearGradient id={gid} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity=\"0.32\" />\n <stop offset=\"100%\" stopColor={color} stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n <path d={area} fill={`url(#${gid})`} />\n <path\n d={line}\n stroke={color}\n strokeWidth=\"1.6\"\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n// ─── Growth area chart ────────────────────────────────────────────────────────\n\ntype GraphRow = {\n label: string;\n totalUsers: number;\n newUsers: number;\n activeUsers: number;\n};\n\nconst ALL_SERIES = [\n { key: \"totalUsers\" as const, color: T.accent, label: \"Total\" },\n { key: \"newUsers\" as const, color: T.green, label: \"New\" },\n { key: \"activeUsers\" as const, color: T.amber, label: \"Active\" },\n];\n\nfunction GrowthChart({\n data,\n hovered,\n onHover,\n activeSeries,\n}: {\n data: GraphRow[];\n hovered: number | null;\n onHover: (i: number | null) => void;\n activeSeries: Set<string>;\n}) {\n const W = 600;\n const H = 200;\n const PL = 40;\n const PR = 12;\n const PT = 12;\n const PB = 28;\n const CW = W - PL - PR;\n const CH = H - PT - PB;\n\n if (!data.length) {\n return (\n <Empty>\n <div style={{ fontSize: 24 }}>📊</div>\n <div>No growth data for this period</div>\n </Empty>\n );\n }\n\n const active = ALL_SERIES.filter((s) => activeSeries.has(s.key));\n const allVals = data.flatMap((d) => active.map((s) => d[s.key]));\n const maxV = Math.max(...allVals, 10);\n const yMax = Math.ceil(maxV * 1.15);\n\n const xp = (i: number) => PL + (i / Math.max(data.length - 1, 1)) * CW;\n const yp = (v: number) => PT + (1 - v / yMax) * CH;\n\n const smooth = (vals: number[]) => {\n const pts = vals.map((v, i) => ({ x: xp(i), y: yp(v) }));\n const path = pts.reduce((a, p, i) => {\n if (i === 0) return `M ${p.x} ${p.y}`;\n const pr = pts[i - 1];\n const cx = (pr.x + p.x) / 2;\n return `${a} C ${cx} ${pr.y} ${cx} ${p.y} ${p.x} ${p.y}`;\n }, \"\");\n const area = `${path} L ${pts.at(-1)!.x} ${PT + CH} L ${pts[0].x} ${PT + CH} Z`;\n return { pts, path, area };\n };\n\n const lines = active.map((s) => ({\n ...s,\n ...smooth(data.map((d) => d[s.key])),\n }));\n const yTicks = Array.from({ length: 5 }, (_, i) => {\n const v = (yMax * (4 - i)) / 4;\n return { v: Math.round(v), y: yp(v) };\n });\n const step = Math.max(1, Math.ceil(data.length / 8));\n const segW = CW / Math.max(data.length - 1, 1);\n\n return (\n <svg\n width=\"100%\"\n viewBox={`0 0 ${W} ${H}`}\n preserveAspectRatio=\"xMidYMid meet\"\n style={{ display: \"block\" }}\n aria-label=\"User growth chart\"\n role=\"img\"\n >\n <defs>\n {lines.map((s) => (\n <linearGradient\n key={s.key}\n id={`ag-${s.key}`}\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop offset=\"0%\" stopColor={s.color} stopOpacity=\"0.18\" />\n <stop offset=\"100%\" stopColor={s.color} stopOpacity=\"0\" />\n </linearGradient>\n ))}\n </defs>\n\n {yTicks.map((t) => (\n <g key={t.v}>\n <line\n x1={PL}\n y1={t.y}\n x2={W - PR}\n y2={t.y}\n stroke=\"#eaeaef\"\n strokeWidth=\"1\"\n />\n <text\n x={PL - 6}\n y={t.y + 4}\n textAnchor=\"end\"\n fill={T.textMuted}\n fontSize=\"9\"\n >\n {t.v >= 1000 ? `${(t.v / 1000).toFixed(1)}k` : t.v}\n </text>\n </g>\n ))}\n <line\n x1={PL}\n y1={PT + CH}\n x2={W - PR}\n y2={PT + CH}\n stroke=\"#eaeaef\"\n strokeWidth=\"1\"\n />\n\n {lines.map((s) => (\n <path key={`area-${s.key}`} d={s.area} fill={`url(#ag-${s.key})`} />\n ))}\n {lines.map((s) => (\n <path\n key={`line-${s.key}`}\n d={s.path}\n stroke={s.color}\n strokeWidth=\"2\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n ))}\n\n {data.map((d, i) => {\n if (i % step !== 0 && i !== data.length - 1) return null;\n return (\n <text\n key={i}\n x={xp(i)}\n y={H - 6}\n textAnchor=\"middle\"\n fill={T.textMuted}\n fontSize=\"9\"\n >\n {d.label}\n </text>\n );\n })}\n\n {data.map((d, i) => {\n const isHov = hovered === i;\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: SVG chart hover\n <g\n key={i}\n onMouseEnter={() => onHover(i)}\n onMouseLeave={() => onHover(null)}\n style={{ cursor: \"crosshair\" }}\n >\n <rect\n x={xp(i) - segW / 2}\n y={PT}\n width={segW}\n height={CH}\n fill=\"transparent\"\n />\n {isHov && (\n <line\n x1={xp(i)}\n y1={PT}\n x2={xp(i)}\n y2={PT + CH}\n stroke=\"rgba(50,50,77,0.2)\"\n strokeWidth=\"1\"\n strokeDasharray=\"3 3\"\n />\n )}\n {lines.map((s) => (\n <circle\n key={s.key}\n cx={xp(i)}\n cy={yp(d[s.key])}\n r={isHov ? 4 : 2.5}\n fill={s.color}\n stroke={T.bg}\n strokeWidth={isHov ? 2 : 1}\n opacity={isHov ? 1 : 0.5}\n />\n ))}\n </g>\n );\n })}\n </svg>\n );\n}\n\n// ─── Progress ring ────────────────────────────────────────────────────────────\n\nfunction ProgressRing({\n value,\n max,\n color,\n size = 56,\n}: {\n value: number;\n max: number;\n color: string;\n size?: number;\n}) {\n const r = (size - 9) / 2;\n const circ = 2 * Math.PI * r;\n const pct = Math.min(value / Math.max(max, 1), 1);\n const offset = circ * (1 - pct);\n return (\n <svg\n width={size}\n height={size}\n style={{ flexShrink: 0 }}\n aria-hidden={true}\n >\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke=\"#e5e7eb\"\n strokeWidth=\"7\"\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={color}\n strokeWidth=\"7\"\n strokeDasharray={`${circ} ${circ}`}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n style={{\n transition: \"stroke-dashoffset 0.9s cubic-bezier(0.4,0,0.2,1)\",\n }}\n />\n </svg>\n );\n}\n\n// ─── Utilities ────────────────────────────────────────────────────────────────\n\nfunction relTime(date: string | Date) {\n const diff = Date.now() - new Date(date).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return \"just now\";\n if (mins < 60) return `${mins}m`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h`;\n return `${Math.floor(hrs / 24)}d`;\n}\n\nfunction rateHue(r: number) {\n return r >= 70 ? 142 : r >= 40 ? 38 : 4;\n}\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ntype User = {\n id: string;\n name: string;\n email: string;\n image?: string;\n emailVerified: boolean;\n banned?: boolean;\n createdAt: string | Date;\n};\n\ntype StrapiSession = {\n id: number;\n documentId: string;\n userId: number;\n ipAddress?: string | null;\n userAgent?: string | null;\n createdAt: string;\n updatedAt: string;\n expiresAt: string;\n};\n\ntype ActiveUser = {\n id: number;\n documentId: string;\n name: string;\n email: string;\n image?: string | null;\n createdAt: string;\n};\n\ntype RetentionRow = {\n n: number;\n label: string;\n cohortStart: string;\n cohortEnd: string;\n activeStart: string;\n activeEnd: string;\n cohortSize: number;\n retentionRate: number;\n};\n\n// ─── Stat card with count-up ──────────────────────────────────────────────────\n\nfunction StatItem({\n id,\n label,\n value,\n pct,\n sparkline,\n color,\n delay = 0,\n}: {\n id: string;\n label: string;\n value: number;\n pct?: number;\n sparkline?: number[];\n color: string;\n delay?: number;\n}) {\n const animated = useCountUp(value);\n const isPos = pct === undefined || pct >= 0;\n return (\n <StatCard $delay={delay} $accent={color}>\n <StatLabel>{label}</StatLabel>\n <StatValue>{animated.toLocaleString()}</StatValue>\n {pct !== undefined && (\n <TrendBadge $pos={isPos}>\n {isPos ? \"↑\" : \"↓\"} {Math.abs(pct).toFixed(1)}%\n </TrendBadge>\n )}\n {sparkline && sparkline.length > 1 && (\n <SparkWrap>\n <Sparkline data={sparkline} color={color} id={id} />\n </SparkWrap>\n )}\n </StatCard>\n );\n}\n\n// ─── Page ─────────────────────────────────────────────────────────────────────\n\nexport function OverviewPage() {\n const { get } = useFetchClient();\n const [period, setPeriod] = useState<\"daily\" | \"weekly\" | \"monthly\">(\n \"weekly\",\n );\n const [feedMode, setFeedMode] = useState<\"signups\" | \"active\">(\"signups\");\n const [hovIdx, setHovIdx] = useState<number | null>(null);\n const [rtnHov, setRtnHov] = useState<number | null>(null);\n const [activeSeries, setActiveSeries] = useState(\n () => new Set([\"totalUsers\", \"newUsers\", \"activeUsers\"]),\n );\n\n const toggleSeries = (key: string) => {\n setActiveSeries((prev) => {\n const next = new Set(prev);\n if (next.has(key) && next.size > 1) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n const statsQuery = useQuery({\n queryKey: [\"dash-user-stats\"],\n queryFn: async () => {\n const r = await client.dash.userStats();\n if (r.error) throw new Error(r.error.message ?? \"Failed\");\n return r.data;\n },\n });\n\n const graphQuery = useQuery({\n queryKey: [\"dash-user-graph\", period],\n queryFn: async () => {\n const r = await client.dash.userGraphData({ query: { period } });\n if (r.error) throw new Error(r.error.message ?? \"Failed\");\n return r.data;\n },\n });\n\n const retentionQuery = useQuery({\n queryKey: [\"dash-user-retention\", period],\n queryFn: async () => {\n const r = await client.dash.userRetentionData({ query: { period } });\n if (r.error) throw new Error(r.error.message ?? \"Failed\");\n return r.data;\n },\n });\n\n const usersQuery = useQuery({\n queryKey: [\"dash-recent-users\"],\n queryFn: async () => {\n const r = await client.dash.listUsers({\n query: { limit: 12, offset: 0, sortBy: \"createdAt\", sortOrder: \"desc\" },\n });\n if (r.error) throw new Error(r.error.message ?? \"Failed\");\n return r.data;\n },\n });\n\n const sessionsQuery = useQuery({\n queryKey: [\"dash-recent-sessions\"],\n queryFn: async () => {\n const { data } = await get<{ results: StrapiSession[] }>(\n \"/better-auth-dashboard/db?uid=plugin::better-auth.session&pagination[pageSize]=12&sort[0]=updatedAt:desc\",\n );\n return (data as { results?: StrapiSession[] }).results ?? [];\n },\n refetchInterval: 30_000,\n });\n\n const orgsQuery = useQuery({\n queryKey: [\"dash-orgs-count\"],\n queryFn: async () => {\n const r = await (client.dash as any).listOrganizations({\n query: { page: 1, limit: 1 },\n });\n if (r.error) throw new Error(r.error.message ?? \"Failed\");\n return r.data;\n },\n });\n\n // Derive ordered unique userIds from sessions for the \"recently active\" feed\n const sessionsRaw = sessionsQuery.data ?? [];\n const activeUserIds: string[] = [];\n const lastActiveByUserId = new Map<string, string>();\n for (const s of sessionsRaw) {\n const uid = String(s.userId);\n if (!lastActiveByUserId.has(uid)) {\n lastActiveByUserId.set(uid, s.updatedAt ?? s.createdAt);\n activeUserIds.push(uid);\n }\n }\n\n const activeUsersQuery = useQuery({\n queryKey: [\"dash-active-users\", activeUserIds],\n queryFn: async () => {\n if (activeUserIds.length === 0) return [];\n const params = new URLSearchParams({ uid: \"plugin::better-auth.user\" });\n for (let i = 0; i < activeUserIds.length; i++) {\n params.set(`filters[id][$in][${i}]`, activeUserIds[i]);\n }\n params.set(\"pagination[pageSize]\", \"12\");\n const { data } = await get<{ results: ActiveUser[] }>(\n `/better-auth-dashboard/db?${params}`,\n );\n return (data as { results?: ActiveUser[] }).results ?? [];\n },\n enabled: feedMode === \"active\" && activeUserIds.length > 0,\n });\n\n // Match FeedCard height to ChartCard height via ResizeObserver\n const chartRef = useRef<HTMLDivElement>(null);\n const [chartHeight, setChartHeight] = useState(0);\n useEffect(() => {\n const el = chartRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n for (const entry of entries) setChartHeight(entry.contentRect.height);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n if (statsQuery.isLoading) {\n return (\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n padding={12}\n style={{ background: T.bg, minHeight: \"100%\" }}\n >\n <Loader>Loading…</Loader>\n </Flex>\n );\n }\n\n const stats = statsQuery.data;\n if (!stats) return null;\n\n const graphData = (graphQuery.data?.data ?? []) as GraphRow[];\n const rtnData = (retentionQuery.data?.data ?? []) as RetentionRow[];\n const users = (usersQuery.data?.users ?? []) as User[];\n const orgCount = (orgsQuery.data as any)?.total ?? 0;\n\n // Build sorted active users (session order preserved, joined with user docs)\n const activeUserMap = new Map<string, ActiveUser>();\n for (const u of activeUsersQuery.data ?? []) {\n activeUserMap.set(String(u.id), u);\n }\n const sortedActiveUsers = activeUserIds\n .map((uid) => activeUserMap.get(uid))\n .filter((u): u is ActiveUser => u !== undefined);\n\n const totalSpark = graphData.map((d) => d.totalUsers);\n const newSpark = graphData.map((d) => d.newUsers);\n const activeSpark = graphData.map((d) => d.activeUsers);\n\n const hovRow = hovIdx !== null ? graphData[hovIdx] : null;\n const rtnHovRow = rtnHov !== null ? rtnData[rtnHov] : null;\n\n const activeMax = Math.max(\n stats.activeUsers.daily.active ?? 0,\n stats.activeUsers.weekly.active ?? 0,\n stats.activeUsers.monthly.active ?? 0,\n 1,\n );\n\n return (\n <Wrap data-testid=\"overview-page\">\n {/* ── Header ── */}\n <Flex justifyContent=\"space-between\" alignItems=\"flex-end\">\n <div>\n <div\n style={{\n fontSize: 22,\n fontWeight: 800,\n color: T.textPrimary,\n letterSpacing: \"-0.03em\",\n }}\n >\n Overview\n </div>\n <div style={{ fontSize: 11, color: T.textSecondary, marginTop: 4 }}>\n {new Date().toLocaleDateString(undefined, {\n weekday: \"long\",\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })}\n </div>\n </div>\n <PillGroup>\n {([\"daily\", \"weekly\", \"monthly\"] as const).map((p) => (\n <Pill key={p} $active={period === p} onClick={() => setPeriod(p)}>\n {p[0].toUpperCase() + p.slice(1)}\n </Pill>\n ))}\n </PillGroup>\n </Flex>\n\n {/* ── Metrics ── */}\n <SectionDivider>\n <DivLabel>Metrics</DivLabel>\n <DivLine />\n </SectionDivider>\n\n <StatGrid>\n <StatItem\n id=\"total\"\n label=\"Total Users\"\n value={stats.total ?? 0}\n sparkline={totalSpark}\n color={T.accent}\n delay={0}\n />\n <StatItem\n id=\"d-sig\"\n label=\"Daily Sign-ups\"\n value={stats.daily.signUps ?? 0}\n pct={stats.daily.percentage ?? undefined}\n sparkline={newSpark}\n color={T.green}\n delay={1}\n />\n <StatItem\n id=\"w-sig\"\n label=\"Weekly Sign-ups\"\n value={stats.weekly.signUps ?? 0}\n pct={stats.weekly.percentage ?? undefined}\n sparkline={newSpark}\n color={T.green}\n delay={2}\n />\n <StatItem\n id=\"m-sig\"\n label=\"Monthly Sign-ups\"\n value={stats.monthly.signUps ?? 0}\n pct={stats.monthly.percentage ?? undefined}\n sparkline={newSpark}\n color={T.green}\n delay={3}\n />\n <StatItem\n id=\"orgs\"\n label=\"Organizations\"\n value={orgCount}\n color={T.purple}\n delay={4}\n />\n </StatGrid>\n\n {/* ── Growth ── */}\n <SectionDivider>\n <DivLabel>Growth</DivLabel>\n <DivLine />\n </SectionDivider>\n\n <TwoPanel>\n <ChartCard ref={chartRef} $delay={5}>\n <ChartHeader>\n <ChartTitle>User Growth</ChartTitle>\n <SeriesRow>\n {ALL_SERIES.map((s) => (\n <SeriesBtn\n key={s.key}\n $on={activeSeries.has(s.key)}\n $c={s.color}\n onClick={() => toggleSeries(s.key)}\n >\n <SDot $c={s.color} />\n {s.label}\n </SeriesBtn>\n ))}\n </SeriesRow>\n </ChartHeader>\n <HoverInfo>\n {hovRow\n ? `${hovRow.label} · ${hovRow.totalUsers.toLocaleString()} total · +${hovRow.newUsers.toLocaleString()} new · ${hovRow.activeUsers.toLocaleString()} active`\n : \"Hover the chart to inspect a data point\"}\n </HoverInfo>\n {graphQuery.isLoading ? (\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n style={{ flex: 1, minHeight: 170 }}\n >\n <Loader>Loading…</Loader>\n </Flex>\n ) : (\n <GrowthChart\n data={graphData}\n hovered={hovIdx}\n onHover={setHovIdx}\n activeSeries={activeSeries}\n />\n )}\n </ChartCard>\n\n <FeedCard\n $delay={6}\n style={chartHeight > 0 ? { height: chartHeight } : undefined}\n >\n <FeedHead>\n <span>\n {feedMode === \"signups\" ? \"Recent Sign-ups\" : \"Recently Active\"}\n </span>\n <FeedSelect\n value={feedMode}\n onChange={(e) =>\n setFeedMode(e.target.value as \"signups\" | \"active\")\n }\n >\n <option value=\"signups\">Recent Sign-ups</option>\n <option value=\"active\">Recently Active</option>\n </FeedSelect>\n </FeedHead>\n <FeedScroll>\n {feedMode === \"signups\" ? (\n usersQuery.isLoading ? (\n <Flex justifyContent=\"center\" padding={4}>\n <Loader>Loading…</Loader>\n </Flex>\n ) : users.length === 0 ? (\n <Empty>No users yet</Empty>\n ) : (\n users.map((u) => (\n <FeedItem key={u.id}>\n <FeedTop>\n <Flex alignItems=\"center\" gap={1} style={{ minWidth: 0 }}>\n <Avatar name={u.name} src={u.image} size={20} />\n <FeedName title={u.name}>{u.name}</FeedName>\n </Flex>\n <FeedMeta>{relTime(u.createdAt)}</FeedMeta>\n </FeedTop>\n <FeedEmail title={u.email}>{u.email}</FeedEmail>\n </FeedItem>\n ))\n )\n ) : activeUsersQuery.isLoading || sessionsQuery.isLoading ? (\n <Flex justifyContent=\"center\" padding={4}>\n <Loader>Loading…</Loader>\n </Flex>\n ) : sortedActiveUsers.length === 0 ? (\n <Empty>No recent activity</Empty>\n ) : (\n sortedActiveUsers.map((u) => (\n <FeedItem key={u.documentId}>\n <FeedTop>\n <Flex alignItems=\"center\" gap={1} style={{ minWidth: 0 }}>\n <Avatar\n name={u.name}\n src={u.image ?? undefined}\n size={20}\n />\n <FeedName title={u.name}>{u.name}</FeedName>\n </Flex>\n <FeedMeta>\n {relTime(\n lastActiveByUserId.get(String(u.id)) ?? u.createdAt,\n )}\n </FeedMeta>\n </FeedTop>\n <FeedEmail title={u.email}>{u.email}</FeedEmail>\n </FeedItem>\n ))\n )}\n </FeedScroll>\n </FeedCard>\n </TwoPanel>\n\n {/* ── Retention & Activity ── */}\n <SectionDivider>\n <DivLabel>Retention &amp; Activity</DivLabel>\n <DivLine />\n </SectionDivider>\n\n <TwoPanel>\n <RtnCard $delay={7}>\n <ChartHeader>\n <ChartTitle>Cohort Retention</ChartTitle>\n <Flex alignItems=\"center\" gap={2}>\n {[\n { hue: 142, label: \"≥70%\" },\n { hue: 38, label: \"40–70%\" },\n { hue: 4, label: \"<40%\" },\n ].map(({ hue, label }) => (\n <Flex\n key={hue}\n alignItems=\"center\"\n gap={1}\n style={{ marginLeft: 8 }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: `hsl(${hue},60%,50%)`,\n display: \"inline-block\",\n flexShrink: 0,\n }}\n />\n <span style={{ fontSize: 9, color: T.textMuted }}>\n {label}\n </span>\n </Flex>\n ))}\n </Flex>\n </ChartHeader>\n\n <RtnTip>\n {rtnHovRow\n ? `Cohort ${rtnHovRow.label} · ${rtnHovRow.cohortSize.toLocaleString()} users · active ${rtnHovRow.activeStart} – ${rtnHovRow.activeEnd}`\n : \"Hover a row to see cohort details\"}\n </RtnTip>\n\n {retentionQuery.isLoading ? (\n <Flex\n justifyContent=\"center\"\n alignItems=\"center\"\n style={{ minHeight: 80 }}\n >\n <Loader>Loading…</Loader>\n </Flex>\n ) : rtnData.length === 0 ? (\n <Empty>\n <div style={{ fontSize: 22 }}>📉</div>\n <div>No retention data for this period</div>\n </Empty>\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 5 }}>\n {rtnData.map((row, i) => {\n const hue = rateHue(row.retentionRate);\n return (\n <RtnRow\n key={row.n}\n $hov={rtnHov === i}\n onMouseEnter={() => setRtnHov(i)}\n onMouseLeave={() => setRtnHov(null)}\n >\n <RtnLabel>{row.label}</RtnLabel>\n <RtnSize>{row.cohortSize.toLocaleString()}</RtnSize>\n <RtnTrack>\n <RtnBar $w={row.retentionRate} $hue={hue} />\n </RtnTrack>\n <RtnPct $hue={hue}>{row.retentionRate.toFixed(1)}%</RtnPct>\n </RtnRow>\n );\n })}\n </div>\n )}\n </RtnCard>\n\n <RingGrid>\n {(\n [\n {\n label: \"Daily Active\",\n value: stats.activeUsers.daily.active,\n pct: stats.activeUsers.daily.percentage,\n color: T.amber,\n sparkline: activeSpark,\n delay: 8,\n },\n {\n label: \"Weekly Active\",\n value: stats.activeUsers.weekly.active,\n pct: stats.activeUsers.weekly.percentage,\n color: T.green,\n sparkline: activeSpark,\n delay: 9,\n },\n {\n label: \"Monthly Active\",\n value: stats.activeUsers.monthly.active,\n pct: stats.activeUsers.monthly.percentage,\n color: T.accent,\n sparkline: activeSpark,\n delay: 10,\n },\n ] as const\n ).map(({ label, value, pct, color, delay }) => {\n const isPos = pct == null || pct >= 0;\n return (\n <RingCard key={label} $delay={delay}>\n <ProgressRing\n value={value ?? 0}\n max={activeMax}\n color={color}\n size={56}\n />\n <RingInfo>\n <RingLabel>{label}</RingLabel>\n <RingVal>{(value ?? 0).toLocaleString()}</RingVal>\n {pct != null && (\n <TrendBadge\n $pos={isPos}\n style={{ marginTop: 4, marginBottom: 0 }}\n >\n {isPos ? \"↑\" : \"↓\"} {Math.abs(pct).toFixed(1)}%\n </TrendBadge>\n )}\n </RingInfo>\n </RingCard>\n );\n })}\n </RingGrid>\n </TwoPanel>\n </Wrap>\n );\n}\n","import { useQuery } from \"react-query\";\nimport { client } from \"../client\";\n\ntype RawUsers = Awaited<ReturnType<typeof client.dash.listUsers>>;\nexport type DashUser = NonNullable<RawUsers[\"data\"]>[\"users\"][number];\n\nexport interface UseUsersOptions {\n limit?: number;\n offset?: number;\n search?: string;\n}\n\nexport function useUsers(options: UseUsersOptions = {}) {\n const { limit = 25, offset = 0, search } = options;\n\n return useQuery({\n queryKey: [\"dash-users\", limit, offset, search],\n queryFn: async () => {\n const whereClause = search\n ? JSON.stringify([\n {\n field: \"email\",\n operator: \"contains\",\n value: search,\n },\n ])\n : undefined;\n\n const result = await client.dash.listUsers({\n query: {\n limit,\n offset,\n sortBy: \"createdAt\",\n sortOrder: \"desc\",\n ...(whereClause ? { where: whereClause } : {}),\n },\n });\n\n if (result.error) {\n throw new Error(result.error.message ?? \"Failed to load users\");\n }\n return result.data;\n },\n keepPreviousData: true,\n });\n}\n","import {\n Box,\n Button,\n Checkbox,\n Field,\n Flex,\n TextInput,\n Typography,\n} from \"@strapi/design-system\";\nimport { useNotification } from \"@strapi/strapi/admin\";\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport { useMutation, useQueryClient } from \"react-query\";\nimport { client } from \"../../client\";\nimport { Drawer } from \"../../components/Drawer\";\nimport { FormSection, SectionLabel } from \"../../components/FormPrimitives\";\nimport { MediaPickerField } from \"../../components/MediaPickerField\";\n\ninterface Props {\n onClose: () => void;\n}\n\nexport function CreateUserDialog({ onClose }: Props) {\n const qc = useQueryClient();\n const { toggleNotification } = useNotification();\n\n const [name, setName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n const [image, setImage] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [generatePassword, setGeneratePassword] = useState(false);\n const [emailVerified, setEmailVerified] = useState(false);\n const [sendVerificationEmail, setSendVerificationEmail] = useState(false);\n\n const createMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.createUser({\n name,\n email,\n ...(image ? { image } : {}),\n ...(generatePassword\n ? { generatePassword: true }\n : password\n ? { password }\n : {}),\n emailVerified,\n sendVerificationEmail,\n });\n if (result.error)\n throw new Error(result.error.message ?? \"Create failed\");\n return result.data;\n },\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: [\"dash-users\"] });\n qc.invalidateQueries({ queryKey: [\"dash-user-stats\"] });\n toggleNotification({\n type: \"success\",\n message: \"User created successfully\",\n });\n onClose();\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to create user\",\n });\n },\n });\n\n const footer = (\n <>\n <Button variant=\"tertiary\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n loading={createMutation.isLoading}\n onClick={() => createMutation.mutate()}\n disabled={!name || !email}\n data-testid=\"create-user-submit\"\n >\n Create user\n </Button>\n </>\n );\n\n return (\n <Drawer\n title=\"Create user\"\n footer={footer}\n onClose={onClose}\n data-testid=\"create-user-drawer\"\n >\n <Flex direction=\"column\" gap={5}>\n {/* Personal information */}\n <FormSection>\n <SectionLabel>Personal information</SectionLabel>\n <Field.Root style={{ width: \"100%\" }} required>\n <Field.Label>Full name</Field.Label>\n <TextInput\n name=\"name\"\n value={name}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setName(e.target.value)\n }\n placeholder=\"Jane Smith\"\n data-testid=\"new-user-name\"\n />\n </Field.Root>\n <Field.Root style={{ width: \"100%\" }} required>\n <Field.Label>Email address</Field.Label>\n <TextInput\n name=\"email\"\n type=\"email\"\n value={email}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEmail(e.target.value)\n }\n placeholder=\"jane@example.com\"\n data-testid=\"new-user-email\"\n />\n </Field.Root>\n <MediaPickerField\n label=\"Avatar URL\"\n name=\"image\"\n value={image}\n onChange={setImage}\n placeholder=\"https://example.com/avatar.png\"\n hint=\"Optional — publicly accessible image URL\"\n />\n </FormSection>\n\n {/* Password section */}\n <FormSection>\n <SectionLabel>Password</SectionLabel>\n <Checkbox\n name=\"generatePassword\"\n checked={generatePassword}\n onCheckedChange={(checked: boolean) => {\n setGeneratePassword(checked);\n if (checked) setPassword(\"\");\n }}\n >\n Generate a random password\n </Checkbox>\n {!generatePassword && (\n <Field.Root style={{ width: \"100%\" }}>\n <Field.Label>Password</Field.Label>\n <TextInput\n name=\"password\"\n type=\"password\"\n value={password}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setPassword(e.target.value)\n }\n placeholder=\"Leave blank for a passwordless account\"\n />\n </Field.Root>\n )}\n </FormSection>\n\n {/* Email verification */}\n <FormSection>\n <SectionLabel>Email verification</SectionLabel>\n <Checkbox\n name=\"emailVerified\"\n checked={emailVerified}\n onCheckedChange={(checked: boolean) => {\n setEmailVerified(checked);\n if (checked) setSendVerificationEmail(false);\n }}\n >\n Mark email as already verified\n </Checkbox>\n {!emailVerified && (\n <Checkbox\n name=\"sendVerificationEmail\"\n checked={sendVerificationEmail}\n onCheckedChange={(checked: boolean) =>\n setSendVerificationEmail(checked)\n }\n >\n Send a verification email to the user\n </Checkbox>\n )}\n {emailVerified && (\n <Box>\n <Typography variant=\"pi\" textColor=\"success600\">\n The user will be able to sign in immediately without verifying\n their email.\n </Typography>\n </Box>\n )}\n </FormSection>\n </Flex>\n </Drawer>\n );\n}\n","import {\n Alert,\n Badge,\n Box,\n Button,\n Checkbox,\n Field,\n Flex,\n Grid,\n IconButton,\n Loader,\n Modal,\n Tabs,\n TextInput,\n Typography,\n} from \"@strapi/design-system\";\nimport { Trash } from \"@strapi/icons\";\nimport { useFetchClient, useNotification } from \"@strapi/strapi/admin\";\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"react-query\";\nimport styled from \"styled-components\";\nimport { client } from \"../../client\";\nimport { Avatar } from \"../../components/Avatar\";\nimport { ConfirmDialog } from \"../../components/ConfirmDialog\";\nimport { Drawer } from \"../../components/Drawer\";\nimport { CustomFieldsSection } from \"../../components/DynamicField\";\nimport { EditViewSidePanels } from \"../../components/EditViewSidePanels\";\nimport {\n AccountRow,\n DangerRow,\n EditLayout,\n EditSidebar,\n FormSection,\n MetaItem,\n MetaKey,\n MetaVal,\n MonoChip,\n PreviewPill,\n ProviderBadge,\n RoleBadge,\n SectionLabel,\n WarnCard,\n} from \"../../components/FormPrimitives\";\nimport { MediaPickerField } from \"../../components/MediaPickerField\";\nimport { useModelSchema } from \"../../hooks/useModelSchema\";\nimport { withContext } from \"../../utils/dashContext\";\n\n// ─── 2FA styled components ────────────────────────────────────────────────────\n\nconst TwoFaChip = styled.span<{ $enabled: boolean }>`\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 10px;\n border-radius: 20px;\n font-size: 11px;\n font-weight: 700;\n background: ${(p) => (p.$enabled ? \"#eafbe7\" : \"#f0f0ff\")};\n color: ${(p) => (p.$enabled ? \"#5cb176\" : \"#8e8ea9\")};\n &::before {\n content: '';\n display: inline-block;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: ${(p) => (p.$enabled ? \"#5cb176\" : \"#b8b8c7\")};\n }\n`;\n\nconst BackupCodeGrid = styled.div`\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 6px;\n`;\n\nconst BackupCodeItem = styled.span`\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n font-size: 12px;\n font-weight: 600;\n padding: 6px 10px;\n background: white;\n border: 1px solid #eaeaef;\n border-radius: 6px;\n color: #32324d;\n letter-spacing: 0.05em;\n text-align: center;\n`;\n\nconst ReadOnlyCodeInput = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: white;\n border: 1px solid #eaeaef;\n border-radius: 6px;\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n font-size: 11px;\n color: #32324d;\n word-break: break-all;\n overflow-wrap: anywhere;\n`;\n\n// ─── Session sub-row (per-user sessions tab) ──────────────────────────────────\n\nconst SessionCard = styled.div`\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 14px;\n background: white;\n border: 1px solid #eaeaef;\n border-radius: 8px;\n`;\n\nconst SessionMeta = styled.div`\n display: flex;\n flex-direction: column;\n gap: 3px;\n flex: 1;\n min-width: 0;\n`;\n\nconst IpChip = styled.span`\n display: inline-block;\n background: #f0f0ff;\n color: #4945ff;\n border-radius: 5px;\n padding: 2px 6px;\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n font-size: 11px;\n font-weight: 600;\n`;\n\nconst TimestampText = styled.span`\n font-size: 11px;\n color: #8e8ea9;\n`;\n\nconst AgentText = styled.span`\n font-size: 11px;\n color: #b8b8c7;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: block;\n`;\n\n// ─── Standard field set ───────────────────────────────────────────────────────\n\nconst STANDARD_FIELDS = new Set([\n \"id\",\n \"name\",\n \"email\",\n \"emailVerified\",\n \"image\",\n \"banned\",\n \"banReason\",\n \"banExpires\",\n \"createdAt\",\n \"updatedAt\",\n]);\n\ninterface Props {\n userId: string;\n banEnabled: boolean;\n emailVerificationEnabled: boolean;\n twoFactorEnabled: boolean;\n onClose: () => void;\n}\n\nexport function UserDetailDrawer({\n userId,\n banEnabled,\n emailVerificationEnabled,\n twoFactorEnabled,\n onClose,\n}: Props) {\n const qc = useQueryClient();\n const { toggleNotification } = useNotification();\n const { get, put } = useFetchClient();\n const schemaQuery = useModelSchema(\"user\");\n\n const userQuery = useQuery({\n queryKey: [\"dash-user\", userId],\n queryFn: async () => {\n const result = await client.dash.user({}, withContext({ userId }));\n if (result.error)\n throw new Error(result.error.message ?? \"Failed to load user\");\n return result.data;\n },\n });\n\n const orgsQuery = useQuery({\n queryKey: [\"dash-user-orgs\", userId],\n queryFn: async () => {\n const result = await client.dash.userOrganizations(\n {},\n withContext({ userId }),\n );\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n return result.data?.organizations ?? [];\n },\n });\n\n type StrapiSession = {\n id: number;\n documentId: string;\n userId: string;\n ipAddress?: string | null;\n userAgent?: string | null;\n createdAt: string;\n expiresAt: string;\n };\n\n const sessionsQuery = useQuery({\n queryKey: [\"dash-user-sessions\", userId],\n queryFn: async () => {\n const { data } = await get<{ results: StrapiSession[] }>(\n `/better-auth-dashboard/db?uid=plugin::better-auth.session&filters[userId][$eq]=${userId}&sort[0]=createdAt:desc&pagination[pageSize]=50`,\n );\n return (data as { results?: StrapiSession[] }).results ?? [];\n },\n });\n\n const strapiUserQuery = useQuery({\n queryKey: [\"dash-strapi-user\", userId],\n enabled: !!schemaQuery.data,\n queryFn: async () => {\n const relationFields = Object.entries(schemaQuery.data!)\n .filter(([, attr]) => attr.type === \"relation\")\n .map(([fieldName]) => fieldName);\n\n const populateParam =\n relationFields.length > 0\n ? `&populate=${encodeURIComponent(relationFields.join(\",\"))}`\n : \"\";\n\n const { data } = await get<{ results: Record<string, unknown>[] }>(\n `/better-auth-dashboard/db?uid=plugin::better-auth.user&filters[id][$eq]=${userId}&pagination[pageSize]=1${populateParam}`,\n );\n return (\n (data as { results?: Record<string, unknown>[] }).results?.[0] ?? null\n );\n },\n });\n\n const [activeTab, setActiveTab] = useState(\"profile\");\n const [editName, setEditName] = useState<string | undefined>(undefined);\n const [editEmail, setEditEmail] = useState<string | undefined>(undefined);\n const [editEmailVerified, setEditEmailVerified] = useState<\n boolean | undefined\n >(undefined);\n const [editImage, setEditImage] = useState<string | undefined>(undefined);\n const [editExtra, setEditExtra] = useState<Record<string, unknown>>({});\n const [newPassword, setNewPassword] = useState(\"\");\n const [banReason, setBanReason] = useState(\"\");\n const [banExpiresDays, setBanExpiresDays] = useState(\"\");\n const [confirmRevokeAll, setConfirmRevokeAll] = useState(false);\n const [confirmRevokeSessionId, setConfirmRevokeSessionId] = useState<\n string | null\n >(null);\n const [confirmBan, setConfirmBan] = useState(false);\n const [confirmUnban, setConfirmUnban] = useState(false);\n const [confirmUnlinkAccountId, setConfirmUnlinkAccountId] = useState<\n string | null\n >(null);\n const [confirmDisable2FA, setConfirmDisable2FA] = useState(false);\n const [showTotpModal, setShowTotpModal] = useState(false);\n const [showBackupCodesModal, setShowBackupCodesModal] = useState(false);\n const [confirmRegenerateBackupCodes, setConfirmRegenerateBackupCodes] =\n useState(false);\n const [twoFactorData, setTwoFactorData] = useState<{\n totpURI: string;\n secret: string;\n backupCodes: string[];\n } | null>(null);\n const [totpUriData, setTotpUriData] = useState<{\n totpURI: string;\n secret: string;\n } | null>(null);\n const [backupCodesData, setBackupCodesData] = useState<string[] | null>(null);\n\n const user = userQuery.data;\n const displayName = editName ?? user?.name ?? \"\";\n const displayEmail = editEmail ?? user?.email ?? \"\";\n const displayEmailVerified =\n editEmailVerified ?? user?.emailVerified ?? false;\n const displayImage = editImage ?? user?.image ?? \"\";\n\n const handleExtraChange = (name: string, value: unknown) => {\n setEditExtra((prev) => ({ ...prev, [name]: value }));\n };\n\n const extraData: Record<string, unknown> = {\n ...(strapiUserQuery.data ?? {}),\n ...editExtra,\n };\n\n const updateMutation = useMutation({\n mutationFn: async () => {\n const body: Record<string, unknown> = { ...editExtra };\n if (editName !== undefined) body.name = editName;\n if (editEmail !== undefined) body.email = editEmail;\n if (editEmailVerified !== undefined)\n body.emailVerified = editEmailVerified;\n if (editImage !== undefined) body.image = editImage;\n\n const documentId = strapiUserQuery.data?.documentId as string | undefined;\n if (!documentId) throw new Error(\"Could not resolve documentId for user\");\n\n await put(\n `/better-auth-dashboard/db/${documentId}?uid=plugin::better-auth.user`,\n body,\n );\n },\n onSuccess: async () => {\n await qc.invalidateQueries({ queryKey: [\"dash-strapi-user\", userId] });\n qc.invalidateQueries({ queryKey: [\"dash-user\", userId] });\n qc.invalidateQueries({ queryKey: [\"dash-users\"] });\n setEditName(undefined);\n setEditEmail(undefined);\n setEditEmailVerified(undefined);\n setEditImage(undefined);\n setEditExtra({});\n toggleNotification({\n type: \"success\",\n message: \"User updated successfully\",\n });\n onClose();\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Update failed\",\n });\n },\n });\n\n const revokeSessionMutation = useMutation({\n mutationFn: async (sessionId: string) => {\n const result = await client.dash.sessions.revoke(\n {},\n withContext({ sessionId, userId }),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Revoke failed\");\n },\n onSuccess: () => {\n setConfirmRevokeSessionId(null);\n qc.invalidateQueries({ queryKey: [\"dash-user-sessions\", userId] });\n toggleNotification({ type: \"success\", message: \"Session revoked\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to revoke session\",\n });\n },\n });\n\n const passwordMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.setPassword(\n { password: newPassword },\n withContext({ userId }),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Password update failed\");\n return result.data;\n },\n onSuccess: () => {\n setNewPassword(\"\");\n toggleNotification({\n type: \"success\",\n message: \"Password updated successfully\",\n });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Password update failed\",\n });\n },\n });\n\n const banMutation = useMutation({\n mutationFn: async () => {\n const body: { banReason?: string; banExpires?: number } = {};\n if (banReason) body.banReason = banReason;\n if (banExpiresDays) {\n const days = parseInt(banExpiresDays, 10);\n if (!Number.isNaN(days)) body.banExpires = Date.now() + days * 86400000;\n }\n const result = await client.dash.banUser(body, withContext({ userId }));\n if (result.error) throw new Error(result.error.message ?? \"Ban failed\");\n return result.data;\n },\n onSuccess: () => {\n setConfirmBan(false);\n qc.invalidateQueries({ queryKey: [\"dash-user\", userId] });\n qc.invalidateQueries({ queryKey: [\"dash-users\"] });\n setBanReason(\"\");\n setBanExpiresDays(\"\");\n toggleNotification({ type: \"success\", message: \"User has been banned\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Ban failed\",\n });\n },\n });\n\n const unbanMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.unbanUser({}, withContext({ userId }));\n if (result.error) throw new Error(result.error.message ?? \"Unban failed\");\n return result.data;\n },\n onSuccess: () => {\n setConfirmUnban(false);\n qc.invalidateQueries({ queryKey: [\"dash-user\", userId] });\n qc.invalidateQueries({ queryKey: [\"dash-users\"] });\n toggleNotification({ type: \"success\", message: \"Ban has been lifted\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Unban failed\",\n });\n },\n });\n\n const unlinkAccountMutation = useMutation({\n mutationFn: async (providerId: string) => {\n const result = await client.dash.unlinkAccount(\n { providerId },\n withContext({ userId }),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Failed to unlink account\");\n },\n onSuccess: () => {\n setConfirmUnlinkAccountId(null);\n qc.invalidateQueries({ queryKey: [\"dash-user\", userId] });\n toggleNotification({ type: \"success\", message: \"Account unlinked\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to unlink account\",\n });\n },\n });\n\n const revokeAllMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.sessions.revokeAll(\n { userId },\n withContext({}),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Revoke failed\");\n return result.data;\n },\n onSuccess: () => {\n setConfirmRevokeAll(false);\n toggleNotification({ type: \"success\", message: \"All sessions revoked\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to revoke sessions\",\n });\n },\n });\n\n const sendVerificationMutation = useMutation({\n mutationFn: async () => {\n const callbackUrl = new URL(window.location.href, window.location.origin);\n const result = await client.dash.sendVerificationEmail(\n { callbackUrl: callbackUrl.toString() },\n withContext({ userId }),\n );\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n return result.data;\n },\n onSuccess: () => {\n toggleNotification({\n type: \"success\",\n message: \"Verification email sent\",\n });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to send email\",\n });\n },\n });\n\n const sendResetPasswordMutation = useMutation({\n mutationFn: async () => {\n const callbackUrl = new URL(window.location.href, window.location.origin);\n const result = await client.dash.sendResetPasswordEmail(\n { callbackUrl: callbackUrl.toString() },\n withContext({ userId }),\n );\n if (result.error) throw new Error(result.error.message ?? \"Failed\");\n return result.data;\n },\n onSuccess: () => {\n toggleNotification({\n type: \"success\",\n message: \"Password reset email sent\",\n });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to send email\",\n });\n },\n });\n\n const enableTwoFactorMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.enableTwoFactor(\n {},\n withContext({ userId }),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Failed to enable 2FA\");\n return result.data;\n },\n onSuccess: (data) => {\n if (data) setTwoFactorData(data);\n qc.invalidateQueries({ queryKey: [\"dash-user\", userId] });\n toggleNotification({\n type: \"success\",\n message: \"Two-factor authentication enabled\",\n });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to enable 2FA\",\n });\n },\n });\n\n const disableTwoFactorMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.disableTwoFactor(\n {},\n withContext({ userId }),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Failed to disable 2FA\");\n return result.data;\n },\n onSuccess: () => {\n setConfirmDisable2FA(false);\n setTwoFactorData(null);\n setTotpUriData(null);\n setBackupCodesData(null);\n qc.invalidateQueries({ queryKey: [\"dash-user\", userId] });\n toggleNotification({\n type: \"success\",\n message: \"Two-factor authentication disabled\",\n });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to disable 2FA\",\n });\n },\n });\n\n const viewTotpUriMutation = useMutation({\n mutationFn: async () => {\n // biome-ignore lint/suspicious/noExplicitAny: viewTwoFactorTotpUri is not typed in @better-auth/infra\n const result = await (client.dash as any).viewTwoFactorTotpUri(\n {},\n withContext({ userId }),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Failed to load TOTP URI\");\n return result.data;\n },\n onSuccess: (data) => {\n if (data) {\n setTotpUriData(data);\n setShowTotpModal(true);\n }\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to load TOTP URI\",\n });\n },\n });\n\n const viewBackupCodesMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.viewBackupCodes(\n {},\n withContext({ userId }),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Failed to load backup codes\");\n return result.data;\n },\n onSuccess: (data) => {\n if (data) {\n setBackupCodesData(data.backupCodes);\n setShowBackupCodesModal(true);\n }\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to load backup codes\",\n });\n },\n });\n\n const generateBackupCodesMutation = useMutation({\n mutationFn: async () => {\n const result = await client.dash.generateBackupCodes(\n {},\n withContext({ userId }),\n );\n if (result.error)\n throw new Error(\n result.error.message ?? \"Failed to generate backup codes\",\n );\n return result.data;\n },\n onSuccess: (data) => {\n setConfirmRegenerateBackupCodes(false);\n if (data) {\n setBackupCodesData(data.backupCodes);\n setShowBackupCodesModal(true);\n }\n toggleNotification({\n type: \"success\",\n message: \"New backup codes generated\",\n });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to generate backup codes\",\n });\n },\n });\n\n const hasEdits =\n editName !== undefined ||\n editEmail !== undefined ||\n editEmailVerified !== undefined ||\n editImage !== undefined ||\n Object.keys(editExtra).length > 0;\n\n const customFields = Object.entries(schemaQuery.data ?? {})\n .filter(([name]) => !STANDARD_FIELDS.has(name))\n .map(([name, attribute]) => ({ name, attribute }));\n\n const banExpiryPreview =\n banExpiresDays && !Number.isNaN(parseInt(banExpiresDays, 10))\n ? new Date(\n Date.now() + parseInt(banExpiresDays, 10) * 86400000,\n ).toLocaleDateString(undefined, {\n weekday: \"long\",\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })\n : null;\n\n const drawerTitle = (\n <Flex gap={2} alignItems=\"center\">\n <Avatar name={user?.name ?? \"?\"} src={user?.image} size={30} />\n <Box>\n <Typography variant=\"beta\" tag=\"span\">\n {user?.name ?? \"User\"}\n </Typography>\n {user?.email && (\n <Box>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {user.email}\n </Typography>\n </Box>\n )}\n </Box>\n {user?.banned && (\n <Badge backgroundColor=\"danger100\" textColor=\"danger600\">\n Banned\n </Badge>\n )}\n </Flex>\n );\n\n const profileFooter =\n activeTab === \"profile\" ? (\n <>\n <Button\n variant=\"tertiary\"\n onClick={() => {\n setEditName(undefined);\n setEditEmail(undefined);\n setEditEmailVerified(undefined);\n setEditImage(undefined);\n setEditExtra({});\n }}\n >\n Discard\n </Button>\n <Button\n disabled={!hasEdits}\n loading={updateMutation.isLoading}\n onClick={() => updateMutation.mutate()}\n data-testid=\"save-user-btn\"\n >\n Save changes\n </Button>\n </>\n ) : undefined;\n\n return (\n <Drawer\n title={drawerTitle}\n footer={profileFooter}\n onClose={onClose}\n data-testid=\"user-detail-drawer\"\n >\n {userQuery.isLoading ? (\n <Flex justifyContent=\"center\" padding={8}>\n <Typography textColor=\"neutral500\">Loading user…</Typography>\n </Flex>\n ) : userQuery.isError ? (\n <Alert closeLabel=\"Close\" title=\"Failed to load user\" variant=\"danger\">\n {userQuery.error instanceof Error\n ? userQuery.error.message\n : \"An error occurred\"}\n </Alert>\n ) : (\n <Tabs.Root defaultValue=\"profile\" onValueChange={setActiveTab}>\n <Tabs.List>\n <Tabs.Trigger value=\"profile\">Profile</Tabs.Trigger>\n <Tabs.Trigger value=\"security\">Security</Tabs.Trigger>\n {banEnabled && <Tabs.Trigger value=\"ban\">Ban</Tabs.Trigger>}\n <Tabs.Trigger value=\"sessions\">Sessions</Tabs.Trigger>\n <Tabs.Trigger value=\"organizations\">Organizations</Tabs.Trigger>\n </Tabs.List>\n\n {/* ── Profile ── */}\n <Tabs.Content value=\"profile\">\n <EditLayout>\n {/* Left: editable fields */}\n <Flex direction=\"column\" gap={5}>\n <FormSection>\n <SectionLabel>Personal information</SectionLabel>\n <Field.Root style={{ width: \"100%\" }}>\n <Field.Label>Full name</Field.Label>\n <TextInput\n value={displayName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditName(e.target.value)\n }\n data-testid=\"user-name-input\"\n />\n </Field.Root>\n <Field.Root style={{ width: \"100%\" }}>\n <Field.Label>Email address</Field.Label>\n <TextInput\n type=\"email\"\n value={displayEmail}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditEmail(e.target.value)\n }\n />\n </Field.Root>\n <Checkbox\n checked={displayEmailVerified}\n onCheckedChange={(checked: boolean) =>\n setEditEmailVerified(checked)\n }\n >\n Mark email as verified\n </Checkbox>\n <MediaPickerField\n label=\"Avatar URL\"\n name=\"image\"\n value={displayImage}\n onChange={setEditImage}\n placeholder=\"https://example.com/avatar.png\"\n hint=\"Optional — publicly accessible image URL\"\n />\n </FormSection>\n\n <CustomFieldsSection\n fields={customFields}\n data={extraData}\n onChange={handleExtraChange}\n />\n </Flex>\n\n {/* Right: metadata + email actions */}\n <EditSidebar>\n <FormSection>\n <SectionLabel>Details</SectionLabel>\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 12,\n }}\n >\n <MetaItem style={{ gridColumn: \"1 / -1\" }}>\n <MetaKey>User ID</MetaKey>\n <MonoChip>{user?.id}</MonoChip>\n </MetaItem>\n <MetaItem>\n <MetaKey>Created</MetaKey>\n <MetaVal>\n {user?.createdAt\n ? new Date(user.createdAt).toLocaleString()\n : \"—\"}\n </MetaVal>\n </MetaItem>\n <MetaItem>\n <MetaKey>Last updated</MetaKey>\n <MetaVal>\n {user?.updatedAt\n ? new Date(user.updatedAt).toLocaleString()\n : \"—\"}\n </MetaVal>\n </MetaItem>\n </div>\n </FormSection>\n\n {emailVerificationEnabled && (\n <Box>\n <SectionLabel style={{ marginBottom: 10 }}>\n Email actions\n </SectionLabel>\n <Flex direction=\"column\" gap={2}>\n <Button\n variant=\"secondary\"\n size=\"S\"\n loading={sendVerificationMutation.isLoading}\n disabled={user?.emailVerified}\n onClick={() => sendVerificationMutation.mutate()}\n style={{ width: \"100%\" }}\n >\n Send verification email\n </Button>\n <Button\n variant=\"secondary\"\n size=\"S\"\n loading={sendResetPasswordMutation.isLoading}\n onClick={() => sendResetPasswordMutation.mutate()}\n style={{ width: \"100%\" }}\n >\n Send password reset\n </Button>\n </Flex>\n </Box>\n )}\n\n <EditViewSidePanels\n model=\"plugin::better-auth.user\"\n documentId={\n strapiUserQuery.data?.documentId as string | undefined\n }\n document={strapiUserQuery.data ?? undefined}\n />\n </EditSidebar>\n </EditLayout>\n </Tabs.Content>\n\n {/* ── Security ── */}\n <Tabs.Content value=\"security\">\n <Flex direction=\"column\" gap={5} paddingTop={6}>\n {/* Password */}\n <FormSection>\n <SectionLabel>Password</SectionLabel>\n <Field.Root hint=\"The user will be able to sign in with this new password\">\n <Field.Label>New password</Field.Label>\n <TextInput\n type=\"password\"\n value={newPassword}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setNewPassword(e.target.value)\n }\n placeholder=\"Enter a strong password…\"\n />\n <Field.Hint />\n </Field.Root>\n <Box>\n <Button\n disabled={!newPassword}\n loading={passwordMutation.isLoading}\n onClick={() => passwordMutation.mutate()}\n >\n Set password\n </Button>\n </Box>\n </FormSection>\n\n {/* Linked accounts */}\n <FormSection>\n <SectionLabel>Linked accounts</SectionLabel>\n {user?.account && user.account.length > 0 ? (\n <Flex direction=\"column\" gap={2}>\n {user.account.map((acc) => (\n <AccountRow key={acc.id}>\n <ProviderBadge>{acc.providerId}</ProviderBadge>\n <Button\n variant=\"danger-light\"\n size=\"S\"\n onClick={() =>\n setConfirmUnlinkAccountId(acc.providerId)\n }\n >\n Unlink\n </Button>\n </AccountRow>\n ))}\n </Flex>\n ) : (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n No linked OAuth accounts.\n </Typography>\n )}\n </FormSection>\n\n {/* Two-factor authentication */}\n {twoFactorEnabled && (\n <FormSection>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <SectionLabel style={{ margin: 0 }}>\n Two-factor authentication\n </SectionLabel>\n <TwoFaChip\n $enabled={\n !!(user as Record<string, unknown>)?.twoFactorEnabled\n }\n >\n {(user as Record<string, unknown>)?.twoFactorEnabled\n ? \"Enabled\"\n : \"Not enabled\"}\n </TwoFaChip>\n </Flex>\n\n {(user as Record<string, unknown>)?.twoFactorEnabled ? (\n <Flex direction=\"column\" gap={2}>\n {/* TOTP row */}\n <AccountRow>\n <Flex\n direction=\"column\"\n gap={1}\n alignItems=\"flex-start\"\n >\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n TOTP authenticator\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n View the URI and secret for this user's\n authenticator app.\n </Typography>\n </Flex>\n <Button\n variant=\"secondary\"\n size=\"S\"\n loading={viewTotpUriMutation.isLoading}\n onClick={() => viewTotpUriMutation.mutate()}\n >\n {totpUriData ? \"Refresh\" : \"View\"}\n </Button>\n </AccountRow>\n\n {/* Backup codes row */}\n <AccountRow>\n <Flex\n direction=\"column\"\n gap={1}\n alignItems=\"flex-start\"\n >\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n Backup codes\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n View or regenerate the user's recovery codes.\n </Typography>\n </Flex>\n <Flex gap={2}>\n <Button\n variant=\"secondary\"\n size=\"S\"\n loading={viewBackupCodesMutation.isLoading}\n onClick={() => viewBackupCodesMutation.mutate()}\n >\n {backupCodesData ? \"Refresh\" : \"View\"}\n </Button>\n <Button\n variant=\"secondary\"\n size=\"S\"\n onClick={() =>\n setConfirmRegenerateBackupCodes(true)\n }\n >\n Regenerate\n </Button>\n </Flex>\n </AccountRow>\n\n {/* Disable row */}\n <DangerRow>\n <Flex\n direction=\"column\"\n gap={1}\n alignItems=\"flex-start\"\n >\n <Typography\n variant=\"omega\"\n fontWeight=\"semiBold\"\n textColor=\"danger600\"\n >\n Disable two-factor authentication\n </Typography>\n <Typography variant=\"pi\" textColor=\"danger500\">\n The user will no longer need a second factor to sign\n in.\n </Typography>\n </Flex>\n <Button\n variant=\"danger-light\"\n size=\"S\"\n onClick={() => setConfirmDisable2FA(true)}\n >\n Disable 2FA\n </Button>\n </DangerRow>\n </Flex>\n ) : (\n <Flex direction=\"column\" gap={2}>\n {twoFactorData && (\n <Flex\n direction=\"column\"\n gap={3}\n style={{ padding: \"2px 4px\" }}\n >\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Scan the TOTP URI with an authenticator app, or\n enter the secret key manually.\n </Typography>\n <Field.Root>\n <Field.Label>TOTP URI</Field.Label>\n <ReadOnlyCodeInput>\n {twoFactorData.totpURI}\n </ReadOnlyCodeInput>\n </Field.Root>\n <Field.Root>\n <Field.Label>Secret key</Field.Label>\n <ReadOnlyCodeInput>\n {twoFactorData.secret}\n </ReadOnlyCodeInput>\n </Field.Root>\n <Flex direction=\"column\" gap={2}>\n <SectionLabel>Backup codes</SectionLabel>\n <BackupCodeGrid>\n {twoFactorData.backupCodes.map((code) => (\n <BackupCodeItem key={code}>\n {code}\n </BackupCodeItem>\n ))}\n </BackupCodeGrid>\n </Flex>\n </Flex>\n )}\n\n <AccountRow>\n <Flex\n direction=\"column\"\n gap={1}\n alignItems=\"flex-start\"\n >\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n Enable two-factor authentication\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Add an extra layer of security to this account.\n </Typography>\n </Flex>\n <Button\n size=\"S\"\n loading={enableTwoFactorMutation.isLoading}\n onClick={() => enableTwoFactorMutation.mutate()}\n >\n Enable 2FA\n </Button>\n </AccountRow>\n </Flex>\n )}\n </FormSection>\n )}\n </Flex>\n </Tabs.Content>\n\n {/* ── Ban ── */}\n {banEnabled && (\n <Tabs.Content value=\"ban\">\n <Flex direction=\"column\" gap={5} paddingTop={6}>\n {user?.banned ? (\n <FormSection>\n <SectionLabel>Ban status</SectionLabel>\n <WarnCard>\n <Typography\n variant=\"omega\"\n fontWeight=\"semiBold\"\n textColor=\"danger600\"\n >\n This user is currently banned\n </Typography>\n {user.banReason && (\n <Typography variant=\"pi\" textColor=\"danger600\">\n Reason: {user.banReason}\n </Typography>\n )}\n {user.banExpires ? (\n <Typography variant=\"pi\" textColor=\"danger600\">\n Expires:{\" \"}\n {new Date(user.banExpires).toLocaleDateString(\n undefined,\n {\n weekday: \"long\",\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n },\n )}\n </Typography>\n ) : (\n <Typography variant=\"pi\" textColor=\"danger600\">\n Duration: Permanent\n </Typography>\n )}\n </WarnCard>\n <Box>\n <Button\n variant=\"secondary\"\n onClick={() => setConfirmUnban(true)}\n >\n Lift ban\n </Button>\n </Box>\n </FormSection>\n ) : (\n <FormSection>\n <SectionLabel>Apply ban</SectionLabel>\n <Field.Root\n hint=\"Optional — will be shown to the user\"\n style={{ width: \"100%\" }}\n >\n <Field.Label>Reason</Field.Label>\n <TextInput\n value={banReason}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setBanReason(e.target.value)\n }\n placeholder=\"e.g. Violated terms of service\"\n />\n <Field.Hint />\n </Field.Root>\n <Grid.Root gap={4}>\n <Grid.Item col={6}>\n <Field.Root\n hint=\"Leave empty for a permanent ban\"\n style={{ width: \"100%\" }}\n >\n <Field.Label>Duration (days)</Field.Label>\n <TextInput\n type=\"number\"\n value={banExpiresDays}\n onChange={(\n e: React.ChangeEvent<HTMLInputElement>,\n ) => setBanExpiresDays(e.target.value)}\n placeholder=\"e.g. 30\"\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item col={6}>\n <Flex\n direction=\"column\"\n justifyContent=\"flex-end\"\n style={{ height: \"100%\", paddingBottom: 4 }}\n >\n <PreviewPill>\n {banExpiryPreview\n ? `⏱ Expires ${banExpiryPreview}`\n : \"♾ Permanent ban\"}\n </PreviewPill>\n </Flex>\n </Grid.Item>\n </Grid.Root>\n <Box>\n <Button\n variant=\"danger\"\n onClick={() => setConfirmBan(true)}\n >\n Ban user\n </Button>\n </Box>\n </FormSection>\n )}\n </Flex>\n </Tabs.Content>\n )}\n\n {/* ── Sessions ── */}\n <Tabs.Content value=\"sessions\">\n <Flex direction=\"column\" gap={5} paddingTop={6}>\n <FormSection>\n <SectionLabel>Session management</SectionLabel>\n <AccountRow>\n <Flex direction=\"column\" gap={1} alignItems=\"flex-start\">\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n Revoke all sessions\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Signs the user out immediately on all devices.\n </Typography>\n </Flex>\n <Button\n variant=\"danger-light\"\n size=\"S\"\n onClick={() => setConfirmRevokeAll(true)}\n style={{ flexShrink: 0 }}\n >\n Revoke all\n </Button>\n </AccountRow>\n </FormSection>\n\n <FormSection>\n <SectionLabel>Active sessions</SectionLabel>\n {sessionsQuery.isLoading ? (\n <Flex justifyContent=\"center\" padding={4}>\n <Loader>Loading sessions…</Loader>\n </Flex>\n ) : (sessionsQuery.data ?? []).length === 0 ? (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n No active sessions.\n </Typography>\n ) : (\n <Flex direction=\"column\" gap={2} alignItems=\"stretch\">\n {(sessionsQuery.data ?? []).map((session) => (\n <SessionCard key={session.documentId}>\n <SessionMeta>\n <Flex\n gap={2}\n alignItems=\"center\"\n style={{ flexWrap: \"wrap\" }}\n >\n {session.ipAddress && (\n <IpChip>{session.ipAddress}</IpChip>\n )}\n <TimestampText>\n Created{\" \"}\n {new Date(session.createdAt).toLocaleString()} ·\n Expires{\" \"}\n {new Date(session.expiresAt).toLocaleString()}\n </TimestampText>\n </Flex>\n {session.userAgent && (\n <AgentText>{session.userAgent}</AgentText>\n )}\n </SessionMeta>\n <IconButton\n label=\"Revoke session\"\n onClick={() =>\n setConfirmRevokeSessionId(String(session.id))\n }\n style={{ flexShrink: 0 }}\n >\n <Trash />\n </IconButton>\n </SessionCard>\n ))}\n </Flex>\n )}\n </FormSection>\n </Flex>\n </Tabs.Content>\n\n {/* ── Organizations ── */}\n <Tabs.Content value=\"organizations\">\n <Flex direction=\"column\" gap={5} paddingTop={6}>\n <FormSection>\n <SectionLabel>Memberships</SectionLabel>\n {orgsQuery.isLoading ? (\n <Typography textColor=\"neutral500\">Loading…</Typography>\n ) : (orgsQuery.data ?? []).length === 0 ? (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Not a member of any organizations.\n </Typography>\n ) : (\n <Flex direction=\"column\" gap={2}>\n {(orgsQuery.data ?? []).map((org) =>\n org ? (\n <AccountRow key={org.id}>\n <Flex\n direction=\"column\"\n gap={1}\n alignItems=\"flex-start\"\n >\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n {org.name}\n </Typography>\n <Flex gap={2} alignItems=\"center\">\n <RoleBadge $role={org.role}>{org.role}</RoleBadge>\n {org.teams.length > 0 && (\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {org.teams.length} team\n {org.teams.length !== 1 ? \"s\" : \"\"}\n </Typography>\n )}\n </Flex>\n </Flex>\n </AccountRow>\n ) : null,\n )}\n </Flex>\n )}\n </FormSection>\n </Flex>\n </Tabs.Content>\n </Tabs.Root>\n )}\n\n {confirmRevokeAll && (\n <ConfirmDialog\n title=\"Revoke all sessions\"\n message=\"Are you sure you want to revoke all sessions for this user? They will be signed out on all devices.\"\n confirmLabel=\"Revoke all\"\n loading={revokeAllMutation.isLoading}\n onConfirm={() => revokeAllMutation.mutate()}\n onCancel={() => setConfirmRevokeAll(false)}\n />\n )}\n\n {confirmRevokeSessionId && (\n <ConfirmDialog\n title=\"Revoke session\"\n message=\"Are you sure you want to revoke this session? The user will be signed out on this device.\"\n confirmLabel=\"Revoke\"\n loading={revokeSessionMutation.isLoading}\n onConfirm={() => revokeSessionMutation.mutate(confirmRevokeSessionId)}\n onCancel={() => setConfirmRevokeSessionId(null)}\n />\n )}\n\n {confirmBan && (\n <ConfirmDialog\n title=\"Ban user\"\n message={\n banReason\n ? `Ban this user for the following reason: \"${banReason}\"? They will be prevented from signing in.`\n : \"Are you sure you want to ban this user? They will be prevented from signing in.\"\n }\n confirmLabel=\"Ban user\"\n variant=\"danger\"\n loading={banMutation.isLoading}\n onConfirm={() => banMutation.mutate()}\n onCancel={() => setConfirmBan(false)}\n />\n )}\n\n {confirmUnban && (\n <ConfirmDialog\n title=\"Lift ban\"\n message=\"Are you sure you want to lift the ban on this user? They will be able to sign in again.\"\n confirmLabel=\"Lift ban\"\n variant=\"default\"\n loading={unbanMutation.isLoading}\n onConfirm={() => unbanMutation.mutate()}\n onCancel={() => setConfirmUnban(false)}\n />\n )}\n\n {confirmUnlinkAccountId && (\n <ConfirmDialog\n title=\"Unlink account\"\n message={`Are you sure you want to unlink the \"${confirmUnlinkAccountId}\" provider from this user?`}\n confirmLabel=\"Unlink\"\n loading={unlinkAccountMutation.isLoading}\n onConfirm={() => unlinkAccountMutation.mutate(confirmUnlinkAccountId)}\n onCancel={() => setConfirmUnlinkAccountId(null)}\n />\n )}\n\n {confirmDisable2FA && (\n <ConfirmDialog\n title=\"Disable two-factor authentication\"\n message=\"Are you sure you want to disable 2FA for this user? They will no longer need a second factor to sign in.\"\n confirmLabel=\"Disable 2FA\"\n loading={disableTwoFactorMutation.isLoading}\n onConfirm={() => disableTwoFactorMutation.mutate()}\n onCancel={() => setConfirmDisable2FA(false)}\n />\n )}\n\n {confirmRegenerateBackupCodes && (\n <ConfirmDialog\n title=\"Regenerate backup codes\"\n message=\"This will invalidate all existing backup codes. New codes will be shown once after generation. Are you sure?\"\n confirmLabel=\"Regenerate\"\n loading={generateBackupCodesMutation.isLoading}\n onConfirm={() => generateBackupCodesMutation.mutate()}\n onCancel={() => setConfirmRegenerateBackupCodes(false)}\n />\n )}\n\n {showTotpModal && totpUriData && (\n <Modal.Root\n defaultOpen\n onOpenChange={(open: boolean) => !open && setShowTotpModal(false)}\n >\n <Modal.Content>\n <Modal.Header>\n <Typography variant=\"beta\" tag=\"h2\">\n TOTP authenticator\n </Typography>\n </Modal.Header>\n <Modal.Body>\n <Flex direction=\"column\" gap={4}>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n Share these details with the user to set up their\n authenticator app.\n </Typography>\n <Field.Root>\n <Field.Label>TOTP URI</Field.Label>\n <ReadOnlyCodeInput>{totpUriData.totpURI}</ReadOnlyCodeInput>\n </Field.Root>\n <Field.Root>\n <Field.Label>Secret key</Field.Label>\n <ReadOnlyCodeInput>{totpUriData.secret}</ReadOnlyCodeInput>\n </Field.Root>\n </Flex>\n </Modal.Body>\n <Modal.Footer>\n <Button\n variant=\"tertiary\"\n onClick={() => setShowTotpModal(false)}\n >\n Close\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n )}\n\n {showBackupCodesModal && backupCodesData && (\n <Modal.Root\n defaultOpen\n onOpenChange={(open: boolean) =>\n !open && setShowBackupCodesModal(false)\n }\n >\n <Modal.Content>\n <Modal.Header>\n <Typography variant=\"beta\" tag=\"h2\">\n Backup codes\n </Typography>\n </Modal.Header>\n <Modal.Body>\n <Flex direction=\"column\" gap={4}>\n <Typography variant=\"omega\" textColor=\"neutral600\">\n Each code can only be used once. Store them somewhere safe.\n </Typography>\n <BackupCodeGrid>\n {backupCodesData.map((code) => (\n <BackupCodeItem key={code}>{code}</BackupCodeItem>\n ))}\n </BackupCodeGrid>\n </Flex>\n </Modal.Body>\n <Modal.Footer>\n <Button\n variant=\"tertiary\"\n onClick={() => setShowBackupCodesModal(false)}\n >\n Close\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n )}\n </Drawer>\n );\n}\n","import {\n Button,\n Checkbox,\n Flex,\n IconButton,\n Loader,\n Searchbar,\n SearchForm,\n} from \"@strapi/design-system\";\nimport { Pencil, Plus, Trash } from \"@strapi/icons\";\nimport { useNotification } from \"@strapi/strapi/admin\";\nimport type React from \"react\";\nimport { useState } from \"react\";\nimport { useMutation, useQueryClient } from \"react-query\";\nimport styled, { keyframes } from \"styled-components\";\nimport { client } from \"../../client\";\nimport { Avatar } from \"../../components/Avatar\";\nimport { ConfirmDialog } from \"../../components/ConfirmDialog\";\nimport type { DashConfig } from \"../../hooks/useDashConfig\";\nimport { hasPlugin } from \"../../hooks/useDashConfig\";\nimport { useUsers } from \"../../hooks/useUsers\";\nimport { withContext } from \"../../utils/dashContext\";\nimport { CreateUserDialog } from \"./CreateUserDialog\";\nimport { UserDetailDrawer } from \"./UserDetailDrawer\";\n\nconst PAGE_SIZE = 25;\n\n// ─── Animations ───────────────────────────────────────────────────────────────\n\nconst fadeUp = keyframes`\n from { opacity: 0; transform: translateY(6px); }\n to { opacity: 1; transform: translateY(0); }\n`;\n\n// ─── Layout ───────────────────────────────────────────────────────────────────\n\nconst Wrap = styled.div`\n padding: 28px 32px;\n background: #f6f6f9;\n min-height: 100%;\n display: flex;\n flex-direction: column;\n gap: 20px;\n`;\n\nconst PageHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n`;\n\nconst TitleBlock = styled.div`\n display: flex;\n flex-direction: column;\n gap: 4px;\n`;\n\nconst PageTitle = styled.h1`\n margin: 0;\n font-size: 22px;\n font-weight: 800;\n color: #32324d;\n letter-spacing: -0.03em;\n`;\n\nconst PageSubtitle = styled.p`\n margin: 0;\n font-size: 12px;\n color: #8e8ea9;\n`;\n\n// ─── Table card ───────────────────────────────────────────────────────────────\n\nconst TableCard = styled.div`\n background: #ffffff;\n border: 1px solid #eaeaef;\n border-radius: 10px;\n overflow: hidden;\n`;\n\nconst Table = styled.table`\n width: 100%;\n border-collapse: collapse;\n`;\n\nconst TH = styled.th`\n text-align: left;\n padding: 10px 14px;\n font-size: 10px;\n font-weight: 700;\n color: #8e8ea9;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n border-bottom: 1px solid #eaeaef;\n background: #fafafa;\n white-space: nowrap;\n &:first-child { padding-left: 20px; }\n &:last-child { padding-right: 20px; }\n`;\n\nconst THCheck = styled(TH)`\n width: 44px;\n`;\n\nconst THActions = styled(TH)`\n width: 80px;\n`;\n\nconst TD = styled.td`\n padding: 11px 14px;\n font-size: 12px;\n color: #32324d;\n border-bottom: 1px solid #f5f5f9;\n vertical-align: middle;\n &:first-child { padding-left: 20px; }\n &:last-child { padding-right: 20px; }\n`;\n\nconst TDCheck = styled(TD)`\n width: 44px;\n`;\n\nconst TDActions = styled(TD)`\n width: 80px;\n`;\n\nconst TR = styled.tr<{ $selected?: boolean; $i?: number }>`\n animation: ${fadeUp} 280ms ease both;\n animation-delay: ${(p) => (p.$i ?? 0) * 25}ms;\n background: ${(p) => (p.$selected ? \"#f0f0ff\" : \"transparent\")};\n transition: background 120ms ease;\n &:hover td { background: ${(p) => (p.$selected ? \"#e8e8ff\" : \"#fafafe\")}; }\n &:last-child td { border-bottom: none; }\n`;\n\n// ─── Status chips ─────────────────────────────────────────────────────────────\n\nconst StatusChip = styled.span<{\n $variant: \"verified\" | \"unverified\" | \"banned\";\n}>`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 20px;\n font-size: 10px;\n font-weight: 700;\n background: ${(p) =>\n p.$variant === \"verified\"\n ? \"#eafbe7\"\n : p.$variant === \"banned\"\n ? \"#fcecea\"\n : \"#f0f0ff\"};\n color: ${(p) =>\n p.$variant === \"verified\"\n ? \"#5cb176\"\n : p.$variant === \"banned\"\n ? \"#d02b20\"\n : \"#8e8ea9\"};\n\n &::before {\n content: '';\n display: inline-block;\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: ${(p) =>\n p.$variant === \"verified\"\n ? \"#5cb176\"\n : p.$variant === \"banned\"\n ? \"#d02b20\"\n : \"#b8b8c7\"};\n }\n`;\n\n// ─── Misc text ────────────────────────────────────────────────────────────────\n\nconst MonoText = styled.span`\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n font-size: 11px;\n color: #8e8ea9;\n`;\n\nconst DateText = styled.span`\n font-size: 11px;\n color: #b8b8c7;\n font-variant-numeric: tabular-nums;\n`;\n\nconst UserName = styled.span`\n font-size: 12px;\n font-weight: 600;\n color: #32324d;\n`;\n\n// ─── Toolbar ──────────────────────────────────────────────────────────────────\n\nconst Toolbar = styled.div`\n display: flex;\n align-items: flex-end;\n gap: 12px;\n`;\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\ninterface Props {\n config: DashConfig;\n}\n\nexport function UsersPage({ config }: Props) {\n const qc = useQueryClient();\n const { toggleNotification } = useNotification();\n const banEnabled = hasPlugin(config, \"admin\");\n const emailVerificationEnabled =\n config.emailVerification.sendVerificationEmailEnabled;\n const twoFactorEnabled = hasPlugin(config, \"two-factor\");\n\n const [page, setPage] = useState(1);\n const [search, setSearch] = useState(\"\");\n const [searchInput, setSearchInput] = useState(\"\");\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [showCreate, setShowCreate] = useState(false);\n const [detailUserId, setDetailUserId] = useState<string | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n const [confirmDeleteMany, setConfirmDeleteMany] = useState(false);\n const [confirmBanMany, setConfirmBanMany] = useState(false);\n\n const offset = (page - 1) * PAGE_SIZE;\n const { data, isLoading, isError, error } = useUsers({\n limit: PAGE_SIZE,\n offset,\n search: search || undefined,\n });\n\n const users = data?.users ?? [];\n const total = data?.total ?? 0;\n const pageCount = Math.ceil(total / PAGE_SIZE);\n\n const deleteMutation = useMutation({\n mutationFn: async (userId: string) => {\n const result = await client.dash.deleteUser({}, withContext({ userId }));\n if (result.error)\n throw new Error(result.error.message ?? \"Delete failed\");\n },\n onSuccess: () => {\n setConfirmDelete(null);\n qc.invalidateQueries({ queryKey: [\"dash-users\"] });\n qc.invalidateQueries({ queryKey: [\"dash-user-stats\"] });\n toggleNotification({ type: \"success\", message: \"User deleted\" });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to delete user\",\n });\n },\n });\n\n const deleteManyMutation = useMutation({\n mutationFn: async (userIds: string[]) => {\n const result = await client.dash.deleteManyUsers(\n {},\n withContext({ userIds } as never),\n );\n if (result.error)\n throw new Error(result.error.message ?? \"Delete failed\");\n return result.data;\n },\n onSuccess: (_data, userIds) => {\n setConfirmDeleteMany(false);\n setSelected(new Set());\n qc.invalidateQueries({ queryKey: [\"dash-users\"] });\n qc.invalidateQueries({ queryKey: [\"dash-user-stats\"] });\n toggleNotification({\n type: \"success\",\n message: `${userIds.length} user${userIds.length !== 1 ? \"s\" : \"\"} deleted`,\n });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to delete users\",\n });\n },\n });\n\n const banManyMutation = useMutation({\n mutationFn: async (userIds: string[]) => {\n const result = await client.dash.banManyUsers(\n {},\n withContext({ userIds } as never),\n );\n if (result.error) throw new Error(result.error.message ?? \"Ban failed\");\n return result.data;\n },\n onSuccess: (_data, userIds) => {\n setConfirmBanMany(false);\n setSelected(new Set());\n qc.invalidateQueries({ queryKey: [\"dash-users\"] });\n toggleNotification({\n type: \"success\",\n message: `${userIds.length} user${userIds.length !== 1 ? \"s\" : \"\"} banned`,\n });\n },\n onError: (err: Error) => {\n toggleNotification({\n type: \"danger\",\n message: err.message ?? \"Failed to ban users\",\n });\n },\n });\n\n const toggleSelect = (id: string) => {\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allSelected =\n users.length > 0 && users.every((u) => selected.has(u.id));\n const someSelected = selected.size > 0;\n\n const handleSelectAll = () => {\n if (allSelected) {\n setSelected(new Set());\n } else {\n setSelected(new Set(users.map((u) => u.id)));\n }\n };\n\n const handleSearch = (e: React.FormEvent) => {\n e.preventDefault();\n setSearch(searchInput);\n setPage(1);\n };\n\n return (\n <Wrap data-testid=\"users-page\">\n <PageHeader>\n <TitleBlock>\n <PageTitle>Users</PageTitle>\n <PageSubtitle>\n {total.toLocaleString()} total\n {data?.onlineUsers ? ` · ${data.onlineUsers} online` : \"\"}\n </PageSubtitle>\n </TitleBlock>\n <Button\n startIcon={<Plus />}\n onClick={() => setShowCreate(true)}\n data-testid=\"create-user-btn\"\n >\n Create user\n </Button>\n </PageHeader>\n\n <Toolbar>\n <SearchForm onSubmit={handleSearch}>\n <Searchbar\n clearLabel=\"Clear\"\n name=\"search\"\n placeholder=\"Search by email…\"\n value={searchInput}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setSearchInput(e.target.value)\n }\n onClear={() => {\n setSearchInput(\"\");\n setSearch(\"\");\n setPage(1);\n }}\n data-testid=\"user-search\"\n >\n Search users\n </Searchbar>\n </SearchForm>\n\n {someSelected && (\n <Flex gap={2}>\n <Button\n variant=\"danger-light\"\n size=\"S\"\n onClick={() => setConfirmDeleteMany(true)}\n data-testid=\"delete-selected-btn\"\n >\n Delete {selected.size} selected\n </Button>\n {banEnabled && (\n <Button\n variant=\"secondary\"\n size=\"S\"\n onClick={() => setConfirmBanMany(true)}\n >\n Ban {selected.size} selected\n </Button>\n )}\n </Flex>\n )}\n </Toolbar>\n\n {isError && (\n <div style={{ color: \"#d02b20\", fontSize: 12, padding: \"8px 0\" }}>\n {(error as Error)?.message}\n </div>\n )}\n\n <TableCard>\n {isLoading ? (\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>Loading users…</Loader>\n </Flex>\n ) : (\n <Table>\n <thead>\n <tr>\n <THCheck>\n <Checkbox\n checked={allSelected}\n onCheckedChange={handleSelectAll}\n aria-label=\"Select all\"\n />\n </THCheck>\n <TH>Name</TH>\n <TH>Email</TH>\n <TH>Status</TH>\n <TH>Created</TH>\n <THActions />\n </tr>\n </thead>\n <tbody>\n {users.length === 0 ? (\n <tr>\n <TD\n colSpan={6}\n style={{\n textAlign: \"center\",\n padding: \"40px\",\n color: \"#8e8ea9\",\n }}\n data-testid=\"users-empty\"\n >\n {search\n ? `No users matching \"${search}\"`\n : \"No users found\"}\n </TD>\n </tr>\n ) : (\n users.map((user, i) => (\n <TR\n key={user.id}\n $selected={selected.has(user.id)}\n $i={i}\n data-testid=\"user-row\"\n >\n <TDCheck>\n <Checkbox\n checked={selected.has(user.id)}\n onCheckedChange={() => toggleSelect(user.id)}\n aria-label={`Select ${user.name}`}\n />\n </TDCheck>\n <TD>\n <Flex alignItems=\"center\" gap={2}>\n <Avatar\n name={user.name ?? \"\"}\n src={user.image}\n size={28}\n />\n <UserName>{user.name}</UserName>\n </Flex>\n </TD>\n <TD>\n <MonoText>{user.email}</MonoText>\n </TD>\n <TD>\n <Flex gap={1}>\n {user.emailVerified ? (\n <StatusChip $variant=\"verified\">Verified</StatusChip>\n ) : (\n <StatusChip $variant=\"unverified\">\n Unverified\n </StatusChip>\n )}\n {user.banned && (\n <StatusChip $variant=\"banned\">Banned</StatusChip>\n )}\n </Flex>\n </TD>\n <TD>\n <DateText>\n {new Date(user.createdAt).toLocaleDateString()}\n </DateText>\n </TD>\n <TDActions>\n <Flex gap={1} justifyContent=\"flex-end\">\n <IconButton\n label=\"Edit user\"\n onClick={() => setDetailUserId(user.id)}\n data-testid=\"edit-user-btn\"\n >\n <Pencil />\n </IconButton>\n <IconButton\n label=\"Delete user\"\n onClick={() => setConfirmDelete(user.id)}\n data-testid=\"delete-user-btn\"\n >\n <Trash />\n </IconButton>\n </Flex>\n </TDActions>\n </TR>\n ))\n )}\n </tbody>\n </Table>\n )}\n </TableCard>\n\n {pageCount > 1 && (\n <Flex justifyContent=\"flex-end\">\n <Flex gap={2}>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n disabled={page === 1}\n onClick={() => setPage((p) => p - 1)}\n >\n Previous\n </Button>\n <Button\n variant=\"tertiary\"\n size=\"S\"\n disabled={page >= pageCount}\n onClick={() => setPage((p) => p + 1)}\n >\n Next\n </Button>\n </Flex>\n </Flex>\n )}\n\n {showCreate && <CreateUserDialog onClose={() => setShowCreate(false)} />}\n\n {detailUserId && (\n <UserDetailDrawer\n userId={detailUserId}\n banEnabled={banEnabled}\n emailVerificationEnabled={emailVerificationEnabled}\n twoFactorEnabled={twoFactorEnabled}\n onClose={() => setDetailUserId(null)}\n />\n )}\n\n {confirmDelete && (\n <ConfirmDialog\n title=\"Delete user\"\n message=\"Are you sure you want to delete this user? This action cannot be undone.\"\n confirmLabel=\"Delete\"\n loading={deleteMutation.isLoading}\n onConfirm={() => deleteMutation.mutate(confirmDelete)}\n onCancel={() => setConfirmDelete(null)}\n />\n )}\n\n {confirmDeleteMany && (\n <ConfirmDialog\n title={`Delete ${selected.size} user${selected.size !== 1 ? \"s\" : \"\"}`}\n message={`Are you sure you want to delete ${selected.size} user${selected.size !== 1 ? \"s\" : \"\"}? This action cannot be undone.`}\n confirmLabel=\"Delete all\"\n loading={deleteManyMutation.isLoading}\n onConfirm={() => deleteManyMutation.mutate([...selected])}\n onCancel={() => setConfirmDeleteMany(false)}\n />\n )}\n\n {confirmBanMany && (\n <ConfirmDialog\n title={`Ban ${selected.size} user${selected.size !== 1 ? \"s\" : \"\"}`}\n message={`Are you sure you want to ban ${selected.size} user${selected.size !== 1 ? \"s\" : \"\"}? They will be prevented from signing in.`}\n confirmLabel=\"Ban all\"\n variant=\"danger\"\n loading={banManyMutation.isLoading}\n onConfirm={() => banManyMutation.mutate([...selected])}\n onCancel={() => setConfirmBanMany(false)}\n />\n )}\n </Wrap>\n );\n}\n","import {\n Alert,\n Box,\n Flex,\n Loader,\n Tabs,\n Typography,\n} from \"@strapi/design-system\";\nimport { useQuery } from \"react-query\";\nimport styled from \"styled-components\";\nimport { client } from \"../client\";\nimport { hasPlugin, useDashConfig } from \"../hooks/useDashConfig\";\nimport { OrganizationsPage } from \"./Organizations\";\nimport { OverviewPage } from \"./Overview\";\nimport { UsersPage } from \"./Users\";\nimport { PluginIcon } from \"../components/PluginIcon\";\n\nconst Accent = styled.div`\n height: 3px;\n background: linear-gradient(90deg, #4945ff 0%, #7b79ff 55%, #9593ff 100%);\n flex-shrink: 0;\n`;\n\nconst BrandIcon = styled.div`\n width: 30px;\n height: 30px;\n background: black;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 12px;\n font-weight: 900;\n flex-shrink: 0;\n letter-spacing: -0.06em;\n user-select: none;\n`;\n\nconst PathTag = styled.code`\n padding: 2px 8px;\n background: #f0f0ff;\n border: 1px solid #d9d8ff;\n border-radius: 4px;\n font-size: 11px;\n color: #4945ff;\n font-family: \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n font-weight: 500;\n`;\n\nexport function App() {\n const { data: config, isLoading, isError, error } = useDashConfig();\n\n const orgEnabled = hasPlugin(config, \"organization\");\n\n const orgOptionsQuery = useQuery({\n queryKey: [\"dash-org-options\"],\n queryFn: async () => {\n const result = await client.dash.organization.options();\n if (result.error) return { teamsEnabled: false };\n return result.data ?? { teamsEnabled: false };\n },\n enabled: orgEnabled,\n });\n\n const teamsEnabled = orgEnabled\n ? (orgOptionsQuery.data?.teamsEnabled ?? false)\n : false;\n\n if (isLoading) {\n return (\n <Flex justifyContent=\"center\" alignItems=\"center\" padding={12}>\n <Loader>Loading Better Auth dashboard…</Loader>\n </Flex>\n );\n }\n\n if (isError) {\n return (\n <Box padding={6}>\n <Alert\n closeLabel=\"Close\"\n title=\"Error loading configuration\"\n variant=\"danger\"\n >\n {(error as Error)?.message}\n </Alert>\n </Box>\n );\n }\n\n if (!config) return null;\n\n return (\n <Box background=\"neutral100\" minHeight=\"100vh\" data-testid=\"dashboard-root\">\n <Tabs.Root defaultValue=\"overview\">\n <Box\n background=\"neutral0\"\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n style={{ overflow: \"hidden\" }}\n >\n <Accent />\n <Box\n paddingLeft={6}\n paddingRight={6}\n paddingTop={4}\n paddingBottom={0}\n >\n <Flex\n justifyContent=\"space-between\"\n alignItems=\"center\"\n paddingBottom={4}\n >\n <Flex gap={2} alignItems=\"center\">\n <BrandIcon>\n <PluginIcon />\n </BrandIcon>\n <Box>\n <Typography variant=\"beta\" textColor=\"neutral800\">\n Better Auth\n </Typography>\n <Box paddingTop=\"2px\">\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Authentication Dashboard\n </Typography>\n </Box>\n </Box>\n </Flex>\n <PathTag>{config.basePath}</PathTag>\n </Flex>\n <Tabs.List aria-label=\"Dashboard navigation\" data-testid=\"main-nav\">\n <Tabs.Trigger value=\"overview\" data-testid=\"nav-overview\">\n Overview\n </Tabs.Trigger>\n <Tabs.Trigger value=\"users\" data-testid=\"nav-users\">\n Users\n </Tabs.Trigger>\n {orgEnabled && (\n <Tabs.Trigger\n value=\"organizations\"\n data-testid=\"nav-organizations\"\n >\n Organizations\n </Tabs.Trigger>\n )}\n </Tabs.List>\n </Box>\n </Box>\n\n <Tabs.Content value=\"overview\" data-testid=\"tab-overview\">\n <OverviewPage />\n </Tabs.Content>\n <Tabs.Content value=\"users\" data-testid=\"tab-users\">\n <UsersPage config={config} />\n </Tabs.Content>\n {orgEnabled && (\n <Tabs.Content value=\"organizations\" data-testid=\"tab-organizations\">\n <OrganizationsPage teamsEnabled={teamsEnabled} />\n </Tabs.Content>\n )}\n </Tabs.Root>\n </Box>\n );\n}\n","import { useMemo } from \"react\";\nimport { QueryClient, QueryClientProvider } from \"react-query\";\nimport { App } from \"./App\";\n\n/**\n * Root component that provides the React Query client.\n * A stable QueryClient instance is created once per mount via useMemo\n * to avoid re-creating it on re-renders.\n */\nexport function Root() {\n const queryClient = useMemo(\n () =>\n new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n staleTime: 30_000,\n },\n },\n }),\n [],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <App />\n </QueryClientProvider>\n );\n}\n\nexport default Root;\n"],"names":["createAuthClient","dashClient","InferPlugin","useQuery","jsx","Modal","jsxs","Typography","Button","keyframes","styled","useEffect","Portal","Flex","IconButton","Cross","Box","useState","getMediaLibraryComponent","Fragment","Field","TextInput","Images","Combobox","ComboboxOption","useQueryClient","useNotification","useMutation","Checkbox","items","useFetchClient","useRef","Trash","SingleSelect","SingleSelectOption","NumberInput","JSONInput","Textarea","document","getEditViewSidePanels","Alert","Tabs","Grid","Plus","PAGE_SIZE","fadeUp","Wrap","PageHeader","TitleBlock","PageTitle","PageSubtitle","TableCard","Table","TH","THCheck","THActions","TD","TDCheck","TDActions","TR","DateText","Toolbar","SearchForm","Searchbar","Loader","Pencil","Badge","PluginIcon","useMemo","QueryClient","QueryClientProvider"],"mappings":"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"}