import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import toast from "react-hot-toast"; import { Input } from "@/shadcn-bridge/heroui/input"; import { Button } from "@/shadcn-bridge/heroui/button"; import { Card, CardBody } from "@/shadcn-bridge/heroui/card"; import { Select, SelectItem } from "@/shadcn-bridge/heroui/select"; import { reinitializeBaseURL } from "@/api/network"; import { type UpdateReleaseChannel, getUpdateReleaseChannel, setUpdateReleaseChannel, } from "@/utils/version-update"; import { getPanelAddresses, savePanelAddress, setCurrentPanelAddress, deletePanelAddress, validatePanelAddress, } from "@/utils/panel"; interface PanelAddress { name: string; address: string; inx: boolean; } export const SettingsPage = () => { const navigate = useNavigate(); const [panelAddresses, setPanelAddresses] = useState([]); const [newName, setNewName] = useState(""); const [newAddress, setNewAddress] = useState(""); const [updateChannel, setUpdateChannel] = useState( getUpdateReleaseChannel(), ); const setPanelAddressesFunc = (newAddress: PanelAddress[]) => { setPanelAddresses(newAddress); }; // 加载面板地址列表 const loadPanelAddresses = async () => { (window as any).setPanelAddresses = setPanelAddressesFunc; getPanelAddresses(); }; // 添加新面板地址 const addPanelAddress = async () => { if (!newName.trim() || !newAddress.trim()) { toast.error("请输入名称和地址"); return; } // 验证地址格式 if (!validatePanelAddress(newAddress.trim())) { toast.error( "地址格式不正确,请检查:\n• 必须是完整的URL格式\n• 必须以 http:// 或 https:// 开头\n• 支持域名、IPv4、IPv6 地址\n• 端口号范围:1-65535\n• 示例:http://192.168.1.100:3000", ); return; } (window as any).setPanelAddresses = setPanelAddressesFunc; savePanelAddress(newName.trim(), newAddress.trim()); setNewName(""); setNewAddress(""); toast.success("添加成功"); }; // 设置当前面板地址 const setCurrentPanel = async (name: string) => { (window as any).setPanelAddresses = setPanelAddressesFunc; setCurrentPanelAddress(name); reinitializeBaseURL(); }; // 删除面板地址 const handleDeletePanelAddress = async (name: string) => { (window as any).setPanelAddresses = setPanelAddressesFunc; deletePanelAddress(name); reinitializeBaseURL(); toast.success("删除成功"); }; // 页面加载时获取数据 useEffect(() => { loadPanelAddresses(); }, []); const handleUpdateChannelChange = (channel: UpdateReleaseChannel) => { setUpdateChannel(channel); setUpdateReleaseChannel(channel); toast.success( `更新通道已切换为${channel === "stable" ? "稳定版" : "开发版"}`, ); }; return (
{/* 顶部导航 */}

面板设置

{/* 内容区域 */}

更新设置

版本提示会根据该通道检查最新版本。

{/* 添加新地址 */}

添加新面板地址

setNewName(e.target.value)} /> setNewAddress(e.target.value)} />
{/* 地址列表 */}

已保存的面板地址

{panelAddresses.length === 0 ? (

暂无保存的面板地址

) : (
{panelAddresses.map((panel, index) => (
{panel.name} {panel.inx && ( 当前 )}

{panel.address}

{!panel.inx && ( )}
))}
)}
); };