@cccsaurora/clue-ui 1.2.1 → 1.2.2-dev.263

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 (183) 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 +156 -118
  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/get-DSsNkRQs.js +8 -0
  77. package/groupBy-xqz-n0Vd.js +14 -0
  78. package/hooks/ClueActionContext.js +6 -6
  79. package/hooks/ClueComponentContext.js +29 -23
  80. package/hooks/ClueConfigProvider.js +14 -12
  81. package/hooks/ClueDatabaseContext.js +19 -13
  82. package/hooks/ClueEnrichContext.js +8 -8
  83. package/hooks/ClueFetcherContext.js +83 -56
  84. package/hooks/ClueGroupContext.js +17 -14
  85. package/hooks/CluePopupContext.js +5 -5
  86. package/hooks/ClueProvider.js +12 -10
  87. package/hooks/selectors.js +7 -7
  88. package/hooks/useActionResult.js +2 -2
  89. package/hooks/useAnnotations.js +47 -31
  90. package/hooks/useClue.js +6 -4
  91. package/hooks/useClueActions.js +3 -3
  92. package/hooks/useClueConfig.js +6 -4
  93. package/hooks/useClueTypeConfig.js +3 -3
  94. package/hooks/useComparator.js +722 -435
  95. package/hooks/useErrors.js +22 -18
  96. package/hooks/useFetcherResult.js +33 -24
  97. package/hooks/useMyHighlights.js +66 -36
  98. package/hooks/useMyLocalStorage.js +66 -37
  99. package/iconify-CXMreGTg.js +1782 -0
  100. package/icons/Action.js +66 -49
  101. package/icons/Assessment.js +85 -69
  102. package/icons/Context.js +77 -63
  103. package/icons/Opinion.js +76 -60
  104. package/icons/iconMap.js +2 -2
  105. package/identity-CPGTqrE4.js +6 -0
  106. package/index-AMfoEg_6.js +696 -0
  107. package/index-B6C2a_Lg.js +1172 -0
  108. package/index-C12gPw2W.js +17698 -0
  109. package/index-DCKkHTvx.js +15750 -0
  110. package/index-JcKyZeoY.js +465 -0
  111. package/isNil-CIubwp4T.js +6 -0
  112. package/isObject-FTY-5JQX.js +7 -0
  113. package/isObjectLike-OAgjjZye.js +48 -0
  114. package/isSymbol-Xd2FsJyp.js +8 -0
  115. package/last-CUCl67Im.js +7 -0
  116. package/main.js +60 -60
  117. package/maxBy-IKHzFrCS.js +8 -0
  118. package/package.json +1 -1
  119. package/sortBy-DfSj8IoJ.js +96 -0
  120. package/sumBy-D-hb_NY-.js +8 -0
  121. package/text/Frequency.js +42 -23
  122. package/toFinite-Bc55msYj.js +16 -0
  123. package/toNumber-DPxy1FBy.js +39 -0
  124. package/useClueTypeConfig-Z1LFp01b.js +3289 -0
  125. package/utils/chain.js +92 -65
  126. package/utils/classificationParser.js +519 -256
  127. package/utils/constants.js +35 -10
  128. package/utils/graph.js +72 -45
  129. package/utils/hashUtil.js +7 -7
  130. package/utils/line.js +131 -81
  131. package/utils/loggerUtil.js +5 -3
  132. package/utils/sessionStorage.js +41 -27
  133. package/utils/time.js +423 -423
  134. package/utils/utils.js +9 -9
  135. package/utils/window.js +21 -10
  136. package/utils-HmNPuoDB.js +199 -0
  137. package/ActionForm-DlOXqMUx.js +0 -4460
  138. package/AnnotationDetails-Bk-p0F6h.js +0 -160
  139. package/AnnotationPreview-jzZvkCxJ.js +0 -140
  140. package/ClueEnrichContext-KqRuuWNS.js +0 -418
  141. package/FlexOne-BXWFOd1T.js +0 -6
  142. package/_MapCache-BiTi0iqu.js +0 -180
  143. package/_Uint8Array-BQNOM9Rr.js +0 -101
  144. package/_baseAssignValue-CNMLQZco.js +0 -20
  145. package/_baseClone-BnT-6pyM.js +0 -207
  146. package/_baseExtremum-Ca2EHgy2.js +0 -16
  147. package/_baseFlatten-Bfr_Molw.js +0 -72
  148. package/_baseGet-DSZygzyq.js +0 -79
  149. package/_baseIsEqual-VgvaAFZG.js +0 -147
  150. package/_baseIteratee-Dbfsw5z8.js +0 -95
  151. package/_baseSlice-M5RKzt1A.js +0 -10
  152. package/_baseSum-wEbgNeUs.js +0 -10
  153. package/_baseUniq-BJcj69PL.js +0 -79
  154. package/_commonjsHelpers-DaMA6jEr.js +0 -8
  155. package/_createAggregator-k3TuAnxT.js +0 -53
  156. package/_getPrototype-Cr1Mk7BC.js +0 -5
  157. package/_getTag-CK2Sffaq.js +0 -90
  158. package/_isIterateeCall-DkJP7Rbx.js +0 -13
  159. package/_setToArray-C7yMOeww.js +0 -29
  160. package/cloneDeep-CF8TtLHr.js +0 -8
  161. package/countBy-CdYegFSu.js +0 -8
  162. package/debounce-DryYcbJ4.js +0 -56
  163. package/get-CH7kz5Ix.js +0 -8
  164. package/groupBy-br8xmD2R.js +0 -8
  165. package/iconify-BBckr5AQ.js +0 -1263
  166. package/identity-ByMq8VxU.js +0 -6
  167. package/index-BHAe_V9n.js +0 -12768
  168. package/index-BK-zfYhR.js +0 -358
  169. package/index-CA5CUNZO.js +0 -975
  170. package/index-Dj5C04IX.js +0 -568
  171. package/index-p5_wX7q1.js +0 -11729
  172. package/isNil-CjWwlQS3.js +0 -6
  173. package/isObject-B53jY8Qg.js +0 -7
  174. package/isObjectLike-BatpeCIi.js +0 -29
  175. package/isSymbol-C3_SC0Qp.js +0 -8
  176. package/last-7CdUxN0r.js +0 -7
  177. package/maxBy-Bc0dYHcO.js +0 -8
  178. package/sortBy-DY2JBf9n.js +0 -75
  179. package/sumBy-DuMASLPd.js +0 -8
  180. package/toFinite-BMy6GObD.js +0 -14
  181. package/toNumber-YVhnnJv4.js +0 -31
  182. package/useClueTypeConfig-Ct9Ygter.js +0 -2292
  183. 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
  };