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 (
>
}
>
);
}
function BrowserVersionEditForm({ editing, onChange, onSave, busy }) {
const pathInvalid =
editing.browser_path !== "" && !pathPattern.test(editing.browser_path);
return (
);
}
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) => (
),
},
]}
rows={versions}
rowKey={(version) => version.version}
minWidth="900px"
/>
{
setCreateOpen(false);
setCreateError(null);
}}
onSubmit={createBrowserVersion}
busy={busyAlias === "create"}
error={createError}
/>
{editing === null ? null : (
setEditing(null)}
title={`编辑 ${editing.version}`}
labelledBy="browser-version-edit-title"
footer={}
>
{editing.error ? (
{editing.error}
) : null}
setEditing({ ...next, error: editing.error })}
onSave={saveEdit}
busy={busyAlias === editing.version}
/>
)}
setDeleting(null)}
onConfirm={() => removeBrowserVersion(deleting)}
title="删除浏览器版本"
confirmLabel="确认删除"
busy={busyAlias === deleting?.version}
body={`删除浏览器版本 ${deleting?.version}?仍被环境引用时删除会被拒绝。`}
/>
);
}