Repository navigation
Fix moveProjects leaving the UI and disk state inconsistent when a pr… - #187
Merged
RykoTheDev merged 1 commit intoSep 22, 2026
Merged
Conversation
…oject update or reorder operation fails midway. Capture the previous projects state before applying the optimistic update. Roll back the optimistic UI state when an API operation fails. Refresh projects from the backend after a failure to restore the actual persisted state. Re-throw the error so existing error handling can handle the failure.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Issue (
src/hooks/useProjects.ts:98-125):moveProjectsperformedsetData, followed byN x updateProject + reorderProjectswithout atry/catchblock. A failure at any point (e.g., during the secondupdateProjectcall orreorderProjects) left the UI in a state inconsistent with the server—some projects had already changed categories on the backend, yet the UI displayed them as if the move had fully succeeded. Related functions likeremove,setPinned, andsetCategoryalready followed thecatch { await refresh(); throw e }pattern.Fix
projects([...projects]) is saved before the optimisticsetDatacall—avoiding an unnecessaryapi.listProjects()request and following the pattern used inCategoryManagerModal(prevItems/setItems(prevItems)).for updateProject+reorderProjects) is wrapped in atry/catchblock.