diff --git a/apps/web/src/pages/admin.tsx b/apps/web/src/pages/admin.tsx index cee8504..8a14121 100644 --- a/apps/web/src/pages/admin.tsx +++ b/apps/web/src/pages/admin.tsx @@ -2,7 +2,7 @@ import * as React from "react" import DOMPurify from "dompurify" import { useSearchParams } from "react-router-dom" import { useInfiniteQuery, useMutation, useQuery, useQueryClient } from "@tanstack/react-query" -import { AlertCircle, BookOpen, CheckCircle2, ChevronDown, ChevronRight, Circle, ClipboardList, Clock3, Cloud, Copy, Database, Download, ExternalLink, Eye, EyeOff, Github, Globe2, HardDrive, KeyRound, Loader2, Mail, MoreHorizontal, RefreshCcw, Scale, Search, Send, ShieldCheck, Star, Trash2, UserRound } from "lucide-react" +import { AlertCircle, CheckCircle2, ChevronDown, ChevronRight, Circle, ClipboardList, Clock3, Cloud, Copy, Database, Download, ExternalLink, Eye, EyeOff, Globe2, HardDrive, KeyRound, Loader2, Mail, MoreHorizontal, RefreshCcw, Search, Send, ShieldCheck, Trash2, UserRound } from "lucide-react" import { api, AdminOverview, AdminUser, Alias, DNSRecord, Domain, Mailbox as MailboxType, MailMessage, MailTemplate, MaildirSyncHealth, PermissionGroup, PermissionInfo, PermissionLimits, SystemSettings } from "@/lib/api" import { cn, decodeMimeHeader, formatBytes, formatDate } from "@/lib/utils" import { Button } from "@/components/ui/button" @@ -20,14 +20,13 @@ import { Switch } from "@/components/ui/switch" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Textarea } from "@/components/ui/textarea" import { ConfirmDialog } from "@/components/confirm-dialog" -import { SystemVersionDialog } from "@/components/system-version-dialog" import { useMe } from "@/hooks/use-me" import { useToast } from "@/hooks/use-toast" import { hasAnyPermission, hasPermission } from "@/lib/permissions" import type { BackupTransfer, PermissionKey, TelegramPairing } from "@/lib/api-types" type Section = "overview" | "users" | "permissionGroups" | "domains" | "mailboxes" | "aliases" | "messages" | "sendAudit" | "backups" | "settings" -type SettingsTab = "base" | "smtp" | "storage" | "mail" | "notifications" | "externalImap" | "templates" | "security" | "about" +type SettingsTab = "base" | "smtp" | "storage" | "mail" | "notifications" | "externalImap" | "templates" | "security" type PendingConfirm = { title: string; description?: string; confirmText: string; onConfirm: () => void } const sectionMeta: Record = { @@ -56,8 +55,6 @@ const sectionPermissions: Record = { backups: ["admin.settings.view"], settings: ["admin.settings.view", "admin.templates.view"], } -const projectRepositoryUrl = "https://github.com/zxyszx/NewSzxcn-Email" -const projectTelegramUrl = "https://t.me/+EhII7MSyi3QwNDQ5" const defaultPermissionLimits: PermissionLimits = { maxAttachmentMb: 25, maxMailboxCount: 9, smtpDailyLimit: 200, smtpMinuteLimit: 20, imapMinuteLimit: 200, pop3MinuteLimit: 150 } const defaultMailboxLimitOverride = 9 const defaultUserStorageQuotaMb = 100 @@ -1543,7 +1540,7 @@ function SystemSettingsSection({ settings, domains, mailboxes, initialTab }: { s const canResetTemplates = hasPermission(user, "admin.templates.reset") const templates = useQuery({ queryKey: ["admin", "mail-templates"], queryFn: api.mailTemplates, enabled: canViewTemplates }) const requestedTab = initialTab as SettingsTab | undefined - const [settingsTab, setSettingsTab] = React.useState(() => requestedTab && ["base", "smtp", "storage", "mail", "notifications", "externalImap", "templates", "security", "about"].includes(requestedTab) ? requestedTab : "base") + const [settingsTab, setSettingsTab] = React.useState(() => requestedTab && ["base", "smtp", "storage", "mail", "notifications", "externalImap", "templates", "security"].includes(requestedTab) ? requestedTab : "base") const maildirHealth = useQuery({ queryKey: ["admin", "maildir-sync", "health"], queryFn: api.maildirSyncHealth, enabled: canSettingsView && settingsTab === "storage" }) const [smtpRequireTls, setSmtpRequireTls] = React.useState(false) const [allowInsecureHttp, setAllowInsecureHttp] = React.useState(true) @@ -1703,11 +1700,10 @@ function SystemSettingsSection({ settings, domains, mailboxes, initialTab }: { s ] : []), ...(canViewTemplates ? [{ key: "templates" as const, label: "模板" }] : []), ...(canSettingsView ? [{ key: "security" as const, label: "安全" }] : []), - { key: "about", label: "关于" }, ] React.useEffect(() => { if (tabs.some((tab) => tab.key === settingsTab)) return - setSettingsTab(tabs[0]?.key || "about") + setSettingsTab(tabs[0]?.key || "base") }, [settingsTab, tabs]) return (
{ event.preventDefault(); if (canUpdateSettings) save.mutate(new FormData(event.currentTarget)) }} className="space-y-6"> @@ -1950,9 +1946,7 @@ function SystemSettingsSection({ settings, domains, mailboxes, initialTab }: { s } - {settingsTab === "about" && } - - {settingsTab !== "about" && canUpdateSettings &&
+ {canUpdateSettings &&
} @@ -2055,76 +2049,6 @@ function queryErrorMessage(error: unknown) { return error instanceof Error ? error.message : "读取 Maildir 同步健康失败" } -function AboutProjectCard() { - return ( - - - 关于 - - - - - - - - - - - - - - - - - ) -} - -function AboutRow({ label, children }: { label: string; children: React.ReactNode }) { - return ( -
-
{label}:
-
{children}
-
- ) -} - function TestSMTPDialog({ disabled }: { disabled?: boolean }) { const { toast } = useToast() const [open, setOpen] = React.useState(false)