sa2kit 1.6.72 → 1.6.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/festivalCard/index.js +39 -16
- package/dist/festivalCard/index.js.map +1 -1
- package/dist/festivalCard/index.mjs +39 -16
- package/dist/festivalCard/index.mjs.map +1 -1
- package/dist/festivalCard/routes/index.d.mts +12 -15
- package/dist/festivalCard/routes/index.d.ts +12 -15
- package/dist/festivalCard/routes/index.js +10 -3
- package/dist/festivalCard/routes/index.js.map +1 -1
- package/dist/festivalCard/routes/index.mjs +10 -3
- package/dist/festivalCard/routes/index.mjs.map +1 -1
- package/dist/festivalCard/web/index.js +39 -16
- package/dist/festivalCard/web/index.js.map +1 -1
- package/dist/festivalCard/web/index.mjs +39 -16
- package/dist/festivalCard/web/index.mjs.map +1 -1
- package/dist/index.js +39 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +39 -16
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -509,25 +509,42 @@ var FestivalCardConfigPage = ({
|
|
|
509
509
|
return normalizeFestivalCardConfig(payload);
|
|
510
510
|
};
|
|
511
511
|
const reloadList = React3.useCallback(async () => {
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
512
|
+
try {
|
|
513
|
+
const response = await fetch(apiBase, { cache: "no-store" });
|
|
514
|
+
if (!response.ok) throw new Error(`\u52A0\u8F7D\u5361\u7247\u5217\u8868\u5931\u8D25: ${response.status}`);
|
|
515
|
+
const data = await response.json();
|
|
516
|
+
setList(parseListResponse2(data));
|
|
517
|
+
} catch (error) {
|
|
518
|
+
window.alert(error.message || "\u52A0\u8F7D\u5361\u7247\u5217\u8868\u5931\u8D25");
|
|
519
|
+
}
|
|
515
520
|
}, [apiBase]);
|
|
516
521
|
React3.useEffect(() => {
|
|
517
522
|
void reloadList();
|
|
518
523
|
}, [reloadList]);
|
|
519
524
|
const fetchConfig = async () => {
|
|
520
525
|
const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, { cache: "no-store" });
|
|
526
|
+
if (!response.ok) {
|
|
527
|
+
const message = `\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25: ${response.status}`;
|
|
528
|
+
window.alert(message);
|
|
529
|
+
throw new Error(message);
|
|
530
|
+
}
|
|
521
531
|
const data = await response.json();
|
|
522
532
|
return parseConfigResponse2(data);
|
|
523
533
|
};
|
|
524
534
|
const saveConfig = async (config) => {
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
535
|
+
try {
|
|
536
|
+
const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, {
|
|
537
|
+
method: "PUT",
|
|
538
|
+
headers: { "Content-Type": "application/json" },
|
|
539
|
+
body: JSON.stringify({ config })
|
|
540
|
+
});
|
|
541
|
+
if (!response.ok) throw new Error(`\u4FDD\u5B58\u5931\u8D25: ${response.status}`);
|
|
542
|
+
await reloadList();
|
|
543
|
+
window.alert("\u4FDD\u5B58\u6210\u529F");
|
|
544
|
+
} catch (error) {
|
|
545
|
+
window.alert(error.message || "\u4FDD\u5B58\u5931\u8D25");
|
|
546
|
+
throw error;
|
|
547
|
+
}
|
|
531
548
|
};
|
|
532
549
|
const createNew = async () => {
|
|
533
550
|
const name = window.prompt("\u8BF7\u8F93\u5165\u65B0\u5361\u7247\u540D\u79F0");
|
|
@@ -537,13 +554,19 @@ var FestivalCardConfigPage = ({
|
|
|
537
554
|
id,
|
|
538
555
|
name
|
|
539
556
|
});
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
557
|
+
try {
|
|
558
|
+
const response = await fetch(`${apiBase}/${encodeURIComponent(id)}`, {
|
|
559
|
+
method: "PUT",
|
|
560
|
+
headers: { "Content-Type": "application/json" },
|
|
561
|
+
body: JSON.stringify({ config })
|
|
562
|
+
});
|
|
563
|
+
if (!response.ok) throw new Error(`\u521B\u5EFA\u5931\u8D25: ${response.status}`);
|
|
564
|
+
setSelectedId(id);
|
|
565
|
+
await reloadList();
|
|
566
|
+
window.alert("\u65B0\u5361\u7247\u521B\u5EFA\u6210\u529F");
|
|
567
|
+
} catch (error) {
|
|
568
|
+
window.alert(error.message || "\u521B\u5EFA\u5931\u8D25");
|
|
569
|
+
}
|
|
547
570
|
};
|
|
548
571
|
const mainLink = React3.useMemo(() => `${mainPagePath}?cardId=${encodeURIComponent(selectedId)}`, [mainPagePath, selectedId]);
|
|
549
572
|
return /* @__PURE__ */ React3__default.default.createElement("div", { className: "grid gap-3" }, /* @__PURE__ */ React3__default.default.createElement("div", { className: "flex flex-wrap items-center gap-2" }, /* @__PURE__ */ React3__default.default.createElement(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/festivalCard/core/defaults.ts","../../src/festivalCard/core/normalize.ts","../../src/festivalCard/hooks/useFestivalCardConfig.ts","../../src/festivalCard/components/FestivalCardPageRenderer.tsx","../../src/festivalCard/components/FestivalCardBook3D.tsx","../../src/festivalCard/components/FestivalCardConfigEditor.tsx","../../src/festivalCard/components/FestivalCardStudio.tsx","../../src/festivalCard/components/FestivalCardConfigPage.tsx","../../src/festivalCard/components/FestivalCardManagedPage.tsx","../../src/festivalCard/server/db.ts","../../src/festivalCard/services/festivalCardService.ts"],"names":["useState","useEffect","useCallback","useMemo","React","parseListResponse","parseConfigResponse"],"mappings":"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","file":"index.js","sourcesContent":["import type { FestivalCardConfig } from '../types';\n\nexport const DEFAULT_FESTIVAL_CARD_CONFIG: FestivalCardConfig = {\n id: 'default-festival-card',\n name: 'Holiday Card',\n theme: 'winter',\n coverTitle: 'Happy Holidays',\n coverSubtitle: 'Warm wishes for you',\n background: {\n colorA: '#0c1a34',\n colorB: '#1f4f8a',\n },\n backgroundMusic: {\n src: '',\n loop: true,\n autoPlay: false,\n volume: 0.5,\n },\n pages: [\n {\n id: 'page-1',\n title: '封面',\n background: { color: '#11284d' },\n elements: [\n {\n id: 'p1-text-1',\n type: 'text',\n x: 50,\n y: 20,\n content: '新年快乐',\n fontSize: 34,\n fontWeight: 700,\n align: 'center',\n color: '#f8fafc',\n },\n {\n id: 'p1-text-2',\n type: 'text',\n x: 50,\n y: 36,\n content: '愿这一年平安喜乐',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#dbeafe',\n },\n {\n id: 'p1-image-1',\n type: 'image',\n x: 50,\n y: 68,\n width: 72,\n height: 42,\n src: 'https://images.unsplash.com/photo-1512389142860-9c449e58a543?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 16,\n alt: 'holiday',\n isBackground: false,\n },\n ],\n },\n {\n id: 'page-2',\n title: '祝福',\n background: { color: '#1a3766' },\n elements: [\n {\n id: 'p2-text-1',\n type: 'text',\n x: 50,\n y: 28,\n content: '愿你新岁:',\n fontSize: 28,\n fontWeight: 700,\n align: 'center',\n color: '#fef3c7',\n },\n {\n id: 'p2-text-2',\n type: 'text',\n x: 50,\n y: 42,\n content: '所得皆所期,所失亦无碍',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#f8fafc',\n },\n {\n id: 'p2-text-3',\n type: 'text',\n x: 50,\n y: 55,\n content: '愿你的每一步都走向光亮',\n fontSize: 16,\n fontWeight: 400,\n align: 'center',\n color: '#dbeafe',\n },\n ],\n },\n {\n id: 'page-3',\n title: '落款',\n background: { color: '#11284d' },\n elements: [\n {\n id: 'p3-image-1',\n type: 'image',\n x: 50,\n y: 34,\n width: 60,\n height: 42,\n src: 'https://images.unsplash.com/photo-1456324504439-367cee3b3c32?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 14,\n alt: 'gift',\n isBackground: false,\n },\n {\n id: 'p3-text-1',\n type: 'text',\n x: 50,\n y: 72,\n content: 'Best wishes, from SA2Kit',\n fontSize: 18,\n fontWeight: 600,\n align: 'center',\n color: '#f8fafc',\n },\n ],\n },\n ],\n};\n","import { DEFAULT_FESTIVAL_CARD_CONFIG } from './defaults';\nimport type { FestivalCardConfig, FestivalCardPage } from '../types';\n\nconst ensurePage = (page: FestivalCardPage, index: number): FestivalCardPage => ({\n id: page.id || `page-${index + 1}`,\n title: page.title || `第 ${index + 1} 页`,\n elements: Array.isArray(page.elements) ? page.elements : [],\n background: page.background || {},\n});\n\nexport const normalizeFestivalCardConfig = (\n config?: Partial<FestivalCardConfig> | null\n): FestivalCardConfig => {\n const pages = config?.pages && config.pages.length > 0 ? config.pages : DEFAULT_FESTIVAL_CARD_CONFIG.pages;\n\n return {\n ...DEFAULT_FESTIVAL_CARD_CONFIG,\n ...config,\n background: {\n ...DEFAULT_FESTIVAL_CARD_CONFIG.background,\n ...(config?.background || {}),\n },\n backgroundMusic: {\n ...DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic,\n ...(config?.backgroundMusic || {}),\n src: config?.backgroundMusic?.src ?? DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic?.src ?? '',\n },\n pages: pages.map(ensurePage),\n };\n};\n\nexport const resizeFestivalCardPages = (config: FestivalCardConfig, pageCount: number): FestivalCardConfig => {\n const safeCount = Math.max(1, Math.min(12, Math.floor(pageCount || 1)));\n const nextPages = [...config.pages];\n\n while (nextPages.length < safeCount) {\n const idx = nextPages.length;\n nextPages.push({\n id: `page-${idx + 1}`,\n title: `第 ${idx + 1} 页`,\n elements: [],\n background: {},\n });\n }\n\n return {\n ...config,\n pages: nextPages.slice(0, safeCount),\n };\n};\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig } from '../types';\n\ninterface UseFestivalCardConfigOptions {\n initialConfig?: FestivalCardConfig;\n fetchConfig?: () => Promise<FestivalCardConfig>;\n onSave?: (config: FestivalCardConfig) => Promise<void> | void;\n}\n\nexport const useFestivalCardConfig = (options?: UseFestivalCardConfigOptions) => {\n const [config, setConfig] = useState<FestivalCardConfig>(() =>\n normalizeFestivalCardConfig(options?.initialConfig || DEFAULT_FESTIVAL_CARD_CONFIG)\n );\n const [loading, setLoading] = useState(Boolean(options?.fetchConfig));\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n const fetchConfig = options?.fetchConfig;\n if (!fetchConfig) return;\n\n let active = true;\n void fetchConfig()\n .then((value) => {\n if (!active) return;\n setConfig(normalizeFestivalCardConfig(value));\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [options?.fetchConfig]);\n\n const save = useCallback(async () => {\n const onSave = options?.onSave;\n if (!onSave) return;\n setSaving(true);\n try {\n await onSave(config);\n } finally {\n setSaving(false);\n }\n }, [config, options?.onSave]);\n\n return useMemo(\n () => ({\n config,\n setConfig,\n loading,\n saving,\n save,\n }),\n [config, loading, save, saving]\n );\n};\n","'use client';\n\nimport React from 'react';\nimport type { FestivalCardElement, FestivalCardPage } from '../types';\n\nconst elementStyle = (element: FestivalCardElement): React.CSSProperties => ({\n position: 'absolute',\n zIndex: 2,\n left: `${element.x}%`,\n top: `${element.y}%`,\n width: `${element.width ?? 70}%`,\n height: element.height ? `${element.height}%` : undefined,\n transform: 'translate(-50%, -50%)',\n});\n\nconst renderElement = (element: FestivalCardElement) => {\n if (element.type === 'text') {\n return (\n <div\n key={element.id}\n style={{\n ...elementStyle(element),\n color: element.color || '#f8fafc',\n fontSize: element.fontSize || 18,\n fontWeight: element.fontWeight || 500,\n textAlign: element.align || 'left',\n lineHeight: 1.45,\n whiteSpace: 'pre-wrap',\n }}\n >\n {element.content}\n </div>\n );\n }\n\n return (\n <img\n key={element.id}\n src={element.src}\n alt={element.alt || 'festival-card-image'}\n style={{\n ...elementStyle(element),\n objectFit: element.fit || 'cover',\n borderRadius: element.borderRadius || 0,\n overflow: 'hidden',\n boxShadow: '0 12px 30px rgba(2, 6, 23, 0.32)',\n }}\n />\n );\n};\n\ninterface FestivalCardPageRendererProps {\n page: FestivalCardPage;\n}\n\nexport const FestivalCardPageRenderer: React.FC<FestivalCardPageRendererProps> = ({ page }) => {\n const backgroundElement = page.elements.find(\n (element): element is Extract<FestivalCardElement, { type: 'image' }> => element.type === 'image' && Boolean(element.isBackground)\n );\n const foregroundElements = page.elements.filter((element) => !(element.type === 'image' && element.isBackground));\n\n return (\n <div\n className=\"relative h-full w-full overflow-hidden rounded-2xl\"\n style={{\n backgroundColor: page.background?.color || '#0f172a',\n backgroundImage: backgroundElement\n ? `url(${backgroundElement.src})`\n : page.background?.image\n ? `url(${page.background.image})`\n : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n >\n <div className=\"absolute inset-0 bg-slate-950/20\" />\n {foregroundElements.map(renderElement)}\n </div>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig } from '../types';\nimport { FestivalCardPageRenderer } from './FestivalCardPageRenderer';\n\nexport interface FestivalCardBook3DProps {\n config: FestivalCardConfig;\n className?: string;\n}\n\nexport const FestivalCardBook3D: React.FC<FestivalCardBook3DProps> = ({ config, className }) => {\n const [currentPage, setCurrentPage] = useState(0);\n const normalized = useMemo(() => normalizeFestivalCardConfig(config), [config]);\n const pages = normalized.pages;\n\n const canPrev = currentPage > 0;\n const canNext = currentPage < pages.length - 1;\n\n return (\n <div className={className}>\n <div\n className=\"w-full min-h-[560px] rounded-3xl p-6 shadow-2xl shadow-slate-900/50\"\n style={{\n background: `linear-gradient(145deg, ${normalized.background?.colorA || '#0c1a34'} 0%, ${normalized.background?.colorB || '#1f4f8a'} 100%)`,\n }}\n >\n <div className=\"mx-auto w-full max-w-5xl text-center text-slate-100\">\n <h3 className=\"mb-4 text-lg font-semibold\">{normalized.coverTitle || 'Festival Card'}</h3>\n </div>\n\n <div className=\"mx-auto w-full max-w-5xl\">\n <div className=\"relative h-[460px]\">\n {pages.map((page, index) => (\n <div\n key={page.id}\n className=\"absolute inset-0 transition-opacity duration-500 ease-out\"\n style={{\n opacity: index === currentPage ? 1 : 0,\n pointerEvents: index === currentPage ? 'auto' : 'none',\n }}\n >\n <FestivalCardPageRenderer page={page} />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"mt-5 flex justify-center gap-3\">\n <button\n type=\"button\"\n disabled={!canPrev}\n onClick={() => setCurrentPage((p) => Math.max(0, p - 1))}\n className=\"rounded-full bg-white px-5 py-2 text-sm font-medium text-slate-900 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n 上一页\n </button>\n <button\n type=\"button\"\n disabled={!canNext}\n onClick={() => setCurrentPage((p) => Math.min(pages.length - 1, p + 1))}\n className=\"rounded-full bg-sky-300 px-5 py-2 text-sm font-medium text-slate-900 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n 下一页\n </button>\n </div>\n </div>\n\n {normalized.backgroundMusic?.src ? (\n <audio\n src={normalized.backgroundMusic.src}\n autoPlay={normalized.backgroundMusic.autoPlay}\n loop={normalized.backgroundMusic.loop}\n controls\n className=\"mt-3 w-full\"\n />\n ) : null}\n </div>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { resizeFestivalCardPages } from '../core';\nimport type { FestivalCardConfig, FestivalCardElement } from '../types';\n\ninterface FestivalCardConfigEditorProps {\n value: FestivalCardConfig;\n onChange: (config: FestivalCardConfig) => void;\n}\n\nconst createTextElement = (pageIndex: number): FestivalCardElement => ({\n id: `text-${Date.now()}-${pageIndex}`,\n type: 'text',\n x: 50,\n y: 50,\n content: '请输入文字',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#ffffff',\n});\n\nconst createImageElement = (pageIndex: number): FestivalCardElement => ({\n id: `image-${Date.now()}-${pageIndex}`,\n type: 'image',\n x: 50,\n y: 50,\n width: 60,\n height: 40,\n src: 'https://images.unsplash.com/photo-1482517967863-00e15c9b44be?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 12,\n});\n\nexport const FestivalCardConfigEditor: React.FC<FestivalCardConfigEditorProps> = ({ value, onChange }) => {\n const [activePageIndex, setActivePageIndex] = useState(0);\n const page = value.pages[activePageIndex];\n const canEditPage = Boolean(page);\n const pageOptions = useMemo(() => value.pages.map((_, index) => index), [value.pages]);\n\n const updateElement = (elementId: string, patch: Partial<FestivalCardElement>) => {\n onChange({\n ...value,\n pages: value.pages.map((p, pIndex) =>\n pIndex === activePageIndex\n ? {\n ...p,\n elements: p.elements.map((el) => (el.id === elementId ? { ...el, ...patch } as FestivalCardElement : el)),\n }\n : p\n ),\n });\n };\n\n return (\n <div className=\"rounded-2xl border border-slate-200 bg-white p-4 text-slate-900 shadow-sm\">\n <div className=\"grid gap-3\">\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面数量</span>\n <input\n type=\"number\"\n min={1}\n max={12}\n value={value.pages.length}\n onChange={(event) => onChange(resizeFestivalCardPages(value, Number(event.target.value)))}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">背景音乐 URL</span>\n <input\n type=\"url\"\n value={value.backgroundMusic?.src || ''}\n onChange={(event) =>\n onChange({\n ...value,\n backgroundMusic: {\n ...value.backgroundMusic,\n src: event.target.value,\n },\n })\n }\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">编辑页面</span>\n <select\n value={activePageIndex}\n onChange={(event) => setActivePageIndex(Number(event.target.value))}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n >\n {pageOptions.map((index) => (\n <option key={index} value={index}>\n 第 {index + 1} 页\n </option>\n ))}\n </select>\n </label>\n </div>\n\n {canEditPage ? (\n <div className=\"mt-4\">\n <div className=\"mb-3 flex gap-2\">\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...value,\n pages: value.pages.map((p, index) =>\n index === activePageIndex ? { ...p, elements: [...p.elements, createTextElement(index)] } : p\n ),\n })\n }\n className=\"rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white\"\n >\n + 文字\n </button>\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...value,\n pages: value.pages.map((p, index) =>\n index === activePageIndex ? { ...p, elements: [...p.elements, createImageElement(index)] } : p\n ),\n })\n }\n className=\"rounded-lg bg-sky-600 px-3 py-2 text-sm font-medium text-white\"\n >\n + 图片\n </button>\n </div>\n\n <div className=\"grid max-h-[340px] gap-2.5 overflow-auto pr-1\">\n {(page?.elements ?? []).map((element) => (\n <div key={element.id} className=\"rounded-xl border border-slate-200 bg-slate-50 p-3\">\n <div className=\"mb-2 text-xs font-semibold tracking-wide text-slate-500\">{element.type.toUpperCase()}</div>\n {element.type === 'text' ? (\n <textarea\n value={element.content}\n onChange={(event) => updateElement(element.id, { content: event.target.value })}\n rows={3}\n className=\"w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n ) : (\n <div className=\"grid gap-2\">\n <input\n type=\"url\"\n value={element.src}\n onChange={(event) => updateElement(element.id, { src: event.target.value })}\n className=\"w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n <label className=\"inline-flex items-center gap-2 text-sm text-slate-700\">\n <input\n type=\"checkbox\"\n checked={Boolean(element.isBackground)}\n onChange={(event) => updateElement(element.id, { isBackground: event.target.checked })}\n className=\"h-4 w-4 rounded border-slate-300 text-sky-600\"\n />\n 作为本页背景图\n </label>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n ) : null}\n </div>\n );\n};\n","'use client';\n\nimport React from 'react';\nimport { normalizeFestivalCardConfig } from '../core';\nimport { useFestivalCardConfig } from '../hooks/useFestivalCardConfig';\nimport type { FestivalCardConfig } from '../types';\nimport { FestivalCardBook3D } from './FestivalCardBook3D';\nimport { FestivalCardConfigEditor } from './FestivalCardConfigEditor';\n\ninterface FestivalCardStudioProps {\n initialConfig?: FestivalCardConfig;\n fetchConfig?: () => Promise<FestivalCardConfig>;\n onSave?: (config: FestivalCardConfig) => Promise<void> | void;\n}\n\nexport const FestivalCardStudio: React.FC<FestivalCardStudioProps> = ({ initialConfig, fetchConfig, onSave }) => {\n const { config, setConfig, loading, save, saving } = useFestivalCardConfig({\n initialConfig: normalizeFestivalCardConfig(initialConfig),\n fetchConfig,\n onSave,\n });\n\n if (loading) return <div>加载中...</div>;\n\n return (\n <div className=\"grid gap-4 lg:grid-cols-[1.45fr_1fr]\">\n <FestivalCardBook3D config={config} className=\"h-full\" />\n <div>\n <FestivalCardConfigEditor value={config} onChange={setConfig} />\n {onSave ? (\n <button\n type=\"button\"\n onClick={() => void save()}\n disabled={saving}\n className=\"mt-3 w-full rounded-lg bg-slate-900 px-4 py-2.5 text-sm font-medium text-white disabled:opacity-60\"\n >\n {saving ? '保存中...' : '保存配置'}\n </button>\n ) : null}\n </div>\n </div>\n );\n};\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FestivalCardStudio } from './FestivalCardStudio';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig, FestivalCardConfigSummary } from '../types';\n\ninterface FestivalCardConfigPageProps {\n apiBase?: string;\n cardId?: string;\n mainPagePath?: string;\n}\n\nexport const FestivalCardConfigPage: React.FC<FestivalCardConfigPageProps> = ({\n apiBase = '/api/festivalCard',\n cardId,\n mainPagePath = '/festivalCard',\n}) => {\n const [list, setList] = useState<FestivalCardConfigSummary[]>([]);\n const [selectedId, setSelectedId] = useState(cardId || 'default-festival-card');\n\n const parseListResponse = (data: unknown): FestivalCardConfigSummary[] => {\n if (!data || typeof data !== 'object') return [];\n const payload = (data as { data?: unknown }).data;\n if (!Array.isArray(payload)) return [];\n return payload\n .filter((item): item is FestivalCardConfigSummary => Boolean(item && typeof item === 'object' && typeof (item as { id?: unknown }).id === 'string'))\n .map((item) => ({ id: item.id, name: item.name }));\n };\n\n const parseConfigResponse = (data: unknown): FestivalCardConfig => {\n if (!data || typeof data !== 'object') return normalizeFestivalCardConfig();\n const payload = (data as { data?: unknown }).data;\n if (!payload || typeof payload !== 'object') return normalizeFestivalCardConfig();\n return normalizeFestivalCardConfig(payload as Partial<FestivalCardConfig>);\n };\n\n const reloadList = useCallback(async () => {\n const response = await fetch(apiBase, { cache: 'no-store' });\n const data: unknown = await response.json();\n setList(parseListResponse(data));\n }, [apiBase]);\n\n useEffect(() => {\n void reloadList();\n }, [reloadList]);\n\n const fetchConfig = async (): Promise<FestivalCardConfig> => {\n const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, { cache: 'no-store' });\n const data: unknown = await response.json();\n return parseConfigResponse(data);\n };\n\n const saveConfig = async (config: FestivalCardConfig) => {\n await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config }),\n });\n await reloadList();\n };\n\n const createNew = async () => {\n const name = window.prompt('请输入新卡片名称');\n if (!name) return;\n const id = `festival-${Date.now()}`;\n const config = normalizeFestivalCardConfig({\n id,\n name,\n });\n await fetch(`${apiBase}/${encodeURIComponent(id)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config }),\n });\n setSelectedId(id);\n await reloadList();\n };\n\n const mainLink = useMemo(() => `${mainPagePath}?cardId=${encodeURIComponent(selectedId)}`, [mainPagePath, selectedId]);\n\n return (\n <div className=\"grid gap-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <select\n value={selectedId}\n onChange={(event) => setSelectedId(event.target.value)}\n className=\"min-w-[200px] rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n >\n {list.map((item) => (\n <option key={item.id} value={item.id}>\n {item.name || item.id}\n </option>\n ))}\n </select>\n <button type=\"button\" onClick={() => void createNew()} className=\"rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white\">\n 新建卡片\n </button>\n <a href={mainLink} className=\"rounded-lg border border-sky-200 bg-sky-50 px-3 py-2 text-sm text-sky-700\">\n 打开主页面\n </a>\n </div>\n\n <FestivalCardStudio fetchConfig={fetchConfig} onSave={saveConfig} />\n </div>\n );\n};\n","'use client';\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { FestivalCardBook3D } from './FestivalCardBook3D';\nimport type { FestivalCardConfig, FestivalCardConfigSummary } from '../types';\n\ninterface FestivalCardManagedPageProps {\n apiBase?: string;\n cardId?: string;\n configPagePath?: string;\n}\n\nconst isSummary = (value: unknown): value is FestivalCardConfigSummary => {\n if (!value || typeof value !== 'object') return false;\n return typeof (value as { id?: unknown }).id === 'string';\n};\n\nconst parseListResponse = (data: unknown): FestivalCardConfigSummary[] => {\n if (!data || typeof data !== 'object') return [];\n const payload = (data as { data?: unknown }).data;\n if (!Array.isArray(payload)) return [];\n return payload.filter(isSummary).map((item) => ({ id: item.id, name: item.name }));\n};\n\nconst parseConfigResponse = (data: unknown): FestivalCardConfig | null => {\n if (!data || typeof data !== 'object') return null;\n const payload = (data as { data?: unknown }).data;\n if (!payload || typeof payload !== 'object') return null;\n if (!Array.isArray((payload as FestivalCardConfig).pages)) return null;\n return payload as FestivalCardConfig;\n};\n\nexport const FestivalCardManagedPage: React.FC<FestivalCardManagedPageProps> = ({\n apiBase = '/api/festivalCard',\n cardId,\n configPagePath = '/festivalCard/config',\n}) => {\n const [currentCardId, setCurrentCardId] = useState<string>(cardId || '');\n const [config, setConfig] = useState<FestivalCardConfig | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const fetchList = async () => {\n const response = await fetch(apiBase, { cache: 'no-store' });\n const data: unknown = await response.json();\n const items = parseListResponse(data);\n const first = items[0];\n if (!currentCardId && first) {\n setCurrentCardId(first.id);\n }\n };\n\n void fetchList();\n }, [apiBase, currentCardId]);\n\n useEffect(() => {\n if (!currentCardId) return;\n setLoading(true);\n void fetch(`${apiBase}/${encodeURIComponent(currentCardId)}`, { cache: 'no-store' })\n .then((res) => res.json() as Promise<unknown>)\n .then((data) => setConfig(parseConfigResponse(data)))\n .finally(() => setLoading(false));\n }, [apiBase, currentCardId]);\n\n const configLink = useMemo(() => {\n if (!currentCardId) return configPagePath;\n return `${configPagePath}?cardId=${encodeURIComponent(currentCardId)}`;\n }, [configPagePath, currentCardId]);\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex justify-end\">\n <a href={configLink} className=\"rounded-lg border border-slate-700 bg-slate-900 px-3 py-1.5 text-sm text-sky-300\">\n 进入配置页\n </a>\n </div>\n\n <div>{loading || !config ? <div className=\"py-12 text-center text-slate-400\">加载中...</div> : <FestivalCardBook3D config={config} />}</div>\n </div>\n );\n};\n","import type { FestivalCardDbAdapter } from '../types';\n\nlet dbAdapter: FestivalCardDbAdapter | null = null;\n\nexport const initializeFestivalCardDb = (adapter: FestivalCardDbAdapter): void => {\n dbAdapter = adapter;\n};\n\nexport const getFestivalCardDb = (): FestivalCardDbAdapter | null => dbAdapter;\n","import { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig } from '../core';\nimport { getFestivalCardDb } from '../server/db';\nimport type {\n FestivalCardConfig,\n FestivalCardConfigSummary,\n FestivalCardDbAdapter,\n FestivalCardServiceOptions,\n} from '../types';\n\nexport class FestivalCardService {\n private db: FestivalCardDbAdapter | null;\n\n constructor(options?: FestivalCardServiceOptions) {\n this.db = options?.db || getFestivalCardDb();\n }\n\n async listConfigs(): Promise<FestivalCardConfigSummary[]> {\n if (!this.db) {\n return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n if (this.db.listConfigs) {\n const list = await this.db.listConfigs();\n return list.length > 0\n ? list\n : [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n async getConfig(cardId = 'default-festival-card'): Promise<FestivalCardConfig> {\n if (!this.db) return DEFAULT_FESTIVAL_CARD_CONFIG;\n const config = await this.db.getConfig(cardId);\n return normalizeFestivalCardConfig(config);\n }\n\n async saveConfig(cardId: string, config: FestivalCardConfig): Promise<FestivalCardConfig> {\n const normalized = normalizeFestivalCardConfig(config);\n if (!this.db) return normalized;\n await this.db.saveConfig(cardId, normalized);\n return normalized;\n }\n\n async deleteConfig(cardId: string): Promise<void> {\n if (!this.db?.deleteConfig) return;\n await this.db.deleteConfig(cardId);\n }\n}\n\nconst memoryStore = new Map<string, FestivalCardConfig>();\nconst defaultId = DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card';\nif (!memoryStore.has(defaultId)) {\n memoryStore.set(defaultId, DEFAULT_FESTIVAL_CARD_CONFIG);\n}\n\nexport const createInMemoryFestivalCardDb = (): FestivalCardDbAdapter => ({\n listConfigs() {\n return Promise.resolve(\n Array.from(memoryStore.entries()).map(([id, config]) => ({\n id,\n name: config.name || id,\n }))\n );\n },\n getConfig(id: string) {\n return Promise.resolve(memoryStore.get(id) || null);\n },\n saveConfig(id: string, config: FestivalCardConfig) {\n memoryStore.set(id, config);\n return Promise.resolve();\n },\n deleteConfig(id: string) {\n memoryStore.delete(id);\n return Promise.resolve();\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/festivalCard/core/defaults.ts","../../src/festivalCard/core/normalize.ts","../../src/festivalCard/hooks/useFestivalCardConfig.ts","../../src/festivalCard/components/FestivalCardPageRenderer.tsx","../../src/festivalCard/components/FestivalCardBook3D.tsx","../../src/festivalCard/components/FestivalCardConfigEditor.tsx","../../src/festivalCard/components/FestivalCardStudio.tsx","../../src/festivalCard/components/FestivalCardConfigPage.tsx","../../src/festivalCard/components/FestivalCardManagedPage.tsx","../../src/festivalCard/server/db.ts","../../src/festivalCard/services/festivalCardService.ts"],"names":["useState","useEffect","useCallback","useMemo","React","parseListResponse","parseConfigResponse"],"mappings":"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","file":"index.js","sourcesContent":["import type { FestivalCardConfig } from '../types';\n\nexport const DEFAULT_FESTIVAL_CARD_CONFIG: FestivalCardConfig = {\n id: 'default-festival-card',\n name: 'Holiday Card',\n theme: 'winter',\n coverTitle: 'Happy Holidays',\n coverSubtitle: 'Warm wishes for you',\n background: {\n colorA: '#0c1a34',\n colorB: '#1f4f8a',\n },\n backgroundMusic: {\n src: '',\n loop: true,\n autoPlay: false,\n volume: 0.5,\n },\n pages: [\n {\n id: 'page-1',\n title: '封面',\n background: { color: '#11284d' },\n elements: [\n {\n id: 'p1-text-1',\n type: 'text',\n x: 50,\n y: 20,\n content: '新年快乐',\n fontSize: 34,\n fontWeight: 700,\n align: 'center',\n color: '#f8fafc',\n },\n {\n id: 'p1-text-2',\n type: 'text',\n x: 50,\n y: 36,\n content: '愿这一年平安喜乐',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#dbeafe',\n },\n {\n id: 'p1-image-1',\n type: 'image',\n x: 50,\n y: 68,\n width: 72,\n height: 42,\n src: 'https://images.unsplash.com/photo-1512389142860-9c449e58a543?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 16,\n alt: 'holiday',\n isBackground: false,\n },\n ],\n },\n {\n id: 'page-2',\n title: '祝福',\n background: { color: '#1a3766' },\n elements: [\n {\n id: 'p2-text-1',\n type: 'text',\n x: 50,\n y: 28,\n content: '愿你新岁:',\n fontSize: 28,\n fontWeight: 700,\n align: 'center',\n color: '#fef3c7',\n },\n {\n id: 'p2-text-2',\n type: 'text',\n x: 50,\n y: 42,\n content: '所得皆所期,所失亦无碍',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#f8fafc',\n },\n {\n id: 'p2-text-3',\n type: 'text',\n x: 50,\n y: 55,\n content: '愿你的每一步都走向光亮',\n fontSize: 16,\n fontWeight: 400,\n align: 'center',\n color: '#dbeafe',\n },\n ],\n },\n {\n id: 'page-3',\n title: '落款',\n background: { color: '#11284d' },\n elements: [\n {\n id: 'p3-image-1',\n type: 'image',\n x: 50,\n y: 34,\n width: 60,\n height: 42,\n src: 'https://images.unsplash.com/photo-1456324504439-367cee3b3c32?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 14,\n alt: 'gift',\n isBackground: false,\n },\n {\n id: 'p3-text-1',\n type: 'text',\n x: 50,\n y: 72,\n content: 'Best wishes, from SA2Kit',\n fontSize: 18,\n fontWeight: 600,\n align: 'center',\n color: '#f8fafc',\n },\n ],\n },\n ],\n};\n","import { DEFAULT_FESTIVAL_CARD_CONFIG } from './defaults';\nimport type { FestivalCardConfig, FestivalCardPage } from '../types';\n\nconst ensurePage = (page: FestivalCardPage, index: number): FestivalCardPage => ({\n id: page.id || `page-${index + 1}`,\n title: page.title || `第 ${index + 1} 页`,\n elements: Array.isArray(page.elements) ? page.elements : [],\n background: page.background || {},\n});\n\nexport const normalizeFestivalCardConfig = (\n config?: Partial<FestivalCardConfig> | null\n): FestivalCardConfig => {\n const pages = config?.pages && config.pages.length > 0 ? config.pages : DEFAULT_FESTIVAL_CARD_CONFIG.pages;\n\n return {\n ...DEFAULT_FESTIVAL_CARD_CONFIG,\n ...config,\n background: {\n ...DEFAULT_FESTIVAL_CARD_CONFIG.background,\n ...(config?.background || {}),\n },\n backgroundMusic: {\n ...DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic,\n ...(config?.backgroundMusic || {}),\n src: config?.backgroundMusic?.src ?? DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic?.src ?? '',\n },\n pages: pages.map(ensurePage),\n };\n};\n\nexport const resizeFestivalCardPages = (config: FestivalCardConfig, pageCount: number): FestivalCardConfig => {\n const safeCount = Math.max(1, Math.min(12, Math.floor(pageCount || 1)));\n const nextPages = [...config.pages];\n\n while (nextPages.length < safeCount) {\n const idx = nextPages.length;\n nextPages.push({\n id: `page-${idx + 1}`,\n title: `第 ${idx + 1} 页`,\n elements: [],\n background: {},\n });\n }\n\n return {\n ...config,\n pages: nextPages.slice(0, safeCount),\n };\n};\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig } from '../types';\n\ninterface UseFestivalCardConfigOptions {\n initialConfig?: FestivalCardConfig;\n fetchConfig?: () => Promise<FestivalCardConfig>;\n onSave?: (config: FestivalCardConfig) => Promise<void> | void;\n}\n\nexport const useFestivalCardConfig = (options?: UseFestivalCardConfigOptions) => {\n const [config, setConfig] = useState<FestivalCardConfig>(() =>\n normalizeFestivalCardConfig(options?.initialConfig || DEFAULT_FESTIVAL_CARD_CONFIG)\n );\n const [loading, setLoading] = useState(Boolean(options?.fetchConfig));\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n const fetchConfig = options?.fetchConfig;\n if (!fetchConfig) return;\n\n let active = true;\n void fetchConfig()\n .then((value) => {\n if (!active) return;\n setConfig(normalizeFestivalCardConfig(value));\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [options?.fetchConfig]);\n\n const save = useCallback(async () => {\n const onSave = options?.onSave;\n if (!onSave) return;\n setSaving(true);\n try {\n await onSave(config);\n } finally {\n setSaving(false);\n }\n }, [config, options?.onSave]);\n\n return useMemo(\n () => ({\n config,\n setConfig,\n loading,\n saving,\n save,\n }),\n [config, loading, save, saving]\n );\n};\n","'use client';\n\nimport React from 'react';\nimport type { FestivalCardElement, FestivalCardPage } from '../types';\n\nconst elementStyle = (element: FestivalCardElement): React.CSSProperties => ({\n position: 'absolute',\n zIndex: 2,\n left: `${element.x}%`,\n top: `${element.y}%`,\n width: `${element.width ?? 70}%`,\n height: element.height ? `${element.height}%` : undefined,\n transform: 'translate(-50%, -50%)',\n});\n\nconst renderElement = (element: FestivalCardElement) => {\n if (element.type === 'text') {\n return (\n <div\n key={element.id}\n style={{\n ...elementStyle(element),\n color: element.color || '#f8fafc',\n fontSize: element.fontSize || 18,\n fontWeight: element.fontWeight || 500,\n textAlign: element.align || 'left',\n lineHeight: 1.45,\n whiteSpace: 'pre-wrap',\n }}\n >\n {element.content}\n </div>\n );\n }\n\n return (\n <img\n key={element.id}\n src={element.src}\n alt={element.alt || 'festival-card-image'}\n style={{\n ...elementStyle(element),\n objectFit: element.fit || 'cover',\n borderRadius: element.borderRadius || 0,\n overflow: 'hidden',\n boxShadow: '0 12px 30px rgba(2, 6, 23, 0.32)',\n }}\n />\n );\n};\n\ninterface FestivalCardPageRendererProps {\n page: FestivalCardPage;\n}\n\nexport const FestivalCardPageRenderer: React.FC<FestivalCardPageRendererProps> = ({ page }) => {\n const backgroundElement = page.elements.find(\n (element): element is Extract<FestivalCardElement, { type: 'image' }> => element.type === 'image' && Boolean(element.isBackground)\n );\n const foregroundElements = page.elements.filter((element) => !(element.type === 'image' && element.isBackground));\n\n return (\n <div\n className=\"relative h-full w-full overflow-hidden rounded-2xl\"\n style={{\n backgroundColor: page.background?.color || '#0f172a',\n backgroundImage: backgroundElement\n ? `url(${backgroundElement.src})`\n : page.background?.image\n ? `url(${page.background.image})`\n : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n >\n <div className=\"absolute inset-0 bg-slate-950/20\" />\n {foregroundElements.map(renderElement)}\n </div>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig } from '../types';\nimport { FestivalCardPageRenderer } from './FestivalCardPageRenderer';\n\nexport interface FestivalCardBook3DProps {\n config: FestivalCardConfig;\n className?: string;\n}\n\nexport const FestivalCardBook3D: React.FC<FestivalCardBook3DProps> = ({ config, className }) => {\n const [currentPage, setCurrentPage] = useState(0);\n const normalized = useMemo(() => normalizeFestivalCardConfig(config), [config]);\n const pages = normalized.pages;\n\n const canPrev = currentPage > 0;\n const canNext = currentPage < pages.length - 1;\n\n return (\n <div className={className}>\n <div\n className=\"w-full min-h-[560px] rounded-3xl p-6 shadow-2xl shadow-slate-900/50\"\n style={{\n background: `linear-gradient(145deg, ${normalized.background?.colorA || '#0c1a34'} 0%, ${normalized.background?.colorB || '#1f4f8a'} 100%)`,\n }}\n >\n <div className=\"mx-auto w-full max-w-5xl text-center text-slate-100\">\n <h3 className=\"mb-4 text-lg font-semibold\">{normalized.coverTitle || 'Festival Card'}</h3>\n </div>\n\n <div className=\"mx-auto w-full max-w-5xl\">\n <div className=\"relative h-[460px]\">\n {pages.map((page, index) => (\n <div\n key={page.id}\n className=\"absolute inset-0 transition-opacity duration-500 ease-out\"\n style={{\n opacity: index === currentPage ? 1 : 0,\n pointerEvents: index === currentPage ? 'auto' : 'none',\n }}\n >\n <FestivalCardPageRenderer page={page} />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"mt-5 flex justify-center gap-3\">\n <button\n type=\"button\"\n disabled={!canPrev}\n onClick={() => setCurrentPage((p) => Math.max(0, p - 1))}\n className=\"rounded-full bg-white px-5 py-2 text-sm font-medium text-slate-900 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n 上一页\n </button>\n <button\n type=\"button\"\n disabled={!canNext}\n onClick={() => setCurrentPage((p) => Math.min(pages.length - 1, p + 1))}\n className=\"rounded-full bg-sky-300 px-5 py-2 text-sm font-medium text-slate-900 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n 下一页\n </button>\n </div>\n </div>\n\n {normalized.backgroundMusic?.src ? (\n <audio\n src={normalized.backgroundMusic.src}\n autoPlay={normalized.backgroundMusic.autoPlay}\n loop={normalized.backgroundMusic.loop}\n controls\n className=\"mt-3 w-full\"\n />\n ) : null}\n </div>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { resizeFestivalCardPages } from '../core';\nimport type { FestivalCardConfig, FestivalCardElement } from '../types';\n\ninterface FestivalCardConfigEditorProps {\n value: FestivalCardConfig;\n onChange: (config: FestivalCardConfig) => void;\n}\n\nconst createTextElement = (pageIndex: number): FestivalCardElement => ({\n id: `text-${Date.now()}-${pageIndex}`,\n type: 'text',\n x: 50,\n y: 50,\n content: '请输入文字',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#ffffff',\n});\n\nconst createImageElement = (pageIndex: number): FestivalCardElement => ({\n id: `image-${Date.now()}-${pageIndex}`,\n type: 'image',\n x: 50,\n y: 50,\n width: 60,\n height: 40,\n src: 'https://images.unsplash.com/photo-1482517967863-00e15c9b44be?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 12,\n});\n\nexport const FestivalCardConfigEditor: React.FC<FestivalCardConfigEditorProps> = ({ value, onChange }) => {\n const [activePageIndex, setActivePageIndex] = useState(0);\n const page = value.pages[activePageIndex];\n const canEditPage = Boolean(page);\n const pageOptions = useMemo(() => value.pages.map((_, index) => index), [value.pages]);\n\n const updateElement = (elementId: string, patch: Partial<FestivalCardElement>) => {\n onChange({\n ...value,\n pages: value.pages.map((p, pIndex) =>\n pIndex === activePageIndex\n ? {\n ...p,\n elements: p.elements.map((el) => (el.id === elementId ? { ...el, ...patch } as FestivalCardElement : el)),\n }\n : p\n ),\n });\n };\n\n return (\n <div className=\"rounded-2xl border border-slate-200 bg-white p-4 text-slate-900 shadow-sm\">\n <div className=\"grid gap-3\">\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面数量</span>\n <input\n type=\"number\"\n min={1}\n max={12}\n value={value.pages.length}\n onChange={(event) => onChange(resizeFestivalCardPages(value, Number(event.target.value)))}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">背景音乐 URL</span>\n <input\n type=\"url\"\n value={value.backgroundMusic?.src || ''}\n onChange={(event) =>\n onChange({\n ...value,\n backgroundMusic: {\n ...value.backgroundMusic,\n src: event.target.value,\n },\n })\n }\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">编辑页面</span>\n <select\n value={activePageIndex}\n onChange={(event) => setActivePageIndex(Number(event.target.value))}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n >\n {pageOptions.map((index) => (\n <option key={index} value={index}>\n 第 {index + 1} 页\n </option>\n ))}\n </select>\n </label>\n </div>\n\n {canEditPage ? (\n <div className=\"mt-4\">\n <div className=\"mb-3 flex gap-2\">\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...value,\n pages: value.pages.map((p, index) =>\n index === activePageIndex ? { ...p, elements: [...p.elements, createTextElement(index)] } : p\n ),\n })\n }\n className=\"rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white\"\n >\n + 文字\n </button>\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...value,\n pages: value.pages.map((p, index) =>\n index === activePageIndex ? { ...p, elements: [...p.elements, createImageElement(index)] } : p\n ),\n })\n }\n className=\"rounded-lg bg-sky-600 px-3 py-2 text-sm font-medium text-white\"\n >\n + 图片\n </button>\n </div>\n\n <div className=\"grid max-h-[340px] gap-2.5 overflow-auto pr-1\">\n {(page?.elements ?? []).map((element) => (\n <div key={element.id} className=\"rounded-xl border border-slate-200 bg-slate-50 p-3\">\n <div className=\"mb-2 text-xs font-semibold tracking-wide text-slate-500\">{element.type.toUpperCase()}</div>\n {element.type === 'text' ? (\n <textarea\n value={element.content}\n onChange={(event) => updateElement(element.id, { content: event.target.value })}\n rows={3}\n className=\"w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n ) : (\n <div className=\"grid gap-2\">\n <input\n type=\"url\"\n value={element.src}\n onChange={(event) => updateElement(element.id, { src: event.target.value })}\n className=\"w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n <label className=\"inline-flex items-center gap-2 text-sm text-slate-700\">\n <input\n type=\"checkbox\"\n checked={Boolean(element.isBackground)}\n onChange={(event) => updateElement(element.id, { isBackground: event.target.checked })}\n className=\"h-4 w-4 rounded border-slate-300 text-sky-600\"\n />\n 作为本页背景图\n </label>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n ) : null}\n </div>\n );\n};\n","'use client';\n\nimport React from 'react';\nimport { normalizeFestivalCardConfig } from '../core';\nimport { useFestivalCardConfig } from '../hooks/useFestivalCardConfig';\nimport type { FestivalCardConfig } from '../types';\nimport { FestivalCardBook3D } from './FestivalCardBook3D';\nimport { FestivalCardConfigEditor } from './FestivalCardConfigEditor';\n\ninterface FestivalCardStudioProps {\n initialConfig?: FestivalCardConfig;\n fetchConfig?: () => Promise<FestivalCardConfig>;\n onSave?: (config: FestivalCardConfig) => Promise<void> | void;\n}\n\nexport const FestivalCardStudio: React.FC<FestivalCardStudioProps> = ({ initialConfig, fetchConfig, onSave }) => {\n const { config, setConfig, loading, save, saving } = useFestivalCardConfig({\n initialConfig: normalizeFestivalCardConfig(initialConfig),\n fetchConfig,\n onSave,\n });\n\n if (loading) return <div>加载中...</div>;\n\n return (\n <div className=\"grid gap-4 lg:grid-cols-[1.45fr_1fr]\">\n <FestivalCardBook3D config={config} className=\"h-full\" />\n <div>\n <FestivalCardConfigEditor value={config} onChange={setConfig} />\n {onSave ? (\n <button\n type=\"button\"\n onClick={() => void save()}\n disabled={saving}\n className=\"mt-3 w-full rounded-lg bg-slate-900 px-4 py-2.5 text-sm font-medium text-white disabled:opacity-60\"\n >\n {saving ? '保存中...' : '保存配置'}\n </button>\n ) : null}\n </div>\n </div>\n );\n};\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FestivalCardStudio } from './FestivalCardStudio';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig, FestivalCardConfigSummary } from '../types';\n\ninterface FestivalCardConfigPageProps {\n apiBase?: string;\n cardId?: string;\n mainPagePath?: string;\n}\n\nexport const FestivalCardConfigPage: React.FC<FestivalCardConfigPageProps> = ({\n apiBase = '/api/festivalCard',\n cardId,\n mainPagePath = '/festivalCard',\n}) => {\n const [list, setList] = useState<FestivalCardConfigSummary[]>([]);\n const [selectedId, setSelectedId] = useState(cardId || 'default-festival-card');\n\n const parseListResponse = (data: unknown): FestivalCardConfigSummary[] => {\n if (!data || typeof data !== 'object') return [];\n const payload = (data as { data?: unknown }).data;\n if (!Array.isArray(payload)) return [];\n return payload\n .filter((item): item is FestivalCardConfigSummary => Boolean(item && typeof item === 'object' && typeof (item as { id?: unknown }).id === 'string'))\n .map((item) => ({ id: item.id, name: item.name }));\n };\n\n const parseConfigResponse = (data: unknown): FestivalCardConfig => {\n if (!data || typeof data !== 'object') return normalizeFestivalCardConfig();\n const payload = (data as { data?: unknown }).data;\n if (!payload || typeof payload !== 'object') return normalizeFestivalCardConfig();\n return normalizeFestivalCardConfig(payload as Partial<FestivalCardConfig>);\n };\n\n const reloadList = useCallback(async () => {\n try {\n const response = await fetch(apiBase, { cache: 'no-store' });\n if (!response.ok) throw new Error(`加载卡片列表失败: ${response.status}`);\n const data: unknown = await response.json();\n setList(parseListResponse(data));\n } catch (error) {\n window.alert((error as Error).message || '加载卡片列表失败');\n }\n }, [apiBase]);\n\n useEffect(() => {\n void reloadList();\n }, [reloadList]);\n\n const fetchConfig = async (): Promise<FestivalCardConfig> => {\n const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, { cache: 'no-store' });\n if (!response.ok) {\n const message = `加载配置失败: ${response.status}`;\n window.alert(message);\n throw new Error(message);\n }\n const data: unknown = await response.json();\n return parseConfigResponse(data);\n };\n\n const saveConfig = async (config: FestivalCardConfig) => {\n try {\n const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config }),\n });\n if (!response.ok) throw new Error(`保存失败: ${response.status}`);\n await reloadList();\n window.alert('保存成功');\n } catch (error) {\n window.alert((error as Error).message || '保存失败');\n throw error;\n }\n };\n\n const createNew = async () => {\n const name = window.prompt('请输入新卡片名称');\n if (!name) return;\n const id = `festival-${Date.now()}`;\n const config = normalizeFestivalCardConfig({\n id,\n name,\n });\n try {\n const response = await fetch(`${apiBase}/${encodeURIComponent(id)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config }),\n });\n if (!response.ok) throw new Error(`创建失败: ${response.status}`);\n setSelectedId(id);\n await reloadList();\n window.alert('新卡片创建成功');\n } catch (error) {\n window.alert((error as Error).message || '创建失败');\n }\n };\n\n const mainLink = useMemo(() => `${mainPagePath}?cardId=${encodeURIComponent(selectedId)}`, [mainPagePath, selectedId]);\n\n return (\n <div className=\"grid gap-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <select\n value={selectedId}\n onChange={(event) => setSelectedId(event.target.value)}\n className=\"min-w-[200px] rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n >\n {list.map((item) => (\n <option key={item.id} value={item.id}>\n {item.name || item.id}\n </option>\n ))}\n </select>\n <button type=\"button\" onClick={() => void createNew()} className=\"rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white\">\n 新建卡片\n </button>\n <a href={mainLink} className=\"rounded-lg border border-sky-200 bg-sky-50 px-3 py-2 text-sm text-sky-700\">\n 打开主页面\n </a>\n </div>\n\n <FestivalCardStudio fetchConfig={fetchConfig} onSave={saveConfig} />\n </div>\n );\n};\n","'use client';\n\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { FestivalCardBook3D } from './FestivalCardBook3D';\nimport type { FestivalCardConfig, FestivalCardConfigSummary } from '../types';\n\ninterface FestivalCardManagedPageProps {\n apiBase?: string;\n cardId?: string;\n configPagePath?: string;\n}\n\nconst isSummary = (value: unknown): value is FestivalCardConfigSummary => {\n if (!value || typeof value !== 'object') return false;\n return typeof (value as { id?: unknown }).id === 'string';\n};\n\nconst parseListResponse = (data: unknown): FestivalCardConfigSummary[] => {\n if (!data || typeof data !== 'object') return [];\n const payload = (data as { data?: unknown }).data;\n if (!Array.isArray(payload)) return [];\n return payload.filter(isSummary).map((item) => ({ id: item.id, name: item.name }));\n};\n\nconst parseConfigResponse = (data: unknown): FestivalCardConfig | null => {\n if (!data || typeof data !== 'object') return null;\n const payload = (data as { data?: unknown }).data;\n if (!payload || typeof payload !== 'object') return null;\n if (!Array.isArray((payload as FestivalCardConfig).pages)) return null;\n return payload as FestivalCardConfig;\n};\n\nexport const FestivalCardManagedPage: React.FC<FestivalCardManagedPageProps> = ({\n apiBase = '/api/festivalCard',\n cardId,\n configPagePath = '/festivalCard/config',\n}) => {\n const [currentCardId, setCurrentCardId] = useState<string>(cardId || '');\n const [config, setConfig] = useState<FestivalCardConfig | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const fetchList = async () => {\n const response = await fetch(apiBase, { cache: 'no-store' });\n const data: unknown = await response.json();\n const items = parseListResponse(data);\n const first = items[0];\n if (!currentCardId && first) {\n setCurrentCardId(first.id);\n }\n };\n\n void fetchList();\n }, [apiBase, currentCardId]);\n\n useEffect(() => {\n if (!currentCardId) return;\n setLoading(true);\n void fetch(`${apiBase}/${encodeURIComponent(currentCardId)}`, { cache: 'no-store' })\n .then((res) => res.json() as Promise<unknown>)\n .then((data) => setConfig(parseConfigResponse(data)))\n .finally(() => setLoading(false));\n }, [apiBase, currentCardId]);\n\n const configLink = useMemo(() => {\n if (!currentCardId) return configPagePath;\n return `${configPagePath}?cardId=${encodeURIComponent(currentCardId)}`;\n }, [configPagePath, currentCardId]);\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex justify-end\">\n <a href={configLink} className=\"rounded-lg border border-slate-700 bg-slate-900 px-3 py-1.5 text-sm text-sky-300\">\n 进入配置页\n </a>\n </div>\n\n <div>{loading || !config ? <div className=\"py-12 text-center text-slate-400\">加载中...</div> : <FestivalCardBook3D config={config} />}</div>\n </div>\n );\n};\n","import type { FestivalCardDbAdapter } from '../types';\n\nlet dbAdapter: FestivalCardDbAdapter | null = null;\n\nexport const initializeFestivalCardDb = (adapter: FestivalCardDbAdapter): void => {\n dbAdapter = adapter;\n};\n\nexport const getFestivalCardDb = (): FestivalCardDbAdapter | null => dbAdapter;\n","import { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig } from '../core';\nimport { getFestivalCardDb } from '../server/db';\nimport type {\n FestivalCardConfig,\n FestivalCardConfigSummary,\n FestivalCardDbAdapter,\n FestivalCardServiceOptions,\n} from '../types';\n\nexport class FestivalCardService {\n private db: FestivalCardDbAdapter | null;\n\n constructor(options?: FestivalCardServiceOptions) {\n this.db = options?.db || getFestivalCardDb();\n }\n\n async listConfigs(): Promise<FestivalCardConfigSummary[]> {\n if (!this.db) {\n return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n if (this.db.listConfigs) {\n const list = await this.db.listConfigs();\n return list.length > 0\n ? list\n : [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n async getConfig(cardId = 'default-festival-card'): Promise<FestivalCardConfig> {\n if (!this.db) return DEFAULT_FESTIVAL_CARD_CONFIG;\n const config = await this.db.getConfig(cardId);\n return normalizeFestivalCardConfig(config);\n }\n\n async saveConfig(cardId: string, config: FestivalCardConfig): Promise<FestivalCardConfig> {\n const normalized = normalizeFestivalCardConfig(config);\n if (!this.db) return normalized;\n await this.db.saveConfig(cardId, normalized);\n return normalized;\n }\n\n async deleteConfig(cardId: string): Promise<void> {\n if (!this.db?.deleteConfig) return;\n await this.db.deleteConfig(cardId);\n }\n}\n\nconst memoryStore = new Map<string, FestivalCardConfig>();\nconst defaultId = DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card';\nif (!memoryStore.has(defaultId)) {\n memoryStore.set(defaultId, DEFAULT_FESTIVAL_CARD_CONFIG);\n}\n\nexport const createInMemoryFestivalCardDb = (): FestivalCardDbAdapter => ({\n listConfigs() {\n return Promise.resolve(\n Array.from(memoryStore.entries()).map(([id, config]) => ({\n id,\n name: config.name || id,\n }))\n );\n },\n getConfig(id: string) {\n return Promise.resolve(memoryStore.get(id) || null);\n },\n saveConfig(id: string, config: FestivalCardConfig) {\n memoryStore.set(id, config);\n return Promise.resolve();\n },\n deleteConfig(id: string) {\n memoryStore.delete(id);\n return Promise.resolve();\n },\n});\n"]}
|
|
@@ -503,25 +503,42 @@ var FestivalCardConfigPage = ({
|
|
|
503
503
|
return normalizeFestivalCardConfig(payload);
|
|
504
504
|
};
|
|
505
505
|
const reloadList = useCallback(async () => {
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
506
|
+
try {
|
|
507
|
+
const response = await fetch(apiBase, { cache: "no-store" });
|
|
508
|
+
if (!response.ok) throw new Error(`\u52A0\u8F7D\u5361\u7247\u5217\u8868\u5931\u8D25: ${response.status}`);
|
|
509
|
+
const data = await response.json();
|
|
510
|
+
setList(parseListResponse2(data));
|
|
511
|
+
} catch (error) {
|
|
512
|
+
window.alert(error.message || "\u52A0\u8F7D\u5361\u7247\u5217\u8868\u5931\u8D25");
|
|
513
|
+
}
|
|
509
514
|
}, [apiBase]);
|
|
510
515
|
useEffect(() => {
|
|
511
516
|
void reloadList();
|
|
512
517
|
}, [reloadList]);
|
|
513
518
|
const fetchConfig = async () => {
|
|
514
519
|
const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, { cache: "no-store" });
|
|
520
|
+
if (!response.ok) {
|
|
521
|
+
const message = `\u52A0\u8F7D\u914D\u7F6E\u5931\u8D25: ${response.status}`;
|
|
522
|
+
window.alert(message);
|
|
523
|
+
throw new Error(message);
|
|
524
|
+
}
|
|
515
525
|
const data = await response.json();
|
|
516
526
|
return parseConfigResponse2(data);
|
|
517
527
|
};
|
|
518
528
|
const saveConfig = async (config) => {
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
529
|
+
try {
|
|
530
|
+
const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, {
|
|
531
|
+
method: "PUT",
|
|
532
|
+
headers: { "Content-Type": "application/json" },
|
|
533
|
+
body: JSON.stringify({ config })
|
|
534
|
+
});
|
|
535
|
+
if (!response.ok) throw new Error(`\u4FDD\u5B58\u5931\u8D25: ${response.status}`);
|
|
536
|
+
await reloadList();
|
|
537
|
+
window.alert("\u4FDD\u5B58\u6210\u529F");
|
|
538
|
+
} catch (error) {
|
|
539
|
+
window.alert(error.message || "\u4FDD\u5B58\u5931\u8D25");
|
|
540
|
+
throw error;
|
|
541
|
+
}
|
|
525
542
|
};
|
|
526
543
|
const createNew = async () => {
|
|
527
544
|
const name = window.prompt("\u8BF7\u8F93\u5165\u65B0\u5361\u7247\u540D\u79F0");
|
|
@@ -531,13 +548,19 @@ var FestivalCardConfigPage = ({
|
|
|
531
548
|
id,
|
|
532
549
|
name
|
|
533
550
|
});
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
551
|
+
try {
|
|
552
|
+
const response = await fetch(`${apiBase}/${encodeURIComponent(id)}`, {
|
|
553
|
+
method: "PUT",
|
|
554
|
+
headers: { "Content-Type": "application/json" },
|
|
555
|
+
body: JSON.stringify({ config })
|
|
556
|
+
});
|
|
557
|
+
if (!response.ok) throw new Error(`\u521B\u5EFA\u5931\u8D25: ${response.status}`);
|
|
558
|
+
setSelectedId(id);
|
|
559
|
+
await reloadList();
|
|
560
|
+
window.alert("\u65B0\u5361\u7247\u521B\u5EFA\u6210\u529F");
|
|
561
|
+
} catch (error) {
|
|
562
|
+
window.alert(error.message || "\u521B\u5EFA\u5931\u8D25");
|
|
563
|
+
}
|
|
541
564
|
};
|
|
542
565
|
const mainLink = useMemo(() => `${mainPagePath}?cardId=${encodeURIComponent(selectedId)}`, [mainPagePath, selectedId]);
|
|
543
566
|
return /* @__PURE__ */ React3.createElement("div", { className: "grid gap-3" }, /* @__PURE__ */ React3.createElement("div", { className: "flex flex-wrap items-center gap-2" }, /* @__PURE__ */ React3.createElement(
|