diff --git a/src/app/components/MenuOtherSpaces.svelte b/src/app/components/MenuOtherSpaces.svelte index 63a31858..2f7c3469 100644 --- a/src/app/components/MenuOtherSpaces.svelte +++ b/src/app/components/MenuOtherSpaces.svelte @@ -6,10 +6,73 @@ } const {urls}: Props = $props() + + const reorderUrls = (sourceUrl: string, targetUrl: string, currentUrls: string[]) => { + if (sourceUrl === targetUrl) { + return currentUrls + } + + const sourceIndex = currentUrls.indexOf(sourceUrl) + const targetIndex = currentUrls.indexOf(targetUrl) + + if (sourceIndex === -1 || targetIndex === -1) { + return currentUrls + } + + const nextUrls = currentUrls.filter(url => url !== sourceUrl) + + nextUrls.splice(targetIndex, 0, sourceUrl) + + return nextUrls + } + + const moveDraggedUrl = (targetUrl: string) => { + if (!draggedUrl) { + return + } + + orderedUrls = reorderUrls(draggedUrl, targetUrl, orderedUrls) + } + + const onDragStart = (e: DragEvent, url: string) => { + draggedUrl = url + + if (e.dataTransfer) { + e.dataTransfer.effectAllowed = "move" + e.dataTransfer.setData("text/plain", url) + } + } + + const onDragOver = (e: DragEvent, targetUrl: string) => { + e.preventDefault() + moveDraggedUrl(targetUrl) + } + + const onDrop = (e: DragEvent, targetUrl: string) => { + e.preventDefault() + moveDraggedUrl(targetUrl) + draggedUrl = undefined + } + + const onDragEnd = () => { + draggedUrl = undefined + } + + let orderedUrls = $state([...urls]) + let draggedUrl = $state() - {:then} - {#each $userSpaceUrls as url (url)} - + {#each orderedSpaceUrls as url (url)} +
onDragStart(e, url)} + ondragover={e => onDragOver(e, url)} + ondrop={e => onDrop(e, url)} + ondragend={onDragEnd}> + +
{:else}

You haven't added any spaces yet!