@cccsaurora/clue-ui 1.2.2 → 1.2.3-dev.266

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/ActionForm-uDp92tN2.js +5941 -0
  2. package/AnnotationDetails-DGYfOiWm.js +175 -0
  3. package/AnnotationPreview-bHObsb3P.js +188 -0
  4. package/ClueEnrichContext-CJEJxrgs.js +541 -0
  5. package/FlexOne-BSYAhhtG.js +9 -0
  6. package/_MapCache-WmuDdwuH.js +222 -0
  7. package/_Uint8Array-B7JqpgFX.js +128 -0
  8. package/_baseAssignValue-CGTuELqU.js +25 -0
  9. package/_baseClone-CkNrTyhm.js +283 -0
  10. package/_baseExtremum-kob8QXyt.js +18 -0
  11. package/_baseFlatten-jIR_sN_-.js +92 -0
  12. package/_baseGet-Bx3A4Qfp.js +108 -0
  13. package/_baseIsEqual-C5OTWzTk.js +208 -0
  14. package/_baseIteratee-avi7MX2o.js +126 -0
  15. package/_baseSlice-GAv_YFTT.js +20 -0
  16. package/_baseSum-D0WC1dN0.js +13 -0
  17. package/_baseUniq-BI9GIHMF.js +115 -0
  18. package/_commonjsHelpers-DWwsNxpa.js +8 -0
  19. package/_createAggregator-QD8MzKwe.js +63 -0
  20. package/_getPrototype-CU0j_POw.js +5 -0
  21. package/_getTag-Ckxxfr88.js +126 -0
  22. package/_isIterateeCall-Ds3sw2SF.js +17 -0
  23. package/_setToArray-CaPKQhcz.js +33 -0
  24. package/cloneDeep-DJrLSw8W.js +8 -0
  25. package/components/AnnotationBody.js +49 -35
  26. package/components/AnnotationDetailPopover.js +36 -30
  27. package/components/AnnotationDetails.js +7 -7
  28. package/components/AnnotationEntry.js +35 -35
  29. package/components/AnnotationPreview.js +5 -5
  30. package/components/ClassificationChip.js +44 -23
  31. package/components/CountBadge.js +31 -26
  32. package/components/EnrichedCard.js +110 -97
  33. package/components/EnrichedChip.js +130 -105
  34. package/components/EnrichedTypography.js +133 -107
  35. package/components/ErrorBoundary.js +28 -24
  36. package/components/RetryFailedEnrichments.js +10 -9
  37. package/components/SourcePicker.js +57 -49
  38. package/components/actions/ActionForm.js +4 -4
  39. package/components/actions/ExecutePopover.js +75 -59
  40. package/components/actions/ResultModal.js +4 -4
  41. package/components/actions/form/schemaAdapter.js +39 -23
  42. package/components/actions/formats/FileResult.js +86 -59
  43. package/components/actions/formats/index.js +21 -10
  44. package/components/display/graph/ExpandMoreButton.js +10 -10
  45. package/components/display/graph/elements/NodeCard.js +111 -91
  46. package/components/display/graph/elements/NodeTag.js +15 -13
  47. package/components/display/graph/index.js +261 -202
  48. package/components/display/graph/visualizations/Leaf.js +88 -69
  49. package/components/display/graph/visualizations/cloud/index.js +98 -81
  50. package/components/display/graph/visualizations/icons/BaseIcon.js +26 -21
  51. package/components/display/graph/visualizations/icons/BugIcon.js +12 -12
  52. package/components/display/graph/visualizations/icons/HostIcon.js +12 -12
  53. package/components/display/graph/visualizations/icons/NetworkIcon.js +12 -12
  54. package/components/display/graph/visualizations/icons/ProcessIcon.js +12 -12
  55. package/components/display/graph/visualizations/icons/TargetIcon.js +13 -13
  56. package/components/display/graph/visualizations/icons/index.js +14 -13
  57. package/components/display/graph/visualizations/panels/NodePanel.js +10 -8
  58. package/components/display/graph/visualizations/tree/BundleLine.js +108 -81
  59. package/components/display/graph/visualizations/tree/Triangle.js +13 -13
  60. package/components/display/graph/visualizations/tree/index.js +408 -306
  61. package/components/display/icons/Iconified.js +27 -12
  62. package/components/display/json/index.js +4 -4
  63. package/components/display/markdown/index.js +8678 -5770
  64. package/components/enrichment/EnrichPopover.js +54 -46
  65. package/components/fetchers/Fetcher.js +158 -117
  66. package/components/fetchers/PreviewModal.js +20 -17
  67. package/components/fetchers/StatusChip.js +21 -17
  68. package/components/group/Entry.js +13 -11
  69. package/components/group/Group.js +13 -10
  70. package/components/group/GroupControl.js +76 -65
  71. package/components/stats/QueryStatus.js +43 -33
  72. package/countBy-c6S3dvSW.js +14 -0
  73. package/data/event.js +6 -4
  74. package/database/index.js +2 -2
  75. package/debounce-bV0h5FC5.js +92 -0
  76. package/en/translation.json +1 -0
  77. package/fr/translation.json +1 -0
  78. package/get-DSsNkRQs.js +8 -0
  79. package/groupBy-xqz-n0Vd.js +14 -0
  80. package/hooks/ClueActionContext.js +6 -6
  81. package/hooks/ClueComponentContext.js +29 -23
  82. package/hooks/ClueConfigProvider.js +14 -12
  83. package/hooks/ClueDatabaseContext.js +19 -13
  84. package/hooks/ClueEnrichContext.js +8 -8
  85. package/hooks/ClueFetcherContext.js +83 -56
  86. package/hooks/ClueGroupContext.js +17 -14
  87. package/hooks/CluePopupContext.js +5 -5
  88. package/hooks/ClueProvider.js +12 -10
  89. package/hooks/selectors.js +7 -7
  90. package/hooks/useActionResult.js +2 -2
  91. package/hooks/useAnnotations.js +47 -31
  92. package/hooks/useClue.js +6 -4
  93. package/hooks/useClueActions.js +3 -3
  94. package/hooks/useClueConfig.js +6 -4
  95. package/hooks/useClueTypeConfig.js +3 -3
  96. package/hooks/useComparator.js +722 -435
  97. package/hooks/useErrors.js +22 -18
  98. package/hooks/useFetcherResult.js +33 -24
  99. package/hooks/useMyHighlights.js +66 -36
  100. package/hooks/useMyLocalStorage.js +66 -37
  101. package/iconify-CXMreGTg.js +1782 -0
  102. package/icons/Action.js +66 -49
  103. package/icons/Assessment.js +85 -69
  104. package/icons/Context.js +77 -63
  105. package/icons/Opinion.js +76 -60
  106. package/icons/iconMap.js +2 -2
  107. package/identity-CPGTqrE4.js +6 -0
  108. package/index-AMfoEg_6.js +696 -0
  109. package/index-B6C2a_Lg.js +1172 -0
  110. package/index-C12gPw2W.js +17698 -0
  111. package/index-DCKkHTvx.js +15750 -0
  112. package/index-JcKyZeoY.js +465 -0
  113. package/isNil-CIubwp4T.js +6 -0
  114. package/isObject-FTY-5JQX.js +7 -0
  115. package/isObjectLike-OAgjjZye.js +48 -0
  116. package/isSymbol-Xd2FsJyp.js +8 -0
  117. package/last-CUCl67Im.js +7 -0
  118. package/main.js +60 -60
  119. package/maxBy-IKHzFrCS.js +8 -0
  120. package/package.json +1 -1
  121. package/sortBy-DfSj8IoJ.js +96 -0
  122. package/sumBy-D-hb_NY-.js +8 -0
  123. package/text/Frequency.js +42 -23
  124. package/toFinite-Bc55msYj.js +16 -0
  125. package/toNumber-DPxy1FBy.js +39 -0
  126. package/useClueTypeConfig-Z1LFp01b.js +3289 -0
  127. package/utils/chain.js +92 -65
  128. package/utils/classificationParser.js +519 -256
  129. package/utils/constants.js +35 -10
  130. package/utils/graph.js +72 -45
  131. package/utils/hashUtil.js +7 -7
  132. package/utils/line.js +131 -81
  133. package/utils/loggerUtil.js +5 -3
  134. package/utils/sessionStorage.js +41 -27
  135. package/utils/time.js +423 -423
  136. package/utils/utils.js +9 -9
  137. package/utils/window.js +21 -10
  138. package/utils-HmNPuoDB.js +199 -0
  139. package/ActionForm-DlOXqMUx.js +0 -4460
  140. package/AnnotationDetails-Bk-p0F6h.js +0 -160
  141. package/AnnotationPreview-jzZvkCxJ.js +0 -140
  142. package/ClueEnrichContext-KqRuuWNS.js +0 -418
  143. package/FlexOne-BXWFOd1T.js +0 -6
  144. package/_MapCache-BiTi0iqu.js +0 -180
  145. package/_Uint8Array-BQNOM9Rr.js +0 -101
  146. package/_baseAssignValue-CNMLQZco.js +0 -20
  147. package/_baseClone-BnT-6pyM.js +0 -207
  148. package/_baseExtremum-Ca2EHgy2.js +0 -16
  149. package/_baseFlatten-Bfr_Molw.js +0 -72
  150. package/_baseGet-DSZygzyq.js +0 -79
  151. package/_baseIsEqual-VgvaAFZG.js +0 -147
  152. package/_baseIteratee-Dbfsw5z8.js +0 -95
  153. package/_baseSlice-M5RKzt1A.js +0 -10
  154. package/_baseSum-wEbgNeUs.js +0 -10
  155. package/_baseUniq-BJcj69PL.js +0 -79
  156. package/_commonjsHelpers-DaMA6jEr.js +0 -8
  157. package/_createAggregator-k3TuAnxT.js +0 -53
  158. package/_getPrototype-Cr1Mk7BC.js +0 -5
  159. package/_getTag-CK2Sffaq.js +0 -90
  160. package/_isIterateeCall-DkJP7Rbx.js +0 -13
  161. package/_setToArray-C7yMOeww.js +0 -29
  162. package/cloneDeep-CF8TtLHr.js +0 -8
  163. package/countBy-CdYegFSu.js +0 -8
  164. package/debounce-DryYcbJ4.js +0 -56
  165. package/get-CH7kz5Ix.js +0 -8
  166. package/groupBy-br8xmD2R.js +0 -8
  167. package/iconify-BBckr5AQ.js +0 -1263
  168. package/identity-ByMq8VxU.js +0 -6
  169. package/index-BHAe_V9n.js +0 -12768
  170. package/index-BK-zfYhR.js +0 -358
  171. package/index-CA5CUNZO.js +0 -975
  172. package/index-Dj5C04IX.js +0 -568
  173. package/index-p5_wX7q1.js +0 -11729
  174. package/isNil-CjWwlQS3.js +0 -6
  175. package/isObject-B53jY8Qg.js +0 -7
  176. package/isObjectLike-BatpeCIi.js +0 -29
  177. package/isSymbol-C3_SC0Qp.js +0 -8
  178. package/last-7CdUxN0r.js +0 -7
  179. package/maxBy-Bc0dYHcO.js +0 -8
  180. package/sortBy-DY2JBf9n.js +0 -75
  181. package/sumBy-DuMASLPd.js +0 -8
  182. package/toFinite-BMy6GObD.js +0 -14
  183. package/toNumber-YVhnnJv4.js +0 -31
  184. package/useClueTypeConfig-Ct9Ygter.js +0 -2292
  185. package/utils-DmwSUrum.js +0 -129
@@ -1,31 +1,35 @@
1
- import { useContext as a, useState as i, useEffect as l } from "react";
2
- import { ClueDatabaseContext as f } from "./ClueDatabaseContext.js";
3
- import { b as m } from "../ActionForm-DlOXqMUx.js";
4
- const C = (r) => {
5
- const e = a(f), o = m((s) => s.ready), [n, u] = i([]);
6
- return l(() => {
7
- if (!o || !r || !(e != null && e.selectors) || e.selectors.closed)
1
+ import { useContext, useState, useEffect } from "react";
2
+ import { ClueDatabaseContext } from "./ClueDatabaseContext.js";
3
+ import { b as useClueEnrichSelector } from "../ActionForm-uDp92tN2.js";
4
+ const useErrors = (value) => {
5
+ const database = useContext(ClueDatabaseContext);
6
+ const ready = useClueEnrichSelector((ctx) => ctx.ready);
7
+ const [errors, setErrors] = useState([]);
8
+ useEffect(() => {
9
+ if (!ready || !value || !(database == null ? void 0 : database.selectors) || database.selectors.closed) {
8
10
  return;
9
- const s = e.selectors.find({ selector: { value: r, error: { $exists: !0 } } }).$.subscribe(
10
- (t) => (
11
+ }
12
+ const observable = database.selectors.find({ selector: { value, error: { $exists: true } } }).$.subscribe(
13
+ (records) => (
11
14
  // Transform database records into simplified error objects
12
- u(
13
- t.map((c) => ({
14
- source: c.source,
15
- message: c.error
15
+ setErrors(
16
+ records.map((record) => ({
17
+ source: record.source,
18
+ message: record.error
16
19
  }))
17
20
  )
18
21
  )
19
22
  );
20
23
  return () => {
21
24
  try {
22
- s.unsubscribe();
23
- } catch (t) {
24
- console.warn(t);
25
+ observable.unsubscribe();
26
+ } catch (e) {
27
+ console.warn(e);
25
28
  }
26
29
  };
27
- }, [e, o, r]), n;
30
+ }, [database, ready, value]);
31
+ return errors;
28
32
  };
29
33
  export {
30
- C as default
34
+ useErrors as default
31
35
  };
@@ -1,31 +1,40 @@
1
- import { useState as S, useRef as T, useMemo as d, useEffect as g } from "react";
2
- import { u as _ } from "../ActionForm-DlOXqMUx.js";
3
- const y = (o, p = 2e3) => {
4
- const [e, n] = S(o), f = T(null), { getActionStatus: I } = _(), m = d(() => o == null ? void 0 : o.task_id, [o == null ? void 0 : o.task_id]), R = d(() => o == null ? void 0 : o.actionId, [o == null ? void 0 : o.actionId]);
5
- return g(() => {
6
- if ((o == null ? void 0 : o.outcome) !== "pending" || !m) return;
7
- let k = !1;
8
- const A = async () => {
9
- const c = await I(R, m);
10
- if (!c)
11
- n({ outcome: "failure", done: !0 });
12
- else if (c.outcome === "success" || c.outcome === "failure")
13
- n({ ...c, done: !0 });
14
- else {
15
- if (k) return;
16
- n({ ...c }), f.current = setTimeout(A, p);
1
+ import { useState, useRef, useMemo, useEffect } from "react";
2
+ import { u as useClueActions } from "../ActionForm-uDp92tN2.js";
3
+ const useActionResult = (resultWithData, interval = 2e3) => {
4
+ const [result, setResult] = useState(resultWithData);
5
+ const timeoutRef = useRef(null);
6
+ const { getActionStatus } = useClueActions();
7
+ const taskId = useMemo(() => resultWithData == null ? void 0 : resultWithData.task_id, [resultWithData == null ? void 0 : resultWithData.task_id]);
8
+ const actionId = useMemo(() => resultWithData == null ? void 0 : resultWithData.actionId, [resultWithData == null ? void 0 : resultWithData.actionId]);
9
+ useEffect(() => {
10
+ if ((resultWithData == null ? void 0 : resultWithData.outcome) !== "pending" || !taskId) return;
11
+ let cancelled = false;
12
+ const poll = async () => {
13
+ const res = await getActionStatus(actionId, taskId);
14
+ if (!res) {
15
+ setResult({ outcome: "failure", done: true });
16
+ } else if (res.outcome === "success" || res.outcome === "failure") {
17
+ setResult({ ...res, done: true });
18
+ } else {
19
+ if (cancelled) return;
20
+ setResult({ ...res });
21
+ timeoutRef.current = setTimeout(poll, interval);
17
22
  }
18
23
  };
19
- return A(), () => {
20
- k = !0, f.current && clearTimeout(f.current);
24
+ poll();
25
+ return () => {
26
+ cancelled = true;
27
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
21
28
  };
22
- }, [R, I, p, o == null ? void 0 : o.outcome, m]), g(() => {
23
- n(o);
24
- }, [o]), d(
25
- () => o || e ? { ...o, ...e } : void 0,
26
- [o, e]
29
+ }, [actionId, getActionStatus, interval, resultWithData == null ? void 0 : resultWithData.outcome, taskId]);
30
+ useEffect(() => {
31
+ setResult(resultWithData);
32
+ }, [resultWithData]);
33
+ return useMemo(
34
+ () => resultWithData || result ? { ...resultWithData, ...result } : void 0,
35
+ [resultWithData, result]
27
36
  );
28
37
  };
29
38
  export {
30
- y as useActionResult
39
+ useActionResult
31
40
  };
@@ -1,44 +1,74 @@
1
- import { getSubGraphNodeSet as H } from "../utils/graph.js";
2
- import { safeAddEventListener as S } from "../utils/window.js";
3
- import { useMemo as P, useState as h, useCallback as i, useEffect as w } from "react";
4
- const z = (n, c) => {
5
- const u = P(() => n == null ? void 0 : n.data, [n]), [o, f] = h(), [t, g] = h(/* @__PURE__ */ new Set()), [d, p] = h(/* @__PURE__ */ new Set()), [y, a] = h(), K = i((e) => {
6
- a(e.ctrlKey);
7
- }, []), m = i((e) => {
8
- a(e.ctrlKey);
1
+ import { getSubGraphNodeSet } from "../utils/graph.js";
2
+ import { safeAddEventListener } from "../utils/window.js";
3
+ import { useMemo, useState, useCallback, useEffect } from "react";
4
+ const useMyHighlights = (graph, onNodeSelectionChanged) => {
5
+ const data = useMemo(() => graph == null ? void 0 : graph.data, [graph]);
6
+ const [hoveredNode, setHoveredNode] = useState();
7
+ const [highlightedNodes, setHighlightedNodes] = useState(/* @__PURE__ */ new Set());
8
+ const [highlightedPath, setHighlightedPath] = useState(/* @__PURE__ */ new Set());
9
+ const [ctrlKeyDown, setCtrlKeyDown] = useState();
10
+ const onKeyPressed = useCallback((ev) => {
11
+ setCtrlKeyDown(ev.ctrlKey);
9
12
  }, []);
10
- w(() => S("keydown", K), [K]), w(() => S("keyup", m), [m]);
11
- const N = i((e, s) => {
12
- f(s ? e : "");
13
- }, []), b = i(
14
- (e, s, l) => {
15
- let r = /* @__PURE__ */ new Set();
16
- s ? r = new Set(l.ctrlKey ? [...t, e] : [e]) : (r = l.ctrlKey ? /* @__PURE__ */ new Set([...t]) : /* @__PURE__ */ new Set(), r.delete(e)), g(r), c == null || c([...r]);
13
+ const onKeyUnpressed = useCallback((ev) => {
14
+ setCtrlKeyDown(ev.ctrlKey);
15
+ }, []);
16
+ useEffect(() => {
17
+ return safeAddEventListener("keydown", onKeyPressed);
18
+ }, [onKeyPressed]);
19
+ useEffect(() => {
20
+ return safeAddEventListener("keyup", onKeyUnpressed);
21
+ }, [onKeyUnpressed]);
22
+ const onNodeHoveredChanged = useCallback((nodeId, isHovered) => {
23
+ if (isHovered) {
24
+ setHoveredNode(nodeId);
25
+ } else {
26
+ setHoveredNode("");
27
+ }
28
+ }, []);
29
+ const onNodeClicked = useCallback(
30
+ (nodeId, isSelected, event) => {
31
+ let newHighlightedNodes = /* @__PURE__ */ new Set();
32
+ if (isSelected) {
33
+ newHighlightedNodes = new Set(event.ctrlKey ? [...highlightedNodes, nodeId] : [nodeId]);
34
+ } else {
35
+ newHighlightedNodes = event.ctrlKey ? /* @__PURE__ */ new Set([...highlightedNodes]) : /* @__PURE__ */ new Set();
36
+ newHighlightedNodes.delete(nodeId);
37
+ }
38
+ setHighlightedNodes(newHighlightedNodes);
39
+ onNodeSelectionChanged == null ? void 0 : onNodeSelectionChanged([...newHighlightedNodes]);
17
40
  },
18
- [t, c]
19
- ), k = i(
20
- (e) => d.size === 0 || d.has(e) ? 1 : 0.2,
21
- [d]
41
+ [highlightedNodes, onNodeSelectionChanged]
22
42
  );
23
- return w(() => {
24
- let e = /* @__PURE__ */ new Set();
25
- if (o) {
26
- const s = H(o, u);
27
- e = /* @__PURE__ */ new Set([...e, ...s]);
43
+ const nodeOpacities = useCallback(
44
+ (nodeId) => {
45
+ return highlightedPath.size === 0 || highlightedPath.has(nodeId) ? 1 : 0.2;
46
+ },
47
+ [highlightedPath]
48
+ );
49
+ useEffect(() => {
50
+ let newHighlightedPath = /* @__PURE__ */ new Set();
51
+ if (hoveredNode) {
52
+ const subGraphNodes = getSubGraphNodeSet(hoveredNode, data);
53
+ newHighlightedPath = /* @__PURE__ */ new Set([...newHighlightedPath, ...subGraphNodes]);
54
+ }
55
+ if (highlightedNodes.size && (ctrlKeyDown || !hoveredNode)) {
56
+ highlightedNodes.forEach((highlightedNode) => {
57
+ const subGraphNodes = getSubGraphNodeSet(highlightedNode, data);
58
+ newHighlightedPath = /* @__PURE__ */ new Set([...newHighlightedPath, ...subGraphNodes]);
59
+ });
28
60
  }
29
- t.size && (y || !o) && t.forEach((s) => {
30
- const l = H(s, u);
31
- e = /* @__PURE__ */ new Set([...e, ...l]);
32
- }), p(e);
33
- }, [o, t, y, u]), {
34
- onNodeHoveredChanged: N,
35
- onNodeClicked: b,
36
- nodeOpacities: k,
37
- highlightedPath: d,
38
- highlightedNodes: t,
39
- hoveredNode: o
61
+ setHighlightedPath(newHighlightedPath);
62
+ }, [hoveredNode, highlightedNodes, ctrlKeyDown, data]);
63
+ return {
64
+ onNodeHoveredChanged,
65
+ onNodeClicked,
66
+ nodeOpacities,
67
+ highlightedPath,
68
+ highlightedNodes,
69
+ hoveredNode
40
70
  };
41
71
  };
42
72
  export {
43
- z as default
73
+ useMyHighlights as default
44
74
  };
@@ -1,51 +1,80 @@
1
- import { useCallback as c, useMemo as S, useState as v, useEffect as I, createContext as O, useContext as i } from "react";
2
- import { i as p } from "../isNil-CjWwlQS3.js";
1
+ import { useCallback, useMemo, useState, useEffect, createContext, useContext } from "react";
2
+ import { i as isNil } from "../isNil-CIubwp4T.js";
3
3
  import "react/jsx-runtime";
4
- import { MY_LOCAL_STORAGE_PREFIX as f } from "../utils/constants.js";
5
- function L(o) {
6
- const e = c((t) => `${o}.${t}`, [o]), a = c((t) => JSON.parse(localStorage.getItem(e(t))), [e]), m = c(
7
- (t, u) => localStorage.setItem(e(t), JSON.stringify(u)),
8
- [e]
9
- ), r = c(
10
- (t, u = !1) => localStorage.removeItem(u ? t : e(t)),
11
- [e]
12
- ), n = c((t) => a(t) !== null, [a]), s = c(() => Object.keys(localStorage), []), l = c(() => s().map((t) => ({ key: t, value: JSON.parse(localStorage.getItem(t)) })), [s]), g = c(
13
- () => s().forEach((t) => {
14
- t.startsWith(o) && r(t, !0);
4
+ import { MY_LOCAL_STORAGE_PREFIX } from "../utils/constants.js";
5
+ function useLocalStorage(prefix) {
6
+ const _buildKey = useCallback((name) => `${prefix}.${name}`, [prefix]);
7
+ const get = useCallback((key) => JSON.parse(localStorage.getItem(_buildKey(key))), [_buildKey]);
8
+ const set = useCallback(
9
+ (key, value) => localStorage.setItem(_buildKey(key), JSON.stringify(value)),
10
+ [_buildKey]
11
+ );
12
+ const remove = useCallback(
13
+ (key, withPrefix = false) => localStorage.removeItem(withPrefix ? key : _buildKey(key)),
14
+ [_buildKey]
15
+ );
16
+ const has = useCallback((key) => get(key) !== null, [get]);
17
+ const keys = useCallback(() => Object.keys(localStorage), []);
18
+ const items = useCallback(() => keys().map((k) => ({ key: k, value: JSON.parse(localStorage.getItem(k)) })), [keys]);
19
+ const clear = useCallback(
20
+ () => keys().forEach((key) => {
21
+ if (key.startsWith(prefix)) {
22
+ remove(key, true);
23
+ }
15
24
  }),
16
- [o, r, s]
25
+ [prefix, remove, keys]
17
26
  );
18
- return S(
27
+ return useMemo(
19
28
  () => ({
20
- get: a,
21
- set: m,
22
- remove: r,
23
- has: n,
24
- keys: s,
25
- items: l,
26
- clear: g
29
+ get,
30
+ set,
31
+ remove,
32
+ has,
33
+ keys,
34
+ items,
35
+ clear
27
36
  }),
28
- [a, m, r, n, s, l, g]
37
+ [get, set, remove, has, keys, items, clear]
29
38
  );
30
39
  }
31
- function C(o, e, a) {
32
- const { get: m, set: r, has: n, remove: s } = L(a), [l, g] = v(m(o) ?? e);
33
- return I(() => {
34
- e != null && !n(o) && r(o, e);
35
- }, [o, e, n, r]), S(
40
+ function useLocalStorageItem(key, initialValue, prefix) {
41
+ const { get, set, has, remove } = useLocalStorage(prefix);
42
+ const [value, setValue] = useState(get(key) ?? initialValue);
43
+ useEffect(() => {
44
+ if (initialValue !== null && initialValue !== void 0 && !has(key)) {
45
+ set(key, initialValue);
46
+ }
47
+ }, [key, initialValue, has, set]);
48
+ return useMemo(
36
49
  () => [
37
- l,
38
- (t, u = !0) => {
39
- u && (p(t) ? s(o) : r(o, t)), g(t);
50
+ value,
51
+ (newValue, save = true) => {
52
+ if (save) {
53
+ if (!isNil(newValue)) {
54
+ set(key, newValue);
55
+ } else {
56
+ remove(key);
57
+ }
58
+ }
59
+ setValue(newValue);
40
60
  },
41
- () => s(o)
61
+ () => remove(key)
42
62
  ],
43
- [o, l, r, s]
63
+ [key, value, set, remove]
44
64
  );
45
65
  }
46
- const M = O(null), _ = () => L(f), b = (o, e) => C(o, e, f), J = () => i(M);
66
+ const LocalStorageContext = createContext(null);
67
+ const useMyLocalStorage = () => {
68
+ return useLocalStorage(MY_LOCAL_STORAGE_PREFIX);
69
+ };
70
+ const useMyLocalStorageItem = (key, initialValue) => {
71
+ return useLocalStorageItem(key, initialValue, MY_LOCAL_STORAGE_PREFIX);
72
+ };
73
+ const useMyLocalStorageProvider = () => {
74
+ return useContext(LocalStorageContext);
75
+ };
47
76
  export {
48
- _ as default,
49
- b as useMyLocalStorageItem,
50
- J as useMyLocalStorageProvider
77
+ useMyLocalStorage as default,
78
+ useMyLocalStorageItem,
79
+ useMyLocalStorageProvider
51
80
  };