import { client } from "./client.mjs"; import { html, create, styled } from "./misc.mjs"; /** * 管理 speaker * * 1. 显示 speaker 列表 * 2. 创建 speaker * 3. 可以删除修改 speaker */ const useStore = create((set, get) => ({ /** * @type {{ name: string, params: string }[]} */ speakers: [], setSpeakers: (speakers) => set({ speakers }), formData: { seed: 42, name: "", }, setFormData: (data) => set({ formData: data }), })); window.addEventListener("load", async () => { const speakers = await client.listSpeakers(); useStore.get().setSpeakers(speakers.data); }); const SpeakerFactory = () => { // 调用接口创建 speaker // 创建speaker需要设定seed和name const { setSpeakers, formData, setFormData } = useStore(); return html`
`; }; const SpeakerList = () => { // 显示 speaker 列表 // 只是可以列出来,没有其他操作 const { speakers } = useStore(); // 以table return html`
Speakers ${speakers.map( (speaker) => html` ` )}
id name
${speaker.id} ${speaker.name}
`; }; const SpeakerPageContainer = styled.div` display: flex; flex-direction: row; textarea { width: 100%; height: 10rem; margin-bottom: 1rem; min-height: 10rem; resize: vertical; } button { padding: 0.5rem 1rem; background-color: #007bff; color: white; border: none; cursor: pointer; } button:hover { background-color: #0056b3; } button:disabled { background-color: #6c757d; cursor: not-allowed; } fieldset { margin-top: 1rem; padding: 1rem; border: 1px solid #333; } legend { font-weight: bold; } label { display: block; margin-bottom: 0.5rem; } select, input[type="range"], input[type="number"] { width: 100%; margin-top: 0.25rem; } input[type="range"] { width: calc(100% - 2rem); } input[type="number"] { width: calc(100% - 2rem); padding: 0.5rem; } input[type="text"] { width: 100%; padding: 0.5rem; } audio { margin-top: 1rem; } textarea, input, select { background-color: #333; color: white; border: 1px solid #333; border-radius: 0.25rem; padding: 0.5rem; } table { width: 100%; border-collapse: collapse; } th, td { padding: 0.5rem; border: 1px solid #333; } th { background-color: #333; color: white; } th:nth-child(2), td:nth-child(2) { width: 60%; } .speaker-factory { flex: 1; } .spekaer-list { width: 256px; } `; export const SpeakerPage = () => { return html` <${SpeakerPageContainer}> <${SpeakerList} /> <${SpeakerFactory} /> `; };