@buoy-gg/storage 1.7.2

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 (187) hide show
  1. package/README.md +607 -0
  2. package/lib/commonjs/index.js +34 -0
  3. package/lib/commonjs/package.json +1 -0
  4. package/lib/commonjs/preset.js +94 -0
  5. package/lib/commonjs/storage/components/DiffViewer/DiffOptionsPanel.js +356 -0
  6. package/lib/commonjs/storage/components/DiffViewer/TreeDiffViewer.js +29 -0
  7. package/lib/commonjs/storage/components/DiffViewer/components/DiffSummary.js +121 -0
  8. package/lib/commonjs/storage/components/DiffViewer/modes/ThemedSplitView.js +419 -0
  9. package/lib/commonjs/storage/components/DiffViewer/themes/diffThemes.js +122 -0
  10. package/lib/commonjs/storage/components/GameUIStorageBrowser.js +924 -0
  11. package/lib/commonjs/storage/components/GameUIStorageStats.js +746 -0
  12. package/lib/commonjs/storage/components/MMKVInstanceInfoPanel.js +257 -0
  13. package/lib/commonjs/storage/components/MMKVInstanceSelector.js +418 -0
  14. package/lib/commonjs/storage/components/SelectionActionBar.js +224 -0
  15. package/lib/commonjs/storage/components/StorageActionButtons.js +239 -0
  16. package/lib/commonjs/storage/components/StorageActions.js +192 -0
  17. package/lib/commonjs/storage/components/StorageBrowserMode.js +31 -0
  18. package/lib/commonjs/storage/components/StorageEventDetailContent.js +1025 -0
  19. package/lib/commonjs/storage/components/StorageEventFilterView.js +141 -0
  20. package/lib/commonjs/storage/components/StorageEventListener.js +357 -0
  21. package/lib/commonjs/storage/components/StorageEventsSection.js +24 -0
  22. package/lib/commonjs/storage/components/StorageFilterCards.js +345 -0
  23. package/lib/commonjs/storage/components/StorageFilterViewV2.js +42 -0
  24. package/lib/commonjs/storage/components/StorageKeyCard.js +516 -0
  25. package/lib/commonjs/storage/components/StorageKeyRow.js +356 -0
  26. package/lib/commonjs/storage/components/StorageKeySection.js +105 -0
  27. package/lib/commonjs/storage/components/StorageKeyStats.js +344 -0
  28. package/lib/commonjs/storage/components/StorageModalWithTabs.js +871 -0
  29. package/lib/commonjs/storage/components/StorageSection.js +43 -0
  30. package/lib/commonjs/storage/hooks/useAsyncStorageKeys.js +126 -0
  31. package/lib/commonjs/storage/hooks/useMMKVInstances.js +221 -0
  32. package/lib/commonjs/storage/hooks/useMMKVKeys.js +362 -0
  33. package/lib/commonjs/storage/hooks/useTickEverySecond.js +21 -0
  34. package/lib/commonjs/storage/index.js +148 -0
  35. package/lib/commonjs/storage/types.js +5 -0
  36. package/lib/commonjs/storage/utils/AsyncStorageListener.js +510 -0
  37. package/lib/commonjs/storage/utils/MMKVInstanceRegistry.js +202 -0
  38. package/lib/commonjs/storage/utils/MMKVListener.js +380 -0
  39. package/lib/commonjs/storage/utils/clearAllStorage.js +47 -0
  40. package/lib/commonjs/storage/utils/index.js +180 -0
  41. package/lib/commonjs/storage/utils/lineDiff.js +363 -0
  42. package/lib/commonjs/storage/utils/mmkvAvailability.js +62 -0
  43. package/lib/commonjs/storage/utils/mmkvTypeDetection.js +139 -0
  44. package/lib/commonjs/storage/utils/objectDiff.js +157 -0
  45. package/lib/commonjs/storage/utils/safeAsyncStorage.js +140 -0
  46. package/lib/commonjs/storage/utils/storageActionHelpers.js +46 -0
  47. package/lib/commonjs/storage/utils/storageQueryUtils.js +35 -0
  48. package/lib/commonjs/storage/utils/valueType.js +18 -0
  49. package/lib/module/index.js +7 -0
  50. package/lib/module/preset.js +89 -0
  51. package/lib/module/storage/components/DiffViewer/DiffOptionsPanel.js +352 -0
  52. package/lib/module/storage/components/DiffViewer/TreeDiffViewer.js +25 -0
  53. package/lib/module/storage/components/DiffViewer/components/DiffSummary.js +117 -0
  54. package/lib/module/storage/components/DiffViewer/modes/ThemedSplitView.js +415 -0
  55. package/lib/module/storage/components/DiffViewer/themes/diffThemes.js +118 -0
  56. package/lib/module/storage/components/GameUIStorageBrowser.js +922 -0
  57. package/lib/module/storage/components/GameUIStorageStats.js +742 -0
  58. package/lib/module/storage/components/MMKVInstanceInfoPanel.js +253 -0
  59. package/lib/module/storage/components/MMKVInstanceSelector.js +414 -0
  60. package/lib/module/storage/components/SelectionActionBar.js +221 -0
  61. package/lib/module/storage/components/StorageActionButtons.js +236 -0
  62. package/lib/module/storage/components/StorageActions.js +189 -0
  63. package/lib/module/storage/components/StorageBrowserMode.js +27 -0
  64. package/lib/module/storage/components/StorageEventDetailContent.js +1020 -0
  65. package/lib/module/storage/components/StorageEventFilterView.js +137 -0
  66. package/lib/module/storage/components/StorageEventListener.js +354 -0
  67. package/lib/module/storage/components/StorageEventsSection.js +20 -0
  68. package/lib/module/storage/components/StorageFilterCards.js +341 -0
  69. package/lib/module/storage/components/StorageFilterViewV2.js +38 -0
  70. package/lib/module/storage/components/StorageKeyCard.js +513 -0
  71. package/lib/module/storage/components/StorageKeyRow.js +353 -0
  72. package/lib/module/storage/components/StorageKeySection.js +101 -0
  73. package/lib/module/storage/components/StorageKeyStats.js +340 -0
  74. package/lib/module/storage/components/StorageModalWithTabs.js +867 -0
  75. package/lib/module/storage/components/StorageSection.js +40 -0
  76. package/lib/module/storage/hooks/useAsyncStorageKeys.js +121 -0
  77. package/lib/module/storage/hooks/useMMKVInstances.js +216 -0
  78. package/lib/module/storage/hooks/useMMKVKeys.js +359 -0
  79. package/lib/module/storage/hooks/useTickEverySecond.js +18 -0
  80. package/lib/module/storage/index.js +25 -0
  81. package/lib/module/storage/types.js +3 -0
  82. package/lib/module/storage/utils/AsyncStorageListener.js +500 -0
  83. package/lib/module/storage/utils/MMKVInstanceRegistry.js +196 -0
  84. package/lib/module/storage/utils/MMKVListener.js +367 -0
  85. package/lib/module/storage/utils/clearAllStorage.js +42 -0
  86. package/lib/module/storage/utils/index.js +22 -0
  87. package/lib/module/storage/utils/lineDiff.js +359 -0
  88. package/lib/module/storage/utils/mmkvAvailability.js +56 -0
  89. package/lib/module/storage/utils/mmkvTypeDetection.js +133 -0
  90. package/lib/module/storage/utils/objectDiff.js +153 -0
  91. package/lib/module/storage/utils/safeAsyncStorage.js +134 -0
  92. package/lib/module/storage/utils/storageActionHelpers.js +42 -0
  93. package/lib/module/storage/utils/storageQueryUtils.js +30 -0
  94. package/lib/module/storage/utils/valueType.js +14 -0
  95. package/lib/typescript/index.d.ts +3 -0
  96. package/lib/typescript/index.d.ts.map +1 -0
  97. package/lib/typescript/preset.d.ts +90 -0
  98. package/lib/typescript/preset.d.ts.map +1 -0
  99. package/lib/typescript/storage/components/DiffViewer/DiffOptionsPanel.d.ts +18 -0
  100. package/lib/typescript/storage/components/DiffViewer/DiffOptionsPanel.d.ts.map +1 -0
  101. package/lib/typescript/storage/components/DiffViewer/TreeDiffViewer.d.ts +7 -0
  102. package/lib/typescript/storage/components/DiffViewer/TreeDiffViewer.d.ts.map +1 -0
  103. package/lib/typescript/storage/components/DiffViewer/components/DiffSummary.d.ts +12 -0
  104. package/lib/typescript/storage/components/DiffViewer/components/DiffSummary.d.ts.map +1 -0
  105. package/lib/typescript/storage/components/DiffViewer/modes/ThemedSplitView.d.ts +13 -0
  106. package/lib/typescript/storage/components/DiffViewer/modes/ThemedSplitView.d.ts.map +1 -0
  107. package/lib/typescript/storage/components/DiffViewer/themes/diffThemes.d.ts +64 -0
  108. package/lib/typescript/storage/components/DiffViewer/themes/diffThemes.d.ts.map +1 -0
  109. package/lib/typescript/storage/components/GameUIStorageBrowser.d.ts +16 -0
  110. package/lib/typescript/storage/components/GameUIStorageBrowser.d.ts.map +1 -0
  111. package/lib/typescript/storage/components/GameUIStorageStats.d.ts +7 -0
  112. package/lib/typescript/storage/components/GameUIStorageStats.d.ts.map +1 -0
  113. package/lib/typescript/storage/components/MMKVInstanceInfoPanel.d.ts +42 -0
  114. package/lib/typescript/storage/components/MMKVInstanceInfoPanel.d.ts.map +1 -0
  115. package/lib/typescript/storage/components/MMKVInstanceSelector.d.ts +35 -0
  116. package/lib/typescript/storage/components/MMKVInstanceSelector.d.ts.map +1 -0
  117. package/lib/typescript/storage/components/SelectionActionBar.d.ts +21 -0
  118. package/lib/typescript/storage/components/SelectionActionBar.d.ts.map +1 -0
  119. package/lib/typescript/storage/components/StorageActionButtons.d.ts +21 -0
  120. package/lib/typescript/storage/components/StorageActionButtons.d.ts.map +1 -0
  121. package/lib/typescript/storage/components/StorageActions.d.ts +10 -0
  122. package/lib/typescript/storage/components/StorageActions.d.ts.map +1 -0
  123. package/lib/typescript/storage/components/StorageBrowserMode.d.ts +18 -0
  124. package/lib/typescript/storage/components/StorageBrowserMode.d.ts.map +1 -0
  125. package/lib/typescript/storage/components/StorageEventDetailContent.d.ts +40 -0
  126. package/lib/typescript/storage/components/StorageEventDetailContent.d.ts.map +1 -0
  127. package/lib/typescript/storage/components/StorageEventFilterView.d.ts +11 -0
  128. package/lib/typescript/storage/components/StorageEventFilterView.d.ts.map +1 -0
  129. package/lib/typescript/storage/components/StorageEventListener.d.ts +6 -0
  130. package/lib/typescript/storage/components/StorageEventListener.d.ts.map +1 -0
  131. package/lib/typescript/storage/components/StorageEventsSection.d.ts +7 -0
  132. package/lib/typescript/storage/components/StorageEventsSection.d.ts.map +1 -0
  133. package/lib/typescript/storage/components/StorageFilterCards.d.ts +36 -0
  134. package/lib/typescript/storage/components/StorageFilterCards.d.ts.map +1 -0
  135. package/lib/typescript/storage/components/StorageFilterViewV2.d.ts +9 -0
  136. package/lib/typescript/storage/components/StorageFilterViewV2.d.ts.map +1 -0
  137. package/lib/typescript/storage/components/StorageKeyCard.d.ts +17 -0
  138. package/lib/typescript/storage/components/StorageKeyCard.d.ts.map +1 -0
  139. package/lib/typescript/storage/components/StorageKeyRow.d.ts +15 -0
  140. package/lib/typescript/storage/components/StorageKeyRow.d.ts.map +1 -0
  141. package/lib/typescript/storage/components/StorageKeySection.d.ts +25 -0
  142. package/lib/typescript/storage/components/StorageKeySection.d.ts.map +1 -0
  143. package/lib/typescript/storage/components/StorageKeyStats.d.ts +15 -0
  144. package/lib/typescript/storage/components/StorageKeyStats.d.ts.map +1 -0
  145. package/lib/typescript/storage/components/StorageModalWithTabs.d.ts +13 -0
  146. package/lib/typescript/storage/components/StorageModalWithTabs.d.ts.map +1 -0
  147. package/lib/typescript/storage/components/StorageSection.d.ts +10 -0
  148. package/lib/typescript/storage/components/StorageSection.d.ts.map +1 -0
  149. package/lib/typescript/storage/hooks/useAsyncStorageKeys.d.ts +10 -0
  150. package/lib/typescript/storage/hooks/useAsyncStorageKeys.d.ts.map +1 -0
  151. package/lib/typescript/storage/hooks/useMMKVInstances.d.ts +114 -0
  152. package/lib/typescript/storage/hooks/useMMKVInstances.d.ts.map +1 -0
  153. package/lib/typescript/storage/hooks/useMMKVKeys.d.ts +94 -0
  154. package/lib/typescript/storage/hooks/useMMKVKeys.d.ts.map +1 -0
  155. package/lib/typescript/storage/hooks/useTickEverySecond.d.ts +6 -0
  156. package/lib/typescript/storage/hooks/useTickEverySecond.d.ts.map +1 -0
  157. package/lib/typescript/storage/index.d.ts +15 -0
  158. package/lib/typescript/storage/index.d.ts.map +1 -0
  159. package/lib/typescript/storage/types.d.ts +41 -0
  160. package/lib/typescript/storage/types.d.ts.map +1 -0
  161. package/lib/typescript/storage/utils/AsyncStorageListener.d.ts +195 -0
  162. package/lib/typescript/storage/utils/AsyncStorageListener.d.ts.map +1 -0
  163. package/lib/typescript/storage/utils/MMKVInstanceRegistry.d.ts +224 -0
  164. package/lib/typescript/storage/utils/MMKVInstanceRegistry.d.ts.map +1 -0
  165. package/lib/typescript/storage/utils/MMKVListener.d.ts +218 -0
  166. package/lib/typescript/storage/utils/MMKVListener.d.ts.map +1 -0
  167. package/lib/typescript/storage/utils/clearAllStorage.d.ts +11 -0
  168. package/lib/typescript/storage/utils/clearAllStorage.d.ts.map +1 -0
  169. package/lib/typescript/storage/utils/index.d.ts +8 -0
  170. package/lib/typescript/storage/utils/index.d.ts.map +1 -0
  171. package/lib/typescript/storage/utils/lineDiff.d.ts +34 -0
  172. package/lib/typescript/storage/utils/lineDiff.d.ts.map +1 -0
  173. package/lib/typescript/storage/utils/mmkvAvailability.d.ts +23 -0
  174. package/lib/typescript/storage/utils/mmkvAvailability.d.ts.map +1 -0
  175. package/lib/typescript/storage/utils/mmkvTypeDetection.d.ts +71 -0
  176. package/lib/typescript/storage/utils/mmkvTypeDetection.d.ts.map +1 -0
  177. package/lib/typescript/storage/utils/objectDiff.d.ts +35 -0
  178. package/lib/typescript/storage/utils/objectDiff.d.ts.map +1 -0
  179. package/lib/typescript/storage/utils/safeAsyncStorage.d.ts +56 -0
  180. package/lib/typescript/storage/utils/safeAsyncStorage.d.ts.map +1 -0
  181. package/lib/typescript/storage/utils/storageActionHelpers.d.ts +5 -0
  182. package/lib/typescript/storage/utils/storageActionHelpers.d.ts.map +1 -0
  183. package/lib/typescript/storage/utils/storageQueryUtils.d.ts +6 -0
  184. package/lib/typescript/storage/utils/storageQueryUtils.d.ts.map +1 -0
  185. package/lib/typescript/storage/utils/valueType.d.ts +3 -0
  186. package/lib/typescript/storage/utils/valueType.d.ts.map +1 -0
  187. package/package.json +68 -0
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.StorageEventFilterView = StorageEventFilterView;
7
+ var _reactNative = require("react-native");
8
+ var _sharedUi = require("@buoy-gg/shared-ui");
9
+ var _jsxRuntime = require("react/jsx-runtime");
10
+ function StorageEventFilterView({
11
+ ignoredPatterns,
12
+ onTogglePattern,
13
+ onAddPattern,
14
+ availableKeys = [],
15
+ enabledStorageTypes,
16
+ onToggleStorageType
17
+ }) {
18
+ const filterConfig = {
19
+ addFilterSection: {
20
+ enabled: true,
21
+ placeholder: "Enter key pattern to hide...",
22
+ title: "KEY FILTERS",
23
+ icon: _sharedUi.Filter
24
+ },
25
+ availableItemsSection: {
26
+ enabled: true,
27
+ title: "AVAILABLE EVENT KEYS",
28
+ emptyMessage: "No storage event keys available. Events will appear here once captured.",
29
+ items: availableKeys
30
+ },
31
+ howItWorksSection: {
32
+ enabled: true,
33
+ title: "HOW EVENT FILTERS WORK",
34
+ description: "Patterns hide matching storage keys from the event list. Storage type toggles control which storage backends are monitored.",
35
+ examples: ["• react_buoy → hides keys containing react_buoy", "• @temp → hides @temp_user, @temp_data", "• redux → hides redux-persist:root", "• AsyncStorage → show/hide AsyncStorage events", "• MMKV → show/hide MMKV events"],
36
+ icon: _sharedUi.Filter
37
+ },
38
+ onPatternToggle: onTogglePattern,
39
+ onPatternAdd: onAddPattern,
40
+ activePatterns: ignoredPatterns
41
+ };
42
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
43
+ style: styles.container,
44
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
45
+ style: styles.storageTypeSection,
46
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
47
+ style: styles.sectionTitle,
48
+ children: "STORAGE TYPES"
49
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
50
+ style: styles.storageTypeButtons,
51
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
52
+ style: [styles.storageTypeButton, enabledStorageTypes.has('async') && styles.storageTypeButtonActive, {
53
+ borderColor: _sharedUi.macOSColors.semantic.warning + '40'
54
+ }],
55
+ onPress: () => onToggleStorageType('async'),
56
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Database, {
57
+ size: 16,
58
+ color: enabledStorageTypes.has('async') ? _sharedUi.macOSColors.semantic.warning : _sharedUi.macOSColors.text.muted
59
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
60
+ style: [styles.storageTypeButtonText, enabledStorageTypes.has('async') && {
61
+ color: _sharedUi.macOSColors.semantic.warning
62
+ }],
63
+ children: "AsyncStorage"
64
+ })]
65
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
66
+ style: [styles.storageTypeButton, enabledStorageTypes.has('mmkv') && styles.storageTypeButtonActive, {
67
+ borderColor: _sharedUi.macOSColors.semantic.info + '40'
68
+ }],
69
+ onPress: () => onToggleStorageType('mmkv'),
70
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.HardDrive, {
71
+ size: 16,
72
+ color: enabledStorageTypes.has('mmkv') ? _sharedUi.macOSColors.semantic.info : _sharedUi.macOSColors.text.muted
73
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
74
+ style: [styles.storageTypeButtonText, enabledStorageTypes.has('mmkv') && {
75
+ color: _sharedUi.macOSColors.semantic.info
76
+ }],
77
+ children: "MMKV"
78
+ })]
79
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.TouchableOpacity, {
80
+ style: [styles.storageTypeButton, enabledStorageTypes.has('secure') && styles.storageTypeButtonActive, {
81
+ borderColor: _sharedUi.macOSColors.semantic.success + '40'
82
+ }],
83
+ onPress: () => onToggleStorageType('secure'),
84
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Shield, {
85
+ size: 16,
86
+ color: enabledStorageTypes.has('secure') ? _sharedUi.macOSColors.semantic.success : _sharedUi.macOSColors.text.muted
87
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
88
+ style: [styles.storageTypeButtonText, enabledStorageTypes.has('secure') && {
89
+ color: _sharedUi.macOSColors.semantic.success
90
+ }],
91
+ children: "Secure Storage"
92
+ })]
93
+ })]
94
+ })]
95
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.DynamicFilterView, {
96
+ ...filterConfig
97
+ })]
98
+ });
99
+ }
100
+ const styles = _reactNative.StyleSheet.create({
101
+ container: {
102
+ flex: 1
103
+ },
104
+ storageTypeSection: {
105
+ padding: 16,
106
+ borderBottomWidth: 1,
107
+ borderBottomColor: _sharedUi.macOSColors.border.default
108
+ },
109
+ sectionTitle: {
110
+ fontSize: 11,
111
+ fontWeight: '700',
112
+ color: _sharedUi.macOSColors.text.secondary,
113
+ letterSpacing: 0.8,
114
+ marginBottom: 12
115
+ },
116
+ storageTypeButtons: {
117
+ flexDirection: 'row',
118
+ gap: 8
119
+ },
120
+ storageTypeButton: {
121
+ flex: 1,
122
+ flexDirection: 'row',
123
+ alignItems: 'center',
124
+ justifyContent: 'center',
125
+ gap: 6,
126
+ paddingVertical: 10,
127
+ paddingHorizontal: 12,
128
+ backgroundColor: _sharedUi.macOSColors.background.input,
129
+ borderRadius: 8,
130
+ borderWidth: 1,
131
+ borderColor: _sharedUi.macOSColors.border.default
132
+ },
133
+ storageTypeButtonActive: {
134
+ backgroundColor: _sharedUi.macOSColors.background.card
135
+ },
136
+ storageTypeButtonText: {
137
+ fontSize: 11,
138
+ fontWeight: '600',
139
+ color: _sharedUi.macOSColors.text.muted
140
+ }
141
+ });
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.StorageEventListener = StorageEventListener;
7
+ var _react = require("react");
8
+ var _reactNative = require("react-native");
9
+ var _sharedUi = require("@buoy-gg/shared-ui");
10
+ var _AsyncStorageListener = require("../utils/AsyncStorageListener");
11
+ var _storageActionHelpers = require("../utils/storageActionHelpers");
12
+ var _mmkvAvailability = require("../utils/mmkvAvailability");
13
+ var _jsxRuntime = require("react/jsx-runtime");
14
+ // Conditionally import MMKV listener
15
+ let addMMKVListener;
16
+
17
+ // Define type for MMKV events (imported conditionally at runtime)
18
+
19
+ if ((0, _mmkvAvailability.isMMKVAvailable)()) {
20
+ const mmkvListener = require("../utils/MMKVListener");
21
+ addMMKVListener = mmkvListener.addMMKVListener;
22
+ }
23
+
24
+ // Unified event type that covers both AsyncStorage and MMKV
25
+
26
+ /**
27
+ * Storage event listener component for monitoring AsyncStorage and MMKV operations
28
+ * Follows the Sentry component pattern for consistency
29
+ */
30
+ function StorageEventListener() {
31
+ const [events, setEvents] = (0, _react.useState)([]);
32
+ const [isListening, setIsListening] = (0, _react.useState)(false);
33
+ const [isAsyncStorageAvailable, setIsAsyncStorageAvailable] = (0, _react.useState)(false);
34
+ (0, _react.useEffect)(() => {
35
+ // Component mounted, AsyncStorage is available
36
+ setIsAsyncStorageAvailable(true);
37
+
38
+ // Add listener for AsyncStorage events
39
+ const unsubscribeAsync = (0, _AsyncStorageListener.addListener)(event => {
40
+ setEvents(prev => {
41
+ const newEvents = [{
42
+ ...event,
43
+ storageType: 'async'
44
+ }, ...prev.slice(0, 99)];
45
+ return newEvents;
46
+ });
47
+ });
48
+
49
+ // Add listener for MMKV events (only if available)
50
+ let unsubscribeMMKV = () => {};
51
+ if ((0, _mmkvAvailability.isMMKVAvailable)() && addMMKVListener) {
52
+ unsubscribeMMKV = addMMKVListener(event => {
53
+ setEvents(prev => {
54
+ const newEvents = [{
55
+ ...event,
56
+ storageType: 'mmkv'
57
+ }, ...prev.slice(0, 99)];
58
+ return newEvents;
59
+ });
60
+ });
61
+ }
62
+
63
+ // Check initial listening state
64
+ const initialState = (0, _AsyncStorageListener.isListening)();
65
+ setIsListening(initialState);
66
+ return () => {
67
+ if ((0, _AsyncStorageListener.isListening)()) {
68
+ (0, _AsyncStorageListener.stopListening)();
69
+ }
70
+ unsubscribeAsync();
71
+ unsubscribeMMKV();
72
+ };
73
+ }, []);
74
+ const handleToggleListening = (0, _react.useCallback)(async () => {
75
+ if (!isAsyncStorageAvailable) {
76
+ return;
77
+ }
78
+ if (isListening) {
79
+ // Stopping listener
80
+ (0, _AsyncStorageListener.stopListening)();
81
+ setIsListening(false);
82
+ } else {
83
+ // Starting listener
84
+ await (0, _AsyncStorageListener.startListening)();
85
+ setIsListening(true);
86
+ }
87
+ }, [isListening, isAsyncStorageAvailable]);
88
+ const handleClearEvents = (0, _react.useCallback)(() => {
89
+ // Clearing all events
90
+ setEvents([]);
91
+ }, []);
92
+ const formatEventData = event => {
93
+ if (!event.data) return "";
94
+
95
+ // MMKV events
96
+ if (event.storageType === 'mmkv') {
97
+ const mmkvEvent = event;
98
+
99
+ // Show instance ID for MMKV events
100
+ const instancePrefix = `[${mmkvEvent.instanceId}] `;
101
+ if (mmkvEvent.action.startsWith('set.') || mmkvEvent.action.startsWith('get.') || mmkvEvent.action === 'delete') {
102
+ const keyInfo = mmkvEvent.data?.key ? `${mmkvEvent.data.key}` : "";
103
+ const typeInfo = mmkvEvent.data?.valueType ? ` (${mmkvEvent.data.valueType})` : "";
104
+ return instancePrefix + keyInfo + typeInfo;
105
+ }
106
+ if (mmkvEvent.action === 'clearAll') {
107
+ return instancePrefix + "All keys";
108
+ }
109
+ return instancePrefix;
110
+ }
111
+
112
+ // AsyncStorage events
113
+ if (event.action === "setItem" || event.action === "removeItem" || event.action === "mergeItem") {
114
+ return event.data.key || "";
115
+ }
116
+ if (event.action === "multiSet" || event.action === "multiMerge") {
117
+ return `${event.data.pairs?.length || 0} pairs`;
118
+ }
119
+ if (event.action === "multiRemove") {
120
+ return `${event.data.keys?.length || 0} keys`;
121
+ }
122
+ if (event.action === "clear") {
123
+ return "All storage";
124
+ }
125
+ return "";
126
+ };
127
+ const getActionColor = action => {
128
+ // MMKV actions
129
+ if (action.startsWith('set.')) {
130
+ return "#10B981"; // Green for writes
131
+ }
132
+ if (action.startsWith('get.')) {
133
+ return "#F59E0B"; // Orange for reads
134
+ }
135
+ if (action === 'delete' || action === 'clearAll') {
136
+ return "#EF4444"; // Red for deletes
137
+ }
138
+
139
+ // AsyncStorage actions
140
+ switch (action) {
141
+ case "setItem":
142
+ case "multiSet":
143
+ return "#10B981";
144
+ // Green for write
145
+ case "removeItem":
146
+ case "multiRemove":
147
+ case "clear":
148
+ return "#EF4444";
149
+ // Red for delete
150
+ case "mergeItem":
151
+ case "multiMerge":
152
+ return "#3B82F6";
153
+ // Blue for merge
154
+ default:
155
+ return "#6B7280";
156
+ }
157
+ };
158
+ if (!isAsyncStorageAvailable) {
159
+ return null; // Don't show component if AsyncStorage isn't available
160
+ }
161
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
162
+ style: styles.container,
163
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
164
+ style: styles.header,
165
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
166
+ style: styles.headerLeft,
167
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
168
+ style: styles.title,
169
+ children: "Storage Events"
170
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
171
+ style: styles.statsContainer,
172
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
173
+ style: styles.statsText,
174
+ children: events.length
175
+ }), isListening && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
176
+ style: styles.listeningIndicator
177
+ })]
178
+ })]
179
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
180
+ style: styles.headerActions,
181
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
182
+ "sentry-label": "ignore toggle listening",
183
+ onPress: handleToggleListening,
184
+ style: [styles.actionButton, isListening ? styles.stopButton : styles.startButton],
185
+ accessibilityLabel: isListening ? "Stop listening" : "Start listening",
186
+ children: isListening ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Pause, {
187
+ size: 14,
188
+ color: "#EF4444"
189
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Play, {
190
+ size: 14,
191
+ color: "#10B981"
192
+ })
193
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
194
+ "sentry-label": "ignore clear events",
195
+ onPress: handleClearEvents,
196
+ style: styles.actionButton,
197
+ accessibilityLabel: "Clear events",
198
+ disabled: events.length === 0,
199
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.Trash2, {
200
+ size: 14,
201
+ color: events.length > 0 ? "#6B7280" : "#374151"
202
+ })
203
+ })]
204
+ })]
205
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
206
+ style: styles.eventsList,
207
+ nestedScrollEnabled: true,
208
+ showsVerticalScrollIndicator: false,
209
+ "sentry-label": "ignore event list scroll",
210
+ children: events.length === 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
211
+ style: styles.emptyState,
212
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
213
+ style: styles.emptyText,
214
+ children: isListening ? "Waiting for storage operations..." : "Start listening to capture events"
215
+ })
216
+ }) : events.map((event, index) => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
217
+ style: styles.eventItem,
218
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
219
+ style: styles.eventLeft,
220
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
221
+ style: [styles.eventAction, {
222
+ color: getActionColor(event.action)
223
+ }],
224
+ children: (0, _storageActionHelpers.translateStorageAction)(event.action)
225
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
226
+ style: styles.eventData,
227
+ numberOfLines: 1,
228
+ children: formatEventData(event)
229
+ })]
230
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
231
+ style: styles.eventTime,
232
+ children: event.timestamp.toLocaleTimeString([], {
233
+ hour: "2-digit",
234
+ minute: "2-digit",
235
+ second: "2-digit"
236
+ })
237
+ })]
238
+ }, `${event.timestamp.getTime()}-${index}`))
239
+ })]
240
+ });
241
+ }
242
+ const styles = _reactNative.StyleSheet.create({
243
+ container: {
244
+ backgroundColor: "rgba(255, 255, 255, 0.03)",
245
+ borderRadius: 8,
246
+ borderWidth: 1,
247
+ borderColor: "rgba(255, 255, 255, 0.08)",
248
+ marginBottom: 12,
249
+ maxHeight: 200
250
+ },
251
+ header: {
252
+ flexDirection: "row",
253
+ alignItems: "center",
254
+ justifyContent: "space-between",
255
+ paddingHorizontal: 12,
256
+ paddingVertical: 8,
257
+ borderBottomWidth: 1,
258
+ borderBottomColor: "rgba(255, 255, 255, 0.06)"
259
+ },
260
+ headerLeft: {
261
+ flexDirection: "row",
262
+ alignItems: "center",
263
+ gap: 8
264
+ },
265
+ title: {
266
+ fontSize: 12,
267
+ fontWeight: "500",
268
+ color: "#9CA3AF",
269
+ textTransform: "uppercase",
270
+ letterSpacing: 0.5
271
+ },
272
+ statsContainer: {
273
+ flexDirection: "row",
274
+ alignItems: "center",
275
+ gap: 6,
276
+ backgroundColor: "rgba(0, 0, 0, 0.2)",
277
+ paddingHorizontal: 8,
278
+ paddingVertical: 2,
279
+ borderRadius: 10
280
+ },
281
+ statsText: {
282
+ fontSize: 11,
283
+ color: "#6B7280",
284
+ fontWeight: "500"
285
+ },
286
+ listeningIndicator: {
287
+ width: 6,
288
+ height: 6,
289
+ borderRadius: 3,
290
+ backgroundColor: "#10B981"
291
+ },
292
+ headerActions: {
293
+ flexDirection: "row",
294
+ alignItems: "center",
295
+ gap: 6
296
+ },
297
+ actionButton: {
298
+ width: 28,
299
+ height: 28,
300
+ borderRadius: 6,
301
+ backgroundColor: "rgba(255, 255, 255, 0.03)",
302
+ borderWidth: 1,
303
+ borderColor: "rgba(255, 255, 255, 0.08)",
304
+ alignItems: "center",
305
+ justifyContent: "center"
306
+ },
307
+ startButton: {
308
+ backgroundColor: "rgba(16, 185, 129, 0.1)",
309
+ borderColor: "rgba(16, 185, 129, 0.2)"
310
+ },
311
+ stopButton: {
312
+ backgroundColor: "rgba(239, 68, 68, 0.1)",
313
+ borderColor: "rgba(239, 68, 68, 0.2)"
314
+ },
315
+ eventsList: {
316
+ maxHeight: 150
317
+ },
318
+ emptyState: {
319
+ padding: 20,
320
+ alignItems: "center"
321
+ },
322
+ emptyText: {
323
+ fontSize: 11,
324
+ color: "#6B7280",
325
+ fontStyle: "italic"
326
+ },
327
+ eventItem: {
328
+ flexDirection: "row",
329
+ alignItems: "center",
330
+ justifyContent: "space-between",
331
+ paddingHorizontal: 12,
332
+ paddingVertical: 6,
333
+ borderBottomWidth: 1,
334
+ borderBottomColor: "rgba(255, 255, 255, 0.03)"
335
+ },
336
+ eventLeft: {
337
+ flex: 1,
338
+ flexDirection: "row",
339
+ alignItems: "center",
340
+ gap: 8,
341
+ marginRight: 8
342
+ },
343
+ eventAction: {
344
+ fontSize: 11,
345
+ fontWeight: "600",
346
+ minWidth: 60
347
+ },
348
+ eventData: {
349
+ fontSize: 11,
350
+ color: "#9CA3AF",
351
+ flex: 1
352
+ },
353
+ eventTime: {
354
+ fontSize: 10,
355
+ color: "#6B7280"
356
+ }
357
+ });
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.StorageEventsSection = StorageEventsSection;
7
+ var _sharedUi = require("@buoy-gg/shared-ui");
8
+ var _jsxRuntime = require("react/jsx-runtime");
9
+ function StorageEventsSection({
10
+ onPress,
11
+ eventCount = 0
12
+ }) {
13
+ const subtitle = eventCount > 0 ? `${eventCount} events` : "Monitoring";
14
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.CyberpunkSectionButton, {
15
+ id: "storage-events",
16
+ title: "EVENTS",
17
+ subtitle: subtitle,
18
+ icon: _sharedUi.Database,
19
+ iconColor: "#00E5FF",
20
+ iconBackgroundColor: "rgba(0, 229, 255, 0.1)",
21
+ onPress: onPress,
22
+ index: 3
23
+ });
24
+ }