diff --git a/src/routes/viewimage/[tripId]/[memoryId]/+page.svelte b/src/routes/viewimage/[tripId]/[memoryId]/+page.svelte index d7b17a7..45c60bf 100644 --- a/src/routes/viewimage/[tripId]/[memoryId]/+page.svelte +++ b/src/routes/viewimage/[tripId]/[memoryId]/+page.svelte @@ -15,6 +15,14 @@ let columnGroups = []; let rotationAngle = 0; + let droppedTripId = null; + let droppedMemory = null; + let droppedImageIndex = 0; + let droppedColumnGroups = []; + let droppedGradientLayers = []; + let droppedWheelStyle = {}; + let droppedCurrentImage = null; + $: tripId = $page.params.tripId; $: memoryId = $page.params.memoryId; $: currentImage = memory?.images?.[currentImageIndex]; @@ -70,10 +78,19 @@ } } + async function loadDroppedTrip(tripId, memoryId) { + const memorySnap = await get(ref(db, `trips/${tripId}/memories/${memoryId}`)); + if (memorySnap.exists()) { + droppedTripId = tripId; + droppedMemory = memorySnap.val(); + droppedColumnGroups = await extractColumnwiseColors(droppedMemory.images); + droppedImageIndex = 0; + } + } + $: { if (memory?.images?.length > 0) { - const imageCount = memory.images.length; - const sliceAngle = 360 / imageCount; + const sliceAngle = 360 / memory.images.length; rotationAngle = sliceAngle * currentImageIndex - 90; } else { rotationAngle = 0; @@ -192,6 +209,34 @@ }); } + $: if (droppedMemory?.images?.length && droppedColumnGroups.length) { + const angleOffset = -(360 / droppedMemory.images.length) * droppedImageIndex; + const gradients = makeConcentricGradients(droppedColumnGroups, angleOffset); + + const MASK_COUNT = 3; + for (let i = 0; i < MASK_COUNT; i++) { + gradients.push('radial-gradient(circle, var(--black) 100%)'); + } + + droppedGradientLayers = gradients.map((bg, i) => { + const scale = 1 - i * 0.1; + return `background: ${bg}; + width: ${scale * 100}%; + height: ${scale * 100}%; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + border-radius: 50%;`; + }); + + droppedWheelStyle = { + transform: `translateY(-50%) rotate(${-90 + (360 / droppedMemory.images.length) * droppedImageIndex}deg)` + }; + + droppedCurrentImage = droppedMemory.images[droppedImageIndex]; + } + function nextImage() { if (memory?.images?.length > 0) { currentImageIndex = (currentImageIndex + 1) % memory.images.length; @@ -203,6 +248,29 @@ currentImageIndex = (currentImageIndex - 1 + memory.images.length) % memory.images.length; } } + + function nextDroppedImage() { + if (droppedMemory?.images?.length > 0) { + droppedImageIndex = (droppedImageIndex + 1) % droppedMemory.images.length; + } + } + + function prevDroppedImage() { + if (droppedMemory?.images?.length > 0) { + droppedImageIndex = (droppedImageIndex - 1 + droppedMemory.images.length) % droppedMemory.images.length; + } + } + + function handleDrop(event) { + event.preventDefault(); + const droppedTripId = event.dataTransfer.getData("tripId"); + const droppedMemoryId = event.dataTransfer.getData("memoryId"); + loadDroppedTrip(droppedTripId, droppedMemoryId); + } + + function allowDrop(event) { + event.preventDefault(); + } @@ -220,6 +288,11 @@ {#each tripOptions as trip} @@ -227,22 +300,45 @@ -