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

jcubic / 10xDevs / 18621254025

18 Oct 2025 09:32PM UTC coverage: 19.473% (+0.2%) from 19.299%
18621254025

push

github

jcubic
replace History API with Next.js routes system

77 of 109 branches covered (70.64%)

Branch coverage included in aggregate %.

0 of 33 new or added lines in 5 files covered. (0.0%)

118 existing lines in 9 files now uncovered.

462 of 2659 relevant lines covered (17.37%)

2.69 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) => {
×
NEW
14
    setNotes((prevNotes) => {
×
NEW
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;
×
NEW
26
      });
×
27

NEW
28
      return newNotes;
×
NEW
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