import { useState } from "react"; import { useDataProvider, useList } from "@refinedev/core"; import { Alert, Button, ConfirmDialog, Field, Input, Modal, PageHeader, PageState, Switch, Table, } from "./lib/ui.jsx"; import { useTitle } from "./lib/hooks.js"; const versionPattern = /^\d[A-Za-z0-9._-]{0,63}$/; const pathPattern = /^\/[A-Za-z0-9._+~/-]{1,4095}$/; function BrowserVersionCreateModal({ open, onClose, onSubmit, busy, error }) { const [form, setForm] = useState({ version: "", browser_path: "", note: "" }); const update = (key, value) => setForm((current) => ({ ...current, [key]: value })); const valid = versionPattern.test(form.version) && pathPattern.test(form.browser_path); const versionInvalid = form.version !== "" && !versionPattern.test(form.version); const pathInvalid = form.browser_path !== "" && !pathPattern.test(form.browser_path); async function submit(event) { event.preventDefault(); if (!valid) return; const created = await onSubmit({ version: form.version, browser_path: form.browser_path, note: form.note, enabled: true, }); if (created) { setForm({ version: "", browser_path: "", note: "" }); onClose(); } } return ( } >
{error ? ( {error.message} ) : null}
update("version", event.target.value)} invalid={versionInvalid} /> update("browser_path", event.target.value)} placeholder="gateway 节点上的预安装浏览器绝对路径" invalid={pathInvalid} /> update("note", event.target.value)} />
); } function BrowserVersionEditForm({ editing, onChange, onSave, busy }) { const pathInvalid = editing.browser_path !== "" && !pathPattern.test(editing.browser_path); return (
onChange({ ...editing, browser_path: event.target.value }) } /> onChange({ ...editing, note: event.target.value }) } />

启用(可用于创建与升级)

onChange({ ...editing, enabled: checked }) } />
); } export function BrowserVersionList() { const dataProvider = useDataProvider()("default"); const { result, query } = useList({ resource: "browser-versions" }); const error = query.error; const isPending = query.isPending; const versions = result.data ?? []; const [createOpen, setCreateOpen] = useState(false); const [createError, setCreateError] = useState(null); const [editing, setEditing] = useState(null); const [busyAlias, setBusyAlias] = useState(""); const [notice, setNotice] = useState(null); const [deleting, setDeleting] = useState(null); useTitle("CreatorHub · 浏览器版本"); async function createBrowserVersion(data) { setBusyAlias("create"); setCreateError(null); try { await dataProvider.create({ resource: "browser-versions", variables: data, }); await query.refetch(); return true; } catch (reason) { setCreateError(reason); return false; } finally { setBusyAlias(""); } } async function toggleBrowserVersion(version) { setBusyAlias(version.version); setNotice(null); try { await dataProvider.update({ resource: "browser-versions", id: version.version, variables: { browser_path: version.browser_path, note: version.note, enabled: !version.enabled, }, }); await query.refetch(); } catch (reason) { setNotice({ variant: "destructive", text: reason.message }); } finally { setBusyAlias(""); } } async function removeBrowserVersion(version) { setBusyAlias(version.version); setNotice(null); try { await dataProvider.deleteOne({ resource: "browser-versions", id: version.version, }); await query.refetch(); setDeleting(null); } catch (reason) { setNotice({ variant: "destructive", text: reason.message }); } finally { setBusyAlias(""); } } async function saveEdit() { if (!pathPattern.test(editing.browser_path)) { setEditing({ ...editing, error: "浏览器路径格式不正确" }); return; } setBusyAlias(editing.version); setNotice(null); try { await dataProvider.update({ resource: "browser-versions", id: editing.version, variables: { browser_path: editing.browser_path, note: editing.note, enabled: editing.enabled, }, }); setEditing(null); await query.refetch(); } catch (reason) { setEditing({ ...editing, error: reason.message }); } finally { setBusyAlias(""); } } const message = notice?.text || (error ? null : notice?.message) || (notice ? notice.message : null); return (
{message ? ( {message} ) : null} ( {version.version} ), }, { header: "浏览器路径", width: "38%", render: (version) => ( {version.browser_path} ), }, { header: "备注", width: "20%", render: (version) => ( {version.note || "—"} ), }, { header: "启用", width: "8%", render: (version) => ( toggleBrowserVersion(version)} /> ), }, { header: "操作", width: "12%", align: "right", render: (version) => (