From 1ba62b0ceed799f6ec6025d63110a7d145daa371 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Wed, 31 Dec 2025 14:23:40 +0330 Subject: [PATCH] split components layers and pages --- src/pages/editor/components/LayersList.tsx | 102 +++++++++++ src/pages/editor/components/LayersPanel.tsx | 180 +------------------- src/pages/editor/components/PagesPanel.tsx | 99 +++++++++++ 3 files changed, 205 insertions(+), 176 deletions(-) create mode 100644 src/pages/editor/components/LayersList.tsx create mode 100644 src/pages/editor/components/PagesPanel.tsx diff --git a/src/pages/editor/components/LayersList.tsx b/src/pages/editor/components/LayersList.tsx new file mode 100644 index 0000000..23ecc55 --- /dev/null +++ b/src/pages/editor/components/LayersList.tsx @@ -0,0 +1,102 @@ +import { Text, Shapes, Eye, Copy, Trash } from 'iconsax-react' +import { useEditorStore } from '../store/editorStore' +import { clx } from '@/helpers/utils' + +const LayersList = () => { + const { + objects, + selectedObjectId, + setSelectedObjectId, + deleteObject, + duplicateObject, + } = useEditorStore() + + const getLayerIcon = (type: string) => { + switch (type) { + case 'text': + return + case 'rectangle': + case 'image': + case 'grid': + return + default: + return + } + } + + const getLayerLabel = (type: string) => { + switch (type) { + case 'text': + return 'متن' + case 'rectangle': + case 'image': + case 'grid': + return 'اشکال هندسی' + default: + return 'لایه' + } + } + + return ( +
+
+ {objects.length === 0 ? ( +
+ لایه‌ای وجود ندارد +
+ ) : ( + objects.map((obj) => { + const isSelected = selectedObjectId === obj.id + return ( +
setSelectedObjectId(obj.id)} + className={clx( + 'flex items-center gap-3 p-3 rounded-lg cursor-pointer transition-colors', + isSelected + ? 'bg-blue-50 border border-blue-200' + : 'bg-gray-50 hover:bg-gray-100' + )} + > +
{getLayerIcon(obj.type)}
+
{getLayerLabel(obj.type)}
+
+ + + +
+
+ ) + }) + )} +
+
+ ) +} + +export default LayersList + diff --git a/src/pages/editor/components/LayersPanel.tsx b/src/pages/editor/components/LayersPanel.tsx index 70c3a58..7078a37 100644 --- a/src/pages/editor/components/LayersPanel.tsx +++ b/src/pages/editor/components/LayersPanel.tsx @@ -1,7 +1,8 @@ -import { DocumentText, Layer, Eye, Trash, ArrowRight2, Text, Shapes, Add, Copy } from 'iconsax-react' -import { useEditorStore } from '../store/editorStore' +import { DocumentText, Layer, ArrowRight2 } from 'iconsax-react' import { clx } from '@/helpers/utils' import { useState } from 'react' +import PagesPanel from './PagesPanel' +import LayersList from './LayersList' type TabType = 'pages' | 'layers' @@ -12,55 +13,6 @@ type LayersPanelProps = { const LayersPanel = ({ isOpen, setIsOpen }: LayersPanelProps) => { const [activeTab, setActiveTab] = useState('pages') - const { objects, selectedObjectId, setSelectedObjectId, deleteObject, duplicateObject } = useEditorStore() - const { - pages, - currentPageId, - setCurrentPage, - addPage, - duplicatePage, - deletePage, - } = useEditorStore() - - const getLayerIcon = (type: string) => { - switch (type) { - case 'text': - return - case 'rectangle': - case 'image': - case 'grid': - return - default: - return - } - } - - const getLayerLabel = (type: string) => { - switch (type) { - case 'text': - return 'متن' - case 'rectangle': - case 'image': - case 'grid': - return 'اشکال هندسی' - default: - return 'لایه' - } - } - - const handleAddPage = () => { - addPage() - } - - const handleDuplicatePage = (pageId: string) => { - duplicatePage(pageId) - } - - const handleDeletePage = (pageId: string) => { - if (pages.length > 1) { - deletePage(pageId) - } - } if (!isOpen) { return ( @@ -135,131 +87,7 @@ const LayersPanel = ({ isOpen, setIsOpen }: LayersPanelProps) => { - {activeTab === 'pages' ? ( - <> -
-
- {pages.length === 0 ? ( -
- صفحه‌ای وجود ندارد -
- ) : ( - pages.map((page) => { - const isSelected = currentPageId === page.id - return ( -
setCurrentPage(page.id)} - className={clx( - 'flex flex-col gap-2 cursor-pointer transition-colors', - isSelected && ' rounded-lg p-0.5' - )} - > -
- -
-
- {page.name} -
-
- ) - }) - )} -
-
- -
-
- - {currentPageId && ( - <> - - - - )} -
-
- - ) : ( -
-
- {objects.length === 0 ? ( -
- لایه‌ای وجود ندارد -
- ) : ( - objects.map((obj) => { - const isSelected = selectedObjectId === obj.id - return ( -
setSelectedObjectId(obj.id)} - className={clx( - 'flex items-center gap-3 p-3 rounded-lg cursor-pointer transition-colors', - isSelected ? 'bg-blue-50 border border-blue-200' : 'bg-gray-50 hover:bg-gray-100' - )} - > -
- {getLayerIcon(obj.type)} -
-
- {getLayerLabel(obj.type)} -
-
- - - -
-
- ) - }) - )} -
-
- )} + {activeTab === 'pages' ? : } diff --git a/src/pages/editor/components/PagesPanel.tsx b/src/pages/editor/components/PagesPanel.tsx new file mode 100644 index 0000000..41e9844 --- /dev/null +++ b/src/pages/editor/components/PagesPanel.tsx @@ -0,0 +1,99 @@ +import { DocumentText, Copy, Trash, AddSquare } from 'iconsax-react' +import { useEditorStore } from '../store/editorStore' +import { clx } from '@/helpers/utils' + +const PagesPanel = () => { + const { + pages, + currentPageId, + setCurrentPage, + addPage, + duplicatePage, + deletePage, + } = useEditorStore() + + const handleAddPage = () => { + addPage() + } + + const handleDuplicatePage = (pageId: string) => { + duplicatePage(pageId) + } + + const handleDeletePage = (pageId: string) => { + if (pages.length > 1) { + deletePage(pageId) + } + } + + return ( + <> +
+
+ {pages.length === 0 ? ( +
+ صفحه‌ای وجود ندارد +
+ ) : ( + pages.map((page) => { + const isSelected = currentPageId === page.id + return ( +
setCurrentPage(page.id)} + className={clx( + 'flex flex-col gap-2 cursor-pointer transition-colors', + isSelected && ' rounded-lg p-0.5' + )} + > +
+ +
+
+ {page.name} +
+
+ ) + }) + )} +
+
+ +
+
+ + {currentPageId && ( + <> + + + + )} +
+
+ + ) +} + +export default PagesPanel +