@buoy-gg/time-machine 7.0.22 → 7.0.23

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 (160) hide show
  1. package/lib/commonjs/components/TimeMachineBody.js +147 -677
  2. package/lib/commonjs/components/TimeMachineBody.js.map +1 -1
  3. package/lib/commonjs/components/TimeMachineModal.js +10 -11
  4. package/lib/commonjs/components/TimeMachineModal.js.map +1 -1
  5. package/lib/commonjs/components/confirm.js +39 -0
  6. package/lib/commonjs/components/confirm.js.map +1 -0
  7. package/lib/commonjs/components/format.js +24 -0
  8. package/lib/commonjs/components/format.js.map +1 -0
  9. package/lib/commonjs/components/list/CaptureBar.js +95 -0
  10. package/lib/commonjs/components/list/CaptureBar.js.map +1 -0
  11. package/lib/commonjs/components/list/RestoreOutcomeCard.js +162 -0
  12. package/lib/commonjs/components/list/RestoreOutcomeCard.js.map +1 -0
  13. package/lib/commonjs/components/list/SnapshotRow.js +141 -0
  14. package/lib/commonjs/components/list/SnapshotRow.js.map +1 -0
  15. package/lib/commonjs/components/list/SourcesStrip.js +126 -0
  16. package/lib/commonjs/components/list/SourcesStrip.js.map +1 -0
  17. package/lib/commonjs/components/list/UndoDeleteBar.js +81 -0
  18. package/lib/commonjs/components/list/UndoDeleteBar.js.map +1 -0
  19. package/lib/commonjs/components/list/WipeAllRow.js +46 -0
  20. package/lib/commonjs/components/list/WipeAllRow.js.map +1 -0
  21. package/lib/commonjs/components/preview/ItemDiffPanel.js +77 -0
  22. package/lib/commonjs/components/preview/ItemDiffPanel.js.map +1 -0
  23. package/lib/commonjs/components/preview/PreviewFlow.js +51 -0
  24. package/lib/commonjs/components/preview/PreviewFlow.js.map +1 -0
  25. package/lib/commonjs/components/preview/RestorePointNameRow.js +83 -0
  26. package/lib/commonjs/components/preview/RestorePointNameRow.js.map +1 -0
  27. package/lib/commonjs/components/preview/RestorePreviewScreen.js +549 -635
  28. package/lib/commonjs/components/preview/RestorePreviewScreen.js.map +1 -1
  29. package/lib/commonjs/components/preview/verdictMeta.js +8 -8
  30. package/lib/commonjs/components/preview/verdictMeta.js.map +1 -1
  31. package/lib/commonjs/components/sources.js +72 -0
  32. package/lib/commonjs/components/sources.js.map +1 -0
  33. package/lib/commonjs/store/snapshotVault.js +93 -9
  34. package/lib/commonjs/store/snapshotVault.js.map +1 -1
  35. package/lib/commonjs/store/timeMachineStore.js +125 -6
  36. package/lib/commonjs/store/timeMachineStore.js.map +1 -1
  37. package/lib/commonjs/sync/timeMachineSyncAdapter.js +41 -0
  38. package/lib/commonjs/sync/timeMachineSyncAdapter.js.map +1 -1
  39. package/lib/commonjs/ui/SwipeActionsRow.js +167 -0
  40. package/lib/commonjs/ui/SwipeActionsRow.js.map +1 -0
  41. package/lib/commonjs/ui/primitives.js +164 -0
  42. package/lib/commonjs/ui/primitives.js.map +1 -0
  43. package/lib/commonjs/ui/tmTheme.js +103 -0
  44. package/lib/commonjs/ui/tmTheme.js.map +1 -0
  45. package/lib/module/components/TimeMachineBody.js +150 -680
  46. package/lib/module/components/TimeMachineBody.js.map +1 -1
  47. package/lib/module/components/TimeMachineModal.js +11 -12
  48. package/lib/module/components/TimeMachineModal.js.map +1 -1
  49. package/lib/module/components/confirm.js +34 -0
  50. package/lib/module/components/confirm.js.map +1 -0
  51. package/lib/module/components/format.js +19 -0
  52. package/lib/module/components/format.js.map +1 -0
  53. package/lib/module/components/list/CaptureBar.js +90 -0
  54. package/lib/module/components/list/CaptureBar.js.map +1 -0
  55. package/lib/module/components/list/RestoreOutcomeCard.js +156 -0
  56. package/lib/module/components/list/RestoreOutcomeCard.js.map +1 -0
  57. package/lib/module/components/list/SnapshotRow.js +138 -0
  58. package/lib/module/components/list/SnapshotRow.js.map +1 -0
  59. package/lib/module/components/list/SourcesStrip.js +121 -0
  60. package/lib/module/components/list/SourcesStrip.js.map +1 -0
  61. package/lib/module/components/list/UndoDeleteBar.js +78 -0
  62. package/lib/module/components/list/UndoDeleteBar.js.map +1 -0
  63. package/lib/module/components/list/WipeAllRow.js +41 -0
  64. package/lib/module/components/list/WipeAllRow.js.map +1 -0
  65. package/lib/module/components/preview/ItemDiffPanel.js +72 -0
  66. package/lib/module/components/preview/ItemDiffPanel.js.map +1 -0
  67. package/lib/module/components/preview/PreviewFlow.js +46 -0
  68. package/lib/module/components/preview/PreviewFlow.js.map +1 -0
  69. package/lib/module/components/preview/RestorePointNameRow.js +78 -0
  70. package/lib/module/components/preview/RestorePointNameRow.js.map +1 -0
  71. package/lib/module/components/preview/RestorePreviewScreen.js +552 -638
  72. package/lib/module/components/preview/RestorePreviewScreen.js.map +1 -1
  73. package/lib/module/components/preview/verdictMeta.js +9 -8
  74. package/lib/module/components/preview/verdictMeta.js.map +1 -1
  75. package/lib/module/components/sources.js +66 -0
  76. package/lib/module/components/sources.js.map +1 -0
  77. package/lib/module/store/snapshotVault.js +87 -9
  78. package/lib/module/store/snapshotVault.js.map +1 -1
  79. package/lib/module/store/timeMachineStore.js +125 -7
  80. package/lib/module/store/timeMachineStore.js.map +1 -1
  81. package/lib/module/sync/timeMachineSyncAdapter.js +41 -0
  82. package/lib/module/sync/timeMachineSyncAdapter.js.map +1 -1
  83. package/lib/module/ui/SwipeActionsRow.js +162 -0
  84. package/lib/module/ui/SwipeActionsRow.js.map +1 -0
  85. package/lib/module/ui/primitives.js +156 -0
  86. package/lib/module/ui/primitives.js.map +1 -0
  87. package/lib/module/ui/tmTheme.js +99 -0
  88. package/lib/module/ui/tmTheme.js.map +1 -0
  89. package/lib/typescript/components/TimeMachineBody.d.ts.map +1 -1
  90. package/lib/typescript/components/TimeMachineModal.d.ts.map +1 -1
  91. package/lib/typescript/components/confirm.d.ts +2 -0
  92. package/lib/typescript/components/confirm.d.ts.map +1 -0
  93. package/lib/typescript/components/format.d.ts +4 -0
  94. package/lib/typescript/components/format.d.ts.map +1 -0
  95. package/lib/typescript/components/list/CaptureBar.d.ts +6 -0
  96. package/lib/typescript/components/list/CaptureBar.d.ts.map +1 -0
  97. package/lib/typescript/components/list/RestoreOutcomeCard.d.ts +11 -0
  98. package/lib/typescript/components/list/RestoreOutcomeCard.d.ts.map +1 -0
  99. package/lib/typescript/components/list/SnapshotRow.d.ts +12 -0
  100. package/lib/typescript/components/list/SnapshotRow.d.ts.map +1 -0
  101. package/lib/typescript/components/list/SourcesStrip.d.ts +5 -0
  102. package/lib/typescript/components/list/SourcesStrip.d.ts.map +1 -0
  103. package/lib/typescript/components/list/UndoDeleteBar.d.ts +8 -0
  104. package/lib/typescript/components/list/UndoDeleteBar.d.ts.map +1 -0
  105. package/lib/typescript/components/list/WipeAllRow.d.ts +5 -0
  106. package/lib/typescript/components/list/WipeAllRow.d.ts.map +1 -0
  107. package/lib/typescript/components/preview/ItemDiffPanel.d.ts +5 -0
  108. package/lib/typescript/components/preview/ItemDiffPanel.d.ts.map +1 -0
  109. package/lib/typescript/components/preview/PreviewFlow.d.ts +9 -0
  110. package/lib/typescript/components/preview/PreviewFlow.d.ts.map +1 -0
  111. package/lib/typescript/components/preview/RestorePointNameRow.d.ts +5 -0
  112. package/lib/typescript/components/preview/RestorePointNameRow.d.ts.map +1 -0
  113. package/lib/typescript/components/preview/RestorePreviewScreen.d.ts +1 -5
  114. package/lib/typescript/components/preview/RestorePreviewScreen.d.ts.map +1 -1
  115. package/lib/typescript/components/preview/verdictMeta.d.ts +5 -0
  116. package/lib/typescript/components/preview/verdictMeta.d.ts.map +1 -1
  117. package/lib/typescript/components/sources.d.ts +36 -0
  118. package/lib/typescript/components/sources.d.ts.map +1 -0
  119. package/lib/typescript/store/snapshotVault.d.ts +48 -0
  120. package/lib/typescript/store/snapshotVault.d.ts.map +1 -1
  121. package/lib/typescript/store/timeMachineStore.d.ts +35 -1
  122. package/lib/typescript/store/timeMachineStore.d.ts.map +1 -1
  123. package/lib/typescript/sync/timeMachineSyncAdapter.d.ts +17 -0
  124. package/lib/typescript/sync/timeMachineSyncAdapter.d.ts.map +1 -1
  125. package/lib/typescript/ui/SwipeActionsRow.d.ts +32 -0
  126. package/lib/typescript/ui/SwipeActionsRow.d.ts.map +1 -0
  127. package/lib/typescript/ui/primitives.d.ts +57 -0
  128. package/lib/typescript/ui/primitives.d.ts.map +1 -0
  129. package/lib/typescript/ui/tmTheme.d.ts +67 -0
  130. package/lib/typescript/ui/tmTheme.d.ts.map +1 -0
  131. package/package.json +7 -7
  132. package/src/components/TimeMachineBody.tsx +183 -817
  133. package/src/components/TimeMachineModal.tsx +10 -11
  134. package/src/components/confirm.ts +35 -0
  135. package/src/components/format.ts +17 -0
  136. package/src/components/list/CaptureBar.tsx +100 -0
  137. package/src/components/list/RestoreOutcomeCard.tsx +159 -0
  138. package/src/components/list/SnapshotRow.tsx +155 -0
  139. package/src/components/list/SourcesStrip.tsx +124 -0
  140. package/src/components/list/UndoDeleteBar.tsx +76 -0
  141. package/src/components/list/WipeAllRow.tsx +42 -0
  142. package/src/components/preview/ItemDiffPanel.tsx +77 -0
  143. package/src/components/preview/PreviewFlow.tsx +70 -0
  144. package/src/components/preview/RestorePointNameRow.tsx +80 -0
  145. package/src/components/preview/RestorePreviewScreen.tsx +535 -535
  146. package/src/components/preview/verdictMeta.ts +8 -8
  147. package/src/components/sources.ts +92 -0
  148. package/src/store/snapshotVault.ts +131 -9
  149. package/src/store/timeMachineStore.ts +136 -5
  150. package/src/sync/timeMachineSyncAdapter.ts +30 -0
  151. package/src/ui/SwipeActionsRow.tsx +199 -0
  152. package/src/ui/primitives.tsx +157 -0
  153. package/src/ui/tmTheme.ts +107 -0
  154. package/lib/commonjs/components/preview/ItemDetailScreen.js +0 -189
  155. package/lib/commonjs/components/preview/ItemDetailScreen.js.map +0 -1
  156. package/lib/module/components/preview/ItemDetailScreen.js +0 -184
  157. package/lib/module/components/preview/ItemDetailScreen.js.map +0 -1
  158. package/lib/typescript/components/preview/ItemDetailScreen.d.ts +0 -11
  159. package/lib/typescript/components/preview/ItemDetailScreen.d.ts.map +0 -1
  160. package/src/components/preview/ItemDetailScreen.tsx +0 -172
@@ -1,184 +0,0 @@
1
- "use strict";
2
-
3
- /**
4
- * Item detail — one preview item's before/after, rendered with the two
5
- * familiar views (TREE / SPLIT, same as storage events).
6
- *
7
- * The render-layer viewers only handle plain JSON faithfully, so both sides
8
- * pass through toDiffable (Dates→ISO, Maps→objects, BigInt→"1n", cycles→
9
- * "[Circular]") and the pair is memoized ONCE per item — the storage tool's
10
- * fix for the fresh-identity-every-render trap that redux/zustand still have.
11
- */
12
- import { useEffect, useMemo, useRef, useState } from "react";
13
- import { ScrollView, StyleSheet, Text, TouchableOpacity, View } from "react-native";
14
- import { DiffModeTabs, buoyColors, devToolsStorageKeys, persistentStorage } from "@buoy-gg/shared-ui";
15
- import { useToolHeader, useToolHost } from "@buoy-gg/core";
16
- import { ABSENT_VALUE, ThemedSplitView, TreeDiffViewer, devToolsDefaultTheme, toDiffable } from "@buoy-gg/shared-ui/dataViewer";
17
- import { VERDICT_META } from "./verdictMeta";
18
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
- const DIFF_MODE_KEY = devToolsStorageKeys.timeMachine.diffViewerMode();
20
- const TABS = [{
21
- key: "tree",
22
- label: "TREE VIEW"
23
- }, {
24
- key: "split",
25
- label: "SPLIT VIEW"
26
- }];
27
- export function ItemDetailScreen({
28
- sourceLabel,
29
- item,
30
- leftLabel,
31
- rightLabel,
32
- onBack
33
- }) {
34
- // Persisted view preference — storage's load-guard/validate/optimistic
35
- // pattern, default TREE (structured state reads better as a tree).
36
- const [diffMode, setDiffMode] = useState("tree");
37
- const hasLoadedMode = useRef(false);
38
- useEffect(() => {
39
- if (hasLoadedMode.current) return;
40
- hasLoadedMode.current = true;
41
- void persistentStorage.getItem(DIFF_MODE_KEY).then(saved => {
42
- if (saved === "tree" || saved === "split") setDiffMode(saved);
43
- });
44
- }, []);
45
- const changeMode = mode => {
46
- setDiffMode(mode);
47
- void persistentStorage.setItem(DIFF_MODE_KEY, mode).catch(() => {});
48
- };
49
- const meta = VERDICT_META[item.verdict];
50
- const host = useToolHost();
51
- const hosted = host.instanceId !== undefined;
52
-
53
- // Hosted: the shared modal header shows this item's identity + back.
54
- useToolHeader(hosted ? {
55
- title: item.label,
56
- subtitle: `${sourceLabel} · ${meta.label} · ${leftLabel} → ${rightLabel}`,
57
- onBack,
58
- searchable: false // nothing searchable on a single item's diff
59
- } : null,
60
- // eslint-disable-next-line react-hooks/exhaustive-deps
61
- [hosted, item.key, sourceLabel, leftLabel, rightLabel]);
62
-
63
- // Normalize ONCE per item; ABSENT_VALUE keeps added/removed reading as
64
- // pure additions/removals instead of diffs against the literal "null".
65
- const {
66
- oldValue,
67
- newValue
68
- } = useMemo(() => ({
69
- oldValue: item.verdict === "added" ? ABSENT_VALUE : toDiffable(item.oldValue),
70
- newValue: item.verdict === "removed" ? ABSENT_VALUE : toDiffable(item.newValue)
71
- }), [item]);
72
- return /*#__PURE__*/_jsxs(View, {
73
- style: styles.container,
74
- children: [!hosted && /*#__PURE__*/_jsxs(View, {
75
- style: styles.screenHeader,
76
- children: [/*#__PURE__*/_jsx(TouchableOpacity, {
77
- onPress: onBack,
78
- hitSlop: HIT,
79
- testID: "tm-item-back",
80
- children: /*#__PURE__*/_jsx(Text, {
81
- style: styles.backText,
82
- children: "\u2039 Preview"
83
- })
84
- }), /*#__PURE__*/_jsxs(View, {
85
- style: styles.titleBlock,
86
- children: [/*#__PURE__*/_jsxs(Text, {
87
- style: styles.title,
88
- numberOfLines: 1,
89
- children: [/*#__PURE__*/_jsxs(Text, {
90
- style: {
91
- color: meta.color
92
- },
93
- children: [meta.glyph, " "]
94
- }), item.label]
95
- }), /*#__PURE__*/_jsxs(Text, {
96
- style: styles.subtitle,
97
- numberOfLines: 1,
98
- children: [sourceLabel, " \xB7 ", meta.label, " \xB7 ", leftLabel, " \u2192 ", rightLabel]
99
- })]
100
- })]
101
- }), item.reason && /*#__PURE__*/_jsxs(Text, {
102
- style: styles.reason,
103
- children: ["\u26A0 ", item.reason]
104
- }), /*#__PURE__*/_jsx(View, {
105
- style: styles.tabs,
106
- children: /*#__PURE__*/_jsx(DiffModeTabs, {
107
- tabs: TABS,
108
- activeTab: diffMode,
109
- onTabChange: changeMode
110
- })
111
- }), /*#__PURE__*/_jsx(ScrollView, {
112
- style: styles.scroll,
113
- contentContainerStyle: styles.scrollContent,
114
- children: diffMode === "tree" ? /*#__PURE__*/_jsx(TreeDiffViewer, {
115
- oldValue: oldValue,
116
- newValue: newValue,
117
- theme: "dark",
118
- showUnchanged: false,
119
- scrollEnabled: false
120
- }) : /*#__PURE__*/_jsx(ThemedSplitView, {
121
- oldValue: oldValue,
122
- newValue: newValue,
123
- differences: EMPTY,
124
- theme: devToolsDefaultTheme,
125
- scrollEnabled: false
126
- })
127
- })]
128
- });
129
- }
130
- const EMPTY = [];
131
- const HIT = {
132
- top: 10,
133
- bottom: 10,
134
- left: 10,
135
- right: 10
136
- };
137
- const styles = StyleSheet.create({
138
- container: {
139
- flex: 1
140
- },
141
- screenHeader: {
142
- flexDirection: "row",
143
- alignItems: "center",
144
- paddingHorizontal: 12,
145
- paddingVertical: 8,
146
- gap: 10
147
- },
148
- backText: {
149
- color: buoyColors.primary,
150
- fontSize: 14
151
- },
152
- titleBlock: {
153
- flex: 1,
154
- minWidth: 0
155
- },
156
- title: {
157
- color: buoyColors.text,
158
- fontSize: 13,
159
- fontWeight: "700"
160
- },
161
- subtitle: {
162
- color: buoyColors.textMuted,
163
- fontSize: 10,
164
- marginTop: 2
165
- },
166
- reason: {
167
- color: buoyColors.warning,
168
- fontSize: 11,
169
- paddingHorizontal: 12,
170
- paddingBottom: 6
171
- },
172
- tabs: {
173
- paddingHorizontal: 12,
174
- paddingBottom: 8
175
- },
176
- scroll: {
177
- flex: 1
178
- },
179
- scrollContent: {
180
- paddingHorizontal: 12,
181
- paddingBottom: 24
182
- }
183
- });
184
- //# sourceMappingURL=ItemDetailScreen.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["useEffect","useMemo","useRef","useState","ScrollView","StyleSheet","Text","TouchableOpacity","View","DiffModeTabs","buoyColors","devToolsStorageKeys","persistentStorage","useToolHeader","useToolHost","ABSENT_VALUE","ThemedSplitView","TreeDiffViewer","devToolsDefaultTheme","toDiffable","VERDICT_META","jsx","_jsx","jsxs","_jsxs","DIFF_MODE_KEY","timeMachine","diffViewerMode","TABS","key","label","ItemDetailScreen","sourceLabel","item","leftLabel","rightLabel","onBack","diffMode","setDiffMode","hasLoadedMode","current","getItem","then","saved","changeMode","mode","setItem","catch","meta","verdict","host","hosted","instanceId","undefined","title","subtitle","searchable","oldValue","newValue","style","styles","container","children","screenHeader","onPress","hitSlop","HIT","testID","backText","titleBlock","numberOfLines","color","glyph","reason","tabs","activeTab","onTabChange","scroll","contentContainerStyle","scrollContent","theme","showUnchanged","scrollEnabled","differences","EMPTY","top","bottom","left","right","create","flex","flexDirection","alignItems","paddingHorizontal","paddingVertical","gap","primary","fontSize","minWidth","text","fontWeight","textMuted","marginTop","warning","paddingBottom"],"sourceRoot":"../../../../src","sources":["components/preview/ItemDetailScreen.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,11 +0,0 @@
1
- import type { StateSnapshotPreviewItem } from "@buoy-gg/shared-ui";
2
- export interface ItemDetailScreenProps {
3
- sourceLabel: string;
4
- item: StateSnapshotPreviewItem;
5
- /** "old → new" side labels, e.g. "CURRENT STATE" / snapshot name. */
6
- leftLabel: string;
7
- rightLabel: string;
8
- onBack: () => void;
9
- }
10
- export declare function ItemDetailScreen({ sourceLabel, item, leftLabel, rightLabel, onBack, }: ItemDetailScreenProps): import("react").JSX.Element;
11
- //# sourceMappingURL=ItemDetailScreen.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ItemDetailScreen.d.ts","sourceRoot":"","sources":["../../../../src/components/preview/ItemDetailScreen.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAgBnE,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,wBAAwB,CAAC;IAC/B,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,WAAW,EACX,IAAI,EACJ,SAAS,EACT,UAAU,EACV,MAAM,GACP,EAAE,qBAAqB,+BA+FvB"}
@@ -1,172 +0,0 @@
1
- /**
2
- * Item detail — one preview item's before/after, rendered with the two
3
- * familiar views (TREE / SPLIT, same as storage events).
4
- *
5
- * The render-layer viewers only handle plain JSON faithfully, so both sides
6
- * pass through toDiffable (Dates→ISO, Maps→objects, BigInt→"1n", cycles→
7
- * "[Circular]") and the pair is memoized ONCE per item — the storage tool's
8
- * fix for the fresh-identity-every-render trap that redux/zustand still have.
9
- */
10
- import { useEffect, useMemo, useRef, useState } from "react";
11
- import { ScrollView, StyleSheet, Text, TouchableOpacity, View } from "react-native";
12
- import {
13
- DiffModeTabs,
14
- buoyColors,
15
- devToolsStorageKeys,
16
- persistentStorage,
17
- } from "@buoy-gg/shared-ui";
18
- import { useToolHeader, useToolHost } from "@buoy-gg/core";
19
- import type { StateSnapshotPreviewItem } from "@buoy-gg/shared-ui";
20
- import {
21
- ABSENT_VALUE,
22
- ThemedSplitView,
23
- TreeDiffViewer,
24
- devToolsDefaultTheme,
25
- toDiffable,
26
- } from "@buoy-gg/shared-ui/dataViewer";
27
- import { VERDICT_META } from "./verdictMeta";
28
-
29
- const DIFF_MODE_KEY = devToolsStorageKeys.timeMachine.diffViewerMode();
30
- const TABS = [
31
- { key: "tree", label: "TREE VIEW" },
32
- { key: "split", label: "SPLIT VIEW" },
33
- ];
34
-
35
- export interface ItemDetailScreenProps {
36
- sourceLabel: string;
37
- item: StateSnapshotPreviewItem;
38
- /** "old → new" side labels, e.g. "CURRENT STATE" / snapshot name. */
39
- leftLabel: string;
40
- rightLabel: string;
41
- onBack: () => void;
42
- }
43
-
44
- export function ItemDetailScreen({
45
- sourceLabel,
46
- item,
47
- leftLabel,
48
- rightLabel,
49
- onBack,
50
- }: ItemDetailScreenProps) {
51
- // Persisted view preference — storage's load-guard/validate/optimistic
52
- // pattern, default TREE (structured state reads better as a tree).
53
- const [diffMode, setDiffMode] = useState<string>("tree");
54
- const hasLoadedMode = useRef(false);
55
- useEffect(() => {
56
- if (hasLoadedMode.current) return;
57
- hasLoadedMode.current = true;
58
- void persistentStorage.getItem(DIFF_MODE_KEY).then((saved) => {
59
- if (saved === "tree" || saved === "split") setDiffMode(saved);
60
- });
61
- }, []);
62
- const changeMode = (mode: string) => {
63
- setDiffMode(mode);
64
- void persistentStorage.setItem(DIFF_MODE_KEY, mode).catch(() => {});
65
- };
66
-
67
- const meta = VERDICT_META[item.verdict];
68
- const host = useToolHost();
69
- const hosted = host.instanceId !== undefined;
70
-
71
- // Hosted: the shared modal header shows this item's identity + back.
72
- useToolHeader(
73
- hosted
74
- ? {
75
- title: item.label,
76
- subtitle: `${sourceLabel} · ${meta.label} · ${leftLabel} → ${rightLabel}`,
77
- onBack,
78
- searchable: false, // nothing searchable on a single item's diff
79
- }
80
- : null,
81
- // eslint-disable-next-line react-hooks/exhaustive-deps
82
- [hosted, item.key, sourceLabel, leftLabel, rightLabel]
83
- );
84
-
85
- // Normalize ONCE per item; ABSENT_VALUE keeps added/removed reading as
86
- // pure additions/removals instead of diffs against the literal "null".
87
- const { oldValue, newValue } = useMemo(
88
- () => ({
89
- oldValue:
90
- item.verdict === "added" ? ABSENT_VALUE : toDiffable(item.oldValue),
91
- newValue:
92
- item.verdict === "removed" ? ABSENT_VALUE : toDiffable(item.newValue),
93
- }),
94
- [item]
95
- );
96
-
97
- return (
98
- <View style={styles.container}>
99
- {!hosted && (
100
- <View style={styles.screenHeader}>
101
- <TouchableOpacity onPress={onBack} hitSlop={HIT} testID="tm-item-back">
102
- <Text style={styles.backText}>‹ Preview</Text>
103
- </TouchableOpacity>
104
- <View style={styles.titleBlock}>
105
- <Text style={styles.title} numberOfLines={1}>
106
- <Text style={{ color: meta.color }}>{meta.glyph} </Text>
107
- {item.label}
108
- </Text>
109
- <Text style={styles.subtitle} numberOfLines={1}>
110
- {sourceLabel} · {meta.label} · {leftLabel} → {rightLabel}
111
- </Text>
112
- </View>
113
- </View>
114
- )}
115
-
116
- {item.reason && <Text style={styles.reason}>⚠ {item.reason}</Text>}
117
-
118
- <View style={styles.tabs}>
119
- <DiffModeTabs tabs={TABS} activeTab={diffMode} onTabChange={changeMode} />
120
- </View>
121
-
122
- {/* One page-level scroller; both viewers render inline at natural
123
- height (scrollEnabled=false) — the storage matched-pair contract. */}
124
- <ScrollView style={styles.scroll} contentContainerStyle={styles.scrollContent}>
125
- {diffMode === "tree" ? (
126
- <TreeDiffViewer
127
- oldValue={oldValue}
128
- newValue={newValue}
129
- theme="dark"
130
- showUnchanged={false}
131
- scrollEnabled={false}
132
- />
133
- ) : (
134
- <ThemedSplitView
135
- oldValue={oldValue}
136
- newValue={newValue}
137
- differences={EMPTY}
138
- theme={devToolsDefaultTheme}
139
- scrollEnabled={false}
140
- />
141
- )}
142
- </ScrollView>
143
- </View>
144
- );
145
- }
146
-
147
- const EMPTY: unknown[] = [];
148
- const HIT = { top: 10, bottom: 10, left: 10, right: 10 };
149
-
150
- const styles = StyleSheet.create({
151
- container: { flex: 1 },
152
- screenHeader: {
153
- flexDirection: "row",
154
- alignItems: "center",
155
- paddingHorizontal: 12,
156
- paddingVertical: 8,
157
- gap: 10,
158
- },
159
- backText: { color: buoyColors.primary, fontSize: 14 },
160
- titleBlock: { flex: 1, minWidth: 0 },
161
- title: { color: buoyColors.text, fontSize: 13, fontWeight: "700" },
162
- subtitle: { color: buoyColors.textMuted, fontSize: 10, marginTop: 2 },
163
- reason: {
164
- color: buoyColors.warning,
165
- fontSize: 11,
166
- paddingHorizontal: 12,
167
- paddingBottom: 6,
168
- },
169
- tabs: { paddingHorizontal: 12, paddingBottom: 8 },
170
- scroll: { flex: 1 },
171
- scrollContent: { paddingHorizontal: 12, paddingBottom: 24 },
172
- });