This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
import type { PageSummary } from '@/lib/pages'
|
||||
|
||||
/**
|
||||
* Reorder pages by moving sourceId beside targetId. Pinned and unpinned pages
|
||||
* are separate groups (the server sorts pinned first), so a cross-group drop
|
||||
* returns 'blocked' instead of silently landing at a different boundary.
|
||||
* `after` places the source after the target; otherwise it goes before it.
|
||||
*/
|
||||
export function reorderPages(
|
||||
pages: PageSummary[],
|
||||
sourceId: string,
|
||||
targetId: string,
|
||||
after = false,
|
||||
): PageSummary[] | 'blocked' | null {
|
||||
const from = pages.findIndex((p) => p.id === sourceId)
|
||||
const to = pages.findIndex((p) => p.id === targetId)
|
||||
if (from < 0 || to < 0 || sourceId === targetId) return null
|
||||
if (pages[from].pinned !== pages[to].pinned) return 'blocked'
|
||||
const next = [...pages]
|
||||
const [moved] = next.splice(from, 1)
|
||||
let insertAt = to + (after ? 1 : 0)
|
||||
if (from < insertAt) insertAt--
|
||||
next.splice(insertAt, 0, moved)
|
||||
return next
|
||||
}
|
||||
Reference in New Issue
Block a user