@akinon/next 2.0.0-beta.20 → 2.0.0-beta.22

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.
Files changed (64) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/api/auth.ts +292 -60
  3. package/bin/pz-install-plugins.js +1 -1
  4. package/package.json +3 -3
  5. package/types/index.ts +19 -6
  6. package/types/next-auth.d.ts +1 -1
  7. package/with-pz-config.js +8 -1
  8. package/components/theme-editor/blocks/accordion-block.tsx +0 -136
  9. package/components/theme-editor/blocks/block-renderer-registry.tsx +0 -77
  10. package/components/theme-editor/blocks/button-block.tsx +0 -593
  11. package/components/theme-editor/blocks/counter-block.tsx +0 -348
  12. package/components/theme-editor/blocks/divider-block.tsx +0 -20
  13. package/components/theme-editor/blocks/embed-block.tsx +0 -208
  14. package/components/theme-editor/blocks/group-block.tsx +0 -116
  15. package/components/theme-editor/blocks/hotspot-block.tsx +0 -147
  16. package/components/theme-editor/blocks/icon-block.tsx +0 -230
  17. package/components/theme-editor/blocks/image-block.tsx +0 -137
  18. package/components/theme-editor/blocks/image-gallery-block.tsx +0 -269
  19. package/components/theme-editor/blocks/input-block.tsx +0 -123
  20. package/components/theme-editor/blocks/link-block.tsx +0 -216
  21. package/components/theme-editor/blocks/lottie-block.tsx +0 -325
  22. package/components/theme-editor/blocks/map-block.tsx +0 -89
  23. package/components/theme-editor/blocks/slider-block.tsx +0 -595
  24. package/components/theme-editor/blocks/tab-block.tsx +0 -10
  25. package/components/theme-editor/blocks/text-block.tsx +0 -52
  26. package/components/theme-editor/blocks/video-block.tsx +0 -122
  27. package/components/theme-editor/components/action-toolbar.tsx +0 -305
  28. package/components/theme-editor/components/designer-overlay.tsx +0 -74
  29. package/components/theme-editor/components/with-designer-features.tsx +0 -142
  30. package/components/theme-editor/dynamic-font-loader.tsx +0 -79
  31. package/components/theme-editor/hooks/use-designer-features.tsx +0 -100
  32. package/components/theme-editor/hooks/use-external-designer.tsx +0 -95
  33. package/components/theme-editor/hooks/use-native-widget-data.ts +0 -188
  34. package/components/theme-editor/hooks/use-visibility-context.ts +0 -27
  35. package/components/theme-editor/placeholder-registry.ts +0 -31
  36. package/components/theme-editor/sections/before-after-section.tsx +0 -245
  37. package/components/theme-editor/sections/contact-form-section.tsx +0 -563
  38. package/components/theme-editor/sections/countdown-campaign-banner-section.tsx +0 -433
  39. package/components/theme-editor/sections/coupon-banner-section.tsx +0 -710
  40. package/components/theme-editor/sections/divider-section.tsx +0 -62
  41. package/components/theme-editor/sections/featured-product-spotlight-section.tsx +0 -507
  42. package/components/theme-editor/sections/find-in-store-section.tsx +0 -1995
  43. package/components/theme-editor/sections/hover-showcase-section.tsx +0 -326
  44. package/components/theme-editor/sections/image-hotspot-section.tsx +0 -142
  45. package/components/theme-editor/sections/installment-options-section.tsx +0 -1065
  46. package/components/theme-editor/sections/notification-banner-section.tsx +0 -173
  47. package/components/theme-editor/sections/order-tracking-lookup-section.tsx +0 -1379
  48. package/components/theme-editor/sections/posts-slider-section.tsx +0 -472
  49. package/components/theme-editor/sections/pre-order-launch-banner-section.tsx +0 -663
  50. package/components/theme-editor/sections/section-renderer-registry.tsx +0 -89
  51. package/components/theme-editor/sections/section-wrapper.tsx +0 -135
  52. package/components/theme-editor/sections/shipping-threshold-progress-section.tsx +0 -586
  53. package/components/theme-editor/sections/stats-counter-section.tsx +0 -486
  54. package/components/theme-editor/sections/tabs-section.tsx +0 -578
  55. package/components/theme-editor/theme-block.tsx +0 -102
  56. package/components/theme-editor/theme-placeholder-client.tsx +0 -218
  57. package/components/theme-editor/theme-placeholder-wrapper.tsx +0 -732
  58. package/components/theme-editor/theme-placeholder.tsx +0 -288
  59. package/components/theme-editor/theme-section.tsx +0 -1224
  60. package/components/theme-editor/theme-settings-context.tsx +0 -13
  61. package/components/theme-editor/utils/index.ts +0 -792
  62. package/components/theme-editor/utils/iterator-utils.ts +0 -234
  63. package/components/theme-editor/utils/publish-window.ts +0 -86
  64. package/components/theme-editor/utils/visibility-rules.ts +0 -188
@@ -1,288 +0,0 @@
1
- import 'server-only';
2
-
3
- import { getCollectionWidgetData, getWidgetData, getWidgetSchemaData } from '@akinon/next/data/server';
4
- import ThemePlaceholderWrapper from './theme-placeholder-wrapper';
5
- import { Section } from './theme-section';
6
- import { generateThemeCSS } from './utils';
7
-
8
- type ThemePlaceholderData = {
9
- theme_editor_placeholder: Array<{
10
- section_slug: string;
11
- order: number;
12
- }>;
13
- };
14
-
15
- interface ThemePlaceholderProps {
16
- slug: string;
17
- }
18
-
19
- export default async function ThemePlaceholder({
20
- slug
21
- }: ThemePlaceholderProps) {
22
- try {
23
- let dataSources: any[] = [];
24
- let themeSettings: Record<string, unknown> | null = null;
25
- try {
26
- const themeConfigData = await getWidgetData<any>({
27
- slug: 'theme-config'
28
- });
29
-
30
- if (themeConfigData?.attributes?.theme_dataSources) {
31
- try {
32
- const raw = themeConfigData.attributes.theme_dataSources;
33
- // Handle both plain string/array and { value: "..." } attribute format
34
- const resolved =
35
- typeof raw === 'string'
36
- ? raw
37
- : typeof raw === 'object' && raw !== null && !Array.isArray(raw)
38
- ? (raw as { value?: any }).value ?? raw
39
- : raw;
40
-
41
- if (typeof resolved === 'string') {
42
- dataSources = JSON.parse(resolved);
43
- } else if (Array.isArray(resolved)) {
44
- dataSources = resolved;
45
- }
46
- } catch (e) {
47
- console.error('Failed to parse theme_dataSources:', e);
48
- }
49
- }
50
-
51
- if (themeConfigData?.attributes?.theme_settings) {
52
- try {
53
- const rawSettings = themeConfigData.attributes.theme_settings;
54
- const resolvedValue =
55
- typeof rawSettings === 'string'
56
- ? rawSettings
57
- : typeof rawSettings === 'object' && rawSettings !== null
58
- ? (rawSettings as { value?: string }).value ?? rawSettings
59
- : null;
60
-
61
- if (resolvedValue) {
62
- if (typeof resolvedValue === 'string') {
63
- themeSettings = JSON.parse(resolvedValue);
64
- } else if (typeof resolvedValue === 'object') {
65
- themeSettings = resolvedValue as Record<string, unknown>;
66
- }
67
- }
68
- } catch (e) {
69
- console.error('Failed to parse theme_settings:', e);
70
- }
71
- }
72
- } catch (configError) {}
73
-
74
- const data = await getWidgetData<ThemePlaceholderData>({
75
- slug
76
- });
77
-
78
- const sections: Section[] = [];
79
-
80
- if (data?.attributes?.theme_editor_placeholder) {
81
- let placeholderData = data.attributes.theme_editor_placeholder;
82
-
83
- if (
84
- typeof placeholderData === 'object' &&
85
- placeholderData !== null &&
86
- 'value' in placeholderData
87
- ) {
88
- placeholderData = (
89
- placeholderData as {
90
- value: { section_slug: string; order: number }[];
91
- }
92
- ).value;
93
- }
94
-
95
- if (typeof placeholderData === 'string') {
96
- try {
97
- placeholderData = JSON.parse(placeholderData);
98
- } catch {
99
- placeholderData = [];
100
- }
101
- }
102
-
103
- if (!Array.isArray(placeholderData)) {
104
- placeholderData = [];
105
- }
106
-
107
- const sectionPromises = placeholderData.map(async (item: any) => {
108
- try {
109
- const sectionSlug = item.value?.section_slug || item.section_slug;
110
- const sectionOrder = item.value?.order ?? item.order ?? 0;
111
-
112
- if (!sectionSlug) {
113
- return null;
114
- }
115
-
116
- const [regularSectionData, sectionSchema] = await Promise.all([
117
- getWidgetData<any>({
118
- slug: sectionSlug
119
- }),
120
- getWidgetSchemaData<any>({
121
- widgetSlug: sectionSlug
122
- })
123
- ]);
124
-
125
- let sectionData = regularSectionData;
126
- if (!sectionData) {
127
- try {
128
- sectionData = await getCollectionWidgetData<any>({
129
- slug: sectionSlug
130
- });
131
- } catch {
132
- // Not a collection widget either; sectionData stays null
133
- }
134
- }
135
-
136
- const sectionSchemaEntry = sectionSchema?.schema?.[sectionSlug];
137
- const sectionMetadata = sectionSchemaEntry?.metadata || {};
138
-
139
- const getBlockValue = (blockId: string): unknown => {
140
- const attrData = sectionData?.attributes?.[blockId];
141
- if (attrData === undefined || attrData === null) return undefined;
142
-
143
- if (typeof attrData === 'string') {
144
- try {
145
- return JSON.parse(attrData);
146
- } catch {
147
- return attrData;
148
- }
149
- } else if (typeof attrData === 'object' && 'value' in attrData) {
150
- return attrData.value;
151
- }
152
- return attrData;
153
- };
154
-
155
- const reconstructBlock = (blockSchema: any): any => {
156
- return {
157
- id: blockSchema.id,
158
- type: blockSchema.type || 'text',
159
- label: blockSchema.label || blockSchema.id,
160
- order: blockSchema.order || 0,
161
- isIterator: blockSchema.isIterator,
162
- iteratorDataPath: blockSchema.iteratorDataPath,
163
- value: getBlockValue(blockSchema.id),
164
- styles: blockSchema.styles || {},
165
- properties: blockSchema.properties || {},
166
- hidden: blockSchema.hidden || false,
167
- blocks: (blockSchema.blocks || []).map((b: any) =>
168
- reconstructBlock(b)
169
- )
170
- };
171
- };
172
-
173
- const blocks: any[] = [];
174
- if (sectionMetadata.blocks && Array.isArray(sectionMetadata.blocks)) {
175
- sectionMetadata.blocks.forEach((blockSchema: any) => {
176
- blocks.push(reconstructBlock(blockSchema));
177
- });
178
- }
179
-
180
- blocks.sort((a, b) => a.order - b.order);
181
-
182
- // dataSourceId may be stored in schema metadata OR in widget data attributes
183
- // (theme editor saves it as a widget attribute when user selects a data source)
184
- const dataSourceId =
185
- sectionMetadata.dataSourceId ||
186
- (getBlockValue('dataSourceId') as string | undefined) ||
187
- (getBlockValue('selectedDataSourceId') as string | undefined);
188
-
189
- const dataSource = dataSourceId
190
- ? dataSources.find((ds) => ds.id === dataSourceId)
191
- : undefined;
192
-
193
- let dataSourceWithData = dataSource;
194
- if (dataSource && dataSource.details) {
195
- // Only fetch collection data if we have a valid widget slug
196
- // (not the section's own slug which contains config, not products)
197
- const collectionSlug = dataSource.details.collection?.slug;
198
- if (collectionSlug) {
199
- try {
200
- let collectionData = await getWidgetData<{
201
- [key: string]: unknown;
202
- }>({
203
- slug: collectionSlug
204
- });
205
-
206
- if (!collectionData) {
207
- collectionData = await getCollectionWidgetData<{
208
- [key: string]: unknown;
209
- }>({
210
- slug: collectionSlug
211
- });
212
- }
213
-
214
- if (collectionData) {
215
- dataSourceWithData = {
216
- ...dataSource,
217
- details: {
218
- ...dataSource.details,
219
- collection: {
220
- ...dataSource.details.collection,
221
- data: collectionData
222
- }
223
- }
224
- };
225
- }
226
- } catch (error) {
227
- console.error(
228
- `Error fetching widget data for section ${sectionSlug}:`,
229
- error
230
- );
231
- }
232
- }
233
- // If no collection slug, the saved products from editor
234
- // (details.collection.products) will be used as fallback
235
- }
236
-
237
- const section: Section = {
238
- id: sectionSlug,
239
- type: sectionMetadata.type || 'default',
240
- name: sectionMetadata.name || sectionSlug,
241
- label: sectionMetadata.label || sectionSlug,
242
- properties: sectionMetadata.properties || {},
243
- styles: sectionMetadata.styles || {},
244
- blocks,
245
- order: sectionOrder,
246
- hidden: sectionMetadata.hidden || false,
247
- dataSourceId,
248
- dataSource: dataSourceWithData
249
- };
250
-
251
- return section;
252
- } catch (error) {
253
- const errorSlug =
254
- item.value?.section_slug || item.section_slug || 'unknown';
255
- console.error(
256
- `Error parsing section metadata for ${errorSlug}:`,
257
- error
258
- );
259
- return null;
260
- }
261
- });
262
-
263
- const resolvedSections = await Promise.all(sectionPromises);
264
- sections.push(
265
- ...resolvedSections.filter((s): s is Section => s !== null)
266
- );
267
- }
268
-
269
- const themeCSS = generateThemeCSS(sections);
270
-
271
- return (
272
- <>
273
- {themeCSS && <style dangerouslySetInnerHTML={{ __html: themeCSS }} />}
274
- <ThemePlaceholderWrapper
275
- slug={slug}
276
- initialSections={sections}
277
- initialPlaceholderId={data?.slug?.toString() || ''}
278
- isDesignMode={false}
279
- dataSources={dataSources}
280
- initialThemeSettings={themeSettings}
281
- />
282
- </>
283
- );
284
- } catch (error) {
285
- console.error(`Error fetching theme placeholder data for ${slug}:`, error);
286
- return null;
287
- }
288
- }