File size: 1,532 Bytes
dbeb485
 
 
 
 
9205030
dbeb485
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import { useState, useMemo } from "react";

interface Question {
  id: string;
  examTypeId: string;
  [key: string]: unknown;
}

export function useQuestionSelection(questions: Question[]) {
  const [isSelectMode, setIsSelectMode] = useState(false);
  const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());

  const lockedExamType = useMemo(() => {
    if (selectedIds.size === 0) return null;
    const firstId = Array.from(selectedIds)[0];
    const firstQ = questions.find((q) => q.id === firstId);
    return firstQ?.examTypeId ?? null;
  }, [selectedIds, questions]);

  const toggleSelection = (id: string) => {
    const q = questions.find((item) => item.id === id);
    if (!q) return;
    if (lockedExamType && q.examTypeId !== lockedExamType) return;

    setSelectedIds((prev) => {
      const next = new Set(prev);
      if (next.has(id)) next.delete(id);
      else next.add(id);
      return next;
    });
  };

  const selectAll = () => {
    if (lockedExamType) {
      setSelectedIds(
        new Set(questions.filter((q) => q.examTypeId === lockedExamType).map((q) => q.id)),
      );
    } else {
      setSelectedIds(new Set(questions.map((q) => q.id)));
    }
  };

  const clearSelection = () => setSelectedIds(new Set());

  const exitSelectMode = () => {
    setIsSelectMode(false);
    setSelectedIds(new Set());
  };

  return {
    isSelectMode,
    setIsSelectMode,
    selectedIds,
    lockedExamType,
    toggleSelection,
    selectAll,
    clearSelection,
    exitSelectMode,
  };
}