sa2kit 1.6.69 → 1.6.70
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/core/index.d.mts +1 -1
- package/dist/festivalCard/core/index.d.ts +1 -1
- package/dist/festivalCard/index.d.mts +3 -3
- package/dist/festivalCard/index.d.ts +3 -3
- package/dist/festivalCard/index.js +161 -0
- package/dist/festivalCard/index.js.map +1 -1
- package/dist/festivalCard/index.mjs +160 -1
- package/dist/festivalCard/index.mjs.map +1 -1
- package/dist/festivalCard/miniapp/index.d.mts +3 -3
- package/dist/festivalCard/miniapp/index.d.ts +3 -3
- package/dist/festivalCard/miniapp/index.js +30 -0
- package/dist/festivalCard/miniapp/index.js.map +1 -1
- package/dist/festivalCard/miniapp/index.mjs +30 -0
- package/dist/festivalCard/miniapp/index.mjs.map +1 -1
- package/dist/festivalCard/routes/index.d.mts +44 -0
- package/dist/festivalCard/routes/index.d.ts +44 -0
- package/dist/festivalCard/routes/index.js +266 -0
- package/dist/festivalCard/routes/index.js.map +1 -0
- package/dist/festivalCard/routes/index.mjs +261 -0
- package/dist/festivalCard/routes/index.mjs.map +1 -0
- package/dist/festivalCard/server/index.d.mts +1 -1
- package/dist/festivalCard/server/index.d.ts +1 -1
- package/dist/festivalCard/web/index.d.mts +18 -4
- package/dist/festivalCard/web/index.d.ts +18 -4
- package/dist/festivalCard/web/index.js +161 -0
- package/dist/festivalCard/web/index.js.map +1 -1
- package/dist/festivalCard/web/index.mjs +160 -1
- package/dist/festivalCard/web/index.mjs.map +1 -1
- package/dist/{festivalCardService-uSg0oNuD.d.mts → festivalCardService-CgNBOjjO.d.mts} +3 -1
- package/dist/{festivalCardService-C0fhTezx.d.ts → festivalCardService-ClJiAP6P.d.ts} +3 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +161 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +160 -1
- package/dist/index.mjs.map +1 -1
- package/dist/{types-B-tjQTGi.d.mts → types-COyg0XDw.d.mts} +7 -1
- package/dist/{types-B-tjQTGi.d.ts → types-COyg0XDw.d.ts} +7 -1
- package/package.json +6 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/festivalCard/server/db.ts","../../../src/festivalCard/core/defaults.ts","../../../src/festivalCard/core/normalize.ts","../../../src/festivalCard/services/festivalCardService.ts","../../../src/festivalCard/routes/index.ts"],"names":["NextResponse"],"mappings":"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","file":"index.js","sourcesContent":["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 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 },\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 },\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","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","import { NextResponse } from 'next/server';\nimport { initializeFestivalCardDb } from '../server/db';\nimport { FestivalCardService } from '../services';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig, FestivalCardDbAdapter } from '../types';\nimport type { NextRequest } from 'next/server';\n\nexport interface FestivalCardRouteConfig {\n db?: FestivalCardDbAdapter;\n}\n\nconst createService = (config: FestivalCardRouteConfig) => {\n if (config.db) initializeFestivalCardDb(config.db);\n return new FestivalCardService({ db: config.db });\n};\n\nexport const createListFestivalCardsHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (_request: NextRequest) => {\n try {\n const data = await service.listConfigs();\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n\nexport const createGetFestivalCardHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (_request: NextRequest, context: { params: { id: string } }) => {\n try {\n const card = await service.getConfig(context.params.id);\n return NextResponse.json({ success: true, data: card });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n\nexport const createUpsertFestivalCardHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (request: NextRequest, context: { params: { id: string } }) => {\n try {\n const body: unknown = await request.json();\n const payload =\n body && typeof body === 'object' && 'config' in body\n ? (body as { config?: unknown }).config\n : undefined;\n const normalized = normalizeFestivalCardConfig((payload || {}) as Partial<FestivalCardConfig>);\n const data = await service.saveConfig(context.params.id, normalized);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n\nexport const createDeleteFestivalCardHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (_request: NextRequest, context: { params: { id: string } }) => {\n try {\n await service.deleteConfig(context.params.id);\n return NextResponse.json({ success: true });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n"]}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
// src/festivalCard/routes/index.ts
|
|
4
|
+
|
|
5
|
+
// src/festivalCard/server/db.ts
|
|
6
|
+
var dbAdapter = null;
|
|
7
|
+
var initializeFestivalCardDb = (adapter) => {
|
|
8
|
+
dbAdapter = adapter;
|
|
9
|
+
};
|
|
10
|
+
var getFestivalCardDb = () => dbAdapter;
|
|
11
|
+
|
|
12
|
+
// src/festivalCard/core/defaults.ts
|
|
13
|
+
var DEFAULT_FESTIVAL_CARD_CONFIG = {
|
|
14
|
+
id: "default-festival-card",
|
|
15
|
+
name: "Holiday Card",
|
|
16
|
+
theme: "winter",
|
|
17
|
+
coverTitle: "Happy Holidays",
|
|
18
|
+
coverSubtitle: "Warm wishes for you",
|
|
19
|
+
background: {
|
|
20
|
+
colorA: "#0c1a34",
|
|
21
|
+
colorB: "#1f4f8a"
|
|
22
|
+
},
|
|
23
|
+
backgroundMusic: {
|
|
24
|
+
src: "",
|
|
25
|
+
loop: true,
|
|
26
|
+
autoPlay: false,
|
|
27
|
+
volume: 0.5
|
|
28
|
+
},
|
|
29
|
+
pages: [
|
|
30
|
+
{
|
|
31
|
+
id: "page-1",
|
|
32
|
+
title: "\u5C01\u9762",
|
|
33
|
+
background: { color: "#11284d" },
|
|
34
|
+
elements: [
|
|
35
|
+
{
|
|
36
|
+
id: "p1-text-1",
|
|
37
|
+
type: "text",
|
|
38
|
+
x: 50,
|
|
39
|
+
y: 20,
|
|
40
|
+
content: "\u65B0\u5E74\u5FEB\u4E50",
|
|
41
|
+
fontSize: 34,
|
|
42
|
+
fontWeight: 700,
|
|
43
|
+
align: "center",
|
|
44
|
+
color: "#f8fafc"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "p1-text-2",
|
|
48
|
+
type: "text",
|
|
49
|
+
x: 50,
|
|
50
|
+
y: 36,
|
|
51
|
+
content: "\u613F\u8FD9\u4E00\u5E74\u5E73\u5B89\u559C\u4E50",
|
|
52
|
+
fontSize: 18,
|
|
53
|
+
fontWeight: 500,
|
|
54
|
+
align: "center",
|
|
55
|
+
color: "#dbeafe"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: "p1-image-1",
|
|
59
|
+
type: "image",
|
|
60
|
+
x: 50,
|
|
61
|
+
y: 68,
|
|
62
|
+
width: 72,
|
|
63
|
+
height: 42,
|
|
64
|
+
src: "https://images.unsplash.com/photo-1512389142860-9c449e58a543?auto=format&fit=crop&w=1200&q=80",
|
|
65
|
+
fit: "cover",
|
|
66
|
+
borderRadius: 16,
|
|
67
|
+
alt: "holiday"
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: "page-2",
|
|
73
|
+
title: "\u795D\u798F",
|
|
74
|
+
background: { color: "#1a3766" },
|
|
75
|
+
elements: [
|
|
76
|
+
{
|
|
77
|
+
id: "p2-text-1",
|
|
78
|
+
type: "text",
|
|
79
|
+
x: 50,
|
|
80
|
+
y: 28,
|
|
81
|
+
content: "\u613F\u4F60\u65B0\u5C81\uFF1A",
|
|
82
|
+
fontSize: 28,
|
|
83
|
+
fontWeight: 700,
|
|
84
|
+
align: "center",
|
|
85
|
+
color: "#fef3c7"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: "p2-text-2",
|
|
89
|
+
type: "text",
|
|
90
|
+
x: 50,
|
|
91
|
+
y: 42,
|
|
92
|
+
content: "\u6240\u5F97\u7686\u6240\u671F\uFF0C\u6240\u5931\u4EA6\u65E0\u788D",
|
|
93
|
+
fontSize: 18,
|
|
94
|
+
fontWeight: 500,
|
|
95
|
+
align: "center",
|
|
96
|
+
color: "#f8fafc"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: "p2-text-3",
|
|
100
|
+
type: "text",
|
|
101
|
+
x: 50,
|
|
102
|
+
y: 55,
|
|
103
|
+
content: "\u613F\u4F60\u7684\u6BCF\u4E00\u6B65\u90FD\u8D70\u5411\u5149\u4EAE",
|
|
104
|
+
fontSize: 16,
|
|
105
|
+
fontWeight: 400,
|
|
106
|
+
align: "center",
|
|
107
|
+
color: "#dbeafe"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: "page-3",
|
|
113
|
+
title: "\u843D\u6B3E",
|
|
114
|
+
background: { color: "#11284d" },
|
|
115
|
+
elements: [
|
|
116
|
+
{
|
|
117
|
+
id: "p3-image-1",
|
|
118
|
+
type: "image",
|
|
119
|
+
x: 50,
|
|
120
|
+
y: 34,
|
|
121
|
+
width: 60,
|
|
122
|
+
height: 42,
|
|
123
|
+
src: "https://images.unsplash.com/photo-1456324504439-367cee3b3c32?auto=format&fit=crop&w=1200&q=80",
|
|
124
|
+
fit: "cover",
|
|
125
|
+
borderRadius: 14,
|
|
126
|
+
alt: "gift"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
id: "p3-text-1",
|
|
130
|
+
type: "text",
|
|
131
|
+
x: 50,
|
|
132
|
+
y: 72,
|
|
133
|
+
content: "Best wishes, from SA2Kit",
|
|
134
|
+
fontSize: 18,
|
|
135
|
+
fontWeight: 600,
|
|
136
|
+
align: "center",
|
|
137
|
+
color: "#f8fafc"
|
|
138
|
+
}
|
|
139
|
+
]
|
|
140
|
+
}
|
|
141
|
+
]
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// src/festivalCard/core/normalize.ts
|
|
145
|
+
var ensurePage = (page, index) => ({
|
|
146
|
+
id: page.id || `page-${index + 1}`,
|
|
147
|
+
title: page.title || `\u7B2C ${index + 1} \u9875`,
|
|
148
|
+
elements: Array.isArray(page.elements) ? page.elements : [],
|
|
149
|
+
background: page.background || {}
|
|
150
|
+
});
|
|
151
|
+
var normalizeFestivalCardConfig = (config) => {
|
|
152
|
+
const pages = config?.pages && config.pages.length > 0 ? config.pages : DEFAULT_FESTIVAL_CARD_CONFIG.pages;
|
|
153
|
+
return {
|
|
154
|
+
...DEFAULT_FESTIVAL_CARD_CONFIG,
|
|
155
|
+
...config,
|
|
156
|
+
background: {
|
|
157
|
+
...DEFAULT_FESTIVAL_CARD_CONFIG.background,
|
|
158
|
+
...config?.background || {}
|
|
159
|
+
},
|
|
160
|
+
backgroundMusic: {
|
|
161
|
+
...DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic,
|
|
162
|
+
...config?.backgroundMusic || {},
|
|
163
|
+
src: config?.backgroundMusic?.src ?? DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic?.src ?? ""
|
|
164
|
+
},
|
|
165
|
+
pages: pages.map(ensurePage)
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
// src/festivalCard/services/festivalCardService.ts
|
|
170
|
+
var FestivalCardService = class {
|
|
171
|
+
constructor(options) {
|
|
172
|
+
this.db = options?.db || getFestivalCardDb();
|
|
173
|
+
}
|
|
174
|
+
async listConfigs() {
|
|
175
|
+
if (!this.db) {
|
|
176
|
+
return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card", name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];
|
|
177
|
+
}
|
|
178
|
+
if (this.db.listConfigs) {
|
|
179
|
+
const list = await this.db.listConfigs();
|
|
180
|
+
return list.length > 0 ? list : [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card", name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];
|
|
181
|
+
}
|
|
182
|
+
return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card", name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];
|
|
183
|
+
}
|
|
184
|
+
async getConfig(cardId = "default-festival-card") {
|
|
185
|
+
if (!this.db) return DEFAULT_FESTIVAL_CARD_CONFIG;
|
|
186
|
+
const config = await this.db.getConfig(cardId);
|
|
187
|
+
return normalizeFestivalCardConfig(config);
|
|
188
|
+
}
|
|
189
|
+
async saveConfig(cardId, config) {
|
|
190
|
+
const normalized = normalizeFestivalCardConfig(config);
|
|
191
|
+
if (!this.db) return normalized;
|
|
192
|
+
await this.db.saveConfig(cardId, normalized);
|
|
193
|
+
return normalized;
|
|
194
|
+
}
|
|
195
|
+
async deleteConfig(cardId) {
|
|
196
|
+
if (!this.db?.deleteConfig) return;
|
|
197
|
+
await this.db.deleteConfig(cardId);
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
var memoryStore = /* @__PURE__ */ new Map();
|
|
201
|
+
var defaultId = DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card";
|
|
202
|
+
if (!memoryStore.has(defaultId)) {
|
|
203
|
+
memoryStore.set(defaultId, DEFAULT_FESTIVAL_CARD_CONFIG);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// src/festivalCard/routes/index.ts
|
|
207
|
+
var createService = (config) => {
|
|
208
|
+
if (config.db) initializeFestivalCardDb(config.db);
|
|
209
|
+
return new FestivalCardService({ db: config.db });
|
|
210
|
+
};
|
|
211
|
+
var createListFestivalCardsHandler = (config = {}) => {
|
|
212
|
+
const service = createService(config);
|
|
213
|
+
return async (_request) => {
|
|
214
|
+
try {
|
|
215
|
+
const data = await service.listConfigs();
|
|
216
|
+
return NextResponse.json({ success: true, data });
|
|
217
|
+
} catch (error) {
|
|
218
|
+
return NextResponse.json({ success: false, error: error.message }, { status: 500 });
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
};
|
|
222
|
+
var createGetFestivalCardHandler = (config = {}) => {
|
|
223
|
+
const service = createService(config);
|
|
224
|
+
return async (_request, context) => {
|
|
225
|
+
try {
|
|
226
|
+
const card = await service.getConfig(context.params.id);
|
|
227
|
+
return NextResponse.json({ success: true, data: card });
|
|
228
|
+
} catch (error) {
|
|
229
|
+
return NextResponse.json({ success: false, error: error.message }, { status: 500 });
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
};
|
|
233
|
+
var createUpsertFestivalCardHandler = (config = {}) => {
|
|
234
|
+
const service = createService(config);
|
|
235
|
+
return async (request, context) => {
|
|
236
|
+
try {
|
|
237
|
+
const body = await request.json();
|
|
238
|
+
const payload = body && typeof body === "object" && "config" in body ? body.config : void 0;
|
|
239
|
+
const normalized = normalizeFestivalCardConfig(payload || {});
|
|
240
|
+
const data = await service.saveConfig(context.params.id, normalized);
|
|
241
|
+
return NextResponse.json({ success: true, data });
|
|
242
|
+
} catch (error) {
|
|
243
|
+
return NextResponse.json({ success: false, error: error.message }, { status: 500 });
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
};
|
|
247
|
+
var createDeleteFestivalCardHandler = (config = {}) => {
|
|
248
|
+
const service = createService(config);
|
|
249
|
+
return async (_request, context) => {
|
|
250
|
+
try {
|
|
251
|
+
await service.deleteConfig(context.params.id);
|
|
252
|
+
return NextResponse.json({ success: true });
|
|
253
|
+
} catch (error) {
|
|
254
|
+
return NextResponse.json({ success: false, error: error.message }, { status: 500 });
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
export { createDeleteFestivalCardHandler, createGetFestivalCardHandler, createListFestivalCardsHandler, createUpsertFestivalCardHandler };
|
|
260
|
+
//# sourceMappingURL=index.mjs.map
|
|
261
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/festivalCard/server/db.ts","../../../src/festivalCard/core/defaults.ts","../../../src/festivalCard/core/normalize.ts","../../../src/festivalCard/services/festivalCardService.ts","../../../src/festivalCard/routes/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["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 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 },\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 },\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","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","import { NextResponse } from 'next/server';\nimport { initializeFestivalCardDb } from '../server/db';\nimport { FestivalCardService } from '../services';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig, FestivalCardDbAdapter } from '../types';\nimport type { NextRequest } from 'next/server';\n\nexport interface FestivalCardRouteConfig {\n db?: FestivalCardDbAdapter;\n}\n\nconst createService = (config: FestivalCardRouteConfig) => {\n if (config.db) initializeFestivalCardDb(config.db);\n return new FestivalCardService({ db: config.db });\n};\n\nexport const createListFestivalCardsHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (_request: NextRequest) => {\n try {\n const data = await service.listConfigs();\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n\nexport const createGetFestivalCardHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (_request: NextRequest, context: { params: { id: string } }) => {\n try {\n const card = await service.getConfig(context.params.id);\n return NextResponse.json({ success: true, data: card });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n\nexport const createUpsertFestivalCardHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (request: NextRequest, context: { params: { id: string } }) => {\n try {\n const body: unknown = await request.json();\n const payload =\n body && typeof body === 'object' && 'config' in body\n ? (body as { config?: unknown }).config\n : undefined;\n const normalized = normalizeFestivalCardConfig((payload || {}) as Partial<FestivalCardConfig>);\n const data = await service.saveConfig(context.params.id, normalized);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n\nexport const createDeleteFestivalCardHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (_request: NextRequest, context: { params: { id: string } }) => {\n try {\n await service.deleteConfig(context.params.id);\n return NextResponse.json({ success: true });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as FestivalCardDbAdapter } from '../../types-COyg0XDw.mjs';
|
|
2
2
|
|
|
3
3
|
declare const initializeFestivalCardDb: (adapter: FestivalCardDbAdapter) => void;
|
|
4
4
|
declare const getFestivalCardDb: () => FestivalCardDbAdapter | null;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { i as FestivalCardDbAdapter } from '../../types-COyg0XDw.js';
|
|
2
2
|
|
|
3
3
|
declare const initializeFestivalCardDb: (adapter: FestivalCardDbAdapter) => void;
|
|
4
4
|
declare const getFestivalCardDb: () => FestivalCardDbAdapter | null;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig, resizeFestivalCardPages } from '../core/index.mjs';
|
|
2
|
-
export { F as FestivalCardService, c as createInMemoryFestivalCardDb, u as useFestivalCardConfig } from '../../festivalCardService-
|
|
3
|
-
import { F as FestivalCardConfig, f as FestivalCardPage } from '../../types-
|
|
4
|
-
export { g as FestivalCardAudioConfig, h as FestivalCardDbAdapter, e as FestivalCardElement, b as FestivalCardElementBase, a as FestivalCardElementType, d as FestivalCardImageElement,
|
|
2
|
+
export { F as FestivalCardService, c as createInMemoryFestivalCardDb, u as useFestivalCardConfig } from '../../festivalCardService-CgNBOjjO.mjs';
|
|
3
|
+
import { F as FestivalCardConfig, f as FestivalCardPage } from '../../types-COyg0XDw.mjs';
|
|
4
|
+
export { g as FestivalCardAudioConfig, h as FestivalCardConfigSummary, i as FestivalCardDbAdapter, e as FestivalCardElement, b as FestivalCardElementBase, a as FestivalCardElementType, d as FestivalCardImageElement, j as FestivalCardServiceOptions, c as FestivalCardTextElement } from '../../types-COyg0XDw.mjs';
|
|
5
5
|
import React__default from 'react';
|
|
6
6
|
|
|
7
7
|
interface FestivalCardBook3DProps {
|
|
@@ -10,12 +10,26 @@ interface FestivalCardBook3DProps {
|
|
|
10
10
|
}
|
|
11
11
|
declare const FestivalCardBook3D: React__default.FC<FestivalCardBook3DProps>;
|
|
12
12
|
|
|
13
|
+
interface FestivalCardConfigPageProps {
|
|
14
|
+
apiBase?: string;
|
|
15
|
+
cardId?: string;
|
|
16
|
+
mainPagePath?: string;
|
|
17
|
+
}
|
|
18
|
+
declare const FestivalCardConfigPage: React__default.FC<FestivalCardConfigPageProps>;
|
|
19
|
+
|
|
13
20
|
interface FestivalCardConfigEditorProps {
|
|
14
21
|
value: FestivalCardConfig;
|
|
15
22
|
onChange: (config: FestivalCardConfig) => void;
|
|
16
23
|
}
|
|
17
24
|
declare const FestivalCardConfigEditor: React__default.FC<FestivalCardConfigEditorProps>;
|
|
18
25
|
|
|
26
|
+
interface FestivalCardManagedPageProps {
|
|
27
|
+
apiBase?: string;
|
|
28
|
+
cardId?: string;
|
|
29
|
+
configPagePath?: string;
|
|
30
|
+
}
|
|
31
|
+
declare const FestivalCardManagedPage: React__default.FC<FestivalCardManagedPageProps>;
|
|
32
|
+
|
|
19
33
|
interface FestivalCardPageRendererProps {
|
|
20
34
|
page: FestivalCardPage;
|
|
21
35
|
}
|
|
@@ -28,4 +42,4 @@ interface FestivalCardStudioProps {
|
|
|
28
42
|
}
|
|
29
43
|
declare const FestivalCardStudio: React__default.FC<FestivalCardStudioProps>;
|
|
30
44
|
|
|
31
|
-
export { FestivalCardBook3D, type FestivalCardBook3DProps, FestivalCardConfig, FestivalCardConfigEditor, FestivalCardPage, FestivalCardPageRenderer, FestivalCardStudio };
|
|
45
|
+
export { FestivalCardBook3D, type FestivalCardBook3DProps, FestivalCardConfig, FestivalCardConfigEditor, FestivalCardConfigPage, FestivalCardManagedPage, FestivalCardPage, FestivalCardPageRenderer, FestivalCardStudio };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig, resizeFestivalCardPages } from '../core/index.js';
|
|
2
|
-
export { F as FestivalCardService, c as createInMemoryFestivalCardDb, u as useFestivalCardConfig } from '../../festivalCardService-
|
|
3
|
-
import { F as FestivalCardConfig, f as FestivalCardPage } from '../../types-
|
|
4
|
-
export { g as FestivalCardAudioConfig, h as FestivalCardDbAdapter, e as FestivalCardElement, b as FestivalCardElementBase, a as FestivalCardElementType, d as FestivalCardImageElement,
|
|
2
|
+
export { F as FestivalCardService, c as createInMemoryFestivalCardDb, u as useFestivalCardConfig } from '../../festivalCardService-ClJiAP6P.js';
|
|
3
|
+
import { F as FestivalCardConfig, f as FestivalCardPage } from '../../types-COyg0XDw.js';
|
|
4
|
+
export { g as FestivalCardAudioConfig, h as FestivalCardConfigSummary, i as FestivalCardDbAdapter, e as FestivalCardElement, b as FestivalCardElementBase, a as FestivalCardElementType, d as FestivalCardImageElement, j as FestivalCardServiceOptions, c as FestivalCardTextElement } from '../../types-COyg0XDw.js';
|
|
5
5
|
import React__default from 'react';
|
|
6
6
|
|
|
7
7
|
interface FestivalCardBook3DProps {
|
|
@@ -10,12 +10,26 @@ interface FestivalCardBook3DProps {
|
|
|
10
10
|
}
|
|
11
11
|
declare const FestivalCardBook3D: React__default.FC<FestivalCardBook3DProps>;
|
|
12
12
|
|
|
13
|
+
interface FestivalCardConfigPageProps {
|
|
14
|
+
apiBase?: string;
|
|
15
|
+
cardId?: string;
|
|
16
|
+
mainPagePath?: string;
|
|
17
|
+
}
|
|
18
|
+
declare const FestivalCardConfigPage: React__default.FC<FestivalCardConfigPageProps>;
|
|
19
|
+
|
|
13
20
|
interface FestivalCardConfigEditorProps {
|
|
14
21
|
value: FestivalCardConfig;
|
|
15
22
|
onChange: (config: FestivalCardConfig) => void;
|
|
16
23
|
}
|
|
17
24
|
declare const FestivalCardConfigEditor: React__default.FC<FestivalCardConfigEditorProps>;
|
|
18
25
|
|
|
26
|
+
interface FestivalCardManagedPageProps {
|
|
27
|
+
apiBase?: string;
|
|
28
|
+
cardId?: string;
|
|
29
|
+
configPagePath?: string;
|
|
30
|
+
}
|
|
31
|
+
declare const FestivalCardManagedPage: React__default.FC<FestivalCardManagedPageProps>;
|
|
32
|
+
|
|
19
33
|
interface FestivalCardPageRendererProps {
|
|
20
34
|
page: FestivalCardPage;
|
|
21
35
|
}
|
|
@@ -28,4 +42,4 @@ interface FestivalCardStudioProps {
|
|
|
28
42
|
}
|
|
29
43
|
declare const FestivalCardStudio: React__default.FC<FestivalCardStudioProps>;
|
|
30
44
|
|
|
31
|
-
export { FestivalCardBook3D, type FestivalCardBook3DProps, FestivalCardConfig, FestivalCardConfigEditor, FestivalCardPage, FestivalCardPageRenderer, FestivalCardStudio };
|
|
45
|
+
export { FestivalCardBook3D, type FestivalCardBook3DProps, FestivalCardConfig, FestivalCardConfigEditor, FestivalCardConfigPage, FestivalCardManagedPage, FestivalCardPage, FestivalCardPageRenderer, FestivalCardStudio };
|
|
@@ -517,6 +517,8 @@ var FestivalCardConfigEditor = ({ value, onChange }) => {
|
|
|
517
517
|
}
|
|
518
518
|
))))) : null);
|
|
519
519
|
};
|
|
520
|
+
|
|
521
|
+
// src/festivalCard/components/FestivalCardStudio.tsx
|
|
520
522
|
var FestivalCardStudio = ({ initialConfig, fetchConfig, onSave }) => {
|
|
521
523
|
const { config, setConfig, loading, save, saving } = useFestivalCardConfig({
|
|
522
524
|
initialConfig: normalizeFestivalCardConfig(initialConfig),
|
|
@@ -536,6 +538,133 @@ var FestivalCardStudio = ({ initialConfig, fetchConfig, onSave }) => {
|
|
|
536
538
|
) : null));
|
|
537
539
|
};
|
|
538
540
|
|
|
541
|
+
// src/festivalCard/components/FestivalCardConfigPage.tsx
|
|
542
|
+
var FestivalCardConfigPage = ({
|
|
543
|
+
apiBase = "/api/festivalCard",
|
|
544
|
+
cardId,
|
|
545
|
+
mainPagePath = "/festivalCard"
|
|
546
|
+
}) => {
|
|
547
|
+
const [list, setList] = React3.useState([]);
|
|
548
|
+
const [selectedId, setSelectedId] = React3.useState(cardId || "default-festival-card");
|
|
549
|
+
const parseListResponse2 = (data) => {
|
|
550
|
+
if (!data || typeof data !== "object") return [];
|
|
551
|
+
const payload = data.data;
|
|
552
|
+
if (!Array.isArray(payload)) return [];
|
|
553
|
+
return payload.filter((item) => Boolean(item && typeof item === "object" && typeof item.id === "string")).map((item) => ({ id: item.id, name: item.name }));
|
|
554
|
+
};
|
|
555
|
+
const parseConfigResponse2 = (data) => {
|
|
556
|
+
if (!data || typeof data !== "object") return normalizeFestivalCardConfig();
|
|
557
|
+
const payload = data.data;
|
|
558
|
+
if (!payload || typeof payload !== "object") return normalizeFestivalCardConfig();
|
|
559
|
+
return normalizeFestivalCardConfig(payload);
|
|
560
|
+
};
|
|
561
|
+
const reloadList = React3.useCallback(async () => {
|
|
562
|
+
const response = await fetch(apiBase, { cache: "no-store" });
|
|
563
|
+
const data = await response.json();
|
|
564
|
+
setList(parseListResponse2(data));
|
|
565
|
+
}, [apiBase]);
|
|
566
|
+
React3.useEffect(() => {
|
|
567
|
+
void reloadList();
|
|
568
|
+
}, [reloadList]);
|
|
569
|
+
const fetchConfig = async () => {
|
|
570
|
+
const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, { cache: "no-store" });
|
|
571
|
+
const data = await response.json();
|
|
572
|
+
return parseConfigResponse2(data);
|
|
573
|
+
};
|
|
574
|
+
const saveConfig = async (config) => {
|
|
575
|
+
await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, {
|
|
576
|
+
method: "PUT",
|
|
577
|
+
headers: { "Content-Type": "application/json" },
|
|
578
|
+
body: JSON.stringify({ config })
|
|
579
|
+
});
|
|
580
|
+
await reloadList();
|
|
581
|
+
};
|
|
582
|
+
const createNew = async () => {
|
|
583
|
+
const name = window.prompt("\u8BF7\u8F93\u5165\u65B0\u5361\u7247\u540D\u79F0");
|
|
584
|
+
if (!name) return;
|
|
585
|
+
const id = `festival-${Date.now()}`;
|
|
586
|
+
const config = normalizeFestivalCardConfig({
|
|
587
|
+
id,
|
|
588
|
+
name
|
|
589
|
+
});
|
|
590
|
+
await fetch(`${apiBase}/${encodeURIComponent(id)}`, {
|
|
591
|
+
method: "PUT",
|
|
592
|
+
headers: { "Content-Type": "application/json" },
|
|
593
|
+
body: JSON.stringify({ config })
|
|
594
|
+
});
|
|
595
|
+
setSelectedId(id);
|
|
596
|
+
await reloadList();
|
|
597
|
+
};
|
|
598
|
+
const mainLink = React3.useMemo(() => `${mainPagePath}?cardId=${encodeURIComponent(selectedId)}`, [mainPagePath, selectedId]);
|
|
599
|
+
return /* @__PURE__ */ React3__default.default.createElement("div", { style: { display: "grid", gap: 12 } }, /* @__PURE__ */ React3__default.default.createElement("div", { style: { display: "flex", gap: 10, alignItems: "center" } }, /* @__PURE__ */ React3__default.default.createElement("select", { value: selectedId, onChange: (event) => setSelectedId(event.target.value) }, list.map((item) => /* @__PURE__ */ React3__default.default.createElement("option", { key: item.id, value: item.id }, item.name || item.id))), /* @__PURE__ */ React3__default.default.createElement("button", { type: "button", onClick: () => void createNew() }, "\u65B0\u5EFA\u5361\u7247"), /* @__PURE__ */ React3__default.default.createElement("a", { href: mainLink, style: { color: "#2563eb", fontSize: 14 } }, "\u6253\u5F00\u4E3B\u9875\u9762")), /* @__PURE__ */ React3__default.default.createElement(FestivalCardStudio, { fetchConfig, onSave: saveConfig }));
|
|
600
|
+
};
|
|
601
|
+
var isSummary = (value) => {
|
|
602
|
+
if (!value || typeof value !== "object") return false;
|
|
603
|
+
return typeof value.id === "string";
|
|
604
|
+
};
|
|
605
|
+
var parseListResponse = (data) => {
|
|
606
|
+
if (!data || typeof data !== "object") return [];
|
|
607
|
+
const payload = data.data;
|
|
608
|
+
if (!Array.isArray(payload)) return [];
|
|
609
|
+
return payload.filter(isSummary).map((item) => ({ id: item.id, name: item.name }));
|
|
610
|
+
};
|
|
611
|
+
var parseConfigResponse = (data) => {
|
|
612
|
+
if (!data || typeof data !== "object") return null;
|
|
613
|
+
const payload = data.data;
|
|
614
|
+
if (!payload || typeof payload !== "object") return null;
|
|
615
|
+
if (!Array.isArray(payload.pages)) return null;
|
|
616
|
+
return payload;
|
|
617
|
+
};
|
|
618
|
+
var FestivalCardManagedPage = ({
|
|
619
|
+
apiBase = "/api/festivalCard",
|
|
620
|
+
cardId,
|
|
621
|
+
configPagePath = "/festivalCard/config"
|
|
622
|
+
}) => {
|
|
623
|
+
const [list, setList] = React3.useState([]);
|
|
624
|
+
const [currentCardId, setCurrentCardId] = React3.useState(cardId || "");
|
|
625
|
+
const [config, setConfig] = React3.useState(null);
|
|
626
|
+
const [loading, setLoading] = React3.useState(true);
|
|
627
|
+
React3.useEffect(() => {
|
|
628
|
+
const fetchList = async () => {
|
|
629
|
+
const response = await fetch(apiBase, { cache: "no-store" });
|
|
630
|
+
const data = await response.json();
|
|
631
|
+
const items = parseListResponse(data);
|
|
632
|
+
setList(items);
|
|
633
|
+
const first = items[0];
|
|
634
|
+
if (!currentCardId && first) {
|
|
635
|
+
setCurrentCardId(first.id);
|
|
636
|
+
}
|
|
637
|
+
};
|
|
638
|
+
void fetchList();
|
|
639
|
+
}, [apiBase, currentCardId]);
|
|
640
|
+
React3.useEffect(() => {
|
|
641
|
+
if (!currentCardId) return;
|
|
642
|
+
setLoading(true);
|
|
643
|
+
void fetch(`${apiBase}/${encodeURIComponent(currentCardId)}`, { cache: "no-store" }).then((res) => res.json()).then((data) => setConfig(parseConfigResponse(data))).finally(() => setLoading(false));
|
|
644
|
+
}, [apiBase, currentCardId]);
|
|
645
|
+
const configLink = React3.useMemo(() => {
|
|
646
|
+
if (!currentCardId) return configPagePath;
|
|
647
|
+
return `${configPagePath}?cardId=${encodeURIComponent(currentCardId)}`;
|
|
648
|
+
}, [configPagePath, currentCardId]);
|
|
649
|
+
return /* @__PURE__ */ React3__default.default.createElement("div", { style: { display: "grid", gridTemplateColumns: "240px 1fr", gap: 14 } }, /* @__PURE__ */ React3__default.default.createElement("aside", { style: { borderRadius: 16, padding: 12, background: "#0f172a", color: "#e2e8f0" } }, /* @__PURE__ */ React3__default.default.createElement("div", { style: { fontSize: 14, marginBottom: 8 } }, "\u5361\u7247\u5217\u8868"), /* @__PURE__ */ React3__default.default.createElement("div", { style: { display: "grid", gap: 8 } }, list.map((item) => /* @__PURE__ */ React3__default.default.createElement(
|
|
650
|
+
"button",
|
|
651
|
+
{
|
|
652
|
+
key: item.id,
|
|
653
|
+
type: "button",
|
|
654
|
+
onClick: () => setCurrentCardId(item.id),
|
|
655
|
+
style: {
|
|
656
|
+
borderRadius: 8,
|
|
657
|
+
border: "1px solid #334155",
|
|
658
|
+
padding: "8px 10px",
|
|
659
|
+
textAlign: "left",
|
|
660
|
+
background: currentCardId === item.id ? "#1e293b" : "#0b1220",
|
|
661
|
+
color: "#e2e8f0"
|
|
662
|
+
}
|
|
663
|
+
},
|
|
664
|
+
item.name || item.id
|
|
665
|
+
))), /* @__PURE__ */ React3__default.default.createElement("a", { href: configLink, style: { display: "inline-block", marginTop: 12, color: "#93c5fd", fontSize: 13 } }, "\u8FDB\u5165\u914D\u7F6E\u9875")), /* @__PURE__ */ React3__default.default.createElement("div", null, loading || !config ? /* @__PURE__ */ React3__default.default.createElement("div", null, "\u52A0\u8F7D\u4E2D...") : /* @__PURE__ */ React3__default.default.createElement(FestivalCardBook3D, { config })));
|
|
666
|
+
};
|
|
667
|
+
|
|
539
668
|
// src/festivalCard/server/db.ts
|
|
540
669
|
var dbAdapter = null;
|
|
541
670
|
var getFestivalCardDb = () => dbAdapter;
|
|
@@ -545,6 +674,16 @@ var FestivalCardService = class {
|
|
|
545
674
|
constructor(options) {
|
|
546
675
|
this.db = options?.db || getFestivalCardDb();
|
|
547
676
|
}
|
|
677
|
+
async listConfigs() {
|
|
678
|
+
if (!this.db) {
|
|
679
|
+
return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card", name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];
|
|
680
|
+
}
|
|
681
|
+
if (this.db.listConfigs) {
|
|
682
|
+
const list = await this.db.listConfigs();
|
|
683
|
+
return list.length > 0 ? list : [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card", name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];
|
|
684
|
+
}
|
|
685
|
+
return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card", name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];
|
|
686
|
+
}
|
|
548
687
|
async getConfig(cardId = "default-festival-card") {
|
|
549
688
|
if (!this.db) return DEFAULT_FESTIVAL_CARD_CONFIG;
|
|
550
689
|
const config = await this.db.getConfig(cardId);
|
|
@@ -556,21 +695,43 @@ var FestivalCardService = class {
|
|
|
556
695
|
await this.db.saveConfig(cardId, normalized);
|
|
557
696
|
return normalized;
|
|
558
697
|
}
|
|
698
|
+
async deleteConfig(cardId) {
|
|
699
|
+
if (!this.db?.deleteConfig) return;
|
|
700
|
+
await this.db.deleteConfig(cardId);
|
|
701
|
+
}
|
|
559
702
|
};
|
|
560
703
|
var memoryStore = /* @__PURE__ */ new Map();
|
|
704
|
+
var defaultId = DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card";
|
|
705
|
+
if (!memoryStore.has(defaultId)) {
|
|
706
|
+
memoryStore.set(defaultId, DEFAULT_FESTIVAL_CARD_CONFIG);
|
|
707
|
+
}
|
|
561
708
|
var createInMemoryFestivalCardDb = () => ({
|
|
709
|
+
listConfigs() {
|
|
710
|
+
return Promise.resolve(
|
|
711
|
+
Array.from(memoryStore.entries()).map(([id, config]) => ({
|
|
712
|
+
id,
|
|
713
|
+
name: config.name || id
|
|
714
|
+
}))
|
|
715
|
+
);
|
|
716
|
+
},
|
|
562
717
|
getConfig(id) {
|
|
563
718
|
return Promise.resolve(memoryStore.get(id) || null);
|
|
564
719
|
},
|
|
565
720
|
saveConfig(id, config) {
|
|
566
721
|
memoryStore.set(id, config);
|
|
567
722
|
return Promise.resolve();
|
|
723
|
+
},
|
|
724
|
+
deleteConfig(id) {
|
|
725
|
+
memoryStore.delete(id);
|
|
726
|
+
return Promise.resolve();
|
|
568
727
|
}
|
|
569
728
|
});
|
|
570
729
|
|
|
571
730
|
exports.DEFAULT_FESTIVAL_CARD_CONFIG = DEFAULT_FESTIVAL_CARD_CONFIG;
|
|
572
731
|
exports.FestivalCardBook3D = FestivalCardBook3D;
|
|
573
732
|
exports.FestivalCardConfigEditor = FestivalCardConfigEditor;
|
|
733
|
+
exports.FestivalCardConfigPage = FestivalCardConfigPage;
|
|
734
|
+
exports.FestivalCardManagedPage = FestivalCardManagedPage;
|
|
574
735
|
exports.FestivalCardPageRenderer = FestivalCardPageRenderer;
|
|
575
736
|
exports.FestivalCardService = FestivalCardService;
|
|
576
737
|
exports.FestivalCardStudio = FestivalCardStudio;
|