sort layers
This commit is contained in:
+1
-1
@@ -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'
|
||||||
|
|||||||
@@ -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({
|
||||||
|
|||||||
Reference in New Issue
Block a user