Skip to content

Commit 2a7fc0c

Browse files
authored
Merge pull request #255 from beNative/fix/focus-loss-title-edit-v2
Fix focus loss on title edit by implementing silent refresh
2 parents 412bbfa + 57daf8e commit 2a7fc0c

1 file changed

Lines changed: 15 additions & 15 deletions

File tree

hooks/useNodes.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@ export const useNodes = () => {
88
const [nodes, setNodes] = useState<Node[]>([]);
99
const [isLoading, setIsLoading] = useState(true);
1010

11-
const refreshNodes = useCallback(async () => {
12-
setIsLoading(true);
11+
const refreshNodes = useCallback(async (silent: boolean = false) => {
12+
if (!silent) setIsLoading(true);
1313
try {
1414
const fetchedNodes = await repository.getNodeTree();
1515
setNodes(fetchedNodes);
1616
addLog('DEBUG', 'Node tree refreshed from database.');
1717
} catch (error) {
1818
addLog('ERROR', `Failed to refresh nodes: ${error instanceof Error ? error.message : String(error)}`);
1919
} finally {
20-
setIsLoading(false);
20+
if (!silent) setIsLoading(false);
2121
}
2222
}, [addLog]);
2323

@@ -28,44 +28,44 @@ export const useNodes = () => {
2828
const addNode = useCallback(async (node: Omit<Node, 'node_id' | 'sort_order' | 'created_at' | 'updated_at'>): Promise<Node> => {
2929
const newNode = await repository.addNode(node);
3030
addLog('INFO', `New ${node.node_type} created with title: "${node.title}"`);
31-
await refreshNodes(); // Refresh to get correct sorting and structure
31+
await refreshNodes(true); // Refresh to get correct sorting and structure
3232
return newNode;
3333
}, [addLog, refreshNodes]);
3434

3535
const updateNode = useCallback(async (nodeId: string, updates: Partial<Pick<Node, 'title' | 'parent_id'> & { language_hint?: string | null; default_view_mode?: ViewMode | null }>) => {
3636
await repository.updateNode(nodeId, updates);
3737
addLog('DEBUG', `Node updated with ID: ${nodeId}. Refreshing tree.`);
38-
await refreshNodes();
38+
await refreshNodes(true);
3939
}, [addLog, refreshNodes]);
4040

4141
const deleteNode = useCallback(async (nodeId: string) => {
4242
await repository.deleteNode(nodeId);
4343
addLog('INFO', `Deleted node and its descendants starting from root ID: ${nodeId}`);
44-
await refreshNodes();
44+
await refreshNodes(true);
4545
}, [addLog, refreshNodes]);
4646

4747
const deleteNodes = useCallback(async (nodeIds: string[]) => {
4848
if (nodeIds.length === 0) return;
4949
await repository.deleteNodes(nodeIds);
5050
addLog('INFO', `Deleted ${nodeIds.length} node(s) and their descendants.`);
51-
await refreshNodes();
51+
await refreshNodes(true);
5252
}, [addLog, refreshNodes]);
5353

5454
const duplicateNodes = useCallback(async (nodeIds: string[]) => {
5555
await repository.duplicateNodes(nodeIds);
5656
addLog('INFO', `Duplicated ${nodeIds.length} item(s).`);
57-
await refreshNodes();
57+
await refreshNodes(true);
5858
}, [addLog, refreshNodes]);
5959

6060
const moveNodes = useCallback(async (draggedIds: string[], targetId: string | null, position: 'before' | 'after' | 'inside') => {
6161
await repository.moveNodes(draggedIds, targetId, position);
6262
addLog('INFO', `Moved ${draggedIds.length} item(s).`);
63-
await refreshNodes();
63+
await refreshNodes(true);
6464
}, [addLog, refreshNodes]);
65-
65+
6666
const updateDocumentContent = useCallback(async (nodeId: string, newContent: string): Promise<void> => {
67-
await repository.updateDocumentContent(nodeId, newContent);
68-
addLog('DEBUG', `Content for node ${nodeId} saved.`);
67+
await repository.updateDocumentContent(nodeId, newContent);
68+
addLog('DEBUG', `Content for node ${nodeId} saved.`);
6969
}, [addLog]);
7070

7171
const importFiles = useCallback(
@@ -82,7 +82,7 @@ export const useNodes = () => {
8282
async (payload: DraggedNodeTransfer, targetId: string | null, position: 'before' | 'after' | 'inside') => {
8383
const createdIds = await repository.importNodesFromTransfer(payload, targetId, position);
8484
addLog('INFO', `Copied ${createdIds.length} item(s) from external workspace.`);
85-
await refreshNodes();
85+
await refreshNodes(true);
8686
return createdIds;
8787
},
8888
[addLog, refreshNodes]
@@ -91,7 +91,7 @@ export const useNodes = () => {
9191
const setNodeLock = useCallback(async (nodeId: string, locked: boolean) => {
9292
await repository.setNodeLock(nodeId, locked);
9393
addLog('DEBUG', `Set lock state for node ${nodeId} to ${locked ? 'locked' : 'unlocked'}.`);
94-
await refreshNodes();
94+
await refreshNodes(true);
9595
}, [addLog, refreshNodes]);
9696

9797
const createDocumentFromClipboard = useCallback(async (
@@ -106,7 +106,7 @@ export const useNodes = () => {
106106
if (summary.warnings.length > 0) {
107107
summary.warnings.forEach(warning => addLog('WARNING', warning));
108108
}
109-
await refreshNodes();
109+
await refreshNodes(true);
110110
return result;
111111
}, [addLog, refreshNodes]);
112112

0 commit comments

Comments
 (0)