diff --git a/swipic/components/photo-swiper.tsx b/swipic/components/photo-swiper.tsx index 9e3dbf5..d66ad2b 100644 --- a/swipic/components/photo-swiper.tsx +++ b/swipic/components/photo-swiper.tsx @@ -318,14 +318,18 @@ export default function PhotoSwiper() { const newDeletedIds = new Set([ ...deletedPhotoIds, ...markedForDeletionIds, + ...keptPhotoIds, // Add kept photos to deleted so they don't appear again ]); setDeletedPhotoIds(newDeletedIds); - setMarkedForDeletionIds(new Set()); - setLastAction(null); // Clear last action to disable undo after confirmation - // Update last confirmed state + // Update last confirmed state before clearing working sets setLastConfirmedKeptIds(new Set(keptPhotoIds)); setLastConfirmedMarkedIds(new Set()); + + // Clear working sets to start fresh changeset + setKeptPhotoIds(new Set()); + setMarkedForDeletionIds(new Set()); + setLastAction(null); // Clear last action to disable undo after confirmation } catch (error) { console.error("canceled delete:", error); // User canceled deletion - keep current state intact, don't reset anything @@ -391,23 +395,35 @@ export default function PhotoSwiper() { const confirmedChangeset = await loadChangeset(CONFIRMED_CHANGESET_KEY); if (currentChangeset) { + // Reset to current changeset if it exists resetToChangeset(currentChangeset); await AsyncStorage.removeItem(CURRENT_CHANGESET_KEY); + } else if (!hasNoChangesets) { + // If we have current changes but no saved changeset, clear everything + setKeptPhotoIds(new Set()); + setMarkedForDeletionIds(new Set()); + setLastAction(null); + setCurrentIndex(0); + setIsFinished(false); + filterPhotos(photos); + resetCard(); } else if (confirmedChangeset) { - resetToChangeset(confirmedChangeset); - } else { + // If no current changes, revert to last confirmed changeset setKeptPhotoIds(new Set()); setMarkedForDeletionIds(new Set()); setLastAction(null); setCurrentIndex(0); setIsFinished(false); + setLastConfirmedKeptIds(new Set()); + setLastConfirmedMarkedIds(new Set()); filterPhotos(photos); resetCard(); + await AsyncStorage.removeItem(CONFIRMED_CHANGESET_KEY); } }; const confirmDeletion = async () => { - if (!hasUnconfirmedChanges) { + if (!canConfirm) { return; } @@ -423,11 +439,22 @@ export default function PhotoSwiper() { ); await saveChangeset(CONFIRMED_CHANGESET_KEY, newConfirmedChangeset); await AsyncStorage.removeItem(CURRENT_CHANGESET_KEY); - setLastAction(null); // Clear last action to disable undo after confirmation - // Update last confirmed state + // Add kept photos to deleted so they don't appear again + const newDeletedIds = new Set([ + ...deletedPhotoIds, + ...keptPhotoIds, + ]); + setDeletedPhotoIds(newDeletedIds); + + // Update last confirmed state before clearing working sets setLastConfirmedKeptIds(new Set(keptPhotoIds)); setLastConfirmedMarkedIds(new Set(markedForDeletionIds)); + + // Clear working sets to start fresh changeset + setKeptPhotoIds(new Set()); + setMarkedForDeletionIds(new Set()); + setLastAction(null); // Clear last action to disable undo after confirmation } }; @@ -603,12 +630,11 @@ export default function PhotoSwiper() { const hasNoChangesets = keptPhotoIds.size === 0 && markedForDeletionIds.size === 0 && !lastAction; - // Check if current state differs from last confirmed state - const hasUnconfirmedChanges = - keptPhotoIds.size !== lastConfirmedKeptIds.size || - markedForDeletionIds.size !== lastConfirmedMarkedIds.size || - ![...keptPhotoIds].every(id => lastConfirmedKeptIds.has(id)) || - ![...markedForDeletionIds].every(id => lastConfirmedMarkedIds.has(id)); + // Confirm button should be enabled when any images have been marked in current changeset + const canConfirm = keptPhotoIds.size > 0 || markedForDeletionIds.size > 0; + + // Reset should be enabled if there are current changes OR if there's a confirmed changeset to revert to + const canReset = !hasNoChangesets || (lastConfirmedKeptIds.size > 0 || lastConfirmedMarkedIds.size > 0); const currentPhoto = filteredPhotos[currentIndex]; if (!currentPhoto) { @@ -645,30 +671,30 @@ export default function PhotoSwiper() {