@jhits/plugin-blog 0.0.18 → 0.0.20
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/api/categories.d.ts.map +1 -1
- package/dist/api/categories.js +42 -38
- package/dist/api/handler.d.ts +1 -26
- package/dist/api/handler.d.ts.map +1 -1
- package/dist/api/handler.js +81 -500
- package/dist/api/router.d.ts +0 -5
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +8 -35
- package/dist/api/service.d.ts +80 -0
- package/dist/api/service.d.ts.map +1 -0
- package/dist/api/service.js +219 -0
- package/dist/hooks/useAutoSave.d.ts +10 -0
- package/dist/hooks/useAutoSave.d.ts.map +1 -0
- package/dist/hooks/useAutoSave.js +57 -0
- package/dist/hooks/useCategories.d.ts +1 -1
- package/dist/hooks/useCategories.d.ts.map +1 -1
- package/dist/hooks/useCategories.js +15 -46
- package/dist/index.d.ts +24 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -201
- package/dist/init.d.ts +20 -7
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +8 -7
- package/dist/lib/blocks/BlockRenderer.d.ts.map +1 -1
- package/dist/lib/layouts/blocks/ColumnsBlock.d.ts.map +1 -1
- package/dist/lib/layouts/blocks/ColumnsBlock.js +30 -113
- package/dist/lib/layouts/blocks/SectionBlock.d.ts.map +1 -1
- package/dist/lib/layouts/blocks/SectionBlock.js +9 -21
- package/dist/lib/layouts/index.d.ts +3 -3
- package/dist/lib/layouts/index.js +4 -4
- package/dist/lib/mappers/apiMapper.d.ts +10 -0
- package/dist/lib/mappers/apiMapper.d.ts.map +1 -1
- package/dist/lib/mappers/apiMapper.js +47 -32
- package/dist/lib/rich-text/RichTextEditor.d.ts +4 -2
- package/dist/lib/rich-text/RichTextEditor.d.ts.map +1 -1
- package/dist/lib/rich-text/RichTextEditor.js +12 -9
- package/dist/lib/utils/config-resolver.d.ts +28 -0
- package/dist/lib/utils/config-resolver.d.ts.map +1 -0
- package/dist/lib/utils/config-resolver.js +46 -0
- package/dist/lib/utils/tree.d.ts +29 -0
- package/dist/lib/utils/tree.d.ts.map +1 -0
- package/dist/lib/utils/tree.js +129 -0
- package/dist/state/EditorContext.d.ts +3 -25
- package/dist/state/EditorContext.d.ts.map +1 -1
- package/dist/state/EditorContext.js +124 -174
- package/dist/state/reducer.d.ts +1 -5
- package/dist/state/reducer.d.ts.map +1 -1
- package/dist/state/reducer.js +128 -521
- package/dist/state/types.d.ts +12 -1
- package/dist/state/types.d.ts.map +1 -1
- package/dist/types/block.d.ts +9 -0
- package/dist/types/block.d.ts.map +1 -1
- package/dist/types/post.d.ts +17 -1
- package/dist/types/post.d.ts.map +1 -1
- package/dist/views/CanvasEditor/BlockWrapper.d.ts +5 -6
- package/dist/views/CanvasEditor/BlockWrapper.d.ts.map +1 -1
- package/dist/views/CanvasEditor/BlockWrapper.js +56 -264
- package/dist/views/CanvasEditor/CanvasEditorView.d.ts +5 -3
- package/dist/views/CanvasEditor/CanvasEditorView.d.ts.map +1 -1
- package/dist/views/CanvasEditor/CanvasEditorView.js +55 -315
- package/dist/views/CanvasEditor/EditorBody.d.ts +6 -8
- package/dist/views/CanvasEditor/EditorBody.d.ts.map +1 -1
- package/dist/views/CanvasEditor/EditorBody.js +34 -482
- package/dist/views/CanvasEditor/EditorHeader.d.ts.map +1 -1
- package/dist/views/CanvasEditor/EditorHeader.js +27 -63
- package/dist/views/CanvasEditor/LayoutContainer.d.ts.map +1 -1
- package/dist/views/CanvasEditor/LayoutContainer.js +49 -70
- package/dist/views/CanvasEditor/components/CustomBlockItem.js +1 -1
- package/dist/views/CanvasEditor/components/EditorCanvas.d.ts +15 -3
- package/dist/views/CanvasEditor/components/EditorCanvas.d.ts.map +1 -1
- package/dist/views/CanvasEditor/components/EditorCanvas.js +40 -18
- package/dist/views/CanvasEditor/components/EditorLibrary.d.ts +5 -1
- package/dist/views/CanvasEditor/components/EditorLibrary.d.ts.map +1 -1
- package/dist/views/CanvasEditor/components/EditorLibrary.js +11 -7
- package/dist/views/CanvasEditor/components/EditorSidebar.d.ts.map +1 -1
- package/dist/views/CanvasEditor/components/EditorSidebar.js +32 -14
- package/dist/views/CanvasEditor/components/FeaturedMediaSection.d.ts +0 -6
- package/dist/views/CanvasEditor/components/FeaturedMediaSection.d.ts.map +1 -1
- package/dist/views/CanvasEditor/components/FeaturedMediaSection.js +17 -128
- package/dist/views/CanvasEditor/components/JSONInspector.d.ts +9 -0
- package/dist/views/CanvasEditor/components/JSONInspector.d.ts.map +1 -0
- package/dist/views/CanvasEditor/components/JSONInspector.js +56 -0
- package/dist/views/CanvasEditor/components/LibraryItem.js +2 -2
- package/dist/views/CanvasEditor/components/PrivacySettingsSection.d.ts +0 -4
- package/dist/views/CanvasEditor/components/PrivacySettingsSection.d.ts.map +1 -1
- package/dist/views/CanvasEditor/components/PrivacySettingsSection.js +6 -28
- package/dist/views/CanvasEditor/components/index.d.ts +2 -0
- package/dist/views/CanvasEditor/components/index.d.ts.map +1 -1
- package/dist/views/CanvasEditor/components/index.js +1 -0
- package/dist/views/CanvasEditor/hooks/useHeroBlock.d.ts.map +1 -1
- package/dist/views/CanvasEditor/hooks/useHeroBlock.js +15 -18
- package/dist/views/CanvasEditor/hooks/usePostLoader.d.ts +3 -0
- package/dist/views/CanvasEditor/hooks/usePostLoader.d.ts.map +1 -1
- package/dist/views/CanvasEditor/hooks/usePostLoader.js +12 -13
- package/dist/views/CanvasEditor/hooks/useUnsavedChanges.js +0 -4
- package/dist/views/PostManager/EmptyState.d.ts +1 -1
- package/dist/views/PostManager/EmptyState.js +4 -4
- package/dist/views/PostManager/FilterDropdown.d.ts +21 -0
- package/dist/views/PostManager/FilterDropdown.d.ts.map +1 -0
- package/dist/views/PostManager/FilterDropdown.js +28 -0
- package/dist/views/PostManager/LanguageFlags.d.ts.map +1 -1
- package/dist/views/PostManager/LanguageFlags.js +4 -1
- package/dist/views/PostManager/PostCards.d.ts.map +1 -1
- package/dist/views/PostManager/PostCards.js +23 -40
- package/dist/views/PostManager/PostFilters.d.ts.map +1 -1
- package/dist/views/PostManager/PostFilters.js +34 -3
- package/dist/views/PostManager/PostManagerView.d.ts +1 -2
- package/dist/views/PostManager/PostManagerView.d.ts.map +1 -1
- package/dist/views/PostManager/PostManagerView.js +30 -96
- package/dist/views/PostManager/PostStats.d.ts.map +1 -1
- package/dist/views/PostManager/PostStats.js +10 -10
- package/dist/views/PostManager/PostTable.d.ts.map +1 -1
- package/dist/views/PostManager/PostTable.js +23 -40
- package/dist/views/Settings/SettingsView.d.ts +1 -1
- package/dist/views/Settings/SettingsView.d.ts.map +1 -1
- package/dist/views/Settings/SettingsView.js +12 -39
- package/dist/views/SlugSEO/SlugSEOManagerView.d.ts.map +1 -1
- package/dist/views/SlugSEO/SlugSEOManagerView.js +2 -2
- package/package.json +42 -6
- package/src/api/categories.ts +48 -52
- package/src/api/handler.ts +87 -604
- package/src/api/router.ts +15 -65
- package/src/api/service.ts +241 -0
- package/src/hooks/useAutoSave.ts +64 -0
- package/src/hooks/useCategories.ts +19 -47
- package/src/index.tsx +79 -293
- package/src/init.tsx +24 -11
- package/src/lib/blocks/BlockRenderer.tsx +1 -0
- package/src/lib/layouts/blocks/ColumnsBlock.tsx +60 -173
- package/src/lib/layouts/blocks/SectionBlock.tsx +22 -26
- package/src/lib/layouts/index.ts +4 -4
- package/src/lib/mappers/apiMapper.ts +63 -32
- package/src/lib/rich-text/RichTextEditor.tsx +16 -9
- package/src/lib/utils/config-resolver.ts +64 -0
- package/src/lib/utils/tree.ts +150 -0
- package/src/state/EditorContext.tsx +153 -232
- package/src/state/reducer.ts +141 -606
- package/src/state/types.ts +14 -1
- package/src/types/block.ts +10 -0
- package/src/types/post.ts +19 -1
- package/src/views/CanvasEditor/BlockWrapper.tsx +130 -460
- package/src/views/CanvasEditor/CanvasEditorView.tsx +145 -420
- package/src/views/CanvasEditor/EditorBody.tsx +98 -610
- package/src/views/CanvasEditor/EditorHeader.tsx +176 -196
- package/src/views/CanvasEditor/LayoutContainer.tsx +74 -89
- package/src/views/CanvasEditor/components/CustomBlockItem.tsx +7 -8
- package/src/views/CanvasEditor/components/EditorCanvas.tsx +139 -84
- package/src/views/CanvasEditor/components/EditorLibrary.tsx +25 -10
- package/src/views/CanvasEditor/components/EditorSidebar.tsx +196 -127
- package/src/views/CanvasEditor/components/FeaturedMediaSection.tsx +78 -210
- package/src/views/CanvasEditor/components/JSONInspector.tsx +125 -0
- package/src/views/CanvasEditor/components/LibraryItem.tsx +5 -6
- package/src/views/CanvasEditor/components/PrivacySettingsSection.tsx +73 -124
- package/src/views/CanvasEditor/components/index.ts +2 -1
- package/src/views/CanvasEditor/hooks/useHeroBlock.ts +15 -18
- package/src/views/CanvasEditor/hooks/usePostLoader.ts +21 -13
- package/src/views/CanvasEditor/hooks/useUnsavedChanges.ts +4 -4
- package/src/views/PostManager/EmptyState.tsx +9 -10
- package/src/views/PostManager/FilterDropdown.tsx +95 -0
- package/src/views/PostManager/LanguageFlags.tsx +6 -2
- package/src/views/PostManager/PostCards.tsx +127 -133
- package/src/views/PostManager/PostFilters.tsx +73 -68
- package/src/views/PostManager/PostManagerView.tsx +132 -179
- package/src/views/PostManager/PostStats.tsx +21 -20
- package/src/views/PostManager/PostTable.tsx +137 -165
- package/src/views/Settings/SettingsView.tsx +64 -180
- package/src/views/SlugSEO/SlugSEOManagerView.tsx +59 -44
- package/src/hooks/index.d.ts +0 -8
- package/src/hooks/index.d.ts.map +0 -1
- package/src/hooks/useBlog.d.ts +0 -31
- package/src/hooks/useBlog.d.ts.map +0 -1
- package/src/hooks/useBlogs.d.ts +0 -39
- package/src/hooks/useBlogs.d.ts.map +0 -1
- package/src/hooks/useCategories.d.ts +0 -9
- package/src/hooks/useCategories.d.ts.map +0 -1
- package/src/lib/blocks/BlockRenderer.d.ts +0 -54
- package/src/lib/blocks/BlockRenderer.d.ts.map +0 -1
- package/src/lib/config-storage.d.ts +0 -30
- package/src/lib/config-storage.d.ts.map +0 -1
- package/src/lib/layouts/blocks/ColumnsBlock.d.ts +0 -25
- package/src/lib/layouts/blocks/ColumnsBlock.d.ts.map +0 -1
- package/src/lib/layouts/blocks/SectionBlock.d.ts +0 -25
- package/src/lib/layouts/blocks/SectionBlock.d.ts.map +0 -1
- package/src/lib/layouts/index.d.ts +0 -23
- package/src/lib/layouts/index.d.ts.map +0 -1
- package/src/lib/layouts/registerLayoutBlocks.d.ts +0 -9
- package/src/lib/layouts/registerLayoutBlocks.d.ts.map +0 -1
- package/src/lib/mappers/apiMapper.d.ts +0 -66
- package/src/lib/mappers/apiMapper.d.ts.map +0 -1
- package/src/lib/rich-text/RichTextEditor.d.ts +0 -45
- package/src/lib/rich-text/RichTextEditor.d.ts.map +0 -1
- package/src/lib/rich-text/RichTextPreview.d.ts +0 -16
- package/src/lib/rich-text/RichTextPreview.d.ts.map +0 -1
- package/src/lib/rich-text/index.d.ts +0 -9
- package/src/lib/rich-text/index.d.ts.map +0 -1
- package/src/lib/utils/blockHelpers.d.ts +0 -23
- package/src/lib/utils/blockHelpers.d.ts.map +0 -1
- package/src/lib/utils/configValidation.d.ts +0 -23
- package/src/lib/utils/configValidation.d.ts.map +0 -1
- package/src/registry/BlockRegistry.d.ts +0 -62
- package/src/registry/BlockRegistry.d.ts.map +0 -1
- package/src/registry/index.d.ts +0 -6
- package/src/registry/index.d.ts.map +0 -1
- package/src/state/EditorContext.d.ts +0 -45
- package/src/state/EditorContext.d.ts.map +0 -1
- package/src/state/index.d.ts +0 -7
- package/src/state/index.d.ts.map +0 -1
- package/src/state/reducer.d.ts +0 -11
- package/src/state/reducer.d.ts.map +0 -1
- package/src/state/types.d.ts +0 -162
- package/src/state/types.d.ts.map +0 -1
- package/src/types/block.d.ts +0 -221
- package/src/types/block.d.ts.map +0 -1
- package/src/types/index.d.ts +0 -8
- package/src/types/index.d.ts.map +0 -1
- package/src/types/post.d.ts +0 -136
- package/src/types/post.d.ts.map +0 -1
- package/src/utils/client.d.ts +0 -48
- package/src/utils/client.d.ts.map +0 -1
- package/src/views/CanvasEditor/BlockWrapper.d.ts +0 -16
- package/src/views/CanvasEditor/BlockWrapper.d.ts.map +0 -1
- package/src/views/CanvasEditor/CanvasEditorView.d.ts +0 -14
- package/src/views/CanvasEditor/CanvasEditorView.d.ts.map +0 -1
- package/src/views/CanvasEditor/EditorBody.d.ts +0 -22
- package/src/views/CanvasEditor/EditorBody.d.ts.map +0 -1
- package/src/views/CanvasEditor/EditorHeader.d.ts +0 -18
- package/src/views/CanvasEditor/EditorHeader.d.ts.map +0 -1
- package/src/views/CanvasEditor/LayoutContainer.d.ts +0 -17
- package/src/views/CanvasEditor/LayoutContainer.d.ts.map +0 -1
- package/src/views/CanvasEditor/SaveConfirmationModal.d.ts +0 -13
- package/src/views/CanvasEditor/SaveConfirmationModal.d.ts.map +0 -1
- package/src/views/CanvasEditor/components/CustomBlockItem.d.ts +0 -14
- package/src/views/CanvasEditor/components/CustomBlockItem.d.ts.map +0 -1
- package/src/views/CanvasEditor/components/EditorCanvas.d.ts +0 -29
- package/src/views/CanvasEditor/components/EditorCanvas.d.ts.map +0 -1
- package/src/views/CanvasEditor/components/EditorLibrary.d.ts +0 -7
- package/src/views/CanvasEditor/components/EditorLibrary.d.ts.map +0 -1
- package/src/views/CanvasEditor/components/EditorSidebar.d.ts +0 -13
- package/src/views/CanvasEditor/components/EditorSidebar.d.ts.map +0 -1
- package/src/views/CanvasEditor/components/ErrorBanner.d.ts +0 -6
- package/src/views/CanvasEditor/components/ErrorBanner.d.ts.map +0 -1
- package/src/views/CanvasEditor/components/FeaturedMediaSection.d.ts +0 -25
- package/src/views/CanvasEditor/components/FeaturedMediaSection.d.ts.map +0 -1
- package/src/views/CanvasEditor/components/LibraryItem.d.ts +0 -14
- package/src/views/CanvasEditor/components/LibraryItem.d.ts.map +0 -1
- package/src/views/CanvasEditor/components/PrivacySettingsSection.d.ts +0 -15
- package/src/views/CanvasEditor/components/PrivacySettingsSection.d.ts.map +0 -1
- package/src/views/CanvasEditor/components/index.d.ts +0 -21
- package/src/views/CanvasEditor/components/index.d.ts.map +0 -1
- package/src/views/CanvasEditor/hooks/index.d.ts +0 -10
- package/src/views/CanvasEditor/hooks/index.d.ts.map +0 -1
- package/src/views/CanvasEditor/hooks/useHeroBlock.d.ts +0 -8
- package/src/views/CanvasEditor/hooks/useHeroBlock.d.ts.map +0 -1
- package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts +0 -3
- package/src/views/CanvasEditor/hooks/useKeyboardShortcuts.d.ts.map +0 -1
- package/src/views/CanvasEditor/hooks/usePostLoader.d.ts +0 -5
- package/src/views/CanvasEditor/hooks/usePostLoader.d.ts.map +0 -1
- package/src/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts +0 -2
- package/src/views/CanvasEditor/hooks/useRegisteredBlocks.d.ts.map +0 -1
- package/src/views/CanvasEditor/hooks/useUnsavedChanges.d.ts +0 -25
- package/src/views/CanvasEditor/hooks/useUnsavedChanges.d.ts.map +0 -1
- package/src/views/CanvasEditor/index.d.ts +0 -16
- package/src/views/CanvasEditor/index.d.ts.map +0 -1
- package/src/views/PostManager/EmptyState.d.ts +0 -10
- package/src/views/PostManager/EmptyState.d.ts.map +0 -1
- package/src/views/PostManager/PostActionsMenu.d.ts +0 -12
- package/src/views/PostManager/PostActionsMenu.d.ts.map +0 -1
- package/src/views/PostManager/PostCards.d.ts +0 -15
- package/src/views/PostManager/PostCards.d.ts.map +0 -1
- package/src/views/PostManager/PostFilters.d.ts +0 -16
- package/src/views/PostManager/PostFilters.d.ts.map +0 -1
- package/src/views/PostManager/PostManagerView.d.ts +0 -11
- package/src/views/PostManager/PostManagerView.d.ts.map +0 -1
- package/src/views/PostManager/PostStats.d.ts +0 -11
- package/src/views/PostManager/PostStats.d.ts.map +0 -1
- package/src/views/PostManager/PostTable.d.ts +0 -15
- package/src/views/PostManager/PostTable.d.ts.map +0 -1
- package/src/views/PostManager/index.d.ts +0 -12
- package/src/views/PostManager/index.d.ts.map +0 -1
- package/src/views/Preview/PreviewBridgeView.d.ts +0 -12
- package/src/views/Preview/PreviewBridgeView.d.ts.map +0 -1
- package/src/views/Preview/index.d.ts +0 -6
- package/src/views/Preview/index.d.ts.map +0 -1
- package/src/views/Settings/SettingsView.d.ts +0 -10
- package/src/views/Settings/SettingsView.d.ts.map +0 -1
- package/src/views/Settings/index.d.ts +0 -6
- package/src/views/Settings/index.d.ts.map +0 -1
- package/src/views/SlugSEO/SlugSEOManagerView.d.ts +0 -12
- package/src/views/SlugSEO/SlugSEOManagerView.d.ts.map +0 -1
- package/src/views/SlugSEO/index.d.ts +0 -6
- package/src/views/SlugSEO/index.d.ts.map +0 -1
|
@@ -1,341 +1,81 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState, useEffect
|
|
3
|
+
import { useState, useEffect } from 'react';
|
|
4
4
|
import { useEditor } from '../../state/EditorContext';
|
|
5
5
|
import { EditorHeader } from './EditorHeader';
|
|
6
6
|
import { ErrorBanner } from './components/ErrorBanner';
|
|
7
7
|
import { EditorLibrary } from './components/EditorLibrary';
|
|
8
|
-
import { EditorCanvas } from './components/EditorCanvas';
|
|
9
8
|
import { EditorSidebar } from './components/EditorSidebar';
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
import { EditorCanvas } from './components/EditorCanvas';
|
|
10
|
+
import { JSONInspector } from './components/JSONInspector';
|
|
11
|
+
import { useRegisteredBlocks } from './hooks/useRegisteredBlocks';
|
|
12
|
+
import { useAutoSave } from '../../hooks/useAutoSave';
|
|
13
|
+
import { usePostLoader } from './hooks/usePostLoader';
|
|
14
|
+
import { RefreshCw } from 'lucide-react';
|
|
15
|
+
export function CanvasEditorView({ postId, siteId, locale, initialData, availableLanguages = [], darkMode = false, backgroundColors, LayoutWrapper }) {
|
|
16
|
+
const { state, dispatch, helpers, availableLanguages: contextLanguages } = useEditor();
|
|
17
|
+
const registeredBlocks = useRegisteredBlocks();
|
|
16
18
|
const [isLibraryOpen, setLibraryOpen] = useState(true);
|
|
19
|
+
const [isSidebarOpen, setSidebarOpen] = useState(true);
|
|
17
20
|
const [isPreviewMode, setIsPreviewMode] = useState(false);
|
|
18
21
|
const [isSaving, setIsSaving] = useState(false);
|
|
19
22
|
const [saveError, setSaveError] = useState(null);
|
|
20
|
-
//
|
|
21
|
-
const [primaryLanguage, setPrimaryLanguage] = useState(locale || 'en');
|
|
22
|
-
const [isLoadingLanguage, setIsLoadingLanguage] = useState(true);
|
|
23
|
-
const [availableLanguages, setAvailableLanguages] = useState([locale || 'en']);
|
|
24
|
-
const [currentLanguage, setCurrentLanguage] = useState(locale || 'en');
|
|
25
|
-
// Get registered blocks
|
|
26
|
-
const registeredBlocks = useRegisteredBlocks();
|
|
27
|
-
// Hero block management
|
|
28
|
-
const { heroBlock, setHeroBlock, heroBlockDefinition } = useHeroBlock(state, registeredBlocks);
|
|
29
|
-
// Post loading - wait for language settings to be loaded first
|
|
30
|
-
const { isLoadingPost } = usePostLoader(postId, state.postId, (post) => {
|
|
31
|
-
helpers.loadPost(post);
|
|
32
|
-
// Don't reset current language when loading - preserve user's selection
|
|
33
|
-
// This allows switching to a new language even if no content exists yet
|
|
34
|
-
// Update available languages from post's languages object
|
|
35
|
-
if (post.languages && Object.keys(post.languages).length > 0) {
|
|
36
|
-
const langs = Object.keys(post.languages);
|
|
37
|
-
// Add current language to available if not already there
|
|
38
|
-
if (!langs.includes(currentLanguage)) {
|
|
39
|
-
langs.push(currentLanguage);
|
|
40
|
-
}
|
|
41
|
-
setAvailableLanguages(langs);
|
|
42
|
-
}
|
|
43
|
-
// After loading, ensure we're marked as clean
|
|
44
|
-
// Use setTimeout to ensure this runs after the reducer has processed LOAD_POST
|
|
45
|
-
setTimeout(() => {
|
|
46
|
-
dispatch({ type: 'MARK_CLEAN' });
|
|
47
|
-
}, 0);
|
|
48
|
-
}, () => setHeroBlock(null), !isLoadingLanguage ? currentLanguage : undefined);
|
|
49
|
-
// Sync currentLanguage to editor state on mount so onSave always knows the active language
|
|
50
|
-
useEffect(() => {
|
|
51
|
-
dispatch({ type: 'SET_CURRENT_LANGUAGE', payload: currentLanguage });
|
|
52
|
-
}, []); // eslint-disable-line react-hooks/exhaustive-deps -- only on mount
|
|
53
|
-
// Fetch primary language from settings (simulated - in real app would come from config)
|
|
23
|
+
// Ensure currentLanguage is always set from the locale prop
|
|
54
24
|
useEffect(() => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
// Use the locale prop as the initial language
|
|
58
|
-
// Only set this once on initial load, don't override if user already selected a language
|
|
59
|
-
if (!currentLanguage || currentLanguage === 'en') {
|
|
60
|
-
setPrimaryLanguage(locale || 'nl');
|
|
61
|
-
if (!availableLanguages.includes(locale || 'nl')) {
|
|
62
|
-
setAvailableLanguages([locale || 'nl']);
|
|
63
|
-
}
|
|
64
|
-
setCurrentLanguage(locale || 'nl');
|
|
65
|
-
dispatch({ type: 'SET_CURRENT_LANGUAGE', payload: locale || 'nl' });
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
console.error('Failed to fetch language settings:', error);
|
|
70
|
-
}
|
|
71
|
-
finally {
|
|
72
|
-
setIsLoadingLanguage(false);
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
fetchLanguageSettings();
|
|
76
|
-
}, []); // Empty dependency - only run once on mount
|
|
77
|
-
// Handle language change
|
|
78
|
-
const handleLanguageChange = async (newLanguage) => {
|
|
79
|
-
// Save current content first if dirty
|
|
80
|
-
if (state.isDirty) {
|
|
81
|
-
const confirmed = window.confirm('You have unsaved changes. Do you want to save them first?');
|
|
82
|
-
if (confirmed) {
|
|
83
|
-
await handleSave();
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
setCurrentLanguage(newLanguage);
|
|
87
|
-
dispatch({ type: 'SET_CURRENT_LANGUAGE', payload: newLanguage });
|
|
88
|
-
// Reload with new language
|
|
89
|
-
if (postId) {
|
|
90
|
-
try {
|
|
91
|
-
const response = await fetch(`/api/plugin-blog/${postId}?language=${newLanguage}`);
|
|
92
|
-
if (response && response.ok) {
|
|
93
|
-
const apiDoc = await response.json();
|
|
94
|
-
// Manually update state instead of going through loadPost
|
|
95
|
-
// This avoids re-triggering the usePostLoader hook
|
|
96
|
-
const blocks = apiDoc.contentBlocks || apiDoc.blocks || [];
|
|
97
|
-
dispatch({ type: 'SET_TITLE', payload: apiDoc.title || '' });
|
|
98
|
-
// Replace all blocks
|
|
99
|
-
// First clear, then set new blocks via LOAD_POST-like behavior
|
|
100
|
-
// We use a custom dispatch to update blocks without resetting postId
|
|
101
|
-
dispatch({
|
|
102
|
-
type: 'LOAD_POST',
|
|
103
|
-
payload: {
|
|
104
|
-
id: state.postId || apiDoc._id || apiDoc.id,
|
|
105
|
-
title: apiDoc.title || '',
|
|
106
|
-
slug: apiDoc.slug || state.slug,
|
|
107
|
-
blocks: blocks,
|
|
108
|
-
seo: apiDoc.seo || {},
|
|
109
|
-
publication: {
|
|
110
|
-
status: apiDoc.publicationData?.status === 'concept' ? 'draft' : (apiDoc.publicationData?.status || state.status),
|
|
111
|
-
date: apiDoc.publicationData?.date,
|
|
112
|
-
authorId: apiDoc.authorId,
|
|
113
|
-
},
|
|
114
|
-
metadata: {
|
|
115
|
-
featuredImage: apiDoc.image ? {
|
|
116
|
-
id: apiDoc.image.id || apiDoc.image.src,
|
|
117
|
-
alt: apiDoc.image.alt,
|
|
118
|
-
isCustom: apiDoc.image.isCustom,
|
|
119
|
-
} : state.metadata?.featuredImage,
|
|
120
|
-
categories: apiDoc.categoryTags?.category ? [apiDoc.categoryTags.category] : [],
|
|
121
|
-
tags: apiDoc.categoryTags?.tags || [],
|
|
122
|
-
excerpt: apiDoc.summary || '',
|
|
123
|
-
lang: newLanguage,
|
|
124
|
-
},
|
|
125
|
-
languages: apiDoc.languages,
|
|
126
|
-
createdAt: apiDoc.createdAt || new Date().toISOString(),
|
|
127
|
-
updatedAt: apiDoc.updatedAt || new Date().toISOString(),
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
// Update available languages
|
|
131
|
-
if (apiDoc.availableLanguages) {
|
|
132
|
-
const langs = [...apiDoc.availableLanguages];
|
|
133
|
-
if (!langs.includes(newLanguage)) {
|
|
134
|
-
langs.push(newLanguage);
|
|
135
|
-
}
|
|
136
|
-
setAvailableLanguages(langs);
|
|
137
|
-
}
|
|
138
|
-
// Reset hero block so it re-initializes from new blocks
|
|
139
|
-
setHeroBlock(null);
|
|
140
|
-
setTimeout(() => {
|
|
141
|
-
dispatch({ type: 'MARK_CLEAN' });
|
|
142
|
-
}, 100);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
catch (error) {
|
|
146
|
-
console.error('Failed to switch language:', error);
|
|
147
|
-
}
|
|
25
|
+
if (locale && !state.currentLanguage) {
|
|
26
|
+
dispatch({ type: 'SET_CURRENT_LANGUAGE', payload: locale });
|
|
148
27
|
}
|
|
149
|
-
};
|
|
150
|
-
//
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
// Add the new language to the list
|
|
155
|
-
setAvailableLanguages([...availableLanguages, newLanguage]);
|
|
156
|
-
// Switch to the new language (it will copy from primary language)
|
|
157
|
-
await handleLanguageChange(newLanguage);
|
|
158
|
-
};
|
|
159
|
-
// Track if we just loaded a post to prevent marking as dirty during cleanup
|
|
160
|
-
const justLoadedRef = useRef(false);
|
|
161
|
-
const previousIsLoadingRef = useRef(false);
|
|
162
|
-
const loadingCleanupTimerRef = useRef(null);
|
|
163
|
-
// Mark when post loading completes and ensure it stays clean after all effects
|
|
164
|
-
useEffect(() => {
|
|
165
|
-
// Detect when loading just finished (was loading, now not loading, and we have a postId)
|
|
166
|
-
const loadingJustFinished = previousIsLoadingRef.current && !isLoadingPost && state.postId;
|
|
167
|
-
if (loadingJustFinished) {
|
|
168
|
-
justLoadedRef.current = true;
|
|
169
|
-
// Clear any existing cleanup timer
|
|
170
|
-
if (loadingCleanupTimerRef.current) {
|
|
171
|
-
clearTimeout(loadingCleanupTimerRef.current);
|
|
172
|
-
}
|
|
173
|
-
// Wait for all effects to complete, then ensure we're marked as clean
|
|
174
|
-
// Use multiple animation frames + setTimeout to ensure all effects have run
|
|
175
|
-
requestAnimationFrame(() => {
|
|
176
|
-
requestAnimationFrame(() => {
|
|
177
|
-
loadingCleanupTimerRef.current = setTimeout(() => {
|
|
178
|
-
// Force mark as clean after loading - this ensures cleanup effects don't leave us dirty
|
|
179
|
-
console.log('[CanvasEditorView] Post loading complete - ensuring clean state');
|
|
180
|
-
dispatch({ type: 'MARK_CLEAN' });
|
|
181
|
-
justLoadedRef.current = false;
|
|
182
|
-
loadingCleanupTimerRef.current = null;
|
|
183
|
-
}, 500); // Delay to ensure all effects complete
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
// Update ref
|
|
188
|
-
previousIsLoadingRef.current = isLoadingPost;
|
|
189
|
-
return () => {
|
|
190
|
-
if (loadingCleanupTimerRef.current) {
|
|
191
|
-
clearTimeout(loadingCleanupTimerRef.current);
|
|
192
|
-
loadingCleanupTimerRef.current = null;
|
|
193
|
-
}
|
|
194
|
-
};
|
|
195
|
-
}, [isLoadingPost, state.postId, dispatch]);
|
|
196
|
-
// Keyboard shortcuts
|
|
197
|
-
useKeyboardShortcuts(state, dispatch, canUndo, canRedo, helpers.undo, helpers.redo);
|
|
198
|
-
// Unsaved changes warning and auto-save
|
|
199
|
-
const { autoSaveEnabled, setAutoSaveEnabled, countdown, saveStatus } = useUnsavedChanges({
|
|
200
|
-
state,
|
|
201
|
-
isDirty: state.isDirty,
|
|
202
|
-
onSave: async () => {
|
|
203
|
-
// Preserve current status: if already published, keep it published
|
|
204
|
-
// Otherwise save as draft
|
|
205
|
-
const shouldPublish = state.status === 'published';
|
|
206
|
-
await handleSave(shouldPublish);
|
|
207
|
-
},
|
|
208
|
-
heroBlock,
|
|
209
|
-
postId: state.postId,
|
|
28
|
+
}, [locale, state.currentLanguage, dispatch]);
|
|
29
|
+
// Initial post loading logic
|
|
30
|
+
const { isLoadingPost } = usePostLoader(postId, state.postId, helpers.loadPost, () => setHeroBlock(null), locale);
|
|
31
|
+
const { autoSaveEnabled, setAutoSaveEnabled, saveStatus, countdown } = useAutoSave(postId, state, async (data) => {
|
|
32
|
+
await helpers.save(heroBlock);
|
|
210
33
|
});
|
|
211
|
-
//
|
|
212
|
-
useEffect(() => {
|
|
213
|
-
const handleHeroTitleUpdate = (e) => {
|
|
214
|
-
dispatch({ type: 'SET_TITLE', payload: e.detail });
|
|
215
|
-
};
|
|
216
|
-
window.addEventListener('hero-title-update', handleHeroTitleUpdate);
|
|
217
|
-
return () => window.removeEventListener('hero-title-update', handleHeroTitleUpdate);
|
|
218
|
-
}, [dispatch]);
|
|
219
|
-
// Remove any hero blocks from the content blocks array
|
|
220
|
-
// Note: This effect will mark as dirty, but the loading cleanup effect will fix it
|
|
34
|
+
// Initialize editor with post data (fallback if not using usePostLoader)
|
|
221
35
|
useEffect(() => {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
dispatch({ type: '
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
36
|
+
if (initialData) {
|
|
37
|
+
const data = initialData.data || initialData;
|
|
38
|
+
if (data.blocks)
|
|
39
|
+
dispatch({ type: 'SET_BLOCKS', payload: data.blocks });
|
|
40
|
+
if (data.title)
|
|
41
|
+
dispatch({ type: 'SET_TITLE', payload: data.title });
|
|
42
|
+
if (data.slug)
|
|
43
|
+
dispatch({ type: 'SET_SLUG', payload: data.slug });
|
|
44
|
+
if (data.seo)
|
|
45
|
+
dispatch({ type: 'SET_SEO', payload: data.seo });
|
|
46
|
+
if (data.metadata)
|
|
47
|
+
dispatch({ type: 'SET_METADATA', payload: data.metadata });
|
|
48
|
+
if (data.status)
|
|
49
|
+
dispatch({ type: 'SET_STATUS', payload: data.status });
|
|
50
|
+
dispatch({ type: 'SET_CURRENT_LANGUAGE', payload: locale });
|
|
229
51
|
}
|
|
230
|
-
}, [
|
|
231
|
-
|
|
232
|
-
const contentBlocks = state.blocks.filter(b => b.type !== 'hero');
|
|
233
|
-
// Handler to add block at the bottom when clicking (not dragging)
|
|
234
|
-
const handleAddBlockAtBottom = (blockType) => {
|
|
235
|
-
// Add at the end of content blocks (excluding hero)
|
|
236
|
-
helpers.addBlock(blockType, contentBlocks.length, undefined);
|
|
237
|
-
};
|
|
238
|
-
// Handle save
|
|
239
|
-
const handleSave = async (publish) => {
|
|
52
|
+
}, [initialData, locale, dispatch]);
|
|
53
|
+
const handleSave = async (publish = false) => {
|
|
240
54
|
setIsSaving(true);
|
|
241
55
|
setSaveError(null);
|
|
242
56
|
try {
|
|
243
|
-
|
|
244
|
-
console.log('[CanvasEditorView] onSave called with publish:', publish, 'current status:', state.status);
|
|
245
|
-
// Only change status if explicitly requested (publish is true or false)
|
|
246
|
-
// If publish is undefined, preserve the current status (used for autosave)
|
|
247
|
-
if (publish === true && state.status !== 'published') {
|
|
248
|
-
console.warn('[CanvasEditorView] Status mismatch! Setting to published...');
|
|
249
|
-
dispatch({ type: 'SET_STATUS', payload: 'published' });
|
|
250
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
251
|
-
}
|
|
252
|
-
else if (publish === false && state.status !== 'draft' && state.status !== 'published') {
|
|
253
|
-
// Only set to draft if not already published (preserve published status)
|
|
254
|
-
// This prevents autosave from changing published posts back to draft
|
|
255
|
-
console.warn('[CanvasEditorView] Status mismatch! Setting to draft...');
|
|
256
|
-
dispatch({ type: 'SET_STATUS', payload: 'draft' });
|
|
257
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
258
|
-
}
|
|
259
|
-
console.log('[CanvasEditorView] Final status before save:', state.status);
|
|
260
|
-
// Pass hero block to save function so it can be included in the saved data
|
|
261
|
-
await helpers.save(heroBlock);
|
|
262
|
-
setIsSaving(false);
|
|
57
|
+
await helpers.save(heroBlock, publish ? 'published' : 'draft');
|
|
263
58
|
}
|
|
264
59
|
catch (error) {
|
|
265
|
-
|
|
266
|
-
// Extract and format user-friendly error message
|
|
267
|
-
let errorMessage = error.message || 'Failed to save post';
|
|
268
|
-
// Make error messages more user-friendly
|
|
269
|
-
if (errorMessage.includes('Missing required fields')) {
|
|
270
|
-
errorMessage = errorMessage.replace('Missing required fields for publishing:', 'To publish, please fill in:');
|
|
271
|
-
}
|
|
272
|
-
else if (errorMessage.includes('All required fields')) {
|
|
273
|
-
errorMessage = 'To publish, please fill in all required fields: summary, featured image, category, and content.';
|
|
274
|
-
}
|
|
275
|
-
else if (errorMessage.includes('Unauthorized')) {
|
|
276
|
-
errorMessage = 'You are not authorized to save this post. Please log in again.';
|
|
277
|
-
}
|
|
278
|
-
else if (errorMessage.includes('Failed to save')) {
|
|
279
|
-
errorMessage = 'Unable to save the post. Please check your connection and try again.';
|
|
280
|
-
}
|
|
281
|
-
setSaveError(errorMessage);
|
|
282
|
-
setIsSaving(false); // Always reset saving state on error
|
|
283
|
-
throw error; // Re-throw so EditorHeader can handle it
|
|
60
|
+
setSaveError(error.message || 'Failed to save publication');
|
|
284
61
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
const handleHeroBlockUpdate = (data) => {
|
|
288
|
-
if (!heroBlock)
|
|
289
|
-
return;
|
|
290
|
-
setHeroBlock({
|
|
291
|
-
...heroBlock,
|
|
292
|
-
data: { ...heroBlock.data, ...data },
|
|
293
|
-
});
|
|
294
|
-
// Sync title to editor state
|
|
295
|
-
if (data.title !== undefined && typeof data.title === 'string') {
|
|
296
|
-
dispatch({ type: 'SET_TITLE', payload: data.title });
|
|
297
|
-
}
|
|
298
|
-
// Sync summary to editor state metadata
|
|
299
|
-
if (data.summary !== undefined && typeof data.summary === 'string') {
|
|
300
|
-
dispatch({
|
|
301
|
-
type: 'SET_METADATA',
|
|
302
|
-
payload: { excerpt: data.summary }
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
// Hero image and featured image are completely independent
|
|
306
|
-
// Do NOT sync hero image to featured image
|
|
307
|
-
// The featured image is a separate thumbnail that the client adjusts independently
|
|
308
|
-
// Sync category to editor state metadata
|
|
309
|
-
if (data.category !== undefined && typeof data.category === 'string') {
|
|
310
|
-
dispatch({
|
|
311
|
-
type: 'SET_METADATA',
|
|
312
|
-
payload: {
|
|
313
|
-
categories: data.category.trim() ? [data.category.trim()] : []
|
|
314
|
-
}
|
|
315
|
-
});
|
|
62
|
+
finally {
|
|
63
|
+
setIsSaving(false);
|
|
316
64
|
}
|
|
317
65
|
};
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
if (!heroBlock || !heroBlockDefinition)
|
|
321
|
-
return;
|
|
322
|
-
const defaultData = heroBlockDefinition.defaultData || {};
|
|
323
|
-
setHeroBlock({
|
|
324
|
-
...heroBlock,
|
|
325
|
-
data: { ...defaultData },
|
|
326
|
-
});
|
|
66
|
+
const handleHeroUpdate = (block) => {
|
|
67
|
+
setHeroBlock(block);
|
|
327
68
|
};
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
}, autoSaveEnabled: autoSaveEnabled, onAutoSaveToggle: setAutoSaveEnabled, isDirty: state.isDirty, autoSaveCountdown: countdown, autoSaveStatus: saveStatus, languages: availableLanguages, currentLanguage: currentLanguage, onLanguageChange: handleLanguageChange, onAddLanguage: handleAddLanguage }) }), _jsx(ErrorBanner, { error: saveError, onDismiss: () => setSaveError(null) }), _jsx("main", { className: "flex flex-1 flex-col relative min-h-0 overflow-hidden", children: _jsxs("div", { className: "flex flex-1 relative overflow-hidden min-h-0 flex-nowrap", children: [!isPreviewMode && (_jsx("aside", { className: `transition-all duration-500 ease-[cubic-bezier(0.4,0,0.2,1)] border-r border-dashboard-border bg-dashboard-sidebar overflow-y-auto overflow-x-hidden h-full ${isLibraryOpen ? 'w-72' : 'w-0 opacity-0 pointer-events-none'}`, children: _jsx(EditorLibrary, { registeredBlocks: registeredBlocks, onAddBlock: handleAddBlockAtBottom }) })), _jsx(EditorCanvas, { isPreviewMode: isPreviewMode, heroBlock: heroBlock, heroBlockDefinition: heroBlockDefinition, contentBlocks: contentBlocks, title: state.title, siteId: siteId, locale: locale, darkMode: effectiveDarkMode, backgroundColors: effectiveBackgroundColors, featuredImage: state.metadata.featuredImage, onTitleChange: (title) => dispatch({ type: 'SET_TITLE', payload: title }), onHeroBlockUpdate: handleHeroBlockUpdate, onHeroBlockDelete: handleHeroBlockDelete, onBlockAdd: (type, index, containerId) => helpers.addBlock(type, index, containerId), onBlockUpdate: (id, data) => helpers.updateBlock(id, data), onBlockDelete: (id) => helpers.deleteBlock(id), onBlockMove: (id, newIndex, containerId) => helpers.moveBlock(id, newIndex, containerId) }), !isPreviewMode && (_jsx("aside", { className: `transition-all duration-500 ease-[cubic-bezier(0.4,0,0.2,1)] border-l border-dashboard-border bg-dashboard-sidebar overflow-y-auto overflow-x-hidden h-full ${isSidebarOpen ? 'w-80' : 'w-0 opacity-0 pointer-events-none'}`, children: _jsx(EditorSidebar, { slug: state.slug, seo: state.seo, metadata: state.metadata, heroBlock: heroBlock, status: state.status, onSEOUpdate: (seo) => dispatch({ type: 'SET_SEO', payload: seo }), onMetadataUpdate: (metadata) => dispatch({ type: 'SET_METADATA', payload: metadata }) }) }))] }) })] }));
|
|
69
|
+
// Find hero block if it exists
|
|
70
|
+
const [heroBlock, setHeroBlock] = useState(null);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
const hero = state.blocks.find((b) => b.type === 'hero' || b.category === 'hero');
|
|
73
|
+
if (hero)
|
|
74
|
+
setHeroBlock(hero);
|
|
75
|
+
}, [state.blocks]);
|
|
76
|
+
const heroBlockDefinition = registeredBlocks.find(b => b.type === heroBlock?.type);
|
|
77
|
+
if (isLoadingPost) {
|
|
78
|
+
return (_jsx("div", { className: "absolute inset-0 w-full flex items-center justify-center bg-dashboard-bg/10 backdrop-blur-sm z-[100]", children: _jsxs("div", { className: "flex flex-col items-center gap-4", children: [_jsx(RefreshCw, { className: "size-10 text-primary animate-spin" }), _jsx("p", { className: "text-[10px] font-black uppercase tracking-[0.3em] text-primary", children: "Synchronizing_Node_Data..." })] }) }));
|
|
79
|
+
}
|
|
80
|
+
return (_jsxs("div", { className: "absolute inset-0 w-full flex flex-col overflow-hidden bg-dashboard-bg/10 backdrop-blur-sm", children: [_jsx(EditorHeader, { isLibraryOpen: isLibraryOpen, onLibraryToggle: () => setLibraryOpen(!isLibraryOpen), isPreviewMode: isPreviewMode, onPreviewToggle: () => setIsPreviewMode(!isPreviewMode), isSidebarOpen: isSidebarOpen, onSidebarToggle: () => setSidebarOpen(!isSidebarOpen), isSaving: isSaving, onSave: handleSave, onSaveError: setSaveError, autoSaveEnabled: autoSaveEnabled, onAutoSaveToggle: setAutoSaveEnabled, isDirty: state.isDirty, autoSaveCountdown: countdown, autoSaveStatus: saveStatus, languages: contextLanguages, currentLanguage: state.currentLanguage || locale, onLanguageChange: (lang) => helpers.switchLanguage(lang, postId), onAddLanguage: (lang) => helpers.switchLanguage(lang, postId) }), _jsx(ErrorBanner, { error: saveError, onDismiss: () => setSaveError(null) }), _jsxs("main", { className: "flex flex-1 relative overflow-hidden", children: [_jsx("aside", { className: `transition-all duration-500 bg-dashboard-sidebar/40 backdrop-blur-xl border-r border-dashboard-border/50 relative z-20 overflow-hidden ${isLibraryOpen ? 'w-72' : 'w-0'}`, children: _jsx("div", { className: "w-72 h-full opacity-100 transition-opacity duration-300", children: _jsx(EditorLibrary, { registeredBlocks: registeredBlocks, onAddBlock: (type) => helpers.addBlock(type) }) }) }), _jsx("div", { className: "flex-1 relative overflow-hidden bg-white/[0.01] flex flex-col", children: _jsx(EditorCanvas, { isPreviewMode: isPreviewMode, heroBlock: heroBlock, heroBlockDefinition: heroBlockDefinition, contentBlocks: state.blocks, title: state.title, siteId: siteId, locale: locale, darkMode: darkMode, backgroundColors: backgroundColors, featuredImage: state.metadata.featuredImage, LayoutWrapper: LayoutWrapper, onTitleChange: (title) => dispatch({ type: 'SET_TITLE', payload: title }), onHeroBlockUpdate: handleHeroUpdate, onHeroBlockDelete: () => setHeroBlock(null), onBlockAdd: helpers.addBlock, onBlockUpdate: helpers.updateBlock, onBlockDelete: helpers.deleteBlock, onBlockMove: helpers.moveBlock }) }), _jsx("aside", { className: `transition-all duration-500 bg-dashboard-sidebar/40 backdrop-blur-xl border-l border-dashboard-border/50 relative z-20 overflow-hidden ${isSidebarOpen ? 'w-80' : 'w-0'}`, children: _jsx("div", { className: "w-80 h-full opacity-100 transition-opacity duration-300", children: _jsx(EditorSidebar, { slug: state.slug, seo: state.seo, metadata: state.metadata, heroBlock: heroBlock, status: state.status, onSEOUpdate: (seo) => dispatch({ type: 'SET_SEO', payload: seo }), onMetadataUpdate: (meta) => dispatch({ type: 'SET_METADATA', payload: meta }) }) }) })] }), _jsx(JSONInspector, { data: state })] }));
|
|
341
81
|
}
|
|
@@ -6,17 +6,15 @@
|
|
|
6
6
|
import { Block } from '../../types/block';
|
|
7
7
|
export interface EditorBodyProps {
|
|
8
8
|
blocks: Block[];
|
|
9
|
-
|
|
10
|
-
onBlockUpdate: (id: string, data: Partial<Block['data']>) => void;
|
|
11
|
-
onBlockDelete: (id: string) => void;
|
|
12
|
-
onBlockMove: (id: string, newIndex: number, containerId?: string) => void;
|
|
13
|
-
/** Enable dark mode for content area and wrappers (default: true) */
|
|
14
|
-
darkMode?: boolean;
|
|
15
|
-
/** Background colors for the editor */
|
|
9
|
+
darkMode: boolean;
|
|
16
10
|
backgroundColors?: {
|
|
17
11
|
light: string;
|
|
18
12
|
dark?: string;
|
|
19
13
|
};
|
|
14
|
+
onBlockUpdate: (id: string, data: Partial<Block['data']>, containerId?: string) => void;
|
|
15
|
+
onBlockDelete: (id: string, containerId?: string) => void;
|
|
16
|
+
onBlockMove: (id: string, newIndex: number, containerId?: string) => void;
|
|
17
|
+
onBlockAdd: (type: string, index: number, containerId?: string) => void;
|
|
20
18
|
}
|
|
21
|
-
export declare function EditorBody({ blocks,
|
|
19
|
+
export declare function EditorBody({ blocks, darkMode, backgroundColors, onBlockUpdate, onBlockDelete, onBlockMove, onBlockAdd, }: EditorBodyProps): import("react/jsx-runtime").JSX.Element;
|
|
22
20
|
//# sourceMappingURL=EditorBody.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorBody.d.ts","sourceRoot":"","sources":["../../../src/views/CanvasEditor/EditorBody.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"EditorBody.d.ts","sourceRoot":"","sources":["../../../src/views/CanvasEditor/EditorBody.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAK1C,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxF,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3E;AAED,wBAAgB,UAAU,CAAC,EACvB,MAAM,EACN,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,GACb,EAAE,eAAe,2CAuHjB"}
|