summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2025-12-24 01:06:45 +0000
committersoryu <soryu@soryu.co>2025-12-24 01:06:45 +0000
commitd2bb569401a906e33517cafd0e35d960bd1381bd (patch)
tree70777acbe88c6350d4d20d9f16c8f7f1630cf79c
parentcdfac7b3792d3813594daa36470465bd8c841ea9 (diff)
downloadsoryu-d2bb569401a906e33517cafd0e35d960bd1381bd.tar.gz
soryu-d2bb569401a906e33517cafd0e35d960bd1381bd.zip
Update overwrite mechanism to only require one prompt
-rw-r--r--makima/frontend/src/routes/files.tsx28
1 files changed, 24 insertions, 4 deletions
diff --git a/makima/frontend/src/routes/files.tsx b/makima/frontend/src/routes/files.tsx
index 037df7e..2a75218 100644
--- a/makima/frontend/src/routes/files.tsx
+++ b/makima/frontend/src/routes/files.tsx
@@ -123,6 +123,16 @@ export default function FilesPage() {
const newBody = [...fileDetail.body];
newBody[index] = element;
+ // If there's a pending remote update, fetch latest version first
+ let versionToUse = fileDetail.version;
+ if (remoteUpdate) {
+ const latest = await fetchFile(id);
+ if (latest) {
+ versionToUse = latest.version;
+ }
+ setRemoteUpdate(null); // Dismiss notification
+ }
+
// Update local state immediately for responsiveness
setFileDetail({
...fileDetail,
@@ -132,14 +142,14 @@ export default function FilesPage() {
// Save to backend with version for optimistic locking
pendingUpdateRef.current = true;
- const result = await editFile(id, { body: newBody, version: fileDetail.version });
+ const result = await editFile(id, { body: newBody, version: versionToUse });
if (result) {
setFileDetail(result);
setHasLocalChanges(false);
}
}
},
- [fileDetail, id, editFile]
+ [fileDetail, id, editFile, remoteUpdate, fetchFile]
);
const handleBodyReorder = useCallback(
@@ -150,6 +160,16 @@ export default function FilesPage() {
const [movedElement] = newBody.splice(fromIndex, 1);
newBody.splice(toIndex, 0, movedElement);
+ // If there's a pending remote update, fetch latest version first
+ let versionToUse = fileDetail.version;
+ if (remoteUpdate) {
+ const latest = await fetchFile(id);
+ if (latest) {
+ versionToUse = latest.version;
+ }
+ setRemoteUpdate(null); // Dismiss notification
+ }
+
// Update local state immediately for responsiveness
setFileDetail({
...fileDetail,
@@ -159,14 +179,14 @@ export default function FilesPage() {
// Save to backend with version for optimistic locking
pendingUpdateRef.current = true;
- const result = await editFile(id, { body: newBody, version: fileDetail.version });
+ const result = await editFile(id, { body: newBody, version: versionToUse });
if (result) {
setFileDetail(result);
setHasLocalChanges(false);
}
}
},
- [fileDetail, id, editFile]
+ [fileDetail, id, editFile, remoteUpdate, fetchFile]
);
const handleCreate = useCallback(async () => {