• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

jcubic / 10xDevs / 18840571689

27 Oct 2025 12:14PM UTC coverage: 23.648% (-1.9%) from 25.594%
18840571689

push

github

jcubic
update workflow

1783 of 8857 branches covered (20.13%)

Branch coverage included in aggregate %.

761 of 1901 relevant lines covered (40.03%)

1814.76 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/hooks/useNodeSelection.ts
1
import { useState, useCallback } from 'react';
2
import type { NoteTreeNode } from '@/types/tree';
3
import type { SaveStatus } from '@/types/notes';
4

5
export function useNodeSelection(
6
  initialNotes: NoteTreeNode[] = [],
×
7
  initialSelectedId: number | null = null
×
8
) {
9
  const [notes, setNotes] = useState<NoteTreeNode[]>(initialNotes);
×
10
  const [selectedNoteId, setSelectedNoteId] = useState<number | null>(initialSelectedId);
×
11
  const [saveStatus, setSaveStatus] = useState<SaveStatus>('idle');
×
12

13
  const updateSelection = useCallback((newSelectedId: number | null) => {
×
14
    setNotes((prevNotes) => {
×
15
      const newNotes = prevNotes.map((node) => {
×
16
        // If this is the old selected node, deselect it
17
        if (node.selected && node.id !== newSelectedId) {
×
18
          return { ...node, selected: false };
×
19
        }
20
        // If this is the new selected node, select it
21
        if (node.id === newSelectedId && !node.selected) {
×
22
          return { ...node, selected: true };
×
23
        }
24
        // Otherwise return the same node reference
25
        return node;
×
26
      });
27

28
      return newNotes;
×
29
    });
30

31
    setSelectedNoteId(newSelectedId);
×
32
  }, []);
33

34
  const updateDirtyFlag = useCallback((noteId: number, dirty: boolean) => {
×
35
    setNotes((prevNotes) =>
×
36
      prevNotes.map((node) => {
×
37
        if (node.id === noteId) {
×
38
          return {
×
39
            ...node,
40
            data: { ...node.data!, dirty }
41
          };
42
        }
43
        return node;
×
44
      })
45
    );
46
  }, []);
47

48
  const updateNoteContent = useCallback((noteId: number, content: string) => {
×
49
    setNotes((prevNotes) =>
×
50
      prevNotes.map((node) => {
×
51
        if (node.id === noteId) {
×
52
          return {
×
53
            ...node,
54
            data: { ...node.data!, content, dirty: true }
55
          };
56
        }
57
        return node;
×
58
      })
59
    );
60
  }, []);
61

62
  const updateNoteName = useCallback((noteId: number, name: string) => {
×
63
    setNotes((prevNotes) =>
×
64
      prevNotes.map((node) => {
×
65
        if (node.id === noteId) {
×
66
          return { ...node, name };
×
67
        }
68
        return node;
×
69
      })
70
    );
71
  }, []);
72

73
  return {
×
74
    notes,
75
    selectedNoteId,
76
    saveStatus,
77
    setNotes,
78
    setSaveStatus,
79
    updateSelection,
80
    updateDirtyFlag,
81
    updateNoteContent,
82
    updateNoteName
83
  };
84
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc