.
For commercial licensing, please contact support@quantumnous.com
*/
+import { ChevronDown, Copy, Plus, Trash2 } from 'lucide-react'
import {
memo,
useCallback,
@@ -28,10 +29,9 @@ import {
type InputHTMLAttributes,
type MouseEvent as ReactMouseEvent,
} from 'react'
-import { ChevronDown, Copy, Plus, Trash2 } from 'lucide-react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
-import { cn } from '@/lib/utils'
+
import { Alert, AlertDescription } from '@/components/ui/alert'
import { Badge } from '@/components/ui/badge'
import { Button } from '@/components/ui/button'
@@ -99,6 +99,7 @@ import {
normalizeVisualTier,
tryParseVisualConfig,
} from '@/features/pricing/lib/tier-expr'
+import { cn } from '@/lib/utils'
const PRICE_SUFFIX = '$/1M tokens'
const CACHE_PRICE_VARS = BILLING_EXTRA_VARS.filter(
diff --git a/web/default/src/features/system-settings/models/tool-price-settings.tsx b/web/default/src/features/system-settings/models/tool-price-settings.tsx
index afa59e1f..b0173f9d 100644
--- a/web/default/src/features/system-settings/models/tool-price-settings.tsx
+++ b/web/default/src/features/system-settings/models/tool-price-settings.tsx
@@ -16,15 +16,17 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-import { memo, useCallback, useEffect, useMemo, useState } from 'react'
import { Code2, Copy, Eye, Plus, Trash2 } from 'lucide-react'
+import { memo, useCallback, useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
+
+import { StaticDataTable } from '@/components/data-table'
import { Alert, AlertDescription } from '@/components/ui/alert'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Textarea } from '@/components/ui/textarea'
-import { StaticDataTable } from '@/components/data-table'
+
import { useUpdateOption } from '../hooks/use-update-option'
const OPTION_KEY = 'tool_price_setting.prices'
diff --git a/web/default/src/features/system-settings/models/upstream-ratio-sync-columns.tsx b/web/default/src/features/system-settings/models/upstream-ratio-sync-columns.tsx
index a88e3735..13374b78 100644
--- a/web/default/src/features/system-settings/models/upstream-ratio-sync-columns.tsx
+++ b/web/default/src/features/system-settings/models/upstream-ratio-sync-columns.tsx
@@ -16,10 +16,13 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-import { useMemo } from 'react'
import { type ColumnDef } from '@tanstack/react-table'
import { AlertTriangle } from 'lucide-react'
+import { useMemo } from 'react'
import { useTranslation } from 'react-i18next'
+
+import { BadgeCell } from '@/components/data-table'
+import { StatusBadge } from '@/components/status-badge'
import { Checkbox } from '@/components/ui/checkbox'
import {
Tooltip,
@@ -27,8 +30,7 @@ import {
TooltipProvider,
TooltipTrigger,
} from '@/components/ui/tooltip'
-import { BadgeCell } from '@/components/data-table'
-import { StatusBadge } from '@/components/status-badge'
+
import type { RatioType } from '../types'
import {
getOrderedRatioTypes,
diff --git a/web/default/src/features/system-settings/models/upstream-ratio-sync-table.tsx b/web/default/src/features/system-settings/models/upstream-ratio-sync-table.tsx
index a6e2176f..317c7ce5 100644
--- a/web/default/src/features/system-settings/models/upstream-ratio-sync-table.tsx
+++ b/web/default/src/features/system-settings/models/upstream-ratio-sync-table.tsx
@@ -16,9 +16,15 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-import { useCallback, useMemo, useState } from 'react'
import { Loader2, Search } from 'lucide-react'
+import { useCallback, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
+
+import {
+ DataTablePagination,
+ DataTableView,
+ useDataTable,
+} from '@/components/data-table'
import { Input } from '@/components/ui/input'
import {
Select,
@@ -28,11 +34,7 @@ import {
SelectTrigger,
SelectValue,
} from '@/components/ui/select'
-import {
- DataTablePagination,
- DataTableView,
- useDataTable,
-} from '@/components/data-table'
+
import type { DifferencesMap, RatioType } from '../types'
import { RATIO_TYPE_OPTIONS } from './constants'
import { useUpstreamRatioSyncColumns } from './upstream-ratio-sync-columns'
diff --git a/web/default/src/features/system-settings/models/upstream-ratio-sync.tsx b/web/default/src/features/system-settings/models/upstream-ratio-sync.tsx
index 38bafa86..4d80f136 100644
--- a/web/default/src/features/system-settings/models/upstream-ratio-sync.tsx
+++ b/web/default/src/features/system-settings/models/upstream-ratio-sync.tsx
@@ -16,12 +16,14 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-import { useCallback, useEffect, useMemo, useState } from 'react'
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import { CheckSquare, RefreshCcw } from 'lucide-react'
+import { useCallback, useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
+
import { Button } from '@/components/ui/button'
+
import {
fetchUpstreamRatios,
getUpstreamChannels,
diff --git a/web/default/src/features/system-settings/operations/index.tsx b/web/default/src/features/system-settings/operations/index.tsx
index acc9f678..5ea7070a 100644
--- a/web/default/src/features/system-settings/operations/index.tsx
+++ b/web/default/src/features/system-settings/operations/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
import { useStatus } from '@/hooks/use-status'
+
import { SettingsPage } from '../components/settings-page'
import type { OperationsSettings } from '../types'
import {
diff --git a/web/default/src/features/system-settings/request-limits/rate-limit-dialog.tsx b/web/default/src/features/system-settings/request-limits/rate-limit-dialog.tsx
index 38526d01..abf2abed 100644
--- a/web/default/src/features/system-settings/request-limits/rate-limit-dialog.tsx
+++ b/web/default/src/features/system-settings/request-limits/rate-limit-dialog.tsx
@@ -16,11 +16,13 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-import { useEffect } from 'react'
-import * as z from 'zod'
-import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
+import { useEffect } from 'react'
+import { useForm } from 'react-hook-form'
import { useTranslation } from 'react-i18next'
+import * as z from 'zod'
+
+import { Dialog } from '@/components/dialog'
import { Button } from '@/components/ui/button'
import {
Form,
@@ -32,7 +34,6 @@ import {
FormMessage,
} from '@/components/ui/form'
import { Input } from '@/components/ui/input'
-import { Dialog } from '@/components/dialog'
const rateLimitDialogSchema = z.object({
groupName: z.string().min(1, 'Group name is required'),
diff --git a/web/default/src/features/system-settings/request-limits/rate-limit-section.tsx b/web/default/src/features/system-settings/request-limits/rate-limit-section.tsx
index 864aabf5..98cefedf 100644
--- a/web/default/src/features/system-settings/request-limits/rate-limit-section.tsx
+++ b/web/default/src/features/system-settings/request-limits/rate-limit-section.tsx
@@ -16,12 +16,13 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-import { useEffect, useState } from 'react'
-import * as z from 'zod'
-import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import { Code2, Palette } from 'lucide-react'
+import { useEffect, useState } from 'react'
+import { useForm } from 'react-hook-form'
import { useTranslation } from 'react-i18next'
+import * as z from 'zod'
+
import { Button } from '@/components/ui/button'
import {
Form,
@@ -35,6 +36,7 @@ import {
import { Input } from '@/components/ui/input'
import { Switch } from '@/components/ui/switch'
import { Textarea } from '@/components/ui/textarea'
+
import {
SettingsForm,
SettingsSwitchContent,
diff --git a/web/default/src/features/system-settings/request-limits/rate-limit-visual-editor.tsx b/web/default/src/features/system-settings/request-limits/rate-limit-visual-editor.tsx
index aacf5c49..78c5479a 100644
--- a/web/default/src/features/system-settings/request-limits/rate-limit-visual-editor.tsx
+++ b/web/default/src/features/system-settings/request-limits/rate-limit-visual-editor.tsx
@@ -16,13 +16,15 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useMemo } from 'react'
import { Plus, Search } from 'lucide-react'
+import { useState, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
-import { Button } from '@/components/ui/button'
-import { Input } from '@/components/ui/input'
+
import { StaticDataTable } from '@/components/data-table/static/static-data-table'
import { StaticRowActions } from '@/components/data-table/static/static-row-actions'
+import { Button } from '@/components/ui/button'
+import { Input } from '@/components/ui/input'
+
import { safeJsonParseWithValidation } from '../utils/json-parser'
import { isObjectRecord } from '../utils/json-validators'
import { RateLimitDialog, type RateLimitEntryData } from './rate-limit-dialog'
diff --git a/web/default/src/features/system-settings/request-limits/sensitive-words-section.tsx b/web/default/src/features/system-settings/request-limits/sensitive-words-section.tsx
index cd969fe1..a3ddaa6d 100644
--- a/web/default/src/features/system-settings/request-limits/sensitive-words-section.tsx
+++ b/web/default/src/features/system-settings/request-limits/sensitive-words-section.tsx
@@ -16,11 +16,12 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-import { useEffect } from 'react'
-import * as z from 'zod'
-import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
+import { useEffect } from 'react'
+import { useForm } from 'react-hook-form'
import { useTranslation } from 'react-i18next'
+import * as z from 'zod'
+
import {
Form,
FormControl,
@@ -32,6 +33,7 @@ import {
} from '@/components/ui/form'
import { Switch } from '@/components/ui/switch'
import { Textarea } from '@/components/ui/textarea'
+
import {
SettingsForm,
SettingsSwitchContent,
diff --git a/web/default/src/features/system-settings/request-limits/ssrf-section.tsx b/web/default/src/features/system-settings/request-limits/ssrf-section.tsx
index d7309604..6e7160dd 100644
--- a/web/default/src/features/system-settings/request-limits/ssrf-section.tsx
+++ b/web/default/src/features/system-settings/request-limits/ssrf-section.tsx
@@ -16,12 +16,13 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-import { useEffect, useMemo, useRef } from 'react'
-import * as z from 'zod'
-import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
+import { useEffect, useMemo, useRef } from 'react'
+import { useForm } from 'react-hook-form'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
+import * as z from 'zod'
+
import {
Form,
FormControl,
@@ -42,6 +43,7 @@ import {
} from '@/components/ui/select'
import { Switch } from '@/components/ui/switch'
import { Textarea } from '@/components/ui/textarea'
+
import {
SettingsForm,
SettingsSwitchContent,
diff --git a/web/default/src/features/system-settings/request-limits/token-limit-section.tsx b/web/default/src/features/system-settings/request-limits/token-limit-section.tsx
index 93731cd7..61bc33ca 100644
--- a/web/default/src/features/system-settings/request-limits/token-limit-section.tsx
+++ b/web/default/src/features/system-settings/request-limits/token-limit-section.tsx
@@ -21,6 +21,7 @@ import { useEffect } from 'react'
import { useForm } from 'react-hook-form'
import { useTranslation } from 'react-i18next'
import * as z from 'zod'
+
import {
Form,
FormControl,
@@ -31,6 +32,7 @@ import {
FormMessage,
} from '@/components/ui/form'
import { Input } from '@/components/ui/input'
+
import { SettingsForm } from '../components/settings-form-layout'
import { SettingsPageFormActions } from '../components/settings-page-context'
import { SettingsSection } from '../components/settings-section'
diff --git a/web/default/src/features/system-settings/utils/route-config.ts b/web/default/src/features/system-settings/utils/route-config.ts
index b74d59e3..960e1cf8 100644
--- a/web/default/src/features/system-settings/utils/route-config.ts
+++ b/web/default/src/features/system-settings/utils/route-config.ts
@@ -16,8 +16,8 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-import * as z from 'zod'
import { redirect } from '@tanstack/react-router'
+import * as z from 'zod'
/**
* Create search schema for settings routes with section parameter
diff --git a/web/default/src/features/system-settings/utils/section-registry.ts b/web/default/src/features/system-settings/utils/section-registry.ts
index 7df1a8c1..20ba800b 100644
--- a/web/default/src/features/system-settings/utils/section-registry.ts
+++ b/web/default/src/features/system-settings/utils/section-registry.ts
@@ -16,8 +16,8 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-import type { ReactNode } from 'react'
import type { TFunction } from 'i18next'
+import type { ReactNode } from 'react'
/**
* Section definition for settings pages
diff --git a/web/default/src/features/usage-logs/api.ts b/web/default/src/features/usage-logs/api.ts
index 720c5813..79b59c0b 100644
--- a/web/default/src/features/usage-logs/api.ts
+++ b/web/default/src/features/usage-logs/api.ts
@@ -17,6 +17,7 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
import { api } from '@/lib/api'
+
import { buildQueryParams } from './lib/utils'
import type {
GetLogsParams,
diff --git a/web/default/src/features/usage-logs/components/columns/column-helpers.tsx b/web/default/src/features/usage-logs/components/columns/column-helpers.tsx
index 25a4bd7b..4ed34748 100644
--- a/web/default/src/features/usage-logs/components/columns/column-helpers.tsx
+++ b/web/default/src/features/usage-logs/components/columns/column-helpers.tsx
@@ -16,20 +16,22 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-/* eslint-disable react-refresh/only-export-components */
-import { useState } from 'react'
import type { ColumnDef } from '@tanstack/react-table'
import { Zap } from 'lucide-react'
-import { formatTimestampToDate, formatTokens } from '@/lib/format'
-import { cn } from '@/lib/utils'
+/* eslint-disable react-refresh/only-export-components */
+import { useState } from 'react'
+
+import { DataTableColumnHeader } from '@/components/data-table'
+import { StatusBadge } from '@/components/status-badge'
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from '@/components/ui/tooltip'
-import { DataTableColumnHeader } from '@/components/data-table'
-import { StatusBadge } from '@/components/status-badge'
+import { formatTimestampToDate, formatTokens } from '@/lib/format'
+import { cn } from '@/lib/utils'
+
import { formatDuration } from '../../lib/format'
import { FailReasonDialog } from '../dialogs/fail-reason-dialog'
diff --git a/web/default/src/features/usage-logs/components/columns/common-logs-columns.tsx b/web/default/src/features/usage-logs/components/columns/common-logs-columns.tsx
index 7ef4e1c7..15c547f9 100644
--- a/web/default/src/features/usage-logs/components/columns/common-logs-columns.tsx
+++ b/web/default/src/features/usage-logs/components/columns/common-logs-columns.tsx
@@ -16,18 +16,12 @@ along with this program. If not, see
.
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState } from 'react'
import { type ColumnDef } from '@tanstack/react-table'
import { CircleAlert, GitBranch, Sparkles, KeyRound } from 'lucide-react'
+import { useState } from 'react'
import { useTranslation } from 'react-i18next'
-import { getUserAvatarFallback, getUserAvatarStyle } from '@/lib/avatar'
-import { formatBillingCurrencyFromUSD } from '@/lib/currency'
-import {
- formatUseTime,
- formatLogQuota,
- formatTimestampToDate,
-} from '@/lib/format'
-import { cn } from '@/lib/utils'
+
+import { StatusBadge, type StatusBadgeProps } from '@/components/status-badge'
import { Avatar, AvatarFallback } from '@/components/ui/avatar'
import {
Popover,
@@ -40,7 +34,15 @@ import {
TooltipProvider,
TooltipTrigger,
} from '@/components/ui/tooltip'
-import { StatusBadge, type StatusBadgeProps } from '@/components/status-badge'
+import { getUserAvatarFallback, getUserAvatarStyle } from '@/lib/avatar'
+import { formatBillingCurrencyFromUSD } from '@/lib/currency'
+import {
+ formatUseTime,
+ formatLogQuota,
+ formatTimestampToDate,
+} from '@/lib/format'
+import { cn } from '@/lib/utils'
+
import { LOG_TYPE_ALL_VALUE } from '../../constants'
import type { UsageLog } from '../../data/schema'
import {
@@ -328,8 +330,9 @@ export function useCommonLogsColumns(isAdmin: boolean): ColumnDef
[] {
? rawUseChannel.map(String).filter(Boolean)
: []
const hasRetryChain = useChannel.length > 1
- const channelChain =
- hasRetryChain ? useChannel.join(' → ') : undefined
+ const channelChain = hasRetryChain
+ ? useChannel.join(' → ')
+ : undefined
const channelDisplay = log.channel_name
? `${log.channel_name} #${log.channel}`
: `#${log.channel}`
diff --git a/web/default/src/features/usage-logs/components/columns/drawing-logs-columns.tsx b/web/default/src/features/usage-logs/components/columns/drawing-logs-columns.tsx
index 3f01b20c..2b108513 100644
--- a/web/default/src/features/usage-logs/components/columns/drawing-logs-columns.tsx
+++ b/web/default/src/features/usage-logs/components/columns/drawing-logs-columns.tsx
@@ -16,7 +16,6 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState } from 'react'
import type { ColumnDef } from '@tanstack/react-table'
import {
Blend,
@@ -36,9 +35,12 @@ import {
ZoomIn,
type LucideIcon,
} from 'lucide-react'
+import { useState } from 'react'
import { useTranslation } from 'react-i18next'
-import { formatTimestampToDate } from '@/lib/format'
+
import { StatusBadge } from '@/components/status-badge'
+import { formatTimestampToDate } from '@/lib/format'
+
import { MJ_TASK_TYPES } from '../../constants'
import {
mjTaskTypeMapper,
diff --git a/web/default/src/features/usage-logs/components/columns/task-logs-columns.tsx b/web/default/src/features/usage-logs/components/columns/task-logs-columns.tsx
index 985d308c..24836e62 100644
--- a/web/default/src/features/usage-logs/components/columns/task-logs-columns.tsx
+++ b/web/default/src/features/usage-logs/components/columns/task-logs-columns.tsx
@@ -16,16 +16,18 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-/* eslint-disable react-refresh/only-export-components */
-import { useState, useMemo } from 'react'
import type { ColumnDef } from '@tanstack/react-table'
import { Music } from 'lucide-react'
+/* eslint-disable react-refresh/only-export-components */
+import { useState, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
+
+import { StatusBadge } from '@/components/status-badge'
+import { Avatar, AvatarFallback } from '@/components/ui/avatar'
import { getUserAvatarFallback, getUserAvatarStyle } from '@/lib/avatar'
import { formatTimestampToDate } from '@/lib/format'
import { cn } from '@/lib/utils'
-import { Avatar, AvatarFallback } from '@/components/ui/avatar'
-import { StatusBadge } from '@/components/status-badge'
+
import { TASK_ACTIONS, TASK_STATUS } from '../../constants'
import { taskActionMapper, taskStatusMapper } from '../../lib/mappers'
import type { TaskLog } from '../../types'
diff --git a/web/default/src/features/usage-logs/components/common-logs-filter-bar.tsx b/web/default/src/features/usage-logs/components/common-logs-filter-bar.tsx
index a077b2e1..c6a0b3c3 100644
--- a/web/default/src/features/usage-logs/components/common-logs-filter-bar.tsx
+++ b/web/default/src/features/usage-logs/components/common-logs-filter-bar.tsx
@@ -16,13 +16,13 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useCallback, useMemo } from 'react'
import { useQueryClient, useIsFetching } from '@tanstack/react-query'
import { useNavigate, getRouteApi } from '@tanstack/react-router'
import type { Table } from '@tanstack/react-table'
import { Eye, EyeOff } from 'lucide-react'
+import { useState, useCallback, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
-import { useIsAdmin } from '@/hooks/use-admin'
+
import { Button } from '@/components/ui/button'
import {
Select,
@@ -37,6 +37,8 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip'
+import { useIsAdmin } from '@/hooks/use-admin'
+
import { LOG_TYPE_ALL_VALUE, LOG_TYPE_FILTERS } from '../constants'
import { buildSearchParams } from '../lib/filter'
import { getDefaultTimeRange } from '../lib/utils'
diff --git a/web/default/src/features/usage-logs/components/common-logs-header-actions.tsx b/web/default/src/features/usage-logs/components/common-logs-header-actions.tsx
index 5a4a4485..934766f8 100644
--- a/web/default/src/features/usage-logs/components/common-logs-header-actions.tsx
+++ b/web/default/src/features/usage-logs/components/common-logs-header-actions.tsx
@@ -18,12 +18,14 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { Eye, EyeOff } from 'lucide-react'
import { useTranslation } from 'react-i18next'
+
import { Button } from '@/components/ui/button'
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip'
+
import { CommonLogsStats } from './common-logs-stats'
import { useUsageLogsContext } from './usage-logs-provider'
diff --git a/web/default/src/features/usage-logs/components/common-logs-stats.tsx b/web/default/src/features/usage-logs/components/common-logs-stats.tsx
index 9e51b974..5219c09a 100644
--- a/web/default/src/features/usage-logs/components/common-logs-stats.tsx
+++ b/web/default/src/features/usage-logs/components/common-logs-stats.tsx
@@ -19,10 +19,12 @@ For commercial licensing, please contact support@quantumnous.com
import { useQuery } from '@tanstack/react-query'
import { getRouteApi } from '@tanstack/react-router'
import { useTranslation } from 'react-i18next'
+
+import { Skeleton } from '@/components/ui/skeleton'
+import { useIsAdmin } from '@/hooks/use-admin'
import { formatLogQuota } from '@/lib/format'
import { cn } from '@/lib/utils'
-import { useIsAdmin } from '@/hooks/use-admin'
-import { Skeleton } from '@/components/ui/skeleton'
+
import { getLogStats, getUserLogStats } from '../api'
import { DEFAULT_LOG_STATS } from '../constants'
import { buildApiParams } from '../lib/utils'
diff --git a/web/default/src/features/usage-logs/components/compact-date-time-range-picker.tsx b/web/default/src/features/usage-logs/components/compact-date-time-range-picker.tsx
index 52acf969..409dd1eb 100644
--- a/web/default/src/features/usage-logs/components/compact-date-time-range-picker.tsx
+++ b/web/default/src/features/usage-logs/components/compact-date-time-range-picker.tsx
@@ -16,11 +16,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useMemo, useState } from 'react'
import { CalendarDays } from 'lucide-react'
+import { useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
-import dayjs from '@/lib/dayjs'
-import { cn } from '@/lib/utils'
+
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import {
@@ -28,6 +27,8 @@ import {
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover'
+import dayjs from '@/lib/dayjs'
+import { cn } from '@/lib/utils'
interface CompactDateTimeRangePickerProps {
start?: Date
diff --git a/web/default/src/features/usage-logs/components/dialogs/audio-preview-dialog.tsx b/web/default/src/features/usage-logs/components/dialogs/audio-preview-dialog.tsx
index 371fe133..01bdf558 100644
--- a/web/default/src/features/usage-logs/components/dialogs/audio-preview-dialog.tsx
+++ b/web/default/src/features/usage-logs/components/dialogs/audio-preview-dialog.tsx
@@ -16,14 +16,15 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useRef, useEffect } from 'react'
import { ExternalLink, Copy, Music } from 'lucide-react'
+import { useState, useRef, useEffect } from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
-import { Button } from '@/components/ui/button'
-import { ScrollArea } from '@/components/ui/scroll-area'
+
import { Dialog } from '@/components/dialog'
import { StatusBadge } from '@/components/status-badge'
+import { Button } from '@/components/ui/button'
+import { ScrollArea } from '@/components/ui/scroll-area'
export interface AudioClip {
clip_id?: string
diff --git a/web/default/src/features/usage-logs/components/dialogs/details-dialog.tsx b/web/default/src/features/usage-logs/components/dialogs/details-dialog.tsx
index 2904e0ea..37ab7a38 100644
--- a/web/default/src/features/usage-logs/components/dialogs/details-dialog.tsx
+++ b/web/default/src/features/usage-logs/components/dialogs/details-dialog.tsx
@@ -32,15 +32,17 @@ import {
LogIn,
} from 'lucide-react'
import { useTranslation } from 'react-i18next'
+
+import { Dialog } from '@/components/dialog'
+import { StatusBadge, type StatusBadgeProps } from '@/components/status-badge'
+import { Button } from '@/components/ui/button'
+import { Label } from '@/components/ui/label'
+import { DynamicPricingBreakdown } from '@/features/pricing/components/dynamic-pricing-breakdown'
+import { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard'
import { formatBillingCurrencyFromUSD } from '@/lib/currency'
import { formatLogQuota, formatTokens, formatUseTime } from '@/lib/format'
import { cn } from '@/lib/utils'
-import { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard'
-import { Button } from '@/components/ui/button'
-import { Label } from '@/components/ui/label'
-import { Dialog } from '@/components/dialog'
-import { StatusBadge, type StatusBadgeProps } from '@/components/status-badge'
-import { DynamicPricingBreakdown } from '@/features/pricing/components/dynamic-pricing-breakdown'
+
import type { UsageLog } from '../../data/schema'
import {
parseLogOther,
diff --git a/web/default/src/features/usage-logs/components/dialogs/fail-reason-dialog.tsx b/web/default/src/features/usage-logs/components/dialogs/fail-reason-dialog.tsx
index 02503fcd..5409f8a3 100644
--- a/web/default/src/features/usage-logs/components/dialogs/fail-reason-dialog.tsx
+++ b/web/default/src/features/usage-logs/components/dialogs/fail-reason-dialog.tsx
@@ -18,11 +18,12 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { Copy, Check } from 'lucide-react'
import { useTranslation } from 'react-i18next'
-import { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard'
+
+import { Dialog } from '@/components/dialog'
import { Button } from '@/components/ui/button'
import { Label } from '@/components/ui/label'
import { ScrollArea } from '@/components/ui/scroll-area'
-import { Dialog } from '@/components/dialog'
+import { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard'
interface FailReasonDialogProps {
failReason: string
diff --git a/web/default/src/features/usage-logs/components/dialogs/image-dialog.tsx b/web/default/src/features/usage-logs/components/dialogs/image-dialog.tsx
index 50d83ce5..9a908296 100644
--- a/web/default/src/features/usage-logs/components/dialogs/image-dialog.tsx
+++ b/web/default/src/features/usage-logs/components/dialogs/image-dialog.tsx
@@ -18,9 +18,10 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
+
+import { Dialog } from '@/components/dialog'
import { ScrollArea } from '@/components/ui/scroll-area'
import { Skeleton } from '@/components/ui/skeleton'
-import { Dialog } from '@/components/dialog'
interface ImageDialogProps {
imageUrl: string
diff --git a/web/default/src/features/usage-logs/components/dialogs/prompt-dialog.tsx b/web/default/src/features/usage-logs/components/dialogs/prompt-dialog.tsx
index f820672c..0e77614f 100644
--- a/web/default/src/features/usage-logs/components/dialogs/prompt-dialog.tsx
+++ b/web/default/src/features/usage-logs/components/dialogs/prompt-dialog.tsx
@@ -18,11 +18,12 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { Copy, Check } from 'lucide-react'
import { useTranslation } from 'react-i18next'
-import { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard'
+
+import { Dialog } from '@/components/dialog'
import { Button } from '@/components/ui/button'
import { Label } from '@/components/ui/label'
import { ScrollArea } from '@/components/ui/scroll-area'
-import { Dialog } from '@/components/dialog'
+import { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard'
interface PromptDialogProps {
prompt: string
diff --git a/web/default/src/features/usage-logs/components/dialogs/user-info-dialog.tsx b/web/default/src/features/usage-logs/components/dialogs/user-info-dialog.tsx
index 6adb0e94..cf057f9b 100644
--- a/web/default/src/features/usage-logs/components/dialogs/user-info-dialog.tsx
+++ b/web/default/src/features/usage-logs/components/dialogs/user-info-dialog.tsx
@@ -16,13 +16,15 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useCallback, useEffect, useState } from 'react'
import { Loader2 } from 'lucide-react'
+import { useCallback, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
-import { formatQuota, formatCompactNumber } from '@/lib/format'
-import { Label } from '@/components/ui/label'
+
import { Dialog } from '@/components/dialog'
+import { Label } from '@/components/ui/label'
+import { formatQuota, formatCompactNumber } from '@/lib/format'
+
import { getUserInfo } from '../../api'
import type { UserInfo } from '../../types'
diff --git a/web/default/src/features/usage-logs/components/logs-filter-toolbar.tsx b/web/default/src/features/usage-logs/components/logs-filter-toolbar.tsx
index 792838d3..de441aef 100644
--- a/web/default/src/features/usage-logs/components/logs-filter-toolbar.tsx
+++ b/web/default/src/features/usage-logs/components/logs-filter-toolbar.tsx
@@ -16,12 +16,12 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, type ComponentProps, type ReactNode } from 'react'
import type { Table } from '@tanstack/react-table'
-import { useMediaQuery } from '@/hooks'
import { ChevronDown, Loader2 } from 'lucide-react'
+import { useState, type ComponentProps, type ReactNode } from 'react'
import { useTranslation } from 'react-i18next'
-import { cn } from '@/lib/utils'
+
+import { DataTableViewOptions } from '@/components/data-table'
import { Badge } from '@/components/ui/badge'
import { Button } from '@/components/ui/button'
import {
@@ -34,7 +34,8 @@ import {
DrawerTrigger,
} from '@/components/ui/drawer'
import { Input } from '@/components/ui/input'
-import { DataTableViewOptions } from '@/components/data-table'
+import { useMediaQuery } from '@/hooks'
+import { cn } from '@/lib/utils'
interface LogsFilterToolbarProps {
table: Table
diff --git a/web/default/src/features/usage-logs/components/task-logs-filter-bar.tsx b/web/default/src/features/usage-logs/components/task-logs-filter-bar.tsx
index f31cb8fe..efd7553e 100644
--- a/web/default/src/features/usage-logs/components/task-logs-filter-bar.tsx
+++ b/web/default/src/features/usage-logs/components/task-logs-filter-bar.tsx
@@ -16,12 +16,14 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useEffect, useCallback } from 'react'
import { useQueryClient, useIsFetching } from '@tanstack/react-query'
import { useNavigate, getRouteApi } from '@tanstack/react-router'
import { type Table } from '@tanstack/react-table'
+import { useState, useEffect, useCallback } from 'react'
import { useTranslation } from 'react-i18next'
+
import { useIsAdmin } from '@/hooks/use-admin'
+
import { buildSearchParams } from '../lib/filter'
import { getDefaultTimeRange } from '../lib/utils'
import type { DrawingLogFilters, LogCategory, TaskLogFilters } from '../types'
diff --git a/web/default/src/features/usage-logs/components/usage-logs-mobile-card.tsx b/web/default/src/features/usage-logs/components/usage-logs-mobile-card.tsx
index 56d5b84e..203c0ab2 100644
--- a/web/default/src/features/usage-logs/components/usage-logs-mobile-card.tsx
+++ b/web/default/src/features/usage-logs/components/usage-logs-mobile-card.tsx
@@ -19,8 +19,12 @@ For commercial licensing, please contact support@quantumnous.com
import { flexRender, type Cell, type Table } from '@tanstack/react-table'
import { Database } from 'lucide-react'
import { useTranslation } from 'react-i18next'
-import { formatTimestampToDate } from '@/lib/format'
-import { cn } from '@/lib/utils'
+
+import {
+ dotColorMap,
+ textColorMap,
+ type StatusVariant,
+} from '@/components/status-badge'
import {
Empty,
EmptyDescription,
@@ -29,11 +33,9 @@ import {
EmptyTitle,
} from '@/components/ui/empty'
import { Skeleton } from '@/components/ui/skeleton'
-import {
- dotColorMap,
- textColorMap,
- type StatusVariant,
-} from '@/components/status-badge'
+import { formatTimestampToDate } from '@/lib/format'
+import { cn } from '@/lib/utils'
+
import { LOG_TYPE_ENUM } from '../constants'
import { getLogTypeConfig } from '../lib/utils'
import type { LogCategory } from '../types'
diff --git a/web/default/src/features/usage-logs/components/usage-logs-provider.tsx b/web/default/src/features/usage-logs/components/usage-logs-provider.tsx
index f75d40fb..0897d6ba 100644
--- a/web/default/src/features/usage-logs/components/usage-logs-provider.tsx
+++ b/web/default/src/features/usage-logs/components/usage-logs-provider.tsx
@@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com
*/
/* eslint-disable react-refresh/only-export-components */
import { createContext, useContext, useState, type ReactNode } from 'react'
+
import type { ChannelAffinityInfo } from '../types'
interface UsageLogsContextValue {
diff --git a/web/default/src/features/usage-logs/components/usage-logs-table.tsx b/web/default/src/features/usage-logs/components/usage-logs-table.tsx
index 63e5d636..46337ecf 100644
--- a/web/default/src/features/usage-logs/components/usage-logs-table.tsx
+++ b/web/default/src/features/usage-logs/components/usage-logs-table.tsx
@@ -19,17 +19,19 @@ For commercial licensing, please contact support@quantumnous.com
import { useQuery } from '@tanstack/react-query'
import { getRouteApi } from '@tanstack/react-router'
import { type ColumnDef } from '@tanstack/react-table'
-import { useMediaQuery } from '@/hooks'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
-import { cn } from '@/lib/utils'
-import { useIsAdmin } from '@/hooks/use-admin'
-import { useTableUrlState } from '@/hooks/use-table-url-state'
+
import {
DataTablePage,
DataTableRow,
useDataTable,
} from '@/components/data-table'
+import { useMediaQuery } from '@/hooks'
+import { useIsAdmin } from '@/hooks/use-admin'
+import { useTableUrlState } from '@/hooks/use-table-url-state'
+import { cn } from '@/lib/utils'
+
import {
DEFAULT_LOGS_DATA,
LOG_TYPE_ALL_VALUE,
diff --git a/web/default/src/features/usage-logs/constants.ts b/web/default/src/features/usage-logs/constants.ts
index 8e48b3f2..a2dff48b 100644
--- a/web/default/src/features/usage-logs/constants.ts
+++ b/web/default/src/features/usage-logs/constants.ts
@@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com
* Shared constants for usage logs feature
*/
import type { StatusBadgeProps } from '@/components/status-badge'
+
import type { LogStatistics, LogCategory } from './types'
// ============================================================================
diff --git a/web/default/src/features/usage-logs/index.tsx b/web/default/src/features/usage-logs/index.tsx
index 53bc5dfe..25b1e339 100644
--- a/web/default/src/features/usage-logs/index.tsx
+++ b/web/default/src/features/usage-logs/index.tsx
@@ -16,14 +16,16 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useCallback, useMemo } from 'react'
import { getRouteApi, useNavigate } from '@tanstack/react-router'
+import { useCallback, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
-import { useSidebarConfig } from '@/hooks/use-sidebar-config'
-import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'
+
import { SectionPageLayout } from '@/components/layout'
import type { NavGroup } from '@/components/layout/types'
+import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'
import { CacheStatsDialog } from '@/features/system-settings/general/channel-affinity/cache-stats-dialog'
+import { useSidebarConfig } from '@/hooks/use-sidebar-config'
+
import { UserInfoDialog } from './components/dialogs/user-info-dialog'
import {
UsageLogsProvider,
diff --git a/web/default/src/features/usage-logs/lib/columns.ts b/web/default/src/features/usage-logs/lib/columns.ts
index 97a6d1d8..ed230046 100644
--- a/web/default/src/features/usage-logs/lib/columns.ts
+++ b/web/default/src/features/usage-logs/lib/columns.ts
@@ -20,6 +20,7 @@ For commercial licensing, please contact support@quantumnous.com
* Column definitions factory
*/
import type { ColumnDef } from '@tanstack/react-table'
+
import { useCommonLogsColumns } from '../components/columns/common-logs-columns'
import { useDrawingLogsColumns } from '../components/columns/drawing-logs-columns'
import { useTaskLogsColumns } from '../components/columns/task-logs-columns'
diff --git a/web/default/src/features/usage-logs/lib/format.ts b/web/default/src/features/usage-logs/lib/format.ts
index 443cada6..526ca217 100644
--- a/web/default/src/features/usage-logs/lib/format.ts
+++ b/web/default/src/features/usage-logs/lib/format.ts
@@ -23,6 +23,7 @@ import {
parseTiersFromExpr,
type ParsedTier,
} from '@/features/pricing/lib/billing-expr'
+
import type { UsageLog } from '../data/schema'
import type { LogOtherData } from '../types'
diff --git a/web/default/src/features/users/api.ts b/web/default/src/features/users/api.ts
index bceaf14d..325ea93f 100644
--- a/web/default/src/features/users/api.ts
+++ b/web/default/src/features/users/api.ts
@@ -16,8 +16,9 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { api } from '@/lib/api'
import type { PermissionCatalog } from '@/lib/admin-permissions'
+import { api } from '@/lib/api'
+
import type {
User,
GetUsersParams,
diff --git a/web/default/src/features/users/components/data-table-bulk-actions.tsx b/web/default/src/features/users/components/data-table-bulk-actions.tsx
index a055cd19..d0e0530d 100644
--- a/web/default/src/features/users/components/data-table-bulk-actions.tsx
+++ b/web/default/src/features/users/components/data-table-bulk-actions.tsx
@@ -17,7 +17,9 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { type Table } from '@tanstack/react-table'
+
import { DataTableBulkActions as BulkActionsToolbar } from '@/components/data-table'
+
import { type User } from '../types'
interface DataTableBulkActionsProps {
diff --git a/web/default/src/features/users/components/data-table-row-actions.tsx b/web/default/src/features/users/components/data-table-row-actions.tsx
index d1719409..adf8b5cd 100644
--- a/web/default/src/features/users/components/data-table-row-actions.tsx
+++ b/web/default/src/features/users/components/data-table-row-actions.tsx
@@ -16,7 +16,6 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState } from 'react'
import type { Row } from '@tanstack/react-table'
import {
Pencil,
@@ -30,22 +29,25 @@ import {
Link2,
CreditCard,
} from 'lucide-react'
+import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
+
+import { ConfirmDialog } from '@/components/confirm-dialog'
+import { DataTableRowActionMenu } from '@/components/data-table/core/row-action-menu'
import { Button } from '@/components/ui/button'
import {
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuShortcut,
} from '@/components/ui/dropdown-menu'
-import { DataTableRowActionMenu } from '@/components/data-table/core/row-action-menu'
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip'
-import { ConfirmDialog } from '@/components/confirm-dialog'
import { UserSubscriptionsDialog } from '@/features/subscriptions/components/dialogs/user-subscriptions-dialog'
+
import { manageUser, resetUserPasskey, resetUserTwoFA } from '../api'
import {
USER_STATUS,
@@ -155,7 +157,10 @@ export function DataTableRowActions({ row }: DataTableRowActionsProps) {
{t('Edit')}
-
+
{isDisabled ? (
handleManage('enable')}>
{t('Enable')}
@@ -175,88 +180,88 @@ export function DataTableRowActions({ row }: DataTableRowActionsProps) {
)}
- {isAdmin && !isRoot && (
- handleManage('demote')}>
- {t('Demote')}
-
-
-
-
- )}
-
- {!isAdmin && (
- handleManage('promote')}>
- {t('Promote')}
-
-
-
-
- )}
-
- {
- event.preventDefault()
- setBindingDialogOpen(true)
- }}
- >
- {t('Manage Bindings')}
+ {isAdmin && !isRoot && (
+ handleManage('demote')}>
+ {t('Demote')}
-
+
+ )}
- {
- event.preventDefault()
- setSubscriptionsDialogOpen(true)
- }}
- >
- {t('Manage Subscriptions')}
+ {!isAdmin && (
+ handleManage('promote')}>
+ {t('Promote')}
-
+
+ )}
-
+ {
+ event.preventDefault()
+ setBindingDialogOpen(true)
+ }}
+ >
+ {t('Manage Bindings')}
+
+
+
+
- {
- event.preventDefault()
- setResetPasskeyOpen(true)
- }}
- disabled={isRoot}
- >
- {t('Reset Passkey')}
-
-
-
-
+ {
+ event.preventDefault()
+ setSubscriptionsDialogOpen(true)
+ }}
+ >
+ {t('Manage Subscriptions')}
+
+
+
+
- {
- event.preventDefault()
- setResetTwoFAOpen(true)
- }}
- disabled={isRoot}
- >
- {t('Reset 2FA')}
-
-
-
-
+
-
+ {
+ event.preventDefault()
+ setResetPasskeyOpen(true)
+ }}
+ disabled={isRoot}
+ >
+ {t('Reset Passkey')}
+
+
+
+
-
- {t('Delete')}
-
-
-
-
+ {
+ event.preventDefault()
+ setResetTwoFAOpen(true)
+ }}
+ disabled={isRoot}
+ >
+ {t('Reset 2FA')}
+
+
+
+
+
+
+
+
+ {t('Delete')}
+
+
+
+
.
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useEffect, useCallback, useMemo } from 'react'
import {
Mail,
Globe,
@@ -28,10 +27,14 @@ import {
Eye,
EyeOff,
} from 'lucide-react'
+import { useState, useEffect, useCallback, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import { SiGithub, SiDiscord } from 'react-icons/si'
import { toast } from 'sonner'
-import { api } from '@/lib/api'
+
+import { ConfirmDialog } from '@/components/confirm-dialog'
+import { Dialog } from '@/components/dialog'
+import { StatusBadge } from '@/components/status-badge'
import { Button } from '@/components/ui/button'
import { ScrollArea } from '@/components/ui/scroll-area'
import { Separator } from '@/components/ui/separator'
@@ -41,9 +44,8 @@ import {
TooltipProvider,
TooltipTrigger,
} from '@/components/ui/tooltip'
-import { ConfirmDialog } from '@/components/confirm-dialog'
-import { Dialog } from '@/components/dialog'
-import { StatusBadge } from '@/components/status-badge'
+import { api } from '@/lib/api'
+
import {
getUser,
getUserOAuthBindings,
diff --git a/web/default/src/features/users/components/user-quota-dialog.tsx b/web/default/src/features/users/components/user-quota-dialog.tsx
index e23dedd2..fdfe1584 100644
--- a/web/default/src/features/users/components/user-quota-dialog.tsx
+++ b/web/default/src/features/users/components/user-quota-dialog.tsx
@@ -19,13 +19,15 @@ For commercial licensing, please contact support@quantumnous.com
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
-import { getCurrencyDisplay, getCurrencyLabel } from '@/lib/currency'
-import { formatQuota, parseQuotaFromDollars } from '@/lib/format'
-import { cn } from '@/lib/utils'
+
+import { Dialog } from '@/components/dialog'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
-import { Dialog } from '@/components/dialog'
+import { getCurrencyDisplay, getCurrencyLabel } from '@/lib/currency'
+import { formatQuota, parseQuotaFromDollars } from '@/lib/format'
+import { cn } from '@/lib/utils'
+
import { adjustUserQuota } from '../api'
import type { QuotaAdjustMode } from '../types'
diff --git a/web/default/src/features/users/components/users-columns.tsx b/web/default/src/features/users/components/users-columns.tsx
index 389cea0e..d1845d85 100644
--- a/web/default/src/features/users/components/users-columns.tsx
+++ b/web/default/src/features/users/components/users-columns.tsx
@@ -18,8 +18,12 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { type ColumnDef } from '@tanstack/react-table'
import { useTranslation } from 'react-i18next'
-import { formatQuota, formatTimestamp } from '@/lib/format'
-import { cn } from '@/lib/utils'
+
+import { BadgeCell } from '@/components/data-table'
+import { GroupBadge } from '@/components/group-badge'
+import { LongText } from '@/components/long-text'
+import { StatusBadge } from '@/components/status-badge'
+import { TableId } from '@/components/table-id'
import { Checkbox } from '@/components/ui/checkbox'
import { Progress } from '@/components/ui/progress'
import {
@@ -27,11 +31,9 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip'
-import { BadgeCell } from '@/components/data-table'
-import { GroupBadge } from '@/components/group-badge'
-import { LongText } from '@/components/long-text'
-import { StatusBadge } from '@/components/status-badge'
-import { TableId } from '@/components/table-id'
+import { formatQuota, formatTimestamp } from '@/lib/format'
+import { cn } from '@/lib/utils'
+
import {
USER_STATUS,
USER_STATUSES,
diff --git a/web/default/src/features/users/components/users-delete-dialog.tsx b/web/default/src/features/users/components/users-delete-dialog.tsx
index 72c26cff..f4980e4d 100644
--- a/web/default/src/features/users/components/users-delete-dialog.tsx
+++ b/web/default/src/features/users/components/users-delete-dialog.tsx
@@ -19,7 +19,9 @@ For commercial licensing, please contact support@quantumnous.com
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
+
import { ConfirmDialog } from '@/components/confirm-dialog'
+
import { deleteUser } from '../api'
import { ERROR_MESSAGES } from '../constants'
import { getUserActionMessage } from '../lib'
diff --git a/web/default/src/features/users/components/users-mutate-drawer.tsx b/web/default/src/features/users/components/users-mutate-drawer.tsx
index 41744aa5..8409f572 100644
--- a/web/default/src/features/users/components/users-mutate-drawer.tsx
+++ b/web/default/src/features/users/components/users-mutate-drawer.tsx
@@ -16,24 +16,21 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useEffect, useState } from 'react'
-import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import { useQuery } from '@tanstack/react-query'
import { Pencil } from 'lucide-react'
+import { useEffect, useState } from 'react'
+import { useForm } from 'react-hook-form'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
+
import {
- ADMIN_PERMISSION_ACTIONS,
- ADMIN_PERMISSION_RESOURCES,
- EMPTY_PERMISSION_CATALOG,
- hasPermission,
- normalizeAdminPermissions,
-} from '@/lib/admin-permissions'
-import { getCurrencyDisplay, getCurrencyLabel } from '@/lib/currency'
-import { formatQuota, parseQuotaFromDollars } from '@/lib/format'
-import { ROLE } from '@/lib/roles'
-import { useAuthStore } from '@/stores/auth-store'
+ SideDrawerSection,
+ sideDrawerContentClassName,
+ sideDrawerFooterClassName,
+ sideDrawerFormClassName,
+ sideDrawerHeaderClassName,
+} from '@/components/drawer-layout'
import { Button } from '@/components/ui/button'
import { Checkbox } from '@/components/ui/checkbox'
import {
@@ -66,12 +63,17 @@ import {
} from '@/components/ui/sheet'
import { Textarea } from '@/components/ui/textarea'
import {
- SideDrawerSection,
- sideDrawerContentClassName,
- sideDrawerFooterClassName,
- sideDrawerFormClassName,
- sideDrawerHeaderClassName,
-} from '@/components/drawer-layout'
+ ADMIN_PERMISSION_ACTIONS,
+ ADMIN_PERMISSION_RESOURCES,
+ EMPTY_PERMISSION_CATALOG,
+ hasPermission,
+ normalizeAdminPermissions,
+} from '@/lib/admin-permissions'
+import { getCurrencyDisplay, getCurrencyLabel } from '@/lib/currency'
+import { formatQuota, parseQuotaFromDollars } from '@/lib/format'
+import { ROLE } from '@/lib/roles'
+import { useAuthStore } from '@/stores/auth-store'
+
import {
createUser,
updateUser,
@@ -451,88 +453,93 @@ export function UsersMutateDrawer({
{canEditAdminPermissions &&
targetIsAdmin &&
permissionCatalog.resources.length > 0 && (
-
-
- {t('Admin Permissions')}
-
-
- {t(
- 'Default administrator permissions can be overridden for this user.'
- )}
-
- {
- const selected = normalizeAdminPermissions(
- field.value,
- permissionCatalog
- )
- return (
-
-
- {permissionCatalog.resources.map((resource) => (
-
-
- {t(resource.label_key)}
-
-
- {resource.actions.map((option) => (
-
- ))}
-
-
- ))}
-
-
-
- )
- }}
- />
- {currentUser && (
+
+
+ {t('Admin Permissions')}
+
- {hasPermission(
- currentUser,
- ADMIN_PERMISSION_RESOURCES.CHANNEL,
- ADMIN_PERMISSION_ACTIONS.SENSITIVE_WRITE
- )
- ? t('Your account can edit sensitive channel settings.')
- : t('Your account cannot edit sensitive channel settings.')}
+ {t(
+ 'Default administrator permissions can be overridden for this user.'
+ )}
- )}
-
- )}
+ {
+ const selected = normalizeAdminPermissions(
+ field.value,
+ permissionCatalog
+ )
+ return (
+
+
+ {permissionCatalog.resources.map((resource) => (
+
+
+ {t(resource.label_key)}
+
+
+ {resource.actions.map((option) => (
+
+ ))}
+
+
+ ))}
+
+
+
+ )
+ }}
+ />
+ {currentUser && (
+
+ {hasPermission(
+ currentUser,
+ ADMIN_PERMISSION_RESOURCES.CHANNEL,
+ ADMIN_PERMISSION_ACTIONS.SENSITIVE_WRITE
+ )
+ ? t(
+ 'Your account can edit sensitive channel settings.'
+ )
+ : t(
+ 'Your account cannot edit sensitive channel settings.'
+ )}
+
+ )}
+
+ )}
{/* Binding Information (Read-only) */}
{isUpdate && (
diff --git a/web/default/src/features/users/components/users-primary-buttons.tsx b/web/default/src/features/users/components/users-primary-buttons.tsx
index 16b0b82b..bf80a3c9 100644
--- a/web/default/src/features/users/components/users-primary-buttons.tsx
+++ b/web/default/src/features/users/components/users-primary-buttons.tsx
@@ -18,7 +18,9 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { Plus } from 'lucide-react'
import { useTranslation } from 'react-i18next'
+
import { Button } from '@/components/ui/button'
+
import { useUsers } from './users-provider'
export function UsersPrimaryButtons() {
diff --git a/web/default/src/features/users/components/users-provider.tsx b/web/default/src/features/users/components/users-provider.tsx
index 4dcb3cfa..9b21ced9 100644
--- a/web/default/src/features/users/components/users-provider.tsx
+++ b/web/default/src/features/users/components/users-provider.tsx
@@ -17,7 +17,9 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import React, { useState } from 'react'
+
import useDialogState from '@/hooks/use-dialog'
+
import { type User, type UsersDialogType } from '../types'
type UsersContextType = {
diff --git a/web/default/src/features/users/components/users-table.tsx b/web/default/src/features/users/components/users-table.tsx
index 1dd9b716..33838a7d 100644
--- a/web/default/src/features/users/components/users-table.tsx
+++ b/web/default/src/features/users/components/users-table.tsx
@@ -18,16 +18,18 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { useQuery } from '@tanstack/react-query'
import { getRouteApi } from '@tanstack/react-router'
-import { useMediaQuery } from '@/hooks'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
-import { useTableUrlState } from '@/hooks/use-table-url-state'
+
import {
DISABLED_ROW_DESKTOP,
DISABLED_ROW_MOBILE,
DataTablePage,
useDataTable,
} from '@/components/data-table'
+import { useMediaQuery } from '@/hooks'
+import { useTableUrlState } from '@/hooks/use-table-url-state'
+
import { getUsers, searchUsers } from '../api'
import {
USER_STATUS,
diff --git a/web/default/src/features/users/constants.ts b/web/default/src/features/users/constants.ts
index 71c2c340..a48fa4fe 100644
--- a/web/default/src/features/users/constants.ts
+++ b/web/default/src/features/users/constants.ts
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { Shield, User, Users } from 'lucide-react'
+
import type { User as UserType } from './types'
// ============================================================================
diff --git a/web/default/src/features/users/index.tsx b/web/default/src/features/users/index.tsx
index 51bb70f9..dc6d8f7b 100644
--- a/web/default/src/features/users/index.tsx
+++ b/web/default/src/features/users/index.tsx
@@ -17,7 +17,9 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { useTranslation } from 'react-i18next'
+
import { SectionPageLayout } from '@/components/layout'
+
import { UsersDeleteDialog } from './components/users-delete-dialog'
import { UsersMutateDrawer } from './components/users-mutate-drawer'
import { UsersPrimaryButtons } from './components/users-primary-buttons'
diff --git a/web/default/src/features/users/lib/user-form.ts b/web/default/src/features/users/lib/user-form.ts
index 916bff76..bc6c7894 100644
--- a/web/default/src/features/users/lib/user-form.ts
+++ b/web/default/src/features/users/lib/user-form.ts
@@ -17,13 +17,15 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { z } from 'zod'
-import { quotaUnitsToDollars } from '@/lib/format'
+
import {
type PermissionCatalog,
type AdminPermissionMatrix,
normalizeAdminPermissions,
} from '@/lib/admin-permissions'
+import { quotaUnitsToDollars } from '@/lib/format'
import { ROLE } from '@/lib/roles'
+
import { DEFAULT_GROUP } from '../constants'
import { type UserFormData, type User } from '../types'
@@ -39,7 +41,9 @@ export const userFormSchema = z.object({
quota_dollars: z.number().min(0).optional(),
group: z.string().optional(),
remark: z.string().optional(),
- admin_permissions: z.record(z.string(), z.record(z.string(), z.boolean())).optional(),
+ admin_permissions: z
+ .record(z.string(), z.record(z.string(), z.boolean()))
+ .optional(),
})
export type UserFormValues = z.infer
diff --git a/web/default/src/features/users/types.ts b/web/default/src/features/users/types.ts
index 1cbd2096..a6f12514 100644
--- a/web/default/src/features/users/types.ts
+++ b/web/default/src/features/users/types.ts
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { z } from 'zod'
+
import type { AdminPermissionMatrix } from '@/lib/admin-permissions'
// ============================================================================
@@ -58,7 +59,9 @@ export const userSchema = z.object({
last_login_at: z.number().optional(),
DeletedAt: z.any().nullable().optional(),
remark: z.string().optional(),
- admin_permissions: z.record(z.string(), z.record(z.string(), z.boolean())).optional(),
+ admin_permissions: z
+ .record(z.string(), z.record(z.string(), z.boolean()))
+ .optional(),
})
export type User = z.infer
diff --git a/web/default/src/features/wallet/api.ts b/web/default/src/features/wallet/api.ts
index 949f9d2a..7cd0460a 100644
--- a/web/default/src/features/wallet/api.ts
+++ b/web/default/src/features/wallet/api.ts
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { api } from '@/lib/api'
+
import type {
RedemptionRequest,
PaymentRequest,
diff --git a/web/default/src/features/wallet/components/affiliate-rewards-card.tsx b/web/default/src/features/wallet/components/affiliate-rewards-card.tsx
index b3af98e1..b621e0bb 100644
--- a/web/default/src/features/wallet/components/affiliate-rewards-card.tsx
+++ b/web/default/src/features/wallet/components/affiliate-rewards-card.tsx
@@ -18,12 +18,14 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { Share2 } from 'lucide-react'
import { useTranslation } from 'react-i18next'
-import { formatQuota } from '@/lib/format'
+
+import { CopyButton } from '@/components/copy-button'
import { Button } from '@/components/ui/button'
import { Card, CardContent } from '@/components/ui/card'
import { Input } from '@/components/ui/input'
import { Skeleton } from '@/components/ui/skeleton'
-import { CopyButton } from '@/components/copy-button'
+import { formatQuota } from '@/lib/format'
+
import type { UserWalletData } from '../types'
interface AffiliateRewardsCardProps {
diff --git a/web/default/src/features/wallet/components/creem-products-section.tsx b/web/default/src/features/wallet/components/creem-products-section.tsx
index a3daef2a..37c90670 100644
--- a/web/default/src/features/wallet/components/creem-products-section.tsx
+++ b/web/default/src/features/wallet/components/creem-products-section.tsx
@@ -17,9 +17,11 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { useTranslation } from 'react-i18next'
-import { formatNumber } from '@/lib/format'
+
import { Card, CardContent } from '@/components/ui/card'
import { Skeleton } from '@/components/ui/skeleton'
+import { formatNumber } from '@/lib/format'
+
import { formatCreemPrice } from '../lib/format'
import type { CreemProduct } from '../types'
diff --git a/web/default/src/features/wallet/components/dialogs/billing-history-dialog.tsx b/web/default/src/features/wallet/components/dialogs/billing-history-dialog.tsx
index d0b31491..59f7cbdc 100644
--- a/web/default/src/features/wallet/components/dialogs/billing-history-dialog.tsx
+++ b/web/default/src/features/wallet/components/dialogs/billing-history-dialog.tsx
@@ -16,12 +16,12 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState } from 'react'
import { Search, Copy, Check, ChevronLeft, ChevronRight } from 'lucide-react'
+import { useState } from 'react'
import { useTranslation } from 'react-i18next'
-import { formatCurrencyFromUSD } from '@/lib/currency'
-import { formatNumber } from '@/lib/format'
-import { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard'
+
+import { Dialog } from '@/components/dialog'
+import { StatusBadge } from '@/components/status-badge'
import {
AlertDialog,
AlertDialogAction,
@@ -44,8 +44,10 @@ import {
SelectValue,
} from '@/components/ui/select'
import { Skeleton } from '@/components/ui/skeleton'
-import { Dialog } from '@/components/dialog'
-import { StatusBadge } from '@/components/status-badge'
+import { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard'
+import { formatCurrencyFromUSD } from '@/lib/currency'
+import { formatNumber } from '@/lib/format'
+
import { useBillingHistory } from '../../hooks/use-billing-history'
import {
getStatusConfig,
diff --git a/web/default/src/features/wallet/components/dialogs/creem-confirm-dialog.tsx b/web/default/src/features/wallet/components/dialogs/creem-confirm-dialog.tsx
index 72aaaec9..01a38074 100644
--- a/web/default/src/features/wallet/components/dialogs/creem-confirm-dialog.tsx
+++ b/web/default/src/features/wallet/components/dialogs/creem-confirm-dialog.tsx
@@ -18,9 +18,11 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { Loader2 } from 'lucide-react'
import { useTranslation } from 'react-i18next'
-import { formatNumber } from '@/lib/format'
-import { Button } from '@/components/ui/button'
+
import { Dialog } from '@/components/dialog'
+import { Button } from '@/components/ui/button'
+import { formatNumber } from '@/lib/format'
+
import { formatCreemPrice } from '../../lib/format'
import type { CreemProduct } from '../../types'
diff --git a/web/default/src/features/wallet/components/dialogs/payment-confirm-dialog.tsx b/web/default/src/features/wallet/components/dialogs/payment-confirm-dialog.tsx
index 91b4a884..30fd955b 100644
--- a/web/default/src/features/wallet/components/dialogs/payment-confirm-dialog.tsx
+++ b/web/default/src/features/wallet/components/dialogs/payment-confirm-dialog.tsx
@@ -18,7 +18,7 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { Loader2 } from 'lucide-react'
import { useTranslation } from 'react-i18next'
-import { formatLocalCurrencyAmount } from '@/lib/currency'
+
import {
AlertDialog,
AlertDialogAction,
@@ -30,6 +30,8 @@ import {
AlertDialogTitle,
} from '@/components/ui/alert-dialog'
import { Skeleton } from '@/components/ui/skeleton'
+import { formatLocalCurrencyAmount } from '@/lib/currency'
+
import { DEFAULT_DISCOUNT_RATE } from '../../constants'
import { formatCurrency, getPaymentIcon } from '../../lib'
import type { PaymentMethod } from '../../types'
diff --git a/web/default/src/features/wallet/components/dialogs/transfer-dialog.tsx b/web/default/src/features/wallet/components/dialogs/transfer-dialog.tsx
index 5ea9b418..7d8ac2ee 100644
--- a/web/default/src/features/wallet/components/dialogs/transfer-dialog.tsx
+++ b/web/default/src/features/wallet/components/dialogs/transfer-dialog.tsx
@@ -16,14 +16,16 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useEffect } from 'react'
import { Loader2 } from 'lucide-react'
+import { useState, useEffect } from 'react'
import { useTranslation } from 'react-i18next'
-import { formatQuota } from '@/lib/format'
+
+import { Dialog } from '@/components/dialog'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
-import { Dialog } from '@/components/dialog'
+import { formatQuota } from '@/lib/format'
+
import { QUOTA_PER_DOLLAR } from '../../constants'
interface TransferDialogProps {
diff --git a/web/default/src/features/wallet/components/recharge-form-card.tsx b/web/default/src/features/wallet/components/recharge-form-card.tsx
index 817d211f..5ca6cb1d 100644
--- a/web/default/src/features/wallet/components/recharge-form-card.tsx
+++ b/web/default/src/features/wallet/components/recharge-form-card.tsx
@@ -16,11 +16,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useEffect } from 'react'
import { Gift, ExternalLink, Loader2, Receipt, WalletCards } from 'lucide-react'
+import { useState, useEffect } from 'react'
import { useTranslation } from 'react-i18next'
-import { formatNumber } from '@/lib/format'
-import { cn } from '@/lib/utils'
+
import { Alert, AlertDescription } from '@/components/ui/alert'
import { Button } from '@/components/ui/button'
import { Card, CardContent, CardHeader } from '@/components/ui/card'
@@ -34,6 +33,9 @@ import {
TooltipProvider,
TooltipTrigger,
} from '@/components/ui/tooltip'
+import { formatNumber } from '@/lib/format'
+import { cn } from '@/lib/utils'
+
import {
formatCurrency,
getDiscountLabel,
diff --git a/web/default/src/features/wallet/components/subscription-plans-card.tsx b/web/default/src/features/wallet/components/subscription-plans-card.tsx
index be9156fa..302fc0d2 100644
--- a/web/default/src/features/wallet/components/subscription-plans-card.tsx
+++ b/web/default/src/features/wallet/components/subscription-plans-card.tsx
@@ -16,12 +16,16 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useEffect, useMemo, useCallback } from 'react'
import { Crown, RefreshCw, Sparkles, Check } from 'lucide-react'
+import { useState, useEffect, useMemo, useCallback } from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
-import { formatQuota } from '@/lib/format'
-import { cn } from '@/lib/utils'
+
+import {
+ StatusBadge,
+ dotColorMap,
+ textColorMap,
+} from '@/components/status-badge'
import { Button } from '@/components/ui/button'
import { Card, CardContent, CardHeader } from '@/components/ui/card'
import { Progress } from '@/components/ui/progress'
@@ -41,11 +45,6 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip'
-import {
- StatusBadge,
- dotColorMap,
- textColorMap,
-} from '@/components/status-badge'
import {
getPublicPlans,
getSelfSubscriptionFull,
@@ -57,6 +56,9 @@ import type {
PlanRecord,
UserSubscriptionRecord,
} from '@/features/subscriptions/types'
+import { formatQuota } from '@/lib/format'
+import { cn } from '@/lib/utils'
+
import type { PaymentMethod, TopupInfo } from '../types'
interface SubscriptionPlansCardProps {
diff --git a/web/default/src/features/wallet/components/wallet-stats-card.tsx b/web/default/src/features/wallet/components/wallet-stats-card.tsx
index cecdee6a..3a520d69 100644
--- a/web/default/src/features/wallet/components/wallet-stats-card.tsx
+++ b/web/default/src/features/wallet/components/wallet-stats-card.tsx
@@ -18,8 +18,10 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { Activity, BarChart3, WalletCards } from 'lucide-react'
import { useTranslation } from 'react-i18next'
-import { formatQuota } from '@/lib/format'
+
import { Skeleton } from '@/components/ui/skeleton'
+import { formatQuota } from '@/lib/format'
+
import type { UserWalletData } from '../types'
interface WalletStatsCardProps {
diff --git a/web/default/src/features/wallet/hooks/use-affiliate.ts b/web/default/src/features/wallet/hooks/use-affiliate.ts
index 21c8bf44..de2b67e3 100644
--- a/web/default/src/features/wallet/hooks/use-affiliate.ts
+++ b/web/default/src/features/wallet/hooks/use-affiliate.ts
@@ -16,11 +16,13 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useEffect, useCallback } from 'react'
import i18next from 'i18next'
+import { useState, useEffect, useCallback } from 'react'
import { toast } from 'sonner'
-import { getSelf } from '@/lib/api'
+
import { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard'
+import { getSelf } from '@/lib/api'
+
import { getAffiliateCode, transferAffiliateQuota } from '../api'
import { generateAffiliateLink } from '../lib'
diff --git a/web/default/src/features/wallet/hooks/use-billing-history.ts b/web/default/src/features/wallet/hooks/use-billing-history.ts
index 5dda9913..48aead6a 100644
--- a/web/default/src/features/wallet/hooks/use-billing-history.ts
+++ b/web/default/src/features/wallet/hooks/use-billing-history.ts
@@ -16,10 +16,12 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useEffect, useCallback } from 'react'
import i18next from 'i18next'
+import { useState, useEffect, useCallback } from 'react'
import { toast } from 'sonner'
+
import { useIsAdmin } from '@/hooks/use-admin'
+
import {
getUserBillingHistory,
getAllBillingHistory,
diff --git a/web/default/src/features/wallet/hooks/use-creem-payment.ts b/web/default/src/features/wallet/hooks/use-creem-payment.ts
index 4605f575..53b9c7c6 100644
--- a/web/default/src/features/wallet/hooks/use-creem-payment.ts
+++ b/web/default/src/features/wallet/hooks/use-creem-payment.ts
@@ -16,9 +16,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useCallback } from 'react'
import i18next from 'i18next'
+import { useState, useCallback } from 'react'
import { toast } from 'sonner'
+
import { requestCreemPayment, isApiSuccess } from '../api'
/**
diff --git a/web/default/src/features/wallet/hooks/use-payment.ts b/web/default/src/features/wallet/hooks/use-payment.ts
index 0c1aed60..0733d0c3 100644
--- a/web/default/src/features/wallet/hooks/use-payment.ts
+++ b/web/default/src/features/wallet/hooks/use-payment.ts
@@ -16,9 +16,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useCallback } from 'react'
import i18next from 'i18next'
+import { useState, useCallback } from 'react'
import { toast } from 'sonner'
+
import {
calculateAmount,
calculateStripeAmount,
diff --git a/web/default/src/features/wallet/hooks/use-redemption.ts b/web/default/src/features/wallet/hooks/use-redemption.ts
index 30211536..e43c0b3f 100644
--- a/web/default/src/features/wallet/hooks/use-redemption.ts
+++ b/web/default/src/features/wallet/hooks/use-redemption.ts
@@ -16,11 +16,13 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useCallback } from 'react'
import i18next from 'i18next'
+import { useState, useCallback } from 'react'
import { toast } from 'sonner'
+
import { getSelf } from '@/lib/api'
import { formatQuota } from '@/lib/format'
+
import { redeemTopupCode } from '../api'
// ============================================================================
diff --git a/web/default/src/features/wallet/hooks/use-topup-info.ts b/web/default/src/features/wallet/hooks/use-topup-info.ts
index 6aa17efe..8fb4b1ab 100644
--- a/web/default/src/features/wallet/hooks/use-topup-info.ts
+++ b/web/default/src/features/wallet/hooks/use-topup-info.ts
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { useState, useEffect, useCallback } from 'react'
+
import { getTopupInfo } from '../api'
import {
generatePresetAmounts,
diff --git a/web/default/src/features/wallet/hooks/use-waffo-pancake-payment.ts b/web/default/src/features/wallet/hooks/use-waffo-pancake-payment.ts
index b8acb939..3c80a412 100644
--- a/web/default/src/features/wallet/hooks/use-waffo-pancake-payment.ts
+++ b/web/default/src/features/wallet/hooks/use-waffo-pancake-payment.ts
@@ -16,9 +16,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useCallback } from 'react'
import i18next from 'i18next'
+import { useState, useCallback } from 'react'
import { toast } from 'sonner'
+
import { requestWaffoPancakePayment, isApiSuccess } from '../api'
function getCheckoutUrl(data: unknown): string | null {
diff --git a/web/default/src/features/wallet/hooks/use-waffo-payment.ts b/web/default/src/features/wallet/hooks/use-waffo-payment.ts
index e467db77..a024228a 100644
--- a/web/default/src/features/wallet/hooks/use-waffo-payment.ts
+++ b/web/default/src/features/wallet/hooks/use-waffo-payment.ts
@@ -16,9 +16,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useCallback } from 'react'
import i18next from 'i18next'
+import { useState, useCallback } from 'react'
import { toast } from 'sonner'
+
import { requestWaffoPayment, isApiSuccess } from '../api'
function getPaymentUrl(data: unknown): string | null {
diff --git a/web/default/src/features/wallet/index.tsx b/web/default/src/features/wallet/index.tsx
index 67eb8959..048e0332 100644
--- a/web/default/src/features/wallet/index.tsx
+++ b/web/default/src/features/wallet/index.tsx
@@ -18,10 +18,12 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { useState, useEffect, useCallback, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
-import { getSelf } from '@/lib/api'
+
+import { SectionPageLayout } from '@/components/layout'
import { useStatus } from '@/hooks/use-status'
import { useSystemConfig } from '@/hooks/use-system-config'
-import { SectionPageLayout } from '@/components/layout'
+import { getSelf } from '@/lib/api'
+
import { AffiliateRewardsCard } from './components/affiliate-rewards-card'
import { BillingHistoryDialog } from './components/dialogs/billing-history-dialog'
import { CreemConfirmDialog } from './components/dialogs/creem-confirm-dialog'
diff --git a/web/default/src/features/wallet/lib/billing.ts b/web/default/src/features/wallet/lib/billing.ts
index 77bf98c6..75366b1b 100644
--- a/web/default/src/features/wallet/lib/billing.ts
+++ b/web/default/src/features/wallet/lib/billing.ts
@@ -16,8 +16,9 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { formatTimestampToDate } from '@/lib/format'
import type { StatusBadgeProps } from '@/components/status-badge'
+import { formatTimestampToDate } from '@/lib/format'
+
import type { TopupStatus } from '../types'
// ============================================================================
diff --git a/web/default/src/features/wallet/lib/ui.tsx b/web/default/src/features/wallet/lib/ui.tsx
index 41a75eb6..5182e027 100644
--- a/web/default/src/features/wallet/lib/ui.tsx
+++ b/web/default/src/features/wallet/lib/ui.tsx
@@ -16,11 +16,13 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { type ReactNode } from 'react'
import i18next from 'i18next'
import { CreditCard, Landmark } from 'lucide-react'
+import { type ReactNode } from 'react'
import { SiAlipay, SiWechat, SiStripe } from 'react-icons/si'
+
import { ReactIconByName } from '@/components/react-icon-by-name'
+
import { PAYMENT_TYPES, PAYMENT_ICON_COLORS } from '../constants'
// ============================================================================
diff --git a/web/default/src/hooks/use-admin.ts b/web/default/src/hooks/use-admin.ts
index 7dc9f260..13a5ff1e 100644
--- a/web/default/src/hooks/use-admin.ts
+++ b/web/default/src/hooks/use-admin.ts
@@ -16,11 +16,11 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
+import { ROLE } from '@/lib/roles'
/**
* Hook for checking admin privileges
*/
import { useAuthStore } from '@/stores/auth-store'
-import { ROLE } from '@/lib/roles'
/**
* Check if current user has admin privileges
diff --git a/web/default/src/hooks/use-copy-to-clipboard.ts b/web/default/src/hooks/use-copy-to-clipboard.ts
index 02092a1a..307a3c6e 100644
--- a/web/default/src/hooks/use-copy-to-clipboard.ts
+++ b/web/default/src/hooks/use-copy-to-clipboard.ts
@@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com
import { useState, useCallback, useRef, useEffect } from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
+
import { copyToClipboard as copyToClipboardUtil } from '@/lib/copy-to-clipboard'
type UseCopyToClipboardOptions = {
diff --git a/web/default/src/hooks/use-notifications.ts b/web/default/src/hooks/use-notifications.ts
index 7a5b08db..17e305dc 100644
--- a/web/default/src/hooks/use-notifications.ts
+++ b/web/default/src/hooks/use-notifications.ts
@@ -16,11 +16,12 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useState, useMemo } from 'react'
import { useQuery } from '@tanstack/react-query'
-import { useNotificationStore } from '@/stores/notification-store'
-import { getNotice } from '@/lib/api'
+import { useState, useMemo } from 'react'
+
import { useStatus } from '@/hooks/use-status'
+import { getNotice } from '@/lib/api'
+import { useNotificationStore } from '@/stores/notification-store'
function hashString(input: string): string {
let hash = 0
diff --git a/web/default/src/hooks/use-sidebar-config.ts b/web/default/src/hooks/use-sidebar-config.ts
index 93e3e9ff..a026e43d 100644
--- a/web/default/src/hooks/use-sidebar-config.ts
+++ b/web/default/src/hooks/use-sidebar-config.ts
@@ -17,9 +17,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { useMemo } from 'react'
-import { useAuthStore } from '@/stores/auth-store'
-import { useStatus } from '@/hooks/use-status'
+
import type { NavGroup, NavItem } from '@/components/layout/types'
+import { useStatus } from '@/hooks/use-status'
+import { useAuthStore } from '@/stores/auth-store'
type SidebarSectionConfig = {
enabled: boolean
diff --git a/web/default/src/hooks/use-sidebar-data.ts b/web/default/src/hooks/use-sidebar-data.ts
index 60cc3352..40a0615a 100644
--- a/web/default/src/hooks/use-sidebar-data.ts
+++ b/web/default/src/hooks/use-sidebar-data.ts
@@ -35,8 +35,9 @@ import {
Wallet,
} from 'lucide-react'
import { useTranslation } from 'react-i18next'
-import { ROLE } from '@/lib/roles'
+
import { type SidebarData } from '@/components/layout/types'
+import { ROLE } from '@/lib/roles'
/**
* Root navigation groups for the application sidebar.
diff --git a/web/default/src/hooks/use-sidebar-view.ts b/web/default/src/hooks/use-sidebar-view.ts
index 3cf47a61..77b04173 100644
--- a/web/default/src/hooks/use-sidebar-view.ts
+++ b/web/default/src/hooks/use-sidebar-view.ts
@@ -16,13 +16,15 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useMemo } from 'react'
import { useLocation } from '@tanstack/react-router'
+import { useMemo } from 'react'
import { useTranslation } from 'react-i18next'
-import { useAuthStore } from '@/stores/auth-store'
-import { ROLE } from '@/lib/roles'
+
import { resolveSidebarView } from '@/components/layout/lib/sidebar-view-registry'
import type { NavGroup, ResolvedSidebarView } from '@/components/layout/types'
+import { ROLE } from '@/lib/roles'
+import { useAuthStore } from '@/stores/auth-store'
+
import { useSidebarConfig } from './use-sidebar-config'
import { useSidebarData } from './use-sidebar-data'
diff --git a/web/default/src/hooks/use-status.ts b/web/default/src/hooks/use-status.ts
index 904cc205..723ea547 100644
--- a/web/default/src/hooks/use-status.ts
+++ b/web/default/src/hooks/use-status.ts
@@ -17,9 +17,11 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { useQuery } from '@tanstack/react-query'
-import { useSystemConfigStore } from '@/stores/system-config-store'
-import { getStatus } from '@/lib/api'
+
import type { SystemStatus } from '@/features/auth/types'
+import { getStatus } from '@/lib/api'
+import { useSystemConfigStore } from '@/stores/system-config-store'
+
import { mapStatusDataToConfig } from './use-system-config'
// Get initial cache from localStorage
diff --git a/web/default/src/hooks/use-system-config.ts b/web/default/src/hooks/use-system-config.ts
index 256bd7d5..23f92a63 100644
--- a/web/default/src/hooks/use-system-config.ts
+++ b/web/default/src/hooks/use-system-config.ts
@@ -17,6 +17,9 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { useEffect, useCallback } from 'react'
+
+import { DEFAULT_SYSTEM_NAME, DEFAULT_LOGO } from '@/lib/constants'
+import { applyFaviconToDom } from '@/lib/dom-utils'
import {
useSystemConfigStore,
type CurrencyConfig,
@@ -24,8 +27,6 @@ import {
type SystemConfig,
DEFAULT_CURRENCY_CONFIG,
} from '@/stores/system-config-store'
-import { DEFAULT_SYSTEM_NAME, DEFAULT_LOGO } from '@/lib/constants'
-import { applyFaviconToDom } from '@/lib/dom-utils'
interface UseSystemConfigOptions {
/** Automatically fetch config from backend (use only in root component) */
diff --git a/web/default/src/hooks/use-table-url-state.ts b/web/default/src/hooks/use-table-url-state.ts
index 159041c8..04528e23 100644
--- a/web/default/src/hooks/use-table-url-state.ts
+++ b/web/default/src/hooks/use-table-url-state.ts
@@ -16,12 +16,12 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useEffect, useMemo, useState } from 'react'
import type {
ColumnFiltersState,
OnChangeFn,
PaginationState,
} from '@tanstack/react-table'
+import { useEffect, useMemo, useState } from 'react'
type SearchRecord = Record
diff --git a/web/default/src/hooks/use-top-nav-links.ts b/web/default/src/hooks/use-top-nav-links.ts
index a7996101..5a5baa2d 100644
--- a/web/default/src/hooks/use-top-nav-links.ts
+++ b/web/default/src/hooks/use-top-nav-links.ts
@@ -18,9 +18,10 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { useMemo } from 'react'
import { useTranslation } from 'react-i18next'
-import { useAuthStore } from '@/stores/auth-store'
-import { parseHeaderNavModulesFromStatus } from '@/lib/nav-modules'
+
import { useStatus } from '@/hooks/use-status'
+import { parseHeaderNavModulesFromStatus } from '@/lib/nav-modules'
+import { useAuthStore } from '@/stores/auth-store'
export type TopNavLink = {
title: string
diff --git a/web/default/src/hooks/use-user-display.ts b/web/default/src/hooks/use-user-display.ts
index 1955ef71..002c00e7 100644
--- a/web/default/src/hooks/use-user-display.ts
+++ b/web/default/src/hooks/use-user-display.ts
@@ -18,8 +18,9 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { useMemo } from 'react'
import { useTranslation } from 'react-i18next'
-import type { AuthUser } from '@/stores/auth-store'
+
import { getRoleLabel } from '@/lib/roles'
+import type { AuthUser } from '@/stores/auth-store'
/**
* Custom hook to format user display information
diff --git a/web/default/src/i18n/config.ts b/web/default/src/i18n/config.ts
index c6a249cd..11b541a2 100644
--- a/web/default/src/i18n/config.ts
+++ b/web/default/src/i18n/config.ts
@@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com
import i18n from 'i18next'
import LanguageDetector from 'i18next-browser-languagedetector'
import { initReactI18next } from 'react-i18next'
+
import en from './locales/en.json'
import fr from './locales/fr.json'
import ja from './locales/ja.json'
diff --git a/web/default/src/lib/admin-permissions.ts b/web/default/src/lib/admin-permissions.ts
index 424a80d4..95ddf816 100644
--- a/web/default/src/lib/admin-permissions.ts
+++ b/web/default/src/lib/admin-permissions.ts
@@ -1,6 +1,7 @@
-import { ROLE } from './roles'
import type { AuthUser } from '@/stores/auth-store'
+import { ROLE } from './roles'
+
export type AdminPermissionMatrix = Record>
export type AdminCapabilities = AdminPermissionMatrix
diff --git a/web/default/src/lib/api.ts b/web/default/src/lib/api.ts
index f6cc8805..1e50b16c 100644
--- a/web/default/src/lib/api.ts
+++ b/web/default/src/lib/api.ts
@@ -19,6 +19,7 @@ For commercial licensing, please contact support@quantumnous.com
import axios, { type AxiosRequestConfig } from 'axios'
import { t } from 'i18next'
import { toast } from 'sonner'
+
import { useAuthStore } from '@/stores/auth-store'
declare module 'axios' {
diff --git a/web/default/src/lib/format.ts b/web/default/src/lib/format.ts
index 6850bc6a..64aa7a2d 100644
--- a/web/default/src/lib/format.ts
+++ b/web/default/src/lib/format.ts
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import dayjs from '@/lib/dayjs'
+
import {
formatCurrencyFromUSD,
formatQuotaWithCurrency,
diff --git a/web/default/src/lib/use-chart-theme.ts b/web/default/src/lib/use-chart-theme.ts
index 2eb155cf..b1ec4705 100644
--- a/web/default/src/lib/use-chart-theme.ts
+++ b/web/default/src/lib/use-chart-theme.ts
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { useEffect, useRef, useState } from 'react'
+
import { useTheme } from '@/context/theme-provider'
/**
diff --git a/web/default/src/main.tsx b/web/default/src/main.tsx
index cd420d83..caf9307c 100644
--- a/web/default/src/main.tsx
+++ b/web/default/src/main.tsx
@@ -16,30 +16,33 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { StrictMode } from 'react'
-import ReactDOM from 'react-dom/client'
-import { AxiosError } from 'axios'
import {
QueryCache,
QueryClient,
QueryClientProvider,
} from '@tanstack/react-query'
import { RouterProvider, createRouter } from '@tanstack/react-router'
+import { AxiosError } from 'axios'
import i18next from 'i18next'
+import { StrictMode } from 'react'
+import ReactDOM from 'react-dom/client'
import { toast } from 'sonner'
-import { useAuthStore } from '@/stores/auth-store'
+
import { getStatus } from '@/lib/api'
import { installBuildMetadata } from '@/lib/build-metadata'
-import '@/lib/dayjs'
import { applyFaviconToDom } from '@/lib/dom-utils'
+import '@/lib/dayjs'
import { initializeFrontendCache } from '@/lib/frontend-cache'
import { handleServerError } from '@/lib/handle-server-error'
+import { useAuthStore } from '@/stores/auth-store'
+
import { DirectionProvider } from './context/direction-provider'
import { FontProvider } from './context/font-provider'
import { ThemeProvider } from './context/theme-provider'
import './i18n/config'
// Generated Routes
import { routeTree } from './routeTree.gen'
+
// Styles
import './styles/index.css'
diff --git a/web/default/src/routes/(auth)/forgot-password.tsx b/web/default/src/routes/(auth)/forgot-password.tsx
index 3e52d9f5..2cb898ca 100644
--- a/web/default/src/routes/(auth)/forgot-password.tsx
+++ b/web/default/src/routes/(auth)/forgot-password.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { ForgotPassword } from '@/features/auth/forgot-password'
export const Route = createFileRoute('/(auth)/forgot-password')({
diff --git a/web/default/src/routes/(auth)/oauth.tsx b/web/default/src/routes/(auth)/oauth.tsx
index ffefdcb4..6256017c 100644
--- a/web/default/src/routes/(auth)/oauth.tsx
+++ b/web/default/src/routes/(auth)/oauth.tsx
@@ -16,13 +16,14 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useEffect } from 'react'
import { createFileRoute, useNavigate, useSearch } from '@tanstack/react-router'
import i18next from 'i18next'
+import { useEffect } from 'react'
import { toast } from 'sonner'
-import { useAuthStore, type AuthUser } from '@/stores/auth-store'
-import { getSelf } from '@/lib/api'
+
import { wechatLoginByCode } from '@/features/auth/api'
+import { getSelf } from '@/lib/api'
+import { useAuthStore, type AuthUser } from '@/stores/auth-store'
function OAuthComponent() {
const navigate = useNavigate()
diff --git a/web/default/src/routes/(auth)/otp.tsx b/web/default/src/routes/(auth)/otp.tsx
index 4027422d..3142140a 100644
--- a/web/default/src/routes/(auth)/otp.tsx
+++ b/web/default/src/routes/(auth)/otp.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { Otp } from '@/features/auth/otp'
export const Route = createFileRoute('/(auth)/otp')({
diff --git a/web/default/src/routes/(auth)/reset.tsx b/web/default/src/routes/(auth)/reset.tsx
index 1d230f25..8122c145 100644
--- a/web/default/src/routes/(auth)/reset.tsx
+++ b/web/default/src/routes/(auth)/reset.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, useSearch } from '@tanstack/react-router'
+
import {
ResetPasswordConfirm,
type ResetPasswordSearchParams,
diff --git a/web/default/src/routes/(auth)/sign-in.tsx b/web/default/src/routes/(auth)/sign-in.tsx
index 21672817..ca3b095a 100644
--- a/web/default/src/routes/(auth)/sign-in.tsx
+++ b/web/default/src/routes/(auth)/sign-in.tsx
@@ -16,10 +16,11 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { z } from 'zod'
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
+import { z } from 'zod'
+
import { SignIn } from '@/features/auth/sign-in'
+import { useAuthStore } from '@/stores/auth-store'
const searchSchema = z.object({
redirect: z.string().optional(),
diff --git a/web/default/src/routes/(auth)/sign-up.tsx b/web/default/src/routes/(auth)/sign-up.tsx
index 8ad53308..f14db208 100644
--- a/web/default/src/routes/(auth)/sign-up.tsx
+++ b/web/default/src/routes/(auth)/sign-up.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { SignUp } from '@/features/auth/sign-up'
export const Route = createFileRoute('/(auth)/sign-up')({
diff --git a/web/default/src/routes/(auth)/user/reset.tsx b/web/default/src/routes/(auth)/user/reset.tsx
index f2bb788c..879893a9 100644
--- a/web/default/src/routes/(auth)/user/reset.tsx
+++ b/web/default/src/routes/(auth)/user/reset.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, useSearch } from '@tanstack/react-router'
+
import {
ResetPasswordConfirm,
type ResetPasswordSearchParams,
diff --git a/web/default/src/routes/(errors)/401.tsx b/web/default/src/routes/(errors)/401.tsx
index 88889d50..e03e6a39 100644
--- a/web/default/src/routes/(errors)/401.tsx
+++ b/web/default/src/routes/(errors)/401.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { UnauthorisedError } from '@/features/errors/unauthorized-error'
export const Route = createFileRoute('/(errors)/401')({
diff --git a/web/default/src/routes/(errors)/403.tsx b/web/default/src/routes/(errors)/403.tsx
index 10664692..31361b19 100644
--- a/web/default/src/routes/(errors)/403.tsx
+++ b/web/default/src/routes/(errors)/403.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { ForbiddenError } from '@/features/errors/forbidden'
export const Route = createFileRoute('/(errors)/403')({
diff --git a/web/default/src/routes/(errors)/404.tsx b/web/default/src/routes/(errors)/404.tsx
index 7e1c05a3..572f763b 100644
--- a/web/default/src/routes/(errors)/404.tsx
+++ b/web/default/src/routes/(errors)/404.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { NotFoundError } from '@/features/errors/not-found-error'
export const Route = createFileRoute('/(errors)/404')({
diff --git a/web/default/src/routes/(errors)/500.tsx b/web/default/src/routes/(errors)/500.tsx
index 0d69aad8..d781bccb 100644
--- a/web/default/src/routes/(errors)/500.tsx
+++ b/web/default/src/routes/(errors)/500.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { GeneralError } from '@/features/errors/general-error'
export const Route = createFileRoute('/(errors)/500')({
diff --git a/web/default/src/routes/(errors)/503.tsx b/web/default/src/routes/(errors)/503.tsx
index 23936adf..94e73aa0 100644
--- a/web/default/src/routes/(errors)/503.tsx
+++ b/web/default/src/routes/(errors)/503.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { MaintenanceError } from '@/features/errors/maintenance-error'
export const Route = createFileRoute('/(errors)/503')({
diff --git a/web/default/src/routes/__root.tsx b/web/default/src/routes/__root.tsx
index b212c9de..3ed4fbb6 100644
--- a/web/default/src/routes/__root.tsx
+++ b/web/default/src/routes/__root.tsx
@@ -16,23 +16,24 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useEffect } from 'react'
import { type QueryClient } from '@tanstack/react-query'
+import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
import {
createRootRouteWithContext,
Outlet,
redirect,
} from '@tanstack/react-router'
-import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
import { TanStackRouterDevtools } from '@tanstack/react-router-devtools'
-import { ThemeCustomizationProvider } from '@/context/theme-customization-provider'
-import { useSystemConfig } from '@/hooks/use-system-config'
-import { Toaster } from '@/components/ui/sonner'
+import { useEffect } from 'react'
+
import { NavigationProgress } from '@/components/navigation-progress'
+import { Toaster } from '@/components/ui/sonner'
+import { ThemeCustomizationProvider } from '@/context/theme-customization-provider'
import { saveAffiliateCode } from '@/features/auth/lib/storage'
import { GeneralError } from '@/features/errors/general-error'
import { NotFoundError } from '@/features/errors/not-found-error'
import { getSetupStatus } from '@/features/setup/api'
+import { useSystemConfig } from '@/hooks/use-system-config'
function RootComponent() {
// Load system configuration (logo, system name, etc.) from backend
diff --git a/web/default/src/routes/_authenticated/channels/index.tsx b/web/default/src/routes/_authenticated/channels/index.tsx
index ec515bb6..872e1499 100644
--- a/web/default/src/routes/_authenticated/channels/index.tsx
+++ b/web/default/src/routes/_authenticated/channels/index.tsx
@@ -16,11 +16,12 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import z from 'zod'
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
-import { ROLE } from '@/lib/roles'
+import z from 'zod'
+
import { Channels } from '@/features/channels'
+import { ROLE } from '@/lib/roles'
+import { useAuthStore } from '@/stores/auth-store'
const channelsSearchSchema = z.object({
page: z.number().optional().catch(1),
diff --git a/web/default/src/routes/_authenticated/chat/$chatId.tsx b/web/default/src/routes/_authenticated/chat/$chatId.tsx
index 7f84f1d4..4c8f1a05 100644
--- a/web/default/src/routes/_authenticated/chat/$chatId.tsx
+++ b/web/default/src/routes/_authenticated/chat/$chatId.tsx
@@ -16,10 +16,11 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useMemo } from 'react'
import { Link, createFileRoute, redirect } from '@tanstack/react-router'
import { Loader2, MessageCircleWarning } from 'lucide-react'
+import { useMemo } from 'react'
import { useTranslation } from 'react-i18next'
+
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
import { Button } from '@/components/ui/button'
import { useActiveChatKey } from '@/features/chat/hooks/use-active-chat-key'
diff --git a/web/default/src/routes/_authenticated/chat2link.tsx b/web/default/src/routes/_authenticated/chat2link.tsx
index bd804671..1108a139 100644
--- a/web/default/src/routes/_authenticated/chat2link.tsx
+++ b/web/default/src/routes/_authenticated/chat2link.tsx
@@ -16,11 +16,12 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useEffect, useMemo } from 'react'
import { createFileRoute, useNavigate } from '@tanstack/react-router'
import { Loader2 } from 'lucide-react'
+import { useEffect, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import { toast } from 'sonner'
+
import { useActiveChatKey } from '@/features/chat/hooks/use-active-chat-key'
import { useChatPresets } from '@/features/chat/hooks/use-chat-presets'
import { resolveChatUrl } from '@/features/chat/lib/chat-links'
diff --git a/web/default/src/routes/_authenticated/dashboard/$section.tsx b/web/default/src/routes/_authenticated/dashboard/$section.tsx
index 994f2874..3b334ed8 100644
--- a/web/default/src/routes/_authenticated/dashboard/$section.tsx
+++ b/web/default/src/routes/_authenticated/dashboard/$section.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { Dashboard } from '@/features/dashboard'
import {
DASHBOARD_SECTION_IDS,
diff --git a/web/default/src/routes/_authenticated/dashboard/index.tsx b/web/default/src/routes/_authenticated/dashboard/index.tsx
index cd135a10..b27bcfe3 100644
--- a/web/default/src/routes/_authenticated/dashboard/index.tsx
+++ b/web/default/src/routes/_authenticated/dashboard/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { DASHBOARD_DEFAULT_SECTION } from '@/features/dashboard/section-registry'
export const Route = createFileRoute('/_authenticated/dashboard/')({
diff --git a/web/default/src/routes/_authenticated/errors/$error.tsx b/web/default/src/routes/_authenticated/errors/$error.tsx
index a948f544..2f6ef8a5 100644
--- a/web/default/src/routes/_authenticated/errors/$error.tsx
+++ b/web/default/src/routes/_authenticated/errors/$error.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { ConfigDrawer } from '@/components/config-drawer'
import { Header } from '@/components/layout'
import { ProfileDropdown } from '@/components/profile-dropdown'
diff --git a/web/default/src/routes/_authenticated/keys/index.tsx b/web/default/src/routes/_authenticated/keys/index.tsx
index 051ce08a..14d885cd 100644
--- a/web/default/src/routes/_authenticated/keys/index.tsx
+++ b/web/default/src/routes/_authenticated/keys/index.tsx
@@ -16,8 +16,9 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import z from 'zod'
import { createFileRoute } from '@tanstack/react-router'
+import z from 'zod'
+
import { ApiKeys } from '@/features/keys'
import { API_KEY_STATUS_OPTIONS } from '@/features/keys/constants'
diff --git a/web/default/src/routes/_authenticated/models/$section.tsx b/web/default/src/routes/_authenticated/models/$section.tsx
index aa5c138c..dfeb2802 100644
--- a/web/default/src/routes/_authenticated/models/$section.tsx
+++ b/web/default/src/routes/_authenticated/models/$section.tsx
@@ -16,15 +16,16 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import z from 'zod'
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
-import { ROLE } from '@/lib/roles'
+import z from 'zod'
+
import { Models } from '@/features/models'
import {
MODELS_SECTION_IDS,
MODELS_DEFAULT_SECTION,
} from '@/features/models/section-registry'
+import { ROLE } from '@/lib/roles'
+import { useAuthStore } from '@/stores/auth-store'
const modelsSearchSchema = z.object({
page: z.number().optional().catch(1),
diff --git a/web/default/src/routes/_authenticated/models/index.tsx b/web/default/src/routes/_authenticated/models/index.tsx
index 5da76b48..4485e883 100644
--- a/web/default/src/routes/_authenticated/models/index.tsx
+++ b/web/default/src/routes/_authenticated/models/index.tsx
@@ -17,9 +17,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
-import { ROLE } from '@/lib/roles'
+
import { MODELS_DEFAULT_SECTION } from '@/features/models/section-registry'
+import { ROLE } from '@/lib/roles'
+import { useAuthStore } from '@/stores/auth-store'
export const Route = createFileRoute('/_authenticated/models/')({
beforeLoad: () => {
diff --git a/web/default/src/routes/_authenticated/playground/index.tsx b/web/default/src/routes/_authenticated/playground/index.tsx
index 6a6aa4d4..f69ca162 100644
--- a/web/default/src/routes/_authenticated/playground/index.tsx
+++ b/web/default/src/routes/_authenticated/playground/index.tsx
@@ -17,9 +17,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { isSidebarModuleEnabled } from '@/lib/nav-modules'
+
import { Main } from '@/components/layout'
import { Playground } from '@/features/playground'
+import { isSidebarModuleEnabled } from '@/lib/nav-modules'
export const Route = createFileRoute('/_authenticated/playground/')({
beforeLoad: () => {
diff --git a/web/default/src/routes/_authenticated/profile/index.tsx b/web/default/src/routes/_authenticated/profile/index.tsx
index 35fd6cc7..5d83c773 100644
--- a/web/default/src/routes/_authenticated/profile/index.tsx
+++ b/web/default/src/routes/_authenticated/profile/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { Profile } from '@/features/profile'
export const Route = createFileRoute('/_authenticated/profile/')({
diff --git a/web/default/src/routes/_authenticated/redemption-codes/index.tsx b/web/default/src/routes/_authenticated/redemption-codes/index.tsx
index 295378d4..a9018d1c 100644
--- a/web/default/src/routes/_authenticated/redemption-codes/index.tsx
+++ b/web/default/src/routes/_authenticated/redemption-codes/index.tsx
@@ -16,12 +16,13 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import z from 'zod'
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
-import { ROLE } from '@/lib/roles'
+import z from 'zod'
+
import { Redemptions } from '@/features/redemption-codes'
import { REDEMPTION_STATUS_VALUES } from '@/features/redemption-codes/constants'
+import { ROLE } from '@/lib/roles'
+import { useAuthStore } from '@/stores/auth-store'
const redemptionsSearchSchema = z.object({
page: z.number().optional().catch(1),
diff --git a/web/default/src/routes/_authenticated/route.tsx b/web/default/src/routes/_authenticated/route.tsx
index 5b7ce1c2..8a7115e9 100644
--- a/web/default/src/routes/_authenticated/route.tsx
+++ b/web/default/src/routes/_authenticated/route.tsx
@@ -17,9 +17,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
-import { getSelf } from '@/lib/api'
+
import { AuthenticatedLayout } from '@/components/layout'
+import { getSelf } from '@/lib/api'
+import { useAuthStore } from '@/stores/auth-store'
// 内存中的验证标记,避免同一会话中重复验证
let sessionVerified = false
diff --git a/web/default/src/routes/_authenticated/subscriptions/index.tsx b/web/default/src/routes/_authenticated/subscriptions/index.tsx
index ade24664..550708d2 100644
--- a/web/default/src/routes/_authenticated/subscriptions/index.tsx
+++ b/web/default/src/routes/_authenticated/subscriptions/index.tsx
@@ -17,9 +17,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
-import { ROLE } from '@/lib/roles'
+
import { Subscriptions } from '@/features/subscriptions'
+import { ROLE } from '@/lib/roles'
+import { useAuthStore } from '@/stores/auth-store'
export const Route = createFileRoute('/_authenticated/subscriptions/')({
beforeLoad: () => {
diff --git a/web/default/src/routes/_authenticated/system-info/index.tsx b/web/default/src/routes/_authenticated/system-info/index.tsx
index f62c3f30..324a0302 100644
--- a/web/default/src/routes/_authenticated/system-info/index.tsx
+++ b/web/default/src/routes/_authenticated/system-info/index.tsx
@@ -17,9 +17,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
-import { ROLE } from '@/lib/roles'
+
import { SystemInfo } from '@/features/system-info'
+import { ROLE } from '@/lib/roles'
+import { useAuthStore } from '@/stores/auth-store'
export const Route = createFileRoute('/_authenticated/system-info/')({
beforeLoad: () => {
diff --git a/web/default/src/routes/_authenticated/system-settings/auth/$section.tsx b/web/default/src/routes/_authenticated/system-settings/auth/$section.tsx
index 07adabc4..fa604555 100644
--- a/web/default/src/routes/_authenticated/system-settings/auth/$section.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/auth/$section.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { AuthSettings } from '@/features/system-settings/auth'
import {
AUTH_DEFAULT_SECTION,
diff --git a/web/default/src/routes/_authenticated/system-settings/auth/index.tsx b/web/default/src/routes/_authenticated/system-settings/auth/index.tsx
index 516bb2ef..089d6657 100644
--- a/web/default/src/routes/_authenticated/system-settings/auth/index.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/auth/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { AUTH_DEFAULT_SECTION } from '@/features/system-settings/auth/section-registry.tsx'
export const Route = createFileRoute('/_authenticated/system-settings/auth/')({
diff --git a/web/default/src/routes/_authenticated/system-settings/billing/$section.tsx b/web/default/src/routes/_authenticated/system-settings/billing/$section.tsx
index 6408b4a4..a94e57d5 100644
--- a/web/default/src/routes/_authenticated/system-settings/billing/$section.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/billing/$section.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { BillingSettings } from '@/features/system-settings/billing'
import {
BILLING_DEFAULT_SECTION,
diff --git a/web/default/src/routes/_authenticated/system-settings/billing/index.tsx b/web/default/src/routes/_authenticated/system-settings/billing/index.tsx
index 52c5ba0a..8ffe3634 100644
--- a/web/default/src/routes/_authenticated/system-settings/billing/index.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/billing/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { BILLING_DEFAULT_SECTION } from '@/features/system-settings/billing/section-registry.tsx'
export const Route = createFileRoute(
diff --git a/web/default/src/routes/_authenticated/system-settings/content/$section.tsx b/web/default/src/routes/_authenticated/system-settings/content/$section.tsx
index 494bcf0d..0e28d0ee 100644
--- a/web/default/src/routes/_authenticated/system-settings/content/$section.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/content/$section.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { ContentSettings } from '@/features/system-settings/content'
import {
CONTENT_DEFAULT_SECTION,
diff --git a/web/default/src/routes/_authenticated/system-settings/content/index.tsx b/web/default/src/routes/_authenticated/system-settings/content/index.tsx
index f116b35d..c22a6123 100644
--- a/web/default/src/routes/_authenticated/system-settings/content/index.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/content/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { CONTENT_DEFAULT_SECTION } from '@/features/system-settings/content/section-registry.tsx'
export const Route = createFileRoute(
diff --git a/web/default/src/routes/_authenticated/system-settings/models/$section.tsx b/web/default/src/routes/_authenticated/system-settings/models/$section.tsx
index 3697c252..7db9e39f 100644
--- a/web/default/src/routes/_authenticated/system-settings/models/$section.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/models/$section.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { ModelSettings } from '@/features/system-settings/models'
import {
MODELS_DEFAULT_SECTION,
diff --git a/web/default/src/routes/_authenticated/system-settings/models/index.tsx b/web/default/src/routes/_authenticated/system-settings/models/index.tsx
index 83318b50..bc113887 100644
--- a/web/default/src/routes/_authenticated/system-settings/models/index.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/models/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { MODELS_DEFAULT_SECTION } from '@/features/system-settings/models/section-registry.tsx'
export const Route = createFileRoute('/_authenticated/system-settings/models/')(
diff --git a/web/default/src/routes/_authenticated/system-settings/operations/$section.tsx b/web/default/src/routes/_authenticated/system-settings/operations/$section.tsx
index 887fd9f0..1fe4ec2a 100644
--- a/web/default/src/routes/_authenticated/system-settings/operations/$section.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/operations/$section.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { OperationsSettings } from '@/features/system-settings/operations'
import {
OPERATIONS_DEFAULT_SECTION,
diff --git a/web/default/src/routes/_authenticated/system-settings/operations/index.tsx b/web/default/src/routes/_authenticated/system-settings/operations/index.tsx
index 4705e9d2..70d2b7e3 100644
--- a/web/default/src/routes/_authenticated/system-settings/operations/index.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/operations/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { OPERATIONS_DEFAULT_SECTION } from '@/features/system-settings/operations/section-registry.tsx'
export const Route = createFileRoute(
diff --git a/web/default/src/routes/_authenticated/system-settings/route.tsx b/web/default/src/routes/_authenticated/system-settings/route.tsx
index bb24d15f..081b81a9 100644
--- a/web/default/src/routes/_authenticated/system-settings/route.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/route.tsx
@@ -17,9 +17,10 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
-import { ROLE } from '@/lib/roles'
+
import { SystemSettings } from '@/features/system-settings'
+import { ROLE } from '@/lib/roles'
+import { useAuthStore } from '@/stores/auth-store'
export const Route = createFileRoute('/_authenticated/system-settings')({
beforeLoad: () => {
diff --git a/web/default/src/routes/_authenticated/system-settings/security/$section.tsx b/web/default/src/routes/_authenticated/system-settings/security/$section.tsx
index c65ab22a..0858686e 100644
--- a/web/default/src/routes/_authenticated/system-settings/security/$section.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/security/$section.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { SecuritySettings } from '@/features/system-settings/security'
import {
SECURITY_DEFAULT_SECTION,
diff --git a/web/default/src/routes/_authenticated/system-settings/security/index.tsx b/web/default/src/routes/_authenticated/system-settings/security/index.tsx
index be727ff6..40a1d925 100644
--- a/web/default/src/routes/_authenticated/system-settings/security/index.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/security/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { SECURITY_DEFAULT_SECTION } from '@/features/system-settings/security/section-registry.tsx'
export const Route = createFileRoute(
diff --git a/web/default/src/routes/_authenticated/system-settings/site/$section.tsx b/web/default/src/routes/_authenticated/system-settings/site/$section.tsx
index b01ec4f5..20c57fbd 100644
--- a/web/default/src/routes/_authenticated/system-settings/site/$section.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/site/$section.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { SiteSettings } from '@/features/system-settings/site'
import {
SITE_DEFAULT_SECTION,
diff --git a/web/default/src/routes/_authenticated/system-settings/site/index.tsx b/web/default/src/routes/_authenticated/system-settings/site/index.tsx
index 476d9e2b..edd4b594 100644
--- a/web/default/src/routes/_authenticated/system-settings/site/index.tsx
+++ b/web/default/src/routes/_authenticated/system-settings/site/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { SITE_DEFAULT_SECTION } from '@/features/system-settings/site/section-registry.tsx'
export const Route = createFileRoute('/_authenticated/system-settings/site/')({
diff --git a/web/default/src/routes/_authenticated/usage-logs/$section.tsx b/web/default/src/routes/_authenticated/usage-logs/$section.tsx
index 28a1a3b7..6361def3 100644
--- a/web/default/src/routes/_authenticated/usage-logs/$section.tsx
+++ b/web/default/src/routes/_authenticated/usage-logs/$section.tsx
@@ -16,8 +16,9 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import z from 'zod'
import { createFileRoute, redirect } from '@tanstack/react-router'
+import z from 'zod'
+
import { UsageLogs } from '@/features/usage-logs'
import {
isUsageLogsSectionId,
@@ -26,13 +27,10 @@ import {
const logTypeValues = ['0', '1', '2', '3', '4', '5', '6', '7'] as const
const logTypeSearchSchema = z
- .preprocess(
- (value) => {
- if (value == null || value === '') return undefined
- return Array.isArray(value) ? value : [value]
- },
- z.array(z.enum(logTypeValues)).optional()
- )
+ .preprocess((value) => {
+ if (value == null || value === '') return undefined
+ return Array.isArray(value) ? value : [value]
+ }, z.array(z.enum(logTypeValues)).optional())
.catch([])
const usageLogsSearchSchema = z.object({
diff --git a/web/default/src/routes/_authenticated/usage-logs/index.tsx b/web/default/src/routes/_authenticated/usage-logs/index.tsx
index 3724788e..502a762c 100644
--- a/web/default/src/routes/_authenticated/usage-logs/index.tsx
+++ b/web/default/src/routes/_authenticated/usage-logs/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { USAGE_LOGS_DEFAULT_SECTION } from '@/features/usage-logs/section-registry'
export const Route = createFileRoute('/_authenticated/usage-logs/')({
diff --git a/web/default/src/routes/_authenticated/users/index.tsx b/web/default/src/routes/_authenticated/users/index.tsx
index 5d2e4781..4b0486dd 100644
--- a/web/default/src/routes/_authenticated/users/index.tsx
+++ b/web/default/src/routes/_authenticated/users/index.tsx
@@ -16,11 +16,12 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import z from 'zod'
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
-import { ROLE } from '@/lib/roles'
+import z from 'zod'
+
import { Users } from '@/features/users'
+import { ROLE } from '@/lib/roles'
+import { useAuthStore } from '@/stores/auth-store'
const usersSearchSchema = z.object({
page: z.number().optional().catch(1),
diff --git a/web/default/src/routes/_authenticated/wallet/index.tsx b/web/default/src/routes/_authenticated/wallet/index.tsx
index 5e0e37b2..6feec0e5 100644
--- a/web/default/src/routes/_authenticated/wallet/index.tsx
+++ b/web/default/src/routes/_authenticated/wallet/index.tsx
@@ -16,8 +16,9 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { z } from 'zod'
import { createFileRoute } from '@tanstack/react-router'
+import { z } from 'zod'
+
import { Wallet } from '@/features/wallet'
const walletSearchSchema = z.object({
diff --git a/web/default/src/routes/about/index.tsx b/web/default/src/routes/about/index.tsx
index 0c2e47c3..29ea2a55 100644
--- a/web/default/src/routes/about/index.tsx
+++ b/web/default/src/routes/about/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { About } from '@/features/about'
export const Route = createFileRoute('/about/')({
diff --git a/web/default/src/routes/console/topup.tsx b/web/default/src/routes/console/topup.tsx
index 8e728a2c..057c4352 100644
--- a/web/default/src/routes/console/topup.tsx
+++ b/web/default/src/routes/console/topup.tsx
@@ -16,8 +16,8 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import z from 'zod'
import { createFileRoute, redirect } from '@tanstack/react-router'
+import z from 'zod'
const topupSearchSchema = z.record(z.string(), z.unknown()).catch({})
diff --git a/web/default/src/routes/index.tsx b/web/default/src/routes/index.tsx
index 0255e357..1fe03393 100644
--- a/web/default/src/routes/index.tsx
+++ b/web/default/src/routes/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { Home } from '@/features/home'
export const Route = createFileRoute('/')({
diff --git a/web/default/src/routes/oauth/$provider.tsx b/web/default/src/routes/oauth/$provider.tsx
index 98e546eb..b35bfdaf 100644
--- a/web/default/src/routes/oauth/$provider.tsx
+++ b/web/default/src/routes/oauth/$provider.tsx
@@ -16,20 +16,21 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import { useEffect, useState } from 'react'
-import type { AxiosRequestConfig } from 'axios'
import {
createFileRoute,
useNavigate,
useParams,
useSearch,
} from '@tanstack/react-router'
+import type { AxiosRequestConfig } from 'axios'
import i18next from 'i18next'
+import { useEffect, useState } from 'react'
import { toast } from 'sonner'
-import { useAuthStore, type AuthUser } from '@/stores/auth-store'
-import { api, getSelf } from '@/lib/api'
+
import { OAuthCallbackScreen } from '@/features/auth/components/oauth-callback-screen'
import { OAUTH_BIND_STORAGE_KEY } from '@/features/auth/constants'
+import { api, getSelf } from '@/lib/api'
+import { useAuthStore, type AuthUser } from '@/stores/auth-store'
type OAuthRequestConfig = AxiosRequestConfig & {
skipBusinessError?: boolean
diff --git a/web/default/src/routes/pricing/$modelId/index.tsx b/web/default/src/routes/pricing/$modelId/index.tsx
index e09ccaf4..3eb46a78 100644
--- a/web/default/src/routes/pricing/$modelId/index.tsx
+++ b/web/default/src/routes/pricing/$modelId/index.tsx
@@ -16,11 +16,12 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import z from 'zod'
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
-import { getFreshModuleAccess } from '@/lib/nav-modules'
+import z from 'zod'
+
import { ModelDetails } from '@/features/pricing/components/model-details'
+import { getFreshModuleAccess } from '@/lib/nav-modules'
+import { useAuthStore } from '@/stores/auth-store'
const modelDetailsSearchSchema = z.object({
search: z.string().optional(),
diff --git a/web/default/src/routes/pricing/index.tsx b/web/default/src/routes/pricing/index.tsx
index 66afcb86..3af5e4f9 100644
--- a/web/default/src/routes/pricing/index.tsx
+++ b/web/default/src/routes/pricing/index.tsx
@@ -16,11 +16,12 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import z from 'zod'
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
-import { getFreshModuleAccess } from '@/lib/nav-modules'
+import z from 'zod'
+
import { Pricing } from '@/features/pricing'
+import { getFreshModuleAccess } from '@/lib/nav-modules'
+import { useAuthStore } from '@/stores/auth-store'
const pricingSearchSchema = z.object({
search: z.string().optional(),
diff --git a/web/default/src/routes/privacy-policy.tsx b/web/default/src/routes/privacy-policy.tsx
index 583874b1..c062c517 100644
--- a/web/default/src/routes/privacy-policy.tsx
+++ b/web/default/src/routes/privacy-policy.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { PrivacyPolicy } from '@/features/legal'
export const Route = createFileRoute('/privacy-policy')({
diff --git a/web/default/src/routes/rankings/index.tsx b/web/default/src/routes/rankings/index.tsx
index 71a307d3..4e1ea6d2 100644
--- a/web/default/src/routes/rankings/index.tsx
+++ b/web/default/src/routes/rankings/index.tsx
@@ -16,11 +16,12 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
-import z from 'zod'
import { createFileRoute, redirect } from '@tanstack/react-router'
-import { useAuthStore } from '@/stores/auth-store'
-import { getFreshModuleAccess } from '@/lib/nav-modules'
+import z from 'zod'
+
import { Rankings } from '@/features/rankings'
+import { getFreshModuleAccess } from '@/lib/nav-modules'
+import { useAuthStore } from '@/stores/auth-store'
const rankingsSearchSchema = z.object({
period: z
diff --git a/web/default/src/routes/setup/index.tsx b/web/default/src/routes/setup/index.tsx
index b2de2865..89339306 100644
--- a/web/default/src/routes/setup/index.tsx
+++ b/web/default/src/routes/setup/index.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute, redirect } from '@tanstack/react-router'
+
import { SetupWizard } from '@/features/setup'
import { getSetupStatus } from '@/features/setup/api'
diff --git a/web/default/src/routes/user-agreement.tsx b/web/default/src/routes/user-agreement.tsx
index 7d1cac9f..cfc1ae28 100644
--- a/web/default/src/routes/user-agreement.tsx
+++ b/web/default/src/routes/user-agreement.tsx
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { createFileRoute } from '@tanstack/react-router'
+
import { UserAgreement } from '@/features/legal'
export const Route = createFileRoute('/user-agreement')({
diff --git a/web/default/src/stores/auth-store.ts b/web/default/src/stores/auth-store.ts
index 20981a76..49165c0e 100644
--- a/web/default/src/stores/auth-store.ts
+++ b/web/default/src/stores/auth-store.ts
@@ -17,6 +17,7 @@ along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { create } from 'zustand'
+
import type { AdminCapabilities } from '@/lib/admin-permissions'
export type UserPermissions = {
diff --git a/web/default/src/stores/system-config-store.ts b/web/default/src/stores/system-config-store.ts
index 76997ef8..570fc45a 100644
--- a/web/default/src/stores/system-config-store.ts
+++ b/web/default/src/stores/system-config-store.ts
@@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com
*/
import { create } from 'zustand'
import { persist } from 'zustand/middleware'
+
import { DEFAULT_SYSTEM_NAME, DEFAULT_LOGO } from '@/lib/constants'
export type CurrencyDisplayType = 'USD' | 'CNY' | 'TOKENS' | 'CUSTOM'
diff --git a/web/default/src/styles/theme.css b/web/default/src/styles/theme.css
index 45857453..8a2d174b 100644
--- a/web/default/src/styles/theme.css
+++ b/web/default/src/styles/theme.css
@@ -215,11 +215,7 @@ For commercial licensing, please contact support@quantumnous.com
--skeleton-base: oklch(0.335 0 0);
--skeleton-highlight: oklch(0.44 0 0);
--table-row: var(--background);
- --table-header: color-mix(
- in oklch,
- var(--foreground) 6%,
- var(--background)
- );
+ --table-header: color-mix(in oklch, var(--foreground) 6%, var(--background));
--table-header-hover: color-mix(
in oklch,
var(--foreground) 9%,