sort layers

This commit is contained in:
hamid zarghami
2026-04-29 09:47:27 +03:30
parent 24872d9544
commit b252682509
3 changed files with 63 additions and 1 deletions
+1 -1
View File
@@ -22,4 +22,4 @@ dist-ssr
*.njsproj *.njsproj
*.sln *.sln
*.sw? *.sw?
Archive.zip *.zip
@@ -16,6 +16,7 @@ import {
MouseSquare, MouseSquare,
Sticker, Sticker,
} from 'iconsax-react' } from 'iconsax-react'
import { useState } from 'react'
import { useEditorStore } from '../store/editorStore' import { useEditorStore } from '../store/editorStore'
import { clx } from '@/helpers/utils' import { clx } from '@/helpers/utils'
@@ -27,7 +28,10 @@ const LayersList = () => {
deleteObject, deleteObject,
duplicateObject, duplicateObject,
toggleObjectVisibility, toggleObjectVisibility,
reorderObjects,
} = useEditorStore() } = useEditorStore()
const [draggedObjectId, setDraggedObjectId] = useState<string | null>(null)
const [dragOverObjectId, setDragOverObjectId] = useState<string | null>(null)
const getLayerIcon = (type: string) => { const getLayerIcon = (type: string) => {
switch (type) { switch (type) {
@@ -121,8 +125,33 @@ const LayersList = () => {
<div <div
key={obj.id} key={obj.id}
onClick={() => setSelectedObjectId(obj.id)} onClick={() => setSelectedObjectId(obj.id)}
draggable
onDragStart={() => {
setDraggedObjectId(obj.id)
}}
onDragOver={(e) => {
e.preventDefault()
if (dragOverObjectId !== obj.id) {
setDragOverObjectId(obj.id)
}
}}
onDrop={(e) => {
e.preventDefault()
if (draggedObjectId && draggedObjectId !== obj.id) {
reorderObjects(draggedObjectId, obj.id)
}
setDraggedObjectId(null)
setDragOverObjectId(null)
}}
onDragEnd={() => {
setDraggedObjectId(null)
setDragOverObjectId(null)
}}
className={clx( className={clx(
'flex items-center gap-3 p-3 rounded-lg cursor-pointer transition-colors', 'flex items-center gap-3 p-3 rounded-lg cursor-pointer transition-colors',
dragOverObjectId === obj.id &&
draggedObjectId !== obj.id &&
'ring-2 ring-blue-300',
isSelected isSelected
? 'bg-blue-50 border border-blue-200' ? 'bg-blue-50 border border-blue-200'
: 'bg-gray-50 hover:bg-gray-100' : 'bg-gray-50 hover:bg-gray-100'
+33
View File
@@ -91,6 +91,7 @@ type EditorStoreType = {
updateObject: (id: string, updates: Partial<EditorObject>) => void; updateObject: (id: string, updates: Partial<EditorObject>) => void;
deleteObject: (id: string) => void; deleteObject: (id: string) => void;
duplicateObject: (id: string) => void; duplicateObject: (id: string) => void;
reorderObjects: (draggedId: string, targetId: string) => void;
selectedObjectId: string | null; selectedObjectId: string | null;
setSelectedObjectId: (id: string | null) => void; setSelectedObjectId: (id: string | null) => void;
selectedObjectIds: string[]; selectedObjectIds: string[];
@@ -354,6 +355,38 @@ export const useEditorStore = create<EditorStoreType>((set, get) => {
selectedObjectId: duplicatedObject.id, selectedObjectId: duplicatedObject.id,
})); }));
}, },
reorderObjects: (draggedId, targetId) => {
if (draggedId === targetId) return;
const reorder = (items: EditorObject[]) => {
const fromIndex = items.findIndex((item) => item.id === draggedId);
const toIndex = items.findIndex((item) => item.id === targetId);
if (fromIndex === -1 || toIndex === -1) return items;
const nextItems = [...items];
const [movedItem] = nextItems.splice(fromIndex, 1);
nextItems.splice(toIndex, 0, movedItem);
return nextItems;
};
const state = get();
if (state.currentPageId) {
set((state) => ({
objects: reorder(state.objects),
pages: state.pages.map((page) =>
page.id === state.currentPageId
? { ...page, objects: reorder(page.objects) }
: page,
),
}));
return;
}
set((state) => ({
objects: reorder(state.objects),
}));
},
selectedObjectId: null, selectedObjectId: null,
setSelectedObjectId: (id) => { setSelectedObjectId: (id) => {
set({ set({