MCPcopy
hub / github.com/pingdotgg/t3code / reorderProjects

Function reorderProjects

apps/web/src/uiStateStore.ts:370–412  ·  view source on GitHub ↗
(
  state: UiState,
  currentProjectOrder: readonly string[],
  draggedProjectIds: readonly string[],
  targetProjectIds: readonly string[],
)

Source from the content-addressed store, hash-verified

368}
369
370export function reorderProjects(
371 state: UiState,
372 currentProjectOrder: readonly string[],
373 draggedProjectIds: readonly string[],
374 targetProjectIds: readonly string[],
375): UiState {
376 if (draggedProjectIds.length === 0) {
377 return state;
378 }
379 const draggedSet = new Set(draggedProjectIds);
380 const targetSet = new Set(targetProjectIds);
381 if (draggedProjectIds.every((id) => targetSet.has(id))) {
382 return state;
383 }
384
385 const originalTargetIndex = currentProjectOrder.findIndex((id) => targetSet.has(id));
386 if (originalTargetIndex < 0) {
387 return state;
388 }
389
390 const projectOrder = [...currentProjectOrder];
391
392 const removed: string[] = [];
393 let draggedBeforeTarget = 0;
394 for (let i = projectOrder.length - 1; i >= 0; i--) {
395 if (draggedSet.has(projectOrder[i]!)) {
396 removed.unshift(projectOrder.splice(i, 1)[0]!);
397 if (i < originalTargetIndex) {
398 draggedBeforeTarget++;
399 }
400 }
401 }
402 if (removed.length === 0) {
403 return state;
404 }
405
406 const insertIndex = originalTargetIndex - Math.max(0, draggedBeforeTarget - 1);
407 projectOrder.splice(insertIndex, 0, ...removed);
408 return {
409 ...state,
410 projectOrder,
411 };
412}
413
414interface UiStateStore extends UiState {
415 markThreadVisited: (threadId: string, visitedAt: string) => void;

Callers 3

uiStateStore.tsFile · 0.85
SidebarFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected