react-native-storage-inspector 1.0.1 → 1.0.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.
- package/dist/index.js +19 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +19 -13
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -1
package/dist/index.js
CHANGED
|
@@ -1060,11 +1060,10 @@ function StorageSection({
|
|
|
1060
1060
|
return next;
|
|
1061
1061
|
});
|
|
1062
1062
|
};
|
|
1063
|
-
return /* @__PURE__ */ React6__default.default.createElement(
|
|
1063
|
+
return /* @__PURE__ */ React6__default.default.createElement(reactNative.View, { key: item.key, style: styles2.itemRow }, /* @__PURE__ */ React6__default.default.createElement(
|
|
1064
1064
|
reactNative.TouchableOpacity,
|
|
1065
1065
|
{
|
|
1066
1066
|
key: item.key,
|
|
1067
|
-
style: styles2.itemRow,
|
|
1068
1067
|
onPress: toggleItemExpanded,
|
|
1069
1068
|
activeOpacity: 0.7
|
|
1070
1069
|
},
|
|
@@ -1085,17 +1084,24 @@ function StorageSection({
|
|
|
1085
1084
|
size: LAYOUT.chevronSize,
|
|
1086
1085
|
tintColor: theme.colors.text
|
|
1087
1086
|
}
|
|
1088
|
-
)))
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1087
|
+
)))
|
|
1088
|
+
), isItemExpanded && /* @__PURE__ */ React6__default.default.createElement(reactNative.View, { style: styles2.itemRowExpanded }, /* @__PURE__ */ React6__default.default.createElement(
|
|
1089
|
+
reactNative.TouchableOpacity,
|
|
1090
|
+
{
|
|
1091
|
+
onPress: () => handleEdit(item),
|
|
1092
|
+
style: styles2.valueBox
|
|
1093
|
+
},
|
|
1094
|
+
/* @__PURE__ */ React6__default.default.createElement(reactNative.Text, { style: styles2.valueBoxLabel }, strings.valueLabel),
|
|
1095
|
+
/* @__PURE__ */ React6__default.default.createElement(reactNative.Text, { style: styles2.valueBoxText, selectable: true }, item.value || strings.emptyValue)
|
|
1096
|
+
), /* @__PURE__ */ React6__default.default.createElement(
|
|
1097
|
+
ItemRowActions,
|
|
1098
|
+
{
|
|
1099
|
+
item,
|
|
1100
|
+
onCopy: handleCopy,
|
|
1101
|
+
onEdit: handleEdit,
|
|
1102
|
+
onDelete: setDeleteItem
|
|
1103
|
+
}
|
|
1104
|
+
)));
|
|
1099
1105
|
}), !loading && items.length === 0 && !showKeychainHint && !showSecureStoreHint ? /* @__PURE__ */ React6__default.default.createElement(reactNative.View, { style: styles2.empty }, /* @__PURE__ */ React6__default.default.createElement(reactNative.Text, { style: styles2.emptyText }, strings.noItems)) : null), /* @__PURE__ */ React6__default.default.createElement(
|
|
1100
1106
|
ItemForm,
|
|
1101
1107
|
{
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/mmkv.ts","../src/adapters/async-storage.ts","../src/adapters/keychain.ts","../src/adapters/secure-store.ts","../src/hooks/useStorageItems.ts","../src/theme.ts","../src/components/Icon.tsx","../src/constants.ts","../src/components/styles.ts","../src/components/IconButton.tsx","../src/strings.ts","../src/components/ItemForm.tsx","../src/components/ConfirmModal.tsx","../src/components/ItemRowActions.tsx","../src/components/StorageSection.tsx","../src/components/StorageInspector.tsx"],"names":["creds","result","useState","useCallback","useEffect","React","Text","StyleSheet","Dimensions","styles","TouchableOpacity","Modal","View","TextInput","Share","useMemo","ScrollView","RefreshControl"],"mappings":"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","file":"index.js","sourcesContent":["import type { IStorageAdapter } from '@/adapters/types';\n\ntype MMKVInstance = {\n getAllKeys(): string[];\n getString(key: string): string | undefined;\n set(key: string, value: string | number | boolean): void;\n delete(key: string): void;\n};\n\nexport function createMMKVAdapter(\n instance: MMKVInstance,\n name?: string\n): IStorageAdapter {\n return {\n type: 'mmkv',\n name: name ?? 'MMKV',\n getAllKeys(): Promise<string[]> {\n return Promise.resolve(instance.getAllKeys());\n },\n getItem(key: string): Promise<string | null> {\n const value = instance.getString(key);\n return Promise.resolve(value ?? null);\n },\n setItem(key: string, value: string): Promise<void> {\n instance.set(key, value);\n return Promise.resolve();\n },\n removeItem(key: string): Promise<void> {\n instance.delete(key);\n return Promise.resolve();\n },\n isAvailable(): boolean {\n return true;\n },\n };\n}\n\nexport function isMMKVAvailable(): boolean {\n try {\n require('react-native-mmkv');\n return true;\n } catch {\n return false;\n }\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * AsyncStorage-compatible module interface.\n * Pass your AsyncStorage instance to avoid Metro \"unknown module\" errors in Expo:\n * @example\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * createAsyncStorageAdapter(AsyncStorage)\n */\nexport type AsyncStorageModule = {\n getAllKeys(): Promise<string[]>;\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\nlet asyncStorage: AsyncStorageModule | null = null;\n\nfunction getAsyncStorageFromRequire(): AsyncStorageModule | null {\n try {\n const mod = require('@react-native-async-storage/async-storage') as\n | { default: AsyncStorageModule }\n | AsyncStorageModule;\n return (\n (mod as { default?: AsyncStorageModule }).default ?? (mod as AsyncStorageModule)\n );\n } catch {\n return null;\n }\n}\n\n/**\n * Creates an AsyncStorage adapter. Pass the AsyncStorage instance for reliable\n * bundling in Expo/Metro (avoids \"unknown module\" errors):\n *\n * @example\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * createAsyncStorageAdapter(AsyncStorage)\n */\nexport function createAsyncStorageAdapter(\n instance?: AsyncStorageModule | null\n): IStorageAdapter {\n const getStorage = () => instance ?? (asyncStorage ??= getAsyncStorageFromRequire());\n return {\n type: 'async-storage',\n name: 'Async Storage',\n async getAllKeys(): Promise<string[]> {\n const storage = getStorage();\n if (!storage) return [];\n return storage.getAllKeys();\n },\n async getItem(key: string): Promise<string | null> {\n const storage = getStorage();\n if (!storage) return null;\n return storage.getItem(key);\n },\n async setItem(key: string, value: string): Promise<void> {\n const storage = getStorage();\n if (!storage) throw new Error('AsyncStorage is not available');\n await storage.setItem(key, value);\n },\n async removeItem(key: string): Promise<void> {\n const storage = getStorage();\n if (!storage) throw new Error('AsyncStorage is not available');\n await storage.removeItem(key);\n },\n isAvailable(): boolean {\n return getStorage() !== null;\n },\n };\n}\n\nexport function isAsyncStorageAvailable(instance?: AsyncStorageModule | null): boolean {\n return (instance ?? getAsyncStorageFromRequire()) !== null;\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * Keychain-compatible module. Pass your keychain instance to avoid Metro\n * \"unknown module\" errors in Expo.\n */\nexport type KeychainModule = {\n getAllGenericPasswordServices?(options?: object): Promise<string[]>;\n getGenericPassword?(options?: {\n service?: string;\n }): Promise<{ password: string } | false>;\n setGenericPassword?(\n username: string,\n password: string,\n options?: { service?: string }\n ): Promise<{ storage: string } | false>;\n resetGenericPassword?(options?: { service?: string }): Promise<void>;\n setInternetCredentials(\n server: string,\n username: string,\n password: string\n ): Promise<{ storage: string } | false>;\n getInternetCredentials(server: string): Promise<{\n username: string;\n password: string;\n } | null>;\n resetInternetCredentials(server: string): Promise<void>;\n};\n\nlet keychain: KeychainModule | null = null;\n\nfunction getKeychainFromRequire(): KeychainModule | null {\n try {\n return require('react-native-keychain') as KeychainModule;\n } catch {\n return null;\n }\n}\n\n/**\n * Keychain adapter. Pass the keychain instance for reliable bundling in Expo:\n * @example import * as Keychain from 'react-native-keychain';\n * createKeychainAdapter([], Keychain)\n */\nexport function createKeychainAdapter(\n knownKeys: string[] = [],\n instance?: KeychainModule | null\n): IStorageAdapter {\n const getKc = () => instance ?? (keychain ??= getKeychainFromRequire());\n return {\n type: 'keychain',\n name: 'Keychain',\n async getAllKeys(): Promise<string[]> {\n const kc = getKc();\n if (!kc) return [...knownKeys];\n\n const genericServices: string[] = [];\n if (typeof kc.getAllGenericPasswordServices === 'function') {\n try {\n const services = await kc.getAllGenericPasswordServices();\n if (Array.isArray(services)) genericServices.push(...services);\n } catch {\n // Ignore – fall back to knownKeys\n }\n }\n\n const merged = new Set([...genericServices, ...knownKeys]);\n return Array.from(merged);\n },\n async getItem(key: string): Promise<string | null> {\n const kc = getKc();\n if (!kc) return null;\n\n if (typeof kc.getGenericPassword === 'function') {\n try {\n const creds = await kc.getGenericPassword({ service: key });\n if (creds && typeof creds === 'object' && 'password' in creds) {\n return creds.password;\n }\n } catch {\n // Fall through to internet credentials\n }\n }\n\n const creds = await kc.getInternetCredentials(key);\n return creds?.password ?? null;\n },\n async setItem(key: string, value: string): Promise<void> {\n const kc = getKc();\n if (!kc) throw new Error('react-native-keychain is not available');\n\n if (typeof kc.setGenericPassword === 'function') {\n const result = await kc.setGenericPassword(key, value, { service: key });\n if (result === false) throw new Error('Keychain set failed');\n return;\n }\n\n const result = await kc.setInternetCredentials(key, key, value);\n if (result === false) throw new Error('Keychain set failed');\n },\n async removeItem(key: string): Promise<void> {\n const kc = getKc();\n if (!kc) throw new Error('react-native-keychain is not available');\n\n if (typeof kc.resetGenericPassword === 'function') {\n await kc.resetGenericPassword({ service: key });\n }\n await kc.resetInternetCredentials(key);\n },\n isAvailable(): boolean {\n return getKc() !== null;\n },\n };\n}\n\nexport function isKeychainAvailable(instance?: KeychainModule | null): boolean {\n return (instance ?? getKeychainFromRequire()) !== null;\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * expo-secure-store compatible module. Pass the module to avoid Metro\n * \"unknown module\" errors in Expo.\n */\nexport type SecureStoreModule = {\n getItemAsync(key: string): Promise<string | null>;\n setItemAsync(key: string, value: string): Promise<void>;\n deleteItemAsync(key: string): Promise<void>;\n};\n\nlet secureStore: SecureStoreModule | null = null;\n\nfunction getSecureStoreFromRequire(): SecureStoreModule | null {\n try {\n return require('expo-secure-store') as SecureStoreModule;\n } catch {\n return null;\n }\n}\n\n/**\n * expo-secure-store has no API to list all keys. Pass knownKeys to inspect\n * those entries. Pass the module for reliable bundling in Expo:\n * @example import * as SecureStore from 'expo-secure-store';\n * createSecureStoreAdapter([], SecureStore)\n */\nexport function createSecureStoreAdapter(\n knownKeys: string[] = [],\n instance?: SecureStoreModule | null\n): IStorageAdapter {\n const getStore = () => instance ?? (secureStore ??= getSecureStoreFromRequire());\n return {\n type: 'expo-secure-store',\n name: 'Secure Store',\n async getAllKeys(): Promise<string[]> {\n return [...knownKeys];\n },\n async getItem(key: string): Promise<string | null> {\n const store = getStore();\n if (!store) return null;\n return store.getItemAsync(key);\n },\n async setItem(key: string, value: string): Promise<void> {\n const store = getStore();\n if (!store) throw new Error('expo-secure-store is not available');\n await store.setItemAsync(key, value);\n },\n async removeItem(key: string): Promise<void> {\n const store = getStore();\n if (!store) throw new Error('expo-secure-store is not available');\n await store.deleteItemAsync(key);\n },\n isAvailable(): boolean {\n return getStore() !== null;\n },\n };\n}\n\nexport function isSecureStoreAvailable(instance?: SecureStoreModule | null): boolean {\n return (instance ?? getSecureStoreFromRequire()) !== null;\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport type { StorageItem } from '@/adapters/types';\n\nexport function useStorageItems(adapter: IStorageAdapter | null): {\n items: StorageItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n} {\n const [items, setItems] = useState<StorageItem[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(async () => {\n if (!adapter || !adapter.isAvailable()) {\n setItems([]);\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const keys = await adapter.getAllKeys();\n const pairs: StorageItem[] = [];\n for (const key of keys) {\n const value = await adapter.getItem(key);\n pairs.push({ key, value: value ?? '' });\n }\n setItems(pairs);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to load items');\n setItems([]);\n } finally {\n setLoading(false);\n }\n }, [adapter]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return { items, loading, error, refresh };\n}\n","/**\n * Theme: minimalistic black and white palette.\n * All colors centralized here - no direct hex values in components.\n */\nexport const theme = {\n colors: {\n background: '#ffffff',\n backgroundSecondary: '#f5f5f5',\n backgroundTertiary: '#eeeeee',\n border: '#e0e0e0',\n borderLight: '#ebebeb',\n text: '#000000',\n textSecondary: '#666666',\n textMuted: '#999999',\n inverted: '#ffffff',\n },\n} as const;\n\nexport type Theme = typeof theme;\n","import React from 'react';\nimport { Text, StyleSheet, TextStyle } from 'react-native';\nimport { theme } from '@/theme';\n\nconst GLYPHS: Record<string, string> = {\n chevronBack: '‹',\n refresh: '↻',\n plus: '+',\n chevronDown: '›',\n chevronUp: '›',\n chevronRight: '›',\n close: '×',\n copy: '⎘',\n edit: '✎',\n trash: '⌫',\n};\n\nconst ROTATION: Partial<Record<string, string>> = {\n chevronDown: '90deg',\n chevronUp: '-90deg',\n};\n\nexport type IconName = keyof typeof GLYPHS;\n\nexport interface IconProps {\n name: IconName;\n size?: number;\n tintColor?: string;\n iconStyle?: TextStyle;\n}\n\nexport function Icon({\n name,\n size = 20,\n tintColor = theme.colors.text,\n iconStyle,\n}: IconProps) {\n const glyph = GLYPHS[name] ?? '?';\n const rotation = ROTATION[name];\n\n return (\n <Text\n style={[\n styles.icon,\n { fontSize: size, color: tintColor, lineHeight: size },\n ...(rotation ? [{ transform: [{ rotate: rotation }] }] : []),\n iconStyle,\n ]}\n >\n {glyph}\n </Text>\n );\n}\n\nconst styles = StyleSheet.create({\n icon: {\n alignSelf: 'center',\n fontWeight: '300',\n },\n});\n","import { Dimensions } from 'react-native';\n\nconst { width: SCREEN_WIDTH } = Dimensions.get('window');\n\nexport const LAYOUT = {\n padding: 16,\n fontSize: 14,\n headerHeight: 52,\n rowMinHeight: 48,\n sectionHeaderHeight: 48,\n iconSize: 20,\n chevronSize: 24,\n iconGap: 2,\n iconButtonSize: 36,\n hitSlop: { top: 8, bottom: 8, left: 8, right: 8 },\n hitSlopLarge: { top: 10, bottom: 10, left: 10, right: 10 },\n fabSize: 52,\n modalRadius: 16,\n sectionRadius: 4,\n screenWidth: SCREEN_WIDTH,\n} as const;\n","import { StyleSheet } from 'react-native';\nimport { theme } from '@/theme';\nimport { LAYOUT } from '@/constants';\n\nconst { colors } = theme;\n\nexport const styles = StyleSheet.create({\n container: {\n flex: 1,\n width: '100%',\n backgroundColor: colors.background,\n },\n content: {\n flex: 1,\n },\n scroll: {\n flex: 1,\n },\n header: {\n height: LAYOUT.headerHeight,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: LAYOUT.padding,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.border,\n backgroundColor: colors.background,\n },\n headerLeft: {\n minWidth: 44,\n alignItems: 'flex-start',\n },\n headerCenter: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n headerRight: {\n minWidth: 44,\n alignItems: 'flex-end',\n },\n sectionHeaderLabelWrap: {\n flex: 1,\n },\n headerTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: colors.text,\n },\n headerButton: {\n width: 44,\n height: 44,\n alignItems: 'center',\n justifyContent: 'center',\n },\n scrollContent: {\n flexGrow: 1,\n paddingBottom: LAYOUT.fabSize + LAYOUT.padding + 20,\n paddingTop: LAYOUT.padding,\n },\n sectionHeader: {\n height: LAYOUT.sectionHeaderHeight,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: LAYOUT.padding,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.border,\n backgroundColor: colors.backgroundSecondary,\n marginTop: LAYOUT.padding,\n marginHorizontal: LAYOUT.padding,\n borderRadius: LAYOUT.sectionRadius,\n },\n sectionHeaderLabel: {\n fontSize: 15,\n fontWeight: '600',\n color: colors.text,\n },\n sectionHeaderCount: {\n color: colors.textSecondary,\n fontWeight: '400',\n },\n storageRowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: LAYOUT.iconGap,\n },\n iconButton: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\n },\n iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\n },\n itemRow: {\n minHeight: LAYOUT.rowMinHeight,\n paddingHorizontal: LAYOUT.padding,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.borderLight,\n backgroundColor: colors.background,\n marginHorizontal: LAYOUT.padding,\n marginBottom: 4,\n },\n itemRowCollapsed: {\n flexDirection: 'row',\n alignItems: 'center',\n alignSelf: 'stretch',\n },\n itemKey: {\n flex: 1,\n fontSize: LAYOUT.fontSize,\n fontWeight: '500',\n color: colors.text,\n },\n itemChars: {\n fontSize: 12,\n color: colors.textSecondary,\n marginTop: 2,\n },\n itemRowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n marginLeft: LAYOUT.iconGap,\n gap: LAYOUT.iconGap,\n },\n itemRowExpanded: {\n paddingTop: 4,\n },\n valueBox: {\n backgroundColor: colors.backgroundSecondary,\n borderRadius: 8,\n padding: 12,\n marginTop: 8,\n marginBottom: 8,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: colors.border,\n },\n valueBoxLabel: {\n fontSize: 11,\n fontWeight: '600',\n color: colors.textSecondary,\n marginBottom: 4,\n textTransform: 'uppercase',\n },\n valueBoxText: {\n fontSize: LAYOUT.fontSize,\n color: colors.text,\n },\n empty: {\n padding: LAYOUT.padding * 2,\n alignItems: 'center',\n marginHorizontal: LAYOUT.padding,\n },\n emptyText: {\n fontSize: LAYOUT.fontSize,\n color: colors.textMuted,\n },\n loading: {\n padding: LAYOUT.padding * 2,\n alignItems: 'center',\n marginHorizontal: LAYOUT.padding,\n },\n loadingText: {\n fontSize: LAYOUT.fontSize,\n color: colors.textSecondary,\n },\n error: {\n padding: LAYOUT.padding,\n backgroundColor: colors.backgroundTertiary,\n marginHorizontal: LAYOUT.padding,\n marginVertical: 8,\n borderRadius: 8,\n },\n errorText: {\n fontSize: LAYOUT.fontSize,\n color: colors.text,\n },\n keychainHint: {\n padding: LAYOUT.padding,\n marginHorizontal: LAYOUT.padding,\n marginTop: 8,\n marginBottom: 4,\n backgroundColor: colors.backgroundSecondary,\n borderRadius: 8,\n },\n keychainHintText: {\n fontSize: LAYOUT.fontSize - 1,\n color: colors.textSecondary,\n },\n list: {\n flex: 1,\n },\n listContent: {\n flexGrow: 1,\n paddingBottom: LAYOUT.fabSize + LAYOUT.padding + 20,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n minHeight: LAYOUT.rowMinHeight,\n paddingHorizontal: LAYOUT.padding,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.borderLight,\n backgroundColor: colors.background,\n marginHorizontal: LAYOUT.padding,\n },\n rowKey: {\n flex: 1,\n fontSize: LAYOUT.fontSize,\n fontWeight: '500',\n color: colors.text,\n },\n rowValue: {\n fontSize: LAYOUT.fontSize - 1,\n color: colors.textSecondary,\n },\n rowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n marginLeft: LAYOUT.iconGap,\n gap: LAYOUT.iconGap,\n },\n rowButton: {\n paddingVertical: 8,\n paddingHorizontal: 12,\n },\n rowButtonText: {\n fontSize: 14,\n fontWeight: '600',\n color: colors.text,\n },\n rowButtonDanger: {\n color: colors.text,\n },\n addButton: {\n position: 'absolute',\n bottom: LAYOUT.padding + 16,\n right: LAYOUT.padding + 16,\n width: LAYOUT.fabSize,\n height: LAYOUT.fabSize,\n borderRadius: LAYOUT.fabSize / 2,\n backgroundColor: colors.text,\n alignItems: 'center',\n justifyContent: 'center',\n },\n addButtonText: {\n fontSize: 16,\n fontWeight: '600',\n color: colors.inverted,\n },\n fab: {\n position: 'absolute',\n bottom: LAYOUT.padding + 16,\n right: LAYOUT.padding + 16,\n width: LAYOUT.fabSize,\n height: LAYOUT.fabSize,\n borderRadius: LAYOUT.fabSize / 2,\n backgroundColor: colors.text,\n alignItems: 'center',\n justifyContent: 'center',\n },\n formOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'flex-end',\n alignItems: 'center',\n },\n formModal: {\n width: '100%',\n maxWidth: LAYOUT.screenWidth,\n backgroundColor: colors.background,\n borderTopLeftRadius: LAYOUT.modalRadius,\n borderTopRightRadius: LAYOUT.modalRadius,\n padding: LAYOUT.padding,\n paddingBottom: LAYOUT.padding + 34,\n },\n formHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: LAYOUT.padding,\n },\n formTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: colors.text,\n flex: 1,\n },\n formCloseButton: {\n width: 44,\n height: 44,\n alignItems: 'flex-end',\n justifyContent: 'center',\n },\n formStorageType: {\n fontSize: 13,\n color: colors.textSecondary,\n marginBottom: 12,\n },\n formLabel: {\n fontSize: 12,\n fontWeight: '600',\n color: colors.textSecondary,\n marginBottom: 6,\n },\n formInput: {\n borderWidth: 1,\n borderColor: colors.border,\n borderRadius: 10,\n padding: 12,\n fontSize: LAYOUT.fontSize,\n marginBottom: LAYOUT.padding,\n color: colors.text,\n backgroundColor: colors.background,\n },\n formInputDisabled: {\n backgroundColor: colors.backgroundSecondary,\n color: colors.textSecondary,\n },\n formActions: {\n flexDirection: 'row',\n justifyContent: 'flex-end',\n gap: 12,\n marginTop: 8,\n },\n formButton: {\n paddingVertical: 12,\n paddingHorizontal: 20,\n borderRadius: 10,\n minWidth: 100,\n alignItems: 'center',\n },\n formButtonCancel: {\n backgroundColor: 'transparent',\n borderWidth: 1,\n borderColor: colors.text,\n },\n formButtonSubmit: {\n backgroundColor: colors.text,\n },\n formButtonText: {\n fontSize: 16,\n fontWeight: '600',\n },\n formButtonTextCancel: {\n color: colors.text,\n },\n formButtonTextSubmit: {\n color: colors.inverted,\n },\n confirmOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'flex-end',\n alignItems: 'center',\n },\n confirmModal: {\n width: '100%',\n maxWidth: LAYOUT.screenWidth,\n backgroundColor: colors.background,\n borderTopLeftRadius: LAYOUT.modalRadius,\n borderTopRightRadius: LAYOUT.modalRadius,\n padding: LAYOUT.padding,\n paddingBottom: LAYOUT.padding + 34,\n },\n confirmHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 12,\n },\n confirmTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: colors.text,\n flex: 1,\n },\n confirmMessage: {\n fontSize: 15,\n color: colors.textSecondary,\n lineHeight: 22,\n marginBottom: 20,\n },\n confirmActions: {\n flexDirection: 'row',\n gap: 12,\n },\n confirmButton: {\n flex: 1,\n paddingVertical: 14,\n borderRadius: 10,\n alignItems: 'center',\n },\n confirmButtonSecondary: {\n backgroundColor: 'transparent',\n borderWidth: 1,\n borderColor: colors.text,\n },\n confirmButtonDanger: {\n backgroundColor: colors.text,\n },\n confirmButtonText: {\n fontSize: 16,\n fontWeight: '600',\n },\n confirmButtonTextSecondary: {\n color: colors.text,\n },\n confirmButtonTextDanger: {\n color: colors.inverted,\n },\n});\n","import React from 'react';\nimport { TouchableOpacity, StyleSheet, ViewStyle } from 'react-native';\nimport type { IconName } from '@/components/Icon';\nimport { Icon } from '@/components/Icon';\nimport { theme } from '@/theme';\nimport { LAYOUT } from '@/constants';\nimport { styles as sharedStyles } from '@/components/styles';\n\nexport interface IconButtonProps {\n name: IconName;\n onPress: () => void;\n size?: number;\n tintColor?: string;\n disabled?: boolean;\n hitSlop?: { top: number; bottom: number; left: number; right: number };\n style?: ViewStyle;\n activeOpacity?: number;\n}\n\nexport function IconButton({\n name,\n onPress,\n size = LAYOUT.iconSize,\n tintColor = theme.colors.text,\n disabled = false,\n hitSlop = LAYOUT.hitSlop,\n style,\n activeOpacity = 0.6,\n}: IconButtonProps) {\n return (\n <TouchableOpacity\n style={[sharedStyles.iconButton, style]}\n onPress={onPress}\n disabled={disabled}\n hitSlop={hitSlop}\n activeOpacity={activeOpacity}\n >\n <Icon\n name={name}\n size={size}\n tintColor={disabled ? theme.colors.textMuted : tintColor}\n />\n </TouchableOpacity>\n );\n}\n","/**\n * Centralized user-facing text for the storage inspector.\n * Enables localization and consistent messaging.\n */\nexport const strings = {\n // StorageInspector\n noAdapterAvailable:\n 'No storage adapter available. Install at least one of: react-native-mmkv, @react-native-async-storage/async-storage, react-native-keychain, expo-secure-store',\n\n // StorageSection\n keychainHint:\n 'No generic password items yet. Add a key using + above, or pass keychainKeys for internet credentials.',\n secureStoreHint:\n 'Secure Store has no list API. Pass secureStoreKeys prop with known keys, or add a key using + above.',\n loading: 'Loading…',\n noItems: 'No items',\n valueLabel: 'Value',\n emptyValue: '(empty)',\n charCount: (n: number) => (n === 1 ? '1 char' : `${n} chars`),\n deleteItemTitle: (key: string) => `Delete ${key}?`,\n deleteItemMessage: (key: string) =>\n `This will permanently delete the ${key} storage item. Do you wish to continue?`,\n clearAllTitle: (name: string) => `Clear All ${name}?`,\n clearAllMessage: (count: number, name: string) =>\n `This will permanently delete all ${count} ${name} items. Do you wish to continue?`,\n\n // StorageList\n storageNotAvailable: 'This storage is not available.',\n keychainHintShort:\n 'No items yet. Add a key below, or pass keychainKeys for internet credentials.',\n edit: 'Edit',\n delete: 'Delete',\n addItem: 'Add item',\n\n // ItemForm\n keyRequired: 'Key is required',\n saveFailed: 'Save failed',\n editItemTitle: (key: string) => `Edit ${key}`,\n addItemTitle: (storageName: string) => `Add ${storageName} Item`,\n storageTypeLabel: (name: string) => `Storage Type: ${name}`,\n keyLabel: 'Key',\n enterKeyPlaceholder: 'Enter key',\n enterValuePlaceholder: 'Enter value',\n cancel: 'Cancel',\n saving: 'Saving…',\n save: 'Save',\n add: 'Add',\n\n // ConfirmModal defaults\n confirmDelete: 'Yes, delete',\n cancelKeep: 'No, keep it',\n} as const;\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, TextInput, TouchableOpacity, Modal } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { LAYOUT } from '@/constants';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\n\nexport interface ItemFormProps {\n visible: boolean;\n storageName: string;\n editingItem: StorageItem | null;\n onSave: (key: string, value: string) => Promise<void>;\n onCancel: () => void;\n}\n\nexport function ItemForm({\n visible,\n storageName,\n editingItem,\n onSave,\n onCancel,\n}: ItemFormProps) {\n const [key, setKey] = useState('');\n const [value, setValue] = useState('');\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const isEdit = editingItem !== null;\n\n useEffect(() => {\n if (visible) {\n setKey(editingItem?.key ?? '');\n setValue(editingItem?.value ?? '');\n setError(null);\n }\n }, [visible, editingItem]);\n\n const handleSubmit = async () => {\n const k = key.trim();\n if (!k) {\n setError(strings.keyRequired);\n return;\n }\n setSaving(true);\n setError(null);\n try {\n await onSave(k, value);\n onCancel();\n } catch (e) {\n setError(e instanceof Error ? e.message : strings.saveFailed);\n } finally {\n setSaving(false);\n }\n };\n\n const title = isEdit\n ? strings.editItemTitle(editingItem?.key ?? '')\n : strings.addItemTitle(storageName);\n\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onCancel}>\n <View style={styles.formOverlay}>\n <TouchableOpacity\n style={{ flex: 1, width: '100%' }}\n activeOpacity={1}\n onPress={onCancel}\n />\n <View style={styles.formModal}>\n <View style={styles.formHeader}>\n <Text style={styles.formTitle} numberOfLines={1}>\n {title}\n </Text>\n <IconButton\n name=\"close\"\n onPress={onCancel}\n size={24}\n tintColor={theme.colors.textSecondary}\n style={styles.formCloseButton}\n hitSlop={LAYOUT.hitSlopLarge}\n />\n </View>\n <Text style={styles.formStorageType}>\n {strings.storageTypeLabel(storageName)}\n </Text>\n <Text style={styles.formLabel}>{strings.keyLabel}</Text>\n <TextInput\n style={[styles.formInput, isEdit && styles.formInputDisabled]}\n value={key}\n onChangeText={setKey}\n placeholder={strings.enterKeyPlaceholder}\n placeholderTextColor={theme.colors.textMuted}\n editable={!isEdit}\n autoCapitalize=\"none\"\n multiline\n />\n <Text style={styles.formLabel}>{strings.valueLabel}</Text>\n <TextInput\n style={styles.formInput}\n value={value}\n onChangeText={setValue}\n placeholder={strings.enterValuePlaceholder}\n placeholderTextColor={theme.colors.textMuted}\n multiline\n numberOfLines={3}\n />\n {error ? (\n <Text style={[styles.errorText, { marginBottom: 12 }]}>{error}</Text>\n ) : null}\n <View style={styles.formActions}>\n <TouchableOpacity\n style={[styles.formButton, styles.formButtonCancel]}\n onPress={onCancel}\n disabled={saving}\n >\n <Text style={[styles.formButtonText, styles.formButtonTextCancel]}>\n {strings.cancel}\n </Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[styles.formButton, styles.formButtonSubmit]}\n onPress={handleSubmit}\n disabled={saving}\n >\n <Text style={[styles.formButtonText, styles.formButtonTextSubmit]}>\n {saving ? strings.saving : isEdit ? strings.save : strings.add}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </Modal>\n );\n}\n","import React from 'react';\nimport { View, Text, Modal, TouchableOpacity } from 'react-native';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { LAYOUT } from '@/constants';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\n\nexport interface ConfirmModalProps {\n visible: boolean;\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n danger?: boolean;\n onConfirm: () => void | Promise<void>;\n onCancel: () => void;\n}\n\nexport function ConfirmModal({\n visible,\n title,\n message,\n confirmLabel = strings.confirmDelete,\n cancelLabel = strings.cancelKeep,\n danger = true,\n onConfirm,\n onCancel,\n}: ConfirmModalProps) {\n const handleConfirm = () => {\n void Promise.resolve(onConfirm());\n };\n\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onCancel}>\n <View style={styles.confirmOverlay}>\n <TouchableOpacity\n style={{ flex: 1, width: '100%' }}\n activeOpacity={1}\n onPress={onCancel}\n />\n <View style={styles.confirmModal}>\n <View style={styles.confirmHeader}>\n <Text style={styles.confirmTitle}>{title}</Text>\n <IconButton\n name=\"close\"\n onPress={onCancel}\n size={24}\n tintColor={theme.colors.textSecondary}\n style={styles.formCloseButton}\n hitSlop={LAYOUT.hitSlopLarge}\n />\n </View>\n <Text style={styles.confirmMessage}>{message}</Text>\n <View style={styles.confirmActions}>\n <TouchableOpacity\n style={[styles.confirmButton, styles.confirmButtonSecondary]}\n onPress={onCancel}\n >\n <Text style={[styles.confirmButtonText, styles.confirmButtonTextSecondary]}>\n {cancelLabel}\n </Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[\n styles.confirmButton,\n danger ? styles.confirmButtonDanger : styles.formButtonSubmit,\n ]}\n onPress={handleConfirm}\n >\n <Text\n style={[\n styles.confirmButtonText,\n danger ? styles.confirmButtonTextDanger : styles.formButtonTextSubmit,\n ]}\n >\n {confirmLabel}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </Modal>\n );\n}\n","import React from 'react';\nimport { View } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { theme } from '@/theme';\nimport { LAYOUT } from '@/constants';\n\nexport interface ItemRowActionsProps {\n item: StorageItem;\n onCopy: (item: StorageItem) => void;\n onEdit: (item: StorageItem) => void;\n onDelete: (item: StorageItem) => void;\n showChevron?: boolean;\n chevronDirection?: 'up' | 'down';\n}\n\nexport function ItemRowActions({\n item,\n onCopy,\n onEdit,\n onDelete,\n showChevron = false,\n chevronDirection = 'down',\n}: ItemRowActionsProps) {\n return (\n <View style={styles.itemRowActions}>\n <IconButton name=\"copy\" onPress={() => onCopy(item)} />\n <IconButton name=\"edit\" onPress={() => onEdit(item)} />\n <IconButton name=\"trash\" onPress={() => onDelete(item)} />\n {showChevron && (\n <View style={styles.iconSlot}>\n <Icon\n name={chevronDirection === 'up' ? 'chevronUp' : 'chevronDown'}\n size={LAYOUT.chevronSize}\n tintColor={theme.colors.text}\n />\n </View>\n )}\n </View>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, TouchableOpacity, Share } from 'react-native';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport type { StorageItem } from '@/adapters/types';\nimport { useStorageItems } from '@/hooks/useStorageItems';\nimport { ItemForm } from '@/components/ItemForm';\nimport { ConfirmModal } from '@/components/ConfirmModal';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\nimport { ItemRowActions } from '@/components/ItemRowActions';\nimport { styles } from '@/components/styles';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageSectionProps {\n key?: React.Key;\n adapter: IStorageAdapter;\n keychainKeys?: string[];\n onKeychainKeyAdded?: (key: string) => void;\n onSecureStoreKeyAdded?: (key: string) => void;\n defaultExpanded?: boolean;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n refreshTrigger?: number;\n}\n\nexport function StorageSection({\n adapter,\n keychainKeys,\n onKeychainKeyAdded,\n onSecureStoreKeyAdded,\n defaultExpanded = true,\n expanded: expandedProp,\n onToggleExpanded,\n refreshTrigger,\n}: StorageSectionProps) {\n const { items, loading, error, refresh } = useStorageItems(adapter);\n const [expandedInternal, setExpandedInternal] = useState(defaultExpanded);\n const expanded = expandedProp !== undefined ? expandedProp : expandedInternal;\n\n const handleToggleExpanded = () => {\n if (onToggleExpanded) onToggleExpanded();\n else setExpandedInternal((p: boolean) => !p);\n };\n\n useEffect(() => {\n if (refreshTrigger !== undefined) refresh();\n }, [refreshTrigger, refresh]);\n\n const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());\n const [formVisible, setFormVisible] = useState(false);\n const [editingItem, setEditingItem] = useState<StorageItem | null>(null);\n const [deleteItem, setDeleteItem] = useState<StorageItem | null>(null);\n const [clearAllVisible, setClearAllVisible] = useState(false);\n\n const handleAdd = () => {\n setEditingItem(null);\n setFormVisible(true);\n };\n\n const handleEdit = (item: StorageItem) => {\n setEditingItem(item);\n setFormVisible(true);\n };\n\n const handleSave = async (key: string, value: string) => {\n const isNewKey = !editingItem || editingItem.key !== key;\n await adapter.setItem(key, value);\n if (adapter.type === 'keychain' && isNewKey) {\n onKeychainKeyAdded?.(key);\n }\n if (adapter.type === 'expo-secure-store' && isNewKey) {\n onSecureStoreKeyAdded?.(key);\n }\n await refresh();\n };\n\n const handleDeleteItem = async () => {\n if (deleteItem) {\n await adapter.removeItem(deleteItem.key);\n setDeleteItem(null);\n await refresh();\n }\n };\n\n const handleClearAll = async () => {\n for (const item of items) {\n await adapter.removeItem(item.key);\n }\n setClearAllVisible(false);\n await refresh();\n };\n\n const handleCopy = async (item: StorageItem) => {\n try {\n await Share.share({\n message: item.value,\n title: item.key,\n });\n } catch {\n // Share cancelled or not available\n }\n };\n\n const isKeychain = adapter.type === 'keychain';\n const isSecureStore = adapter.type === 'expo-secure-store';\n const showKeychainHint =\n isKeychain && items.length === 0 && (keychainKeys?.length ?? 0) === 0;\n const showSecureStoreHint = isSecureStore && items.length === 0;\n\n if (!adapter.isAvailable()) return null;\n\n return (\n <>\n <TouchableOpacity\n style={styles.sectionHeader}\n onPress={handleToggleExpanded}\n activeOpacity={0.7}\n >\n <View style={styles.sectionHeaderLabelWrap}>\n <Text style={styles.sectionHeaderLabel}>\n {adapter.name}\n <Text style={styles.sectionHeaderCount}> ({items.length})</Text>\n </Text>\n </View>\n <View style={styles.storageRowActions}>\n <IconButton name=\"plus\" onPress={handleAdd} />\n <IconButton\n name=\"trash\"\n onPress={() => items.length > 0 && setClearAllVisible(true)}\n disabled={items.length === 0}\n />\n <View style={styles.iconSlot}>\n <Icon\n name={expanded ? 'chevronUp' : 'chevronDown'}\n size={LAYOUT.chevronSize}\n tintColor={theme.colors.text}\n />\n </View>\n </View>\n </TouchableOpacity>\n\n {expanded && (\n <>\n {showKeychainHint ? (\n <View style={styles.keychainHint}>\n <Text style={styles.keychainHintText}>{strings.keychainHint}</Text>\n </View>\n ) : null}\n {showSecureStoreHint ? (\n <View style={styles.keychainHint}>\n <Text style={styles.keychainHintText}>{strings.secureStoreHint}</Text>\n </View>\n ) : null}\n {error ? (\n <View style={styles.error}>\n <Text style={styles.errorText}>{error}</Text>\n </View>\n ) : null}\n {loading ? (\n <View style={styles.loading}>\n <Text style={styles.loadingText}>{strings.loading}</Text>\n </View>\n ) : (\n items.map((item) => {\n const isItemExpanded = expandedKeys.has(item.key);\n const charCount = item.value.length;\n const toggleItemExpanded = () => {\n setExpandedKeys((prev: Set<string>) => {\n const next = new Set(prev);\n if (next.has(item.key)) next.delete(item.key);\n else next.add(item.key);\n return next;\n });\n };\n return (\n <TouchableOpacity\n key={item.key}\n style={styles.itemRow}\n onPress={toggleItemExpanded}\n activeOpacity={0.7}\n >\n <View style={styles.itemRowCollapsed}>\n <View style={{ flex: 1 }}>\n <Text style={styles.itemKey} numberOfLines={1}>\n {item.key}\n </Text>\n <Text style={styles.itemChars}>{strings.charCount(charCount)}</Text>\n </View>\n {!isItemExpanded ? (\n <ItemRowActions\n item={item}\n onCopy={handleCopy}\n onEdit={handleEdit}\n onDelete={setDeleteItem}\n showChevron\n chevronDirection=\"down\"\n />\n ) : (\n <View style={styles.iconSlot}>\n <Icon\n name=\"chevronUp\"\n size={LAYOUT.chevronSize}\n tintColor={theme.colors.text}\n />\n </View>\n )}\n </View>\n {isItemExpanded && (\n <View style={styles.itemRowExpanded}>\n <View style={styles.valueBox}>\n <Text style={styles.valueBoxLabel}>{strings.valueLabel}</Text>\n <Text style={styles.valueBoxText} selectable>\n {item.value || strings.emptyValue}\n </Text>\n </View>\n <ItemRowActions\n item={item}\n onCopy={handleCopy}\n onEdit={handleEdit}\n onDelete={setDeleteItem}\n />\n </View>\n )}\n </TouchableOpacity>\n );\n })\n )}\n {!loading && items.length === 0 && !showKeychainHint && !showSecureStoreHint ? (\n <View style={styles.empty}>\n <Text style={styles.emptyText}>{strings.noItems}</Text>\n </View>\n ) : null}\n </>\n )}\n\n <ItemForm\n visible={formVisible}\n storageName={adapter.name}\n editingItem={editingItem}\n onSave={handleSave}\n onCancel={() => {\n setFormVisible(false);\n setEditingItem(null);\n }}\n />\n\n <ConfirmModal\n visible={deleteItem !== null}\n title={strings.deleteItemTitle(deleteItem?.key ?? '')}\n message={strings.deleteItemMessage(deleteItem?.key ?? '')}\n onConfirm={handleDeleteItem}\n onCancel={() => setDeleteItem(null)}\n />\n\n <ConfirmModal\n visible={clearAllVisible}\n title={strings.clearAllTitle(adapter.name)}\n message={strings.clearAllMessage(items.length, adapter.name)}\n onConfirm={handleClearAll}\n onCancel={() => setClearAllVisible(false)}\n />\n </>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport { View, Text, ScrollView, RefreshControl } from 'react-native';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport { createMMKVAdapter } from '@/adapters/mmkv';\nimport {\n createAsyncStorageAdapter,\n type AsyncStorageModule,\n} from '@/adapters/async-storage';\nimport { createKeychainAdapter, type KeychainModule } from '@/adapters/keychain';\nimport {\n createSecureStoreAdapter,\n type SecureStoreModule,\n} from '@/adapters/secure-store';\nimport { StorageSection } from '@/components/StorageSection';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\n\nexport interface StorageInspectorProps {\n mmkvInstances?: Array<{\n getAllKeys(): string[];\n getString(k: string): string | undefined;\n set(k: string, v: string | number | boolean): void;\n delete(k: string): void;\n }>;\n /** Pass AsyncStorage to avoid Metro \"unknown module\" in Expo. */\n asyncStorageInstance?: AsyncStorageModule | null;\n keychainKeys?: string[];\n /** Pass Keychain module to avoid Metro \"unknown module\" in Expo. */\n keychainInstance?: KeychainModule | null;\n secureStoreKeys?: string[];\n /** Pass SecureStore module to avoid Metro \"unknown module\" in Expo. */\n secureStoreInstance?: SecureStoreModule | null;\n customAdapters?: IStorageAdapter[];\n}\n\nexport function StorageInspector({\n mmkvInstances = [],\n asyncStorageInstance,\n keychainKeys: keychainKeysProp,\n keychainInstance,\n secureStoreKeys: secureStoreKeysProp,\n secureStoreInstance,\n customAdapters = [],\n}: StorageInspectorProps) {\n const [keychainKeysAdded, setKeychainKeysAdded] = useState<string[]>([]);\n const [secureStoreKeysAdded, setSecureStoreKeysAdded] = useState<string[]>([]);\n const [refreshKey, setRefreshKey] = useState(0);\n const [refreshing, setRefreshing] = useState(false);\n const [expandedIndices, setExpandedIndices] = useState<Set<number>>(() => new Set([0]));\n\n const keychainKeys = useMemo(\n () => [...(keychainKeysProp ?? []), ...keychainKeysAdded],\n [keychainKeysProp, keychainKeysAdded]\n );\n\n const secureStoreKeys = useMemo(\n () => [...(secureStoreKeysProp ?? []), ...secureStoreKeysAdded],\n [secureStoreKeysProp, secureStoreKeysAdded]\n );\n\n const adapters = useMemo(() => {\n const list: IStorageAdapter[] = [];\n\n mmkvInstances.forEach((inst, i) => {\n list.push(\n createMMKVAdapter(inst, mmkvInstances.length > 1 ? `MMKV ${i + 1}` : 'MMKV')\n );\n });\n\n const asyncAdapter = createAsyncStorageAdapter(asyncStorageInstance);\n if (asyncAdapter.isAvailable()) list.push(asyncAdapter);\n\n const keychainAdapter = createKeychainAdapter(keychainKeys, keychainInstance);\n if (keychainAdapter.isAvailable()) list.push(keychainAdapter);\n\n const secureStoreAdapter = createSecureStoreAdapter(\n secureStoreKeys,\n secureStoreInstance\n );\n if (secureStoreAdapter.isAvailable()) list.push(secureStoreAdapter);\n\n list.push(...customAdapters);\n return list;\n }, [\n mmkvInstances,\n asyncStorageInstance,\n keychainKeys,\n keychainInstance,\n secureStoreKeys,\n secureStoreInstance,\n customAdapters,\n ]);\n\n const handleKeychainKeyAdded = (key: string) => {\n setKeychainKeysAdded((prev: string[]) =>\n prev.includes(key) ? prev : [...prev, key]\n );\n };\n\n const handleSecureStoreKeyAdded = (key: string) => {\n setSecureStoreKeysAdded((prev: string[]) =>\n prev.includes(key) ? prev : [...prev, key]\n );\n };\n\n const handleRefresh = () => {\n setRefreshing(true);\n setRefreshKey((k: number) => k + 1);\n setTimeout(() => setRefreshing(false), 400);\n };\n\n return (\n <View style={styles.container}>\n <View style={styles.content}>\n {adapters.length > 0 ? (\n <>\n <ScrollView\n style={styles.scroll}\n contentContainerStyle={styles.scrollContent}\n keyboardShouldPersistTaps=\"handled\"\n showsVerticalScrollIndicator\n refreshControl={\n <RefreshControl refreshing={refreshing} onRefresh={handleRefresh} />\n }\n >\n {adapters.map((adapter: IStorageAdapter, index: number) => (\n <StorageSection\n key={`${adapter.type}-${index}`}\n adapter={adapter}\n keychainKeys={keychainKeysProp}\n onKeychainKeyAdded={handleKeychainKeyAdded}\n onSecureStoreKeyAdded={handleSecureStoreKeyAdded}\n expanded={expandedIndices.has(index)}\n onToggleExpanded={() => {\n setExpandedIndices((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n }}\n refreshTrigger={refreshKey}\n />\n ))}\n </ScrollView>\n\n <IconButton\n name=\"refresh\"\n onPress={handleRefresh}\n size={24}\n tintColor={theme.colors.inverted}\n style={styles.fab}\n activeOpacity={0.85}\n />\n </>\n ) : (\n <View style={styles.empty}>\n <Text style={styles.emptyText}>{strings.noAdapterAvailable}</Text>\n </View>\n )}\n </View>\n </View>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/mmkv.ts","../src/adapters/async-storage.ts","../src/adapters/keychain.ts","../src/adapters/secure-store.ts","../src/hooks/useStorageItems.ts","../src/theme.ts","../src/components/Icon.tsx","../src/constants.ts","../src/components/styles.ts","../src/components/IconButton.tsx","../src/strings.ts","../src/components/ItemForm.tsx","../src/components/ConfirmModal.tsx","../src/components/ItemRowActions.tsx","../src/components/StorageSection.tsx","../src/components/StorageInspector.tsx"],"names":["creds","result","useState","useCallback","useEffect","React","Text","StyleSheet","Dimensions","styles","TouchableOpacity","Modal","View","TextInput","Share","useMemo","ScrollView","RefreshControl"],"mappings":"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","file":"index.js","sourcesContent":["import type { IStorageAdapter } from '@/adapters/types';\n\ntype MMKVInstance = {\n getAllKeys(): string[];\n getString(key: string): string | undefined;\n set(key: string, value: string | number | boolean): void;\n delete(key: string): void;\n};\n\nexport function createMMKVAdapter(\n instance: MMKVInstance,\n name?: string\n): IStorageAdapter {\n return {\n type: 'mmkv',\n name: name ?? 'MMKV',\n getAllKeys(): Promise<string[]> {\n return Promise.resolve(instance.getAllKeys());\n },\n getItem(key: string): Promise<string | null> {\n const value = instance.getString(key);\n return Promise.resolve(value ?? null);\n },\n setItem(key: string, value: string): Promise<void> {\n instance.set(key, value);\n return Promise.resolve();\n },\n removeItem(key: string): Promise<void> {\n instance.delete(key);\n return Promise.resolve();\n },\n isAvailable(): boolean {\n return true;\n },\n };\n}\n\nexport function isMMKVAvailable(): boolean {\n try {\n require('react-native-mmkv');\n return true;\n } catch {\n return false;\n }\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * AsyncStorage-compatible module interface.\n * Pass your AsyncStorage instance to avoid Metro \"unknown module\" errors in Expo:\n * @example\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * createAsyncStorageAdapter(AsyncStorage)\n */\nexport type AsyncStorageModule = {\n getAllKeys(): Promise<string[]>;\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\nlet asyncStorage: AsyncStorageModule | null = null;\n\nfunction getAsyncStorageFromRequire(): AsyncStorageModule | null {\n try {\n const mod = require('@react-native-async-storage/async-storage') as\n | { default: AsyncStorageModule }\n | AsyncStorageModule;\n return (\n (mod as { default?: AsyncStorageModule }).default ?? (mod as AsyncStorageModule)\n );\n } catch {\n return null;\n }\n}\n\n/**\n * Creates an AsyncStorage adapter. Pass the AsyncStorage instance for reliable\n * bundling in Expo/Metro (avoids \"unknown module\" errors):\n *\n * @example\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * createAsyncStorageAdapter(AsyncStorage)\n */\nexport function createAsyncStorageAdapter(\n instance?: AsyncStorageModule | null\n): IStorageAdapter {\n const getStorage = () => instance ?? (asyncStorage ??= getAsyncStorageFromRequire());\n return {\n type: 'async-storage',\n name: 'Async Storage',\n async getAllKeys(): Promise<string[]> {\n const storage = getStorage();\n if (!storage) return [];\n return storage.getAllKeys();\n },\n async getItem(key: string): Promise<string | null> {\n const storage = getStorage();\n if (!storage) return null;\n return storage.getItem(key);\n },\n async setItem(key: string, value: string): Promise<void> {\n const storage = getStorage();\n if (!storage) throw new Error('AsyncStorage is not available');\n await storage.setItem(key, value);\n },\n async removeItem(key: string): Promise<void> {\n const storage = getStorage();\n if (!storage) throw new Error('AsyncStorage is not available');\n await storage.removeItem(key);\n },\n isAvailable(): boolean {\n return getStorage() !== null;\n },\n };\n}\n\nexport function isAsyncStorageAvailable(instance?: AsyncStorageModule | null): boolean {\n return (instance ?? getAsyncStorageFromRequire()) !== null;\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * Keychain-compatible module. Pass your keychain instance to avoid Metro\n * \"unknown module\" errors in Expo.\n */\nexport type KeychainModule = {\n getAllGenericPasswordServices?(options?: object): Promise<string[]>;\n getGenericPassword?(options?: {\n service?: string;\n }): Promise<{ password: string } | false>;\n setGenericPassword?(\n username: string,\n password: string,\n options?: { service?: string }\n ): Promise<{ storage: string } | false>;\n resetGenericPassword?(options?: { service?: string }): Promise<void>;\n setInternetCredentials(\n server: string,\n username: string,\n password: string\n ): Promise<{ storage: string } | false>;\n getInternetCredentials(server: string): Promise<{\n username: string;\n password: string;\n } | null>;\n resetInternetCredentials(server: string): Promise<void>;\n};\n\nlet keychain: KeychainModule | null = null;\n\nfunction getKeychainFromRequire(): KeychainModule | null {\n try {\n return require('react-native-keychain') as KeychainModule;\n } catch {\n return null;\n }\n}\n\n/**\n * Keychain adapter. Pass the keychain instance for reliable bundling in Expo:\n * @example import * as Keychain from 'react-native-keychain';\n * createKeychainAdapter([], Keychain)\n */\nexport function createKeychainAdapter(\n knownKeys: string[] = [],\n instance?: KeychainModule | null\n): IStorageAdapter {\n const getKc = () => instance ?? (keychain ??= getKeychainFromRequire());\n return {\n type: 'keychain',\n name: 'Keychain',\n async getAllKeys(): Promise<string[]> {\n const kc = getKc();\n if (!kc) return [...knownKeys];\n\n const genericServices: string[] = [];\n if (typeof kc.getAllGenericPasswordServices === 'function') {\n try {\n const services = await kc.getAllGenericPasswordServices();\n if (Array.isArray(services)) genericServices.push(...services);\n } catch {\n // Ignore – fall back to knownKeys\n }\n }\n\n const merged = new Set([...genericServices, ...knownKeys]);\n return Array.from(merged);\n },\n async getItem(key: string): Promise<string | null> {\n const kc = getKc();\n if (!kc) return null;\n\n if (typeof kc.getGenericPassword === 'function') {\n try {\n const creds = await kc.getGenericPassword({ service: key });\n if (creds && typeof creds === 'object' && 'password' in creds) {\n return creds.password;\n }\n } catch {\n // Fall through to internet credentials\n }\n }\n\n const creds = await kc.getInternetCredentials(key);\n return creds?.password ?? null;\n },\n async setItem(key: string, value: string): Promise<void> {\n const kc = getKc();\n if (!kc) throw new Error('react-native-keychain is not available');\n\n if (typeof kc.setGenericPassword === 'function') {\n const result = await kc.setGenericPassword(key, value, { service: key });\n if (result === false) throw new Error('Keychain set failed');\n return;\n }\n\n const result = await kc.setInternetCredentials(key, key, value);\n if (result === false) throw new Error('Keychain set failed');\n },\n async removeItem(key: string): Promise<void> {\n const kc = getKc();\n if (!kc) throw new Error('react-native-keychain is not available');\n\n if (typeof kc.resetGenericPassword === 'function') {\n await kc.resetGenericPassword({ service: key });\n }\n await kc.resetInternetCredentials(key);\n },\n isAvailable(): boolean {\n return getKc() !== null;\n },\n };\n}\n\nexport function isKeychainAvailable(instance?: KeychainModule | null): boolean {\n return (instance ?? getKeychainFromRequire()) !== null;\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * expo-secure-store compatible module. Pass the module to avoid Metro\n * \"unknown module\" errors in Expo.\n */\nexport type SecureStoreModule = {\n getItemAsync(key: string): Promise<string | null>;\n setItemAsync(key: string, value: string): Promise<void>;\n deleteItemAsync(key: string): Promise<void>;\n};\n\nlet secureStore: SecureStoreModule | null = null;\n\nfunction getSecureStoreFromRequire(): SecureStoreModule | null {\n try {\n return require('expo-secure-store') as SecureStoreModule;\n } catch {\n return null;\n }\n}\n\n/**\n * expo-secure-store has no API to list all keys. Pass knownKeys to inspect\n * those entries. Pass the module for reliable bundling in Expo:\n * @example import * as SecureStore from 'expo-secure-store';\n * createSecureStoreAdapter([], SecureStore)\n */\nexport function createSecureStoreAdapter(\n knownKeys: string[] = [],\n instance?: SecureStoreModule | null\n): IStorageAdapter {\n const getStore = () => instance ?? (secureStore ??= getSecureStoreFromRequire());\n return {\n type: 'expo-secure-store',\n name: 'Secure Store',\n async getAllKeys(): Promise<string[]> {\n return [...knownKeys];\n },\n async getItem(key: string): Promise<string | null> {\n const store = getStore();\n if (!store) return null;\n return store.getItemAsync(key);\n },\n async setItem(key: string, value: string): Promise<void> {\n const store = getStore();\n if (!store) throw new Error('expo-secure-store is not available');\n await store.setItemAsync(key, value);\n },\n async removeItem(key: string): Promise<void> {\n const store = getStore();\n if (!store) throw new Error('expo-secure-store is not available');\n await store.deleteItemAsync(key);\n },\n isAvailable(): boolean {\n return getStore() !== null;\n },\n };\n}\n\nexport function isSecureStoreAvailable(instance?: SecureStoreModule | null): boolean {\n return (instance ?? getSecureStoreFromRequire()) !== null;\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport type { StorageItem } from '@/adapters/types';\n\nexport function useStorageItems(adapter: IStorageAdapter | null): {\n items: StorageItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n} {\n const [items, setItems] = useState<StorageItem[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(async () => {\n if (!adapter || !adapter.isAvailable()) {\n setItems([]);\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const keys = await adapter.getAllKeys();\n const pairs: StorageItem[] = [];\n for (const key of keys) {\n const value = await adapter.getItem(key);\n pairs.push({ key, value: value ?? '' });\n }\n setItems(pairs);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to load items');\n setItems([]);\n } finally {\n setLoading(false);\n }\n }, [adapter]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return { items, loading, error, refresh };\n}\n","/**\n * Theme: minimalistic black and white palette.\n * All colors centralized here - no direct hex values in components.\n */\nexport const theme = {\n colors: {\n background: '#ffffff',\n backgroundSecondary: '#f5f5f5',\n backgroundTertiary: '#eeeeee',\n border: '#e0e0e0',\n borderLight: '#ebebeb',\n text: '#000000',\n textSecondary: '#666666',\n textMuted: '#999999',\n inverted: '#ffffff',\n },\n} as const;\n\nexport type Theme = typeof theme;\n","import React from 'react';\nimport { Text, StyleSheet, TextStyle } from 'react-native';\nimport { theme } from '@/theme';\n\nconst GLYPHS: Record<string, string> = {\n chevronBack: '‹',\n refresh: '↻',\n plus: '+',\n chevronDown: '›',\n chevronUp: '›',\n chevronRight: '›',\n close: '×',\n copy: '⎘',\n edit: '✎',\n trash: '⌫',\n};\n\nconst ROTATION: Partial<Record<string, string>> = {\n chevronDown: '90deg',\n chevronUp: '-90deg',\n};\n\nexport type IconName = keyof typeof GLYPHS;\n\nexport interface IconProps {\n name: IconName;\n size?: number;\n tintColor?: string;\n iconStyle?: TextStyle;\n}\n\nexport function Icon({\n name,\n size = 20,\n tintColor = theme.colors.text,\n iconStyle,\n}: IconProps) {\n const glyph = GLYPHS[name] ?? '?';\n const rotation = ROTATION[name];\n\n return (\n <Text\n style={[\n styles.icon,\n { fontSize: size, color: tintColor, lineHeight: size },\n ...(rotation ? [{ transform: [{ rotate: rotation }] }] : []),\n iconStyle,\n ]}\n >\n {glyph}\n </Text>\n );\n}\n\nconst styles = StyleSheet.create({\n icon: {\n alignSelf: 'center',\n fontWeight: '300',\n },\n});\n","import { Dimensions } from 'react-native';\n\nconst { width: SCREEN_WIDTH } = Dimensions.get('window');\n\nexport const LAYOUT = {\n padding: 16,\n fontSize: 14,\n headerHeight: 52,\n rowMinHeight: 48,\n sectionHeaderHeight: 48,\n iconSize: 20,\n chevronSize: 24,\n iconGap: 2,\n iconButtonSize: 36,\n hitSlop: { top: 8, bottom: 8, left: 8, right: 8 },\n hitSlopLarge: { top: 10, bottom: 10, left: 10, right: 10 },\n fabSize: 52,\n modalRadius: 16,\n sectionRadius: 4,\n screenWidth: SCREEN_WIDTH,\n} as const;\n","import { StyleSheet } from 'react-native';\nimport { theme } from '@/theme';\nimport { LAYOUT } from '@/constants';\n\nconst { colors } = theme;\n\nexport const styles = StyleSheet.create({\n container: {\n flex: 1,\n width: '100%',\n backgroundColor: colors.background,\n },\n content: {\n flex: 1,\n },\n scroll: {\n flex: 1,\n },\n header: {\n height: LAYOUT.headerHeight,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: LAYOUT.padding,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.border,\n backgroundColor: colors.background,\n },\n headerLeft: {\n minWidth: 44,\n alignItems: 'flex-start',\n },\n headerCenter: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n headerRight: {\n minWidth: 44,\n alignItems: 'flex-end',\n },\n sectionHeaderLabelWrap: {\n flex: 1,\n },\n headerTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: colors.text,\n },\n headerButton: {\n width: 44,\n height: 44,\n alignItems: 'center',\n justifyContent: 'center',\n },\n scrollContent: {\n flexGrow: 1,\n paddingBottom: LAYOUT.fabSize + LAYOUT.padding + 20,\n paddingTop: LAYOUT.padding,\n },\n sectionHeader: {\n height: LAYOUT.sectionHeaderHeight,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: LAYOUT.padding,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.border,\n backgroundColor: colors.backgroundSecondary,\n marginTop: LAYOUT.padding,\n marginHorizontal: LAYOUT.padding,\n borderRadius: LAYOUT.sectionRadius,\n },\n sectionHeaderLabel: {\n fontSize: 15,\n fontWeight: '600',\n color: colors.text,\n },\n sectionHeaderCount: {\n color: colors.textSecondary,\n fontWeight: '400',\n },\n storageRowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: LAYOUT.iconGap,\n },\n iconButton: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\n },\n iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\n },\n itemRow: {\n minHeight: LAYOUT.rowMinHeight,\n paddingHorizontal: LAYOUT.padding,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.borderLight,\n backgroundColor: colors.background,\n marginHorizontal: LAYOUT.padding,\n marginBottom: 4,\n },\n itemRowCollapsed: {\n flexDirection: 'row',\n alignItems: 'center',\n alignSelf: 'stretch',\n },\n itemKey: {\n flex: 1,\n fontSize: LAYOUT.fontSize,\n fontWeight: '500',\n color: colors.text,\n },\n itemChars: {\n fontSize: 12,\n color: colors.textSecondary,\n marginTop: 2,\n },\n itemRowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n marginLeft: LAYOUT.iconGap,\n gap: LAYOUT.iconGap,\n },\n itemRowExpanded: {\n paddingTop: 4,\n },\n valueBox: {\n backgroundColor: colors.backgroundSecondary,\n borderRadius: 8,\n padding: 12,\n marginTop: 8,\n marginBottom: 8,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: colors.border,\n },\n valueBoxLabel: {\n fontSize: 11,\n fontWeight: '600',\n color: colors.textSecondary,\n marginBottom: 4,\n textTransform: 'uppercase',\n },\n valueBoxText: {\n fontSize: LAYOUT.fontSize,\n color: colors.text,\n },\n empty: {\n padding: LAYOUT.padding * 2,\n alignItems: 'center',\n marginHorizontal: LAYOUT.padding,\n },\n emptyText: {\n fontSize: LAYOUT.fontSize,\n color: colors.textMuted,\n },\n loading: {\n padding: LAYOUT.padding * 2,\n alignItems: 'center',\n marginHorizontal: LAYOUT.padding,\n },\n loadingText: {\n fontSize: LAYOUT.fontSize,\n color: colors.textSecondary,\n },\n error: {\n padding: LAYOUT.padding,\n backgroundColor: colors.backgroundTertiary,\n marginHorizontal: LAYOUT.padding,\n marginVertical: 8,\n borderRadius: 8,\n },\n errorText: {\n fontSize: LAYOUT.fontSize,\n color: colors.text,\n },\n keychainHint: {\n padding: LAYOUT.padding,\n marginHorizontal: LAYOUT.padding,\n marginTop: 8,\n marginBottom: 4,\n backgroundColor: colors.backgroundSecondary,\n borderRadius: 8,\n },\n keychainHintText: {\n fontSize: LAYOUT.fontSize - 1,\n color: colors.textSecondary,\n },\n list: {\n flex: 1,\n },\n listContent: {\n flexGrow: 1,\n paddingBottom: LAYOUT.fabSize + LAYOUT.padding + 20,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n minHeight: LAYOUT.rowMinHeight,\n paddingHorizontal: LAYOUT.padding,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.borderLight,\n backgroundColor: colors.background,\n marginHorizontal: LAYOUT.padding,\n },\n rowKey: {\n flex: 1,\n fontSize: LAYOUT.fontSize,\n fontWeight: '500',\n color: colors.text,\n },\n rowValue: {\n fontSize: LAYOUT.fontSize - 1,\n color: colors.textSecondary,\n },\n rowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n marginLeft: LAYOUT.iconGap,\n gap: LAYOUT.iconGap,\n },\n rowButton: {\n paddingVertical: 8,\n paddingHorizontal: 12,\n },\n rowButtonText: {\n fontSize: 14,\n fontWeight: '600',\n color: colors.text,\n },\n rowButtonDanger: {\n color: colors.text,\n },\n addButton: {\n position: 'absolute',\n bottom: LAYOUT.padding + 16,\n right: LAYOUT.padding + 16,\n width: LAYOUT.fabSize,\n height: LAYOUT.fabSize,\n borderRadius: LAYOUT.fabSize / 2,\n backgroundColor: colors.text,\n alignItems: 'center',\n justifyContent: 'center',\n },\n addButtonText: {\n fontSize: 16,\n fontWeight: '600',\n color: colors.inverted,\n },\n fab: {\n position: 'absolute',\n bottom: LAYOUT.padding + 16,\n right: LAYOUT.padding + 16,\n width: LAYOUT.fabSize,\n height: LAYOUT.fabSize,\n borderRadius: LAYOUT.fabSize / 2,\n backgroundColor: colors.text,\n alignItems: 'center',\n justifyContent: 'center',\n },\n formOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'flex-end',\n alignItems: 'center',\n },\n formModal: {\n width: '100%',\n maxWidth: LAYOUT.screenWidth,\n backgroundColor: colors.background,\n borderTopLeftRadius: LAYOUT.modalRadius,\n borderTopRightRadius: LAYOUT.modalRadius,\n padding: LAYOUT.padding,\n paddingBottom: LAYOUT.padding + 34,\n },\n formHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: LAYOUT.padding,\n },\n formTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: colors.text,\n flex: 1,\n },\n formCloseButton: {\n width: 44,\n height: 44,\n alignItems: 'flex-end',\n justifyContent: 'center',\n },\n formStorageType: {\n fontSize: 13,\n color: colors.textSecondary,\n marginBottom: 12,\n },\n formLabel: {\n fontSize: 12,\n fontWeight: '600',\n color: colors.textSecondary,\n marginBottom: 6,\n },\n formInput: {\n borderWidth: 1,\n borderColor: colors.border,\n borderRadius: 10,\n padding: 12,\n fontSize: LAYOUT.fontSize,\n marginBottom: LAYOUT.padding,\n color: colors.text,\n backgroundColor: colors.background,\n },\n formInputDisabled: {\n backgroundColor: colors.backgroundSecondary,\n color: colors.textSecondary,\n },\n formActions: {\n flexDirection: 'row',\n justifyContent: 'flex-end',\n gap: 12,\n marginTop: 8,\n },\n formButton: {\n paddingVertical: 12,\n paddingHorizontal: 20,\n borderRadius: 10,\n minWidth: 100,\n alignItems: 'center',\n },\n formButtonCancel: {\n backgroundColor: 'transparent',\n borderWidth: 1,\n borderColor: colors.text,\n },\n formButtonSubmit: {\n backgroundColor: colors.text,\n },\n formButtonText: {\n fontSize: 16,\n fontWeight: '600',\n },\n formButtonTextCancel: {\n color: colors.text,\n },\n formButtonTextSubmit: {\n color: colors.inverted,\n },\n confirmOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'flex-end',\n alignItems: 'center',\n },\n confirmModal: {\n width: '100%',\n maxWidth: LAYOUT.screenWidth,\n backgroundColor: colors.background,\n borderTopLeftRadius: LAYOUT.modalRadius,\n borderTopRightRadius: LAYOUT.modalRadius,\n padding: LAYOUT.padding,\n paddingBottom: LAYOUT.padding + 34,\n },\n confirmHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 12,\n },\n confirmTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: colors.text,\n flex: 1,\n },\n confirmMessage: {\n fontSize: 15,\n color: colors.textSecondary,\n lineHeight: 22,\n marginBottom: 20,\n },\n confirmActions: {\n flexDirection: 'row',\n gap: 12,\n },\n confirmButton: {\n flex: 1,\n paddingVertical: 14,\n borderRadius: 10,\n alignItems: 'center',\n },\n confirmButtonSecondary: {\n backgroundColor: 'transparent',\n borderWidth: 1,\n borderColor: colors.text,\n },\n confirmButtonDanger: {\n backgroundColor: colors.text,\n },\n confirmButtonText: {\n fontSize: 16,\n fontWeight: '600',\n },\n confirmButtonTextSecondary: {\n color: colors.text,\n },\n confirmButtonTextDanger: {\n color: colors.inverted,\n },\n});\n","import React from 'react';\nimport { TouchableOpacity, StyleSheet, ViewStyle } from 'react-native';\nimport type { IconName } from '@/components/Icon';\nimport { Icon } from '@/components/Icon';\nimport { theme } from '@/theme';\nimport { LAYOUT } from '@/constants';\nimport { styles as sharedStyles } from '@/components/styles';\n\nexport interface IconButtonProps {\n name: IconName;\n onPress: () => void;\n size?: number;\n tintColor?: string;\n disabled?: boolean;\n hitSlop?: { top: number; bottom: number; left: number; right: number };\n style?: ViewStyle;\n activeOpacity?: number;\n}\n\nexport function IconButton({\n name,\n onPress,\n size = LAYOUT.iconSize,\n tintColor = theme.colors.text,\n disabled = false,\n hitSlop = LAYOUT.hitSlop,\n style,\n activeOpacity = 0.6,\n}: IconButtonProps) {\n return (\n <TouchableOpacity\n style={[sharedStyles.iconButton, style]}\n onPress={onPress}\n disabled={disabled}\n hitSlop={hitSlop}\n activeOpacity={activeOpacity}\n >\n <Icon\n name={name}\n size={size}\n tintColor={disabled ? theme.colors.textMuted : tintColor}\n />\n </TouchableOpacity>\n );\n}\n","/**\n * Centralized user-facing text for the storage inspector.\n * Enables localization and consistent messaging.\n */\nexport const strings = {\n // StorageInspector\n noAdapterAvailable:\n 'No storage adapter available. Install at least one of: react-native-mmkv, @react-native-async-storage/async-storage, react-native-keychain, expo-secure-store',\n\n // StorageSection\n keychainHint:\n 'No generic password items yet. Add a key using + above, or pass keychainKeys for internet credentials.',\n secureStoreHint:\n 'Secure Store has no list API. Pass secureStoreKeys prop with known keys, or add a key using + above.',\n loading: 'Loading…',\n noItems: 'No items',\n valueLabel: 'Value',\n emptyValue: '(empty)',\n charCount: (n: number) => (n === 1 ? '1 char' : `${n} chars`),\n deleteItemTitle: (key: string) => `Delete ${key}?`,\n deleteItemMessage: (key: string) =>\n `This will permanently delete the ${key} storage item. Do you wish to continue?`,\n clearAllTitle: (name: string) => `Clear All ${name}?`,\n clearAllMessage: (count: number, name: string) =>\n `This will permanently delete all ${count} ${name} items. Do you wish to continue?`,\n\n // StorageList\n storageNotAvailable: 'This storage is not available.',\n keychainHintShort:\n 'No items yet. Add a key below, or pass keychainKeys for internet credentials.',\n edit: 'Edit',\n delete: 'Delete',\n addItem: 'Add item',\n\n // ItemForm\n keyRequired: 'Key is required',\n saveFailed: 'Save failed',\n editItemTitle: (key: string) => `Edit ${key}`,\n addItemTitle: (storageName: string) => `Add ${storageName} Item`,\n storageTypeLabel: (name: string) => `Storage Type: ${name}`,\n keyLabel: 'Key',\n enterKeyPlaceholder: 'Enter key',\n enterValuePlaceholder: 'Enter value',\n cancel: 'Cancel',\n saving: 'Saving…',\n save: 'Save',\n add: 'Add',\n\n // ConfirmModal defaults\n confirmDelete: 'Yes, delete',\n cancelKeep: 'No, keep it',\n} as const;\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, TextInput, TouchableOpacity, Modal } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { LAYOUT } from '@/constants';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\n\nexport interface ItemFormProps {\n visible: boolean;\n storageName: string;\n editingItem: StorageItem | null;\n onSave: (key: string, value: string) => Promise<void>;\n onCancel: () => void;\n}\n\nexport function ItemForm({\n visible,\n storageName,\n editingItem,\n onSave,\n onCancel,\n}: ItemFormProps) {\n const [key, setKey] = useState('');\n const [value, setValue] = useState('');\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const isEdit = editingItem !== null;\n\n useEffect(() => {\n if (visible) {\n setKey(editingItem?.key ?? '');\n setValue(editingItem?.value ?? '');\n setError(null);\n }\n }, [visible, editingItem]);\n\n const handleSubmit = async () => {\n const k = key.trim();\n if (!k) {\n setError(strings.keyRequired);\n return;\n }\n setSaving(true);\n setError(null);\n try {\n await onSave(k, value);\n onCancel();\n } catch (e) {\n setError(e instanceof Error ? e.message : strings.saveFailed);\n } finally {\n setSaving(false);\n }\n };\n\n const title = isEdit\n ? strings.editItemTitle(editingItem?.key ?? '')\n : strings.addItemTitle(storageName);\n\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onCancel}>\n <View style={styles.formOverlay}>\n <TouchableOpacity\n style={{ flex: 1, width: '100%' }}\n activeOpacity={1}\n onPress={onCancel}\n />\n <View style={styles.formModal}>\n <View style={styles.formHeader}>\n <Text style={styles.formTitle} numberOfLines={1}>\n {title}\n </Text>\n <IconButton\n name=\"close\"\n onPress={onCancel}\n size={24}\n tintColor={theme.colors.textSecondary}\n style={styles.formCloseButton}\n hitSlop={LAYOUT.hitSlopLarge}\n />\n </View>\n <Text style={styles.formStorageType}>\n {strings.storageTypeLabel(storageName)}\n </Text>\n <Text style={styles.formLabel}>{strings.keyLabel}</Text>\n <TextInput\n style={[styles.formInput, isEdit && styles.formInputDisabled]}\n value={key}\n onChangeText={setKey}\n placeholder={strings.enterKeyPlaceholder}\n placeholderTextColor={theme.colors.textMuted}\n editable={!isEdit}\n autoCapitalize=\"none\"\n multiline\n />\n <Text style={styles.formLabel}>{strings.valueLabel}</Text>\n <TextInput\n style={styles.formInput}\n value={value}\n onChangeText={setValue}\n placeholder={strings.enterValuePlaceholder}\n placeholderTextColor={theme.colors.textMuted}\n multiline\n numberOfLines={3}\n />\n {error ? (\n <Text style={[styles.errorText, { marginBottom: 12 }]}>{error}</Text>\n ) : null}\n <View style={styles.formActions}>\n <TouchableOpacity\n style={[styles.formButton, styles.formButtonCancel]}\n onPress={onCancel}\n disabled={saving}\n >\n <Text style={[styles.formButtonText, styles.formButtonTextCancel]}>\n {strings.cancel}\n </Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[styles.formButton, styles.formButtonSubmit]}\n onPress={handleSubmit}\n disabled={saving}\n >\n <Text style={[styles.formButtonText, styles.formButtonTextSubmit]}>\n {saving ? strings.saving : isEdit ? strings.save : strings.add}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </Modal>\n );\n}\n","import React from 'react';\nimport { View, Text, Modal, TouchableOpacity } from 'react-native';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { LAYOUT } from '@/constants';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\n\nexport interface ConfirmModalProps {\n visible: boolean;\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n danger?: boolean;\n onConfirm: () => void | Promise<void>;\n onCancel: () => void;\n}\n\nexport function ConfirmModal({\n visible,\n title,\n message,\n confirmLabel = strings.confirmDelete,\n cancelLabel = strings.cancelKeep,\n danger = true,\n onConfirm,\n onCancel,\n}: ConfirmModalProps) {\n const handleConfirm = () => {\n void Promise.resolve(onConfirm());\n };\n\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onCancel}>\n <View style={styles.confirmOverlay}>\n <TouchableOpacity\n style={{ flex: 1, width: '100%' }}\n activeOpacity={1}\n onPress={onCancel}\n />\n <View style={styles.confirmModal}>\n <View style={styles.confirmHeader}>\n <Text style={styles.confirmTitle}>{title}</Text>\n <IconButton\n name=\"close\"\n onPress={onCancel}\n size={24}\n tintColor={theme.colors.textSecondary}\n style={styles.formCloseButton}\n hitSlop={LAYOUT.hitSlopLarge}\n />\n </View>\n <Text style={styles.confirmMessage}>{message}</Text>\n <View style={styles.confirmActions}>\n <TouchableOpacity\n style={[styles.confirmButton, styles.confirmButtonSecondary]}\n onPress={onCancel}\n >\n <Text style={[styles.confirmButtonText, styles.confirmButtonTextSecondary]}>\n {cancelLabel}\n </Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[\n styles.confirmButton,\n danger ? styles.confirmButtonDanger : styles.formButtonSubmit,\n ]}\n onPress={handleConfirm}\n >\n <Text\n style={[\n styles.confirmButtonText,\n danger ? styles.confirmButtonTextDanger : styles.formButtonTextSubmit,\n ]}\n >\n {confirmLabel}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </Modal>\n );\n}\n","import React from 'react';\nimport { View } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { theme } from '@/theme';\nimport { LAYOUT } from '@/constants';\n\nexport interface ItemRowActionsProps {\n item: StorageItem;\n onCopy: (item: StorageItem) => void;\n onEdit: (item: StorageItem) => void;\n onDelete: (item: StorageItem) => void;\n showChevron?: boolean;\n chevronDirection?: 'up' | 'down';\n}\n\nexport function ItemRowActions({\n item,\n onCopy,\n onEdit,\n onDelete,\n showChevron = false,\n chevronDirection = 'down',\n}: ItemRowActionsProps) {\n return (\n <View style={styles.itemRowActions}>\n <IconButton name=\"copy\" onPress={() => onCopy(item)} />\n <IconButton name=\"edit\" onPress={() => onEdit(item)} />\n <IconButton name=\"trash\" onPress={() => onDelete(item)} />\n {showChevron && (\n <View style={styles.iconSlot}>\n <Icon\n name={chevronDirection === 'up' ? 'chevronUp' : 'chevronDown'}\n size={LAYOUT.chevronSize}\n tintColor={theme.colors.text}\n />\n </View>\n )}\n </View>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, TouchableOpacity, Share } from 'react-native';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport type { StorageItem } from '@/adapters/types';\nimport { useStorageItems } from '@/hooks/useStorageItems';\nimport { ItemForm } from '@/components/ItemForm';\nimport { ConfirmModal } from '@/components/ConfirmModal';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\nimport { ItemRowActions } from '@/components/ItemRowActions';\nimport { styles } from '@/components/styles';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageSectionProps {\n key?: React.Key;\n adapter: IStorageAdapter;\n keychainKeys?: string[];\n onKeychainKeyAdded?: (key: string) => void;\n onSecureStoreKeyAdded?: (key: string) => void;\n defaultExpanded?: boolean;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n refreshTrigger?: number;\n}\n\nexport function StorageSection({\n adapter,\n keychainKeys,\n onKeychainKeyAdded,\n onSecureStoreKeyAdded,\n defaultExpanded = true,\n expanded: expandedProp,\n onToggleExpanded,\n refreshTrigger,\n}: StorageSectionProps) {\n const { items, loading, error, refresh } = useStorageItems(adapter);\n const [expandedInternal, setExpandedInternal] = useState(defaultExpanded);\n const expanded = expandedProp !== undefined ? expandedProp : expandedInternal;\n\n const handleToggleExpanded = () => {\n if (onToggleExpanded) onToggleExpanded();\n else setExpandedInternal((p: boolean) => !p);\n };\n\n useEffect(() => {\n if (refreshTrigger !== undefined) refresh();\n }, [refreshTrigger, refresh]);\n\n const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());\n const [formVisible, setFormVisible] = useState(false);\n const [editingItem, setEditingItem] = useState<StorageItem | null>(null);\n const [deleteItem, setDeleteItem] = useState<StorageItem | null>(null);\n const [clearAllVisible, setClearAllVisible] = useState(false);\n\n const handleAdd = () => {\n setEditingItem(null);\n setFormVisible(true);\n };\n\n const handleEdit = (item: StorageItem) => {\n setEditingItem(item);\n setFormVisible(true);\n };\n\n const handleSave = async (key: string, value: string) => {\n const isNewKey = !editingItem || editingItem.key !== key;\n await adapter.setItem(key, value);\n if (adapter.type === 'keychain' && isNewKey) {\n onKeychainKeyAdded?.(key);\n }\n if (adapter.type === 'expo-secure-store' && isNewKey) {\n onSecureStoreKeyAdded?.(key);\n }\n await refresh();\n };\n\n const handleDeleteItem = async () => {\n if (deleteItem) {\n await adapter.removeItem(deleteItem.key);\n setDeleteItem(null);\n await refresh();\n }\n };\n\n const handleClearAll = async () => {\n for (const item of items) {\n await adapter.removeItem(item.key);\n }\n setClearAllVisible(false);\n await refresh();\n };\n\n const handleCopy = async (item: StorageItem) => {\n try {\n await Share.share({\n message: item.value,\n title: item.key,\n });\n } catch {\n // Share cancelled or not available\n }\n };\n\n const isKeychain = adapter.type === 'keychain';\n const isSecureStore = adapter.type === 'expo-secure-store';\n const showKeychainHint =\n isKeychain && items.length === 0 && (keychainKeys?.length ?? 0) === 0;\n const showSecureStoreHint = isSecureStore && items.length === 0;\n\n if (!adapter.isAvailable()) return null;\n\n return (\n <>\n <TouchableOpacity\n style={styles.sectionHeader}\n onPress={handleToggleExpanded}\n activeOpacity={0.7}\n >\n <View style={styles.sectionHeaderLabelWrap}>\n <Text style={styles.sectionHeaderLabel}>\n {adapter.name}\n <Text style={styles.sectionHeaderCount}> ({items.length})</Text>\n </Text>\n </View>\n <View style={styles.storageRowActions}>\n <IconButton name=\"plus\" onPress={handleAdd} />\n <IconButton\n name=\"trash\"\n onPress={() => items.length > 0 && setClearAllVisible(true)}\n disabled={items.length === 0}\n />\n <View style={styles.iconSlot}>\n <Icon\n name={expanded ? 'chevronUp' : 'chevronDown'}\n size={LAYOUT.chevronSize}\n tintColor={theme.colors.text}\n />\n </View>\n </View>\n </TouchableOpacity>\n\n {expanded && (\n <>\n {showKeychainHint ? (\n <View style={styles.keychainHint}>\n <Text style={styles.keychainHintText}>{strings.keychainHint}</Text>\n </View>\n ) : null}\n {showSecureStoreHint ? (\n <View style={styles.keychainHint}>\n <Text style={styles.keychainHintText}>{strings.secureStoreHint}</Text>\n </View>\n ) : null}\n {error ? (\n <View style={styles.error}>\n <Text style={styles.errorText}>{error}</Text>\n </View>\n ) : null}\n {loading ? (\n <View style={styles.loading}>\n <Text style={styles.loadingText}>{strings.loading}</Text>\n </View>\n ) : (\n items.map((item) => {\n const isItemExpanded = expandedKeys.has(item.key);\n const charCount = item.value.length;\n const toggleItemExpanded = () => {\n setExpandedKeys((prev: Set<string>) => {\n const next = new Set(prev);\n if (next.has(item.key)) next.delete(item.key);\n else next.add(item.key);\n return next;\n });\n };\n return (\n <View key={item.key} style={styles.itemRow}>\n <TouchableOpacity\n key={item.key}\n onPress={toggleItemExpanded}\n activeOpacity={0.7}\n >\n <View style={styles.itemRowCollapsed}>\n <View style={{ flex: 1 }}>\n <Text style={styles.itemKey} numberOfLines={1}>\n {item.key}\n </Text>\n <Text style={styles.itemChars}>\n {strings.charCount(charCount)}\n </Text>\n </View>\n {!isItemExpanded ? (\n <ItemRowActions\n item={item}\n onCopy={handleCopy}\n onEdit={handleEdit}\n onDelete={setDeleteItem}\n showChevron\n chevronDirection=\"down\"\n />\n ) : (\n <View style={styles.iconSlot}>\n <Icon\n name=\"chevronUp\"\n size={LAYOUT.chevronSize}\n tintColor={theme.colors.text}\n />\n </View>\n )}\n </View>\n </TouchableOpacity>\n {isItemExpanded && (\n <View style={styles.itemRowExpanded}>\n <TouchableOpacity\n onPress={() => handleEdit(item)}\n style={styles.valueBox}\n >\n <Text style={styles.valueBoxLabel}>{strings.valueLabel}</Text>\n <Text style={styles.valueBoxText} selectable>\n {item.value || strings.emptyValue}\n </Text>\n </TouchableOpacity>\n <ItemRowActions\n item={item}\n onCopy={handleCopy}\n onEdit={handleEdit}\n onDelete={setDeleteItem}\n />\n </View>\n )}\n </View>\n );\n })\n )}\n {!loading && items.length === 0 && !showKeychainHint && !showSecureStoreHint ? (\n <View style={styles.empty}>\n <Text style={styles.emptyText}>{strings.noItems}</Text>\n </View>\n ) : null}\n </>\n )}\n\n <ItemForm\n visible={formVisible}\n storageName={adapter.name}\n editingItem={editingItem}\n onSave={handleSave}\n onCancel={() => {\n setFormVisible(false);\n setEditingItem(null);\n }}\n />\n\n <ConfirmModal\n visible={deleteItem !== null}\n title={strings.deleteItemTitle(deleteItem?.key ?? '')}\n message={strings.deleteItemMessage(deleteItem?.key ?? '')}\n onConfirm={handleDeleteItem}\n onCancel={() => setDeleteItem(null)}\n />\n\n <ConfirmModal\n visible={clearAllVisible}\n title={strings.clearAllTitle(adapter.name)}\n message={strings.clearAllMessage(items.length, adapter.name)}\n onConfirm={handleClearAll}\n onCancel={() => setClearAllVisible(false)}\n />\n </>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport { View, Text, ScrollView, RefreshControl } from 'react-native';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport { createMMKVAdapter } from '@/adapters/mmkv';\nimport {\n createAsyncStorageAdapter,\n type AsyncStorageModule,\n} from '@/adapters/async-storage';\nimport { createKeychainAdapter, type KeychainModule } from '@/adapters/keychain';\nimport {\n createSecureStoreAdapter,\n type SecureStoreModule,\n} from '@/adapters/secure-store';\nimport { StorageSection } from '@/components/StorageSection';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\n\nexport interface StorageInspectorProps {\n mmkvInstances?: Array<{\n getAllKeys(): string[];\n getString(k: string): string | undefined;\n set(k: string, v: string | number | boolean): void;\n delete(k: string): void;\n }>;\n /** Pass AsyncStorage to avoid Metro \"unknown module\" in Expo. */\n asyncStorageInstance?: AsyncStorageModule | null;\n keychainKeys?: string[];\n /** Pass Keychain module to avoid Metro \"unknown module\" in Expo. */\n keychainInstance?: KeychainModule | null;\n secureStoreKeys?: string[];\n /** Pass SecureStore module to avoid Metro \"unknown module\" in Expo. */\n secureStoreInstance?: SecureStoreModule | null;\n customAdapters?: IStorageAdapter[];\n}\n\nexport function StorageInspector({\n mmkvInstances = [],\n asyncStorageInstance,\n keychainKeys: keychainKeysProp,\n keychainInstance,\n secureStoreKeys: secureStoreKeysProp,\n secureStoreInstance,\n customAdapters = [],\n}: StorageInspectorProps) {\n const [keychainKeysAdded, setKeychainKeysAdded] = useState<string[]>([]);\n const [secureStoreKeysAdded, setSecureStoreKeysAdded] = useState<string[]>([]);\n const [refreshKey, setRefreshKey] = useState(0);\n const [refreshing, setRefreshing] = useState(false);\n const [expandedIndices, setExpandedIndices] = useState<Set<number>>(() => new Set([0]));\n\n const keychainKeys = useMemo(\n () => [...(keychainKeysProp ?? []), ...keychainKeysAdded],\n [keychainKeysProp, keychainKeysAdded]\n );\n\n const secureStoreKeys = useMemo(\n () => [...(secureStoreKeysProp ?? []), ...secureStoreKeysAdded],\n [secureStoreKeysProp, secureStoreKeysAdded]\n );\n\n const adapters = useMemo(() => {\n const list: IStorageAdapter[] = [];\n\n mmkvInstances.forEach((inst, i) => {\n list.push(\n createMMKVAdapter(inst, mmkvInstances.length > 1 ? `MMKV ${i + 1}` : 'MMKV')\n );\n });\n\n const asyncAdapter = createAsyncStorageAdapter(asyncStorageInstance);\n if (asyncAdapter.isAvailable()) list.push(asyncAdapter);\n\n const keychainAdapter = createKeychainAdapter(keychainKeys, keychainInstance);\n if (keychainAdapter.isAvailable()) list.push(keychainAdapter);\n\n const secureStoreAdapter = createSecureStoreAdapter(\n secureStoreKeys,\n secureStoreInstance\n );\n if (secureStoreAdapter.isAvailable()) list.push(secureStoreAdapter);\n\n list.push(...customAdapters);\n return list;\n }, [\n mmkvInstances,\n asyncStorageInstance,\n keychainKeys,\n keychainInstance,\n secureStoreKeys,\n secureStoreInstance,\n customAdapters,\n ]);\n\n const handleKeychainKeyAdded = (key: string) => {\n setKeychainKeysAdded((prev: string[]) =>\n prev.includes(key) ? prev : [...prev, key]\n );\n };\n\n const handleSecureStoreKeyAdded = (key: string) => {\n setSecureStoreKeysAdded((prev: string[]) =>\n prev.includes(key) ? prev : [...prev, key]\n );\n };\n\n const handleRefresh = () => {\n setRefreshing(true);\n setRefreshKey((k: number) => k + 1);\n setTimeout(() => setRefreshing(false), 400);\n };\n\n return (\n <View style={styles.container}>\n <View style={styles.content}>\n {adapters.length > 0 ? (\n <>\n <ScrollView\n style={styles.scroll}\n contentContainerStyle={styles.scrollContent}\n keyboardShouldPersistTaps=\"handled\"\n showsVerticalScrollIndicator\n refreshControl={\n <RefreshControl refreshing={refreshing} onRefresh={handleRefresh} />\n }\n >\n {adapters.map((adapter: IStorageAdapter, index: number) => (\n <StorageSection\n key={`${adapter.type}-${index}`}\n adapter={adapter}\n keychainKeys={keychainKeysProp}\n onKeychainKeyAdded={handleKeychainKeyAdded}\n onSecureStoreKeyAdded={handleSecureStoreKeyAdded}\n expanded={expandedIndices.has(index)}\n onToggleExpanded={() => {\n setExpandedIndices((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n }}\n refreshTrigger={refreshKey}\n />\n ))}\n </ScrollView>\n\n <IconButton\n name=\"refresh\"\n onPress={handleRefresh}\n size={24}\n tintColor={theme.colors.inverted}\n style={styles.fab}\n activeOpacity={0.85}\n />\n </>\n ) : (\n <View style={styles.empty}>\n <Text style={styles.emptyText}>{strings.noAdapterAvailable}</Text>\n </View>\n )}\n </View>\n </View>\n );\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1054,11 +1054,10 @@ function StorageSection({
|
|
|
1054
1054
|
return next;
|
|
1055
1055
|
});
|
|
1056
1056
|
};
|
|
1057
|
-
return /* @__PURE__ */ React6.createElement(
|
|
1057
|
+
return /* @__PURE__ */ React6.createElement(View, { key: item.key, style: styles2.itemRow }, /* @__PURE__ */ React6.createElement(
|
|
1058
1058
|
TouchableOpacity,
|
|
1059
1059
|
{
|
|
1060
1060
|
key: item.key,
|
|
1061
|
-
style: styles2.itemRow,
|
|
1062
1061
|
onPress: toggleItemExpanded,
|
|
1063
1062
|
activeOpacity: 0.7
|
|
1064
1063
|
},
|
|
@@ -1079,17 +1078,24 @@ function StorageSection({
|
|
|
1079
1078
|
size: LAYOUT.chevronSize,
|
|
1080
1079
|
tintColor: theme.colors.text
|
|
1081
1080
|
}
|
|
1082
|
-
)))
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1081
|
+
)))
|
|
1082
|
+
), isItemExpanded && /* @__PURE__ */ React6.createElement(View, { style: styles2.itemRowExpanded }, /* @__PURE__ */ React6.createElement(
|
|
1083
|
+
TouchableOpacity,
|
|
1084
|
+
{
|
|
1085
|
+
onPress: () => handleEdit(item),
|
|
1086
|
+
style: styles2.valueBox
|
|
1087
|
+
},
|
|
1088
|
+
/* @__PURE__ */ React6.createElement(Text, { style: styles2.valueBoxLabel }, strings.valueLabel),
|
|
1089
|
+
/* @__PURE__ */ React6.createElement(Text, { style: styles2.valueBoxText, selectable: true }, item.value || strings.emptyValue)
|
|
1090
|
+
), /* @__PURE__ */ React6.createElement(
|
|
1091
|
+
ItemRowActions,
|
|
1092
|
+
{
|
|
1093
|
+
item,
|
|
1094
|
+
onCopy: handleCopy,
|
|
1095
|
+
onEdit: handleEdit,
|
|
1096
|
+
onDelete: setDeleteItem
|
|
1097
|
+
}
|
|
1098
|
+
)));
|
|
1093
1099
|
}), !loading && items.length === 0 && !showKeychainHint && !showSecureStoreHint ? /* @__PURE__ */ React6.createElement(View, { style: styles2.empty }, /* @__PURE__ */ React6.createElement(Text, { style: styles2.emptyText }, strings.noItems)) : null), /* @__PURE__ */ React6.createElement(
|
|
1094
1100
|
ItemForm,
|
|
1095
1101
|
{
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/mmkv.ts","../src/adapters/async-storage.ts","../src/adapters/keychain.ts","../src/adapters/secure-store.ts","../src/hooks/useStorageItems.ts","../src/theme.ts","../src/components/Icon.tsx","../src/constants.ts","../src/components/styles.ts","../src/components/IconButton.tsx","../src/strings.ts","../src/components/ItemForm.tsx","../src/components/ConfirmModal.tsx","../src/components/ItemRowActions.tsx","../src/components/StorageSection.tsx","../src/components/StorageInspector.tsx"],"names":["creds","result","React","styles","StyleSheet","useState","useEffect","TouchableOpacity","Text","Modal","View"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { IStorageAdapter } from '@/adapters/types';\n\ntype MMKVInstance = {\n getAllKeys(): string[];\n getString(key: string): string | undefined;\n set(key: string, value: string | number | boolean): void;\n delete(key: string): void;\n};\n\nexport function createMMKVAdapter(\n instance: MMKVInstance,\n name?: string\n): IStorageAdapter {\n return {\n type: 'mmkv',\n name: name ?? 'MMKV',\n getAllKeys(): Promise<string[]> {\n return Promise.resolve(instance.getAllKeys());\n },\n getItem(key: string): Promise<string | null> {\n const value = instance.getString(key);\n return Promise.resolve(value ?? null);\n },\n setItem(key: string, value: string): Promise<void> {\n instance.set(key, value);\n return Promise.resolve();\n },\n removeItem(key: string): Promise<void> {\n instance.delete(key);\n return Promise.resolve();\n },\n isAvailable(): boolean {\n return true;\n },\n };\n}\n\nexport function isMMKVAvailable(): boolean {\n try {\n require('react-native-mmkv');\n return true;\n } catch {\n return false;\n }\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * AsyncStorage-compatible module interface.\n * Pass your AsyncStorage instance to avoid Metro \"unknown module\" errors in Expo:\n * @example\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * createAsyncStorageAdapter(AsyncStorage)\n */\nexport type AsyncStorageModule = {\n getAllKeys(): Promise<string[]>;\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\nlet asyncStorage: AsyncStorageModule | null = null;\n\nfunction getAsyncStorageFromRequire(): AsyncStorageModule | null {\n try {\n const mod = require('@react-native-async-storage/async-storage') as\n | { default: AsyncStorageModule }\n | AsyncStorageModule;\n return (\n (mod as { default?: AsyncStorageModule }).default ?? (mod as AsyncStorageModule)\n );\n } catch {\n return null;\n }\n}\n\n/**\n * Creates an AsyncStorage adapter. Pass the AsyncStorage instance for reliable\n * bundling in Expo/Metro (avoids \"unknown module\" errors):\n *\n * @example\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * createAsyncStorageAdapter(AsyncStorage)\n */\nexport function createAsyncStorageAdapter(\n instance?: AsyncStorageModule | null\n): IStorageAdapter {\n const getStorage = () => instance ?? (asyncStorage ??= getAsyncStorageFromRequire());\n return {\n type: 'async-storage',\n name: 'Async Storage',\n async getAllKeys(): Promise<string[]> {\n const storage = getStorage();\n if (!storage) return [];\n return storage.getAllKeys();\n },\n async getItem(key: string): Promise<string | null> {\n const storage = getStorage();\n if (!storage) return null;\n return storage.getItem(key);\n },\n async setItem(key: string, value: string): Promise<void> {\n const storage = getStorage();\n if (!storage) throw new Error('AsyncStorage is not available');\n await storage.setItem(key, value);\n },\n async removeItem(key: string): Promise<void> {\n const storage = getStorage();\n if (!storage) throw new Error('AsyncStorage is not available');\n await storage.removeItem(key);\n },\n isAvailable(): boolean {\n return getStorage() !== null;\n },\n };\n}\n\nexport function isAsyncStorageAvailable(instance?: AsyncStorageModule | null): boolean {\n return (instance ?? getAsyncStorageFromRequire()) !== null;\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * Keychain-compatible module. Pass your keychain instance to avoid Metro\n * \"unknown module\" errors in Expo.\n */\nexport type KeychainModule = {\n getAllGenericPasswordServices?(options?: object): Promise<string[]>;\n getGenericPassword?(options?: {\n service?: string;\n }): Promise<{ password: string } | false>;\n setGenericPassword?(\n username: string,\n password: string,\n options?: { service?: string }\n ): Promise<{ storage: string } | false>;\n resetGenericPassword?(options?: { service?: string }): Promise<void>;\n setInternetCredentials(\n server: string,\n username: string,\n password: string\n ): Promise<{ storage: string } | false>;\n getInternetCredentials(server: string): Promise<{\n username: string;\n password: string;\n } | null>;\n resetInternetCredentials(server: string): Promise<void>;\n};\n\nlet keychain: KeychainModule | null = null;\n\nfunction getKeychainFromRequire(): KeychainModule | null {\n try {\n return require('react-native-keychain') as KeychainModule;\n } catch {\n return null;\n }\n}\n\n/**\n * Keychain adapter. Pass the keychain instance for reliable bundling in Expo:\n * @example import * as Keychain from 'react-native-keychain';\n * createKeychainAdapter([], Keychain)\n */\nexport function createKeychainAdapter(\n knownKeys: string[] = [],\n instance?: KeychainModule | null\n): IStorageAdapter {\n const getKc = () => instance ?? (keychain ??= getKeychainFromRequire());\n return {\n type: 'keychain',\n name: 'Keychain',\n async getAllKeys(): Promise<string[]> {\n const kc = getKc();\n if (!kc) return [...knownKeys];\n\n const genericServices: string[] = [];\n if (typeof kc.getAllGenericPasswordServices === 'function') {\n try {\n const services = await kc.getAllGenericPasswordServices();\n if (Array.isArray(services)) genericServices.push(...services);\n } catch {\n // Ignore – fall back to knownKeys\n }\n }\n\n const merged = new Set([...genericServices, ...knownKeys]);\n return Array.from(merged);\n },\n async getItem(key: string): Promise<string | null> {\n const kc = getKc();\n if (!kc) return null;\n\n if (typeof kc.getGenericPassword === 'function') {\n try {\n const creds = await kc.getGenericPassword({ service: key });\n if (creds && typeof creds === 'object' && 'password' in creds) {\n return creds.password;\n }\n } catch {\n // Fall through to internet credentials\n }\n }\n\n const creds = await kc.getInternetCredentials(key);\n return creds?.password ?? null;\n },\n async setItem(key: string, value: string): Promise<void> {\n const kc = getKc();\n if (!kc) throw new Error('react-native-keychain is not available');\n\n if (typeof kc.setGenericPassword === 'function') {\n const result = await kc.setGenericPassword(key, value, { service: key });\n if (result === false) throw new Error('Keychain set failed');\n return;\n }\n\n const result = await kc.setInternetCredentials(key, key, value);\n if (result === false) throw new Error('Keychain set failed');\n },\n async removeItem(key: string): Promise<void> {\n const kc = getKc();\n if (!kc) throw new Error('react-native-keychain is not available');\n\n if (typeof kc.resetGenericPassword === 'function') {\n await kc.resetGenericPassword({ service: key });\n }\n await kc.resetInternetCredentials(key);\n },\n isAvailable(): boolean {\n return getKc() !== null;\n },\n };\n}\n\nexport function isKeychainAvailable(instance?: KeychainModule | null): boolean {\n return (instance ?? getKeychainFromRequire()) !== null;\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * expo-secure-store compatible module. Pass the module to avoid Metro\n * \"unknown module\" errors in Expo.\n */\nexport type SecureStoreModule = {\n getItemAsync(key: string): Promise<string | null>;\n setItemAsync(key: string, value: string): Promise<void>;\n deleteItemAsync(key: string): Promise<void>;\n};\n\nlet secureStore: SecureStoreModule | null = null;\n\nfunction getSecureStoreFromRequire(): SecureStoreModule | null {\n try {\n return require('expo-secure-store') as SecureStoreModule;\n } catch {\n return null;\n }\n}\n\n/**\n * expo-secure-store has no API to list all keys. Pass knownKeys to inspect\n * those entries. Pass the module for reliable bundling in Expo:\n * @example import * as SecureStore from 'expo-secure-store';\n * createSecureStoreAdapter([], SecureStore)\n */\nexport function createSecureStoreAdapter(\n knownKeys: string[] = [],\n instance?: SecureStoreModule | null\n): IStorageAdapter {\n const getStore = () => instance ?? (secureStore ??= getSecureStoreFromRequire());\n return {\n type: 'expo-secure-store',\n name: 'Secure Store',\n async getAllKeys(): Promise<string[]> {\n return [...knownKeys];\n },\n async getItem(key: string): Promise<string | null> {\n const store = getStore();\n if (!store) return null;\n return store.getItemAsync(key);\n },\n async setItem(key: string, value: string): Promise<void> {\n const store = getStore();\n if (!store) throw new Error('expo-secure-store is not available');\n await store.setItemAsync(key, value);\n },\n async removeItem(key: string): Promise<void> {\n const store = getStore();\n if (!store) throw new Error('expo-secure-store is not available');\n await store.deleteItemAsync(key);\n },\n isAvailable(): boolean {\n return getStore() !== null;\n },\n };\n}\n\nexport function isSecureStoreAvailable(instance?: SecureStoreModule | null): boolean {\n return (instance ?? getSecureStoreFromRequire()) !== null;\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport type { StorageItem } from '@/adapters/types';\n\nexport function useStorageItems(adapter: IStorageAdapter | null): {\n items: StorageItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n} {\n const [items, setItems] = useState<StorageItem[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(async () => {\n if (!adapter || !adapter.isAvailable()) {\n setItems([]);\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const keys = await adapter.getAllKeys();\n const pairs: StorageItem[] = [];\n for (const key of keys) {\n const value = await adapter.getItem(key);\n pairs.push({ key, value: value ?? '' });\n }\n setItems(pairs);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to load items');\n setItems([]);\n } finally {\n setLoading(false);\n }\n }, [adapter]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return { items, loading, error, refresh };\n}\n","/**\n * Theme: minimalistic black and white palette.\n * All colors centralized here - no direct hex values in components.\n */\nexport const theme = {\n colors: {\n background: '#ffffff',\n backgroundSecondary: '#f5f5f5',\n backgroundTertiary: '#eeeeee',\n border: '#e0e0e0',\n borderLight: '#ebebeb',\n text: '#000000',\n textSecondary: '#666666',\n textMuted: '#999999',\n inverted: '#ffffff',\n },\n} as const;\n\nexport type Theme = typeof theme;\n","import React from 'react';\nimport { Text, StyleSheet, TextStyle } from 'react-native';\nimport { theme } from '@/theme';\n\nconst GLYPHS: Record<string, string> = {\n chevronBack: '‹',\n refresh: '↻',\n plus: '+',\n chevronDown: '›',\n chevronUp: '›',\n chevronRight: '›',\n close: '×',\n copy: '⎘',\n edit: '✎',\n trash: '⌫',\n};\n\nconst ROTATION: Partial<Record<string, string>> = {\n chevronDown: '90deg',\n chevronUp: '-90deg',\n};\n\nexport type IconName = keyof typeof GLYPHS;\n\nexport interface IconProps {\n name: IconName;\n size?: number;\n tintColor?: string;\n iconStyle?: TextStyle;\n}\n\nexport function Icon({\n name,\n size = 20,\n tintColor = theme.colors.text,\n iconStyle,\n}: IconProps) {\n const glyph = GLYPHS[name] ?? '?';\n const rotation = ROTATION[name];\n\n return (\n <Text\n style={[\n styles.icon,\n { fontSize: size, color: tintColor, lineHeight: size },\n ...(rotation ? [{ transform: [{ rotate: rotation }] }] : []),\n iconStyle,\n ]}\n >\n {glyph}\n </Text>\n );\n}\n\nconst styles = StyleSheet.create({\n icon: {\n alignSelf: 'center',\n fontWeight: '300',\n },\n});\n","import { Dimensions } from 'react-native';\n\nconst { width: SCREEN_WIDTH } = Dimensions.get('window');\n\nexport const LAYOUT = {\n padding: 16,\n fontSize: 14,\n headerHeight: 52,\n rowMinHeight: 48,\n sectionHeaderHeight: 48,\n iconSize: 20,\n chevronSize: 24,\n iconGap: 2,\n iconButtonSize: 36,\n hitSlop: { top: 8, bottom: 8, left: 8, right: 8 },\n hitSlopLarge: { top: 10, bottom: 10, left: 10, right: 10 },\n fabSize: 52,\n modalRadius: 16,\n sectionRadius: 4,\n screenWidth: SCREEN_WIDTH,\n} as const;\n","import { StyleSheet } from 'react-native';\nimport { theme } from '@/theme';\nimport { LAYOUT } from '@/constants';\n\nconst { colors } = theme;\n\nexport const styles = StyleSheet.create({\n container: {\n flex: 1,\n width: '100%',\n backgroundColor: colors.background,\n },\n content: {\n flex: 1,\n },\n scroll: {\n flex: 1,\n },\n header: {\n height: LAYOUT.headerHeight,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: LAYOUT.padding,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.border,\n backgroundColor: colors.background,\n },\n headerLeft: {\n minWidth: 44,\n alignItems: 'flex-start',\n },\n headerCenter: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n headerRight: {\n minWidth: 44,\n alignItems: 'flex-end',\n },\n sectionHeaderLabelWrap: {\n flex: 1,\n },\n headerTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: colors.text,\n },\n headerButton: {\n width: 44,\n height: 44,\n alignItems: 'center',\n justifyContent: 'center',\n },\n scrollContent: {\n flexGrow: 1,\n paddingBottom: LAYOUT.fabSize + LAYOUT.padding + 20,\n paddingTop: LAYOUT.padding,\n },\n sectionHeader: {\n height: LAYOUT.sectionHeaderHeight,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: LAYOUT.padding,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.border,\n backgroundColor: colors.backgroundSecondary,\n marginTop: LAYOUT.padding,\n marginHorizontal: LAYOUT.padding,\n borderRadius: LAYOUT.sectionRadius,\n },\n sectionHeaderLabel: {\n fontSize: 15,\n fontWeight: '600',\n color: colors.text,\n },\n sectionHeaderCount: {\n color: colors.textSecondary,\n fontWeight: '400',\n },\n storageRowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: LAYOUT.iconGap,\n },\n iconButton: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\n },\n iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\n },\n itemRow: {\n minHeight: LAYOUT.rowMinHeight,\n paddingHorizontal: LAYOUT.padding,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.borderLight,\n backgroundColor: colors.background,\n marginHorizontal: LAYOUT.padding,\n marginBottom: 4,\n },\n itemRowCollapsed: {\n flexDirection: 'row',\n alignItems: 'center',\n alignSelf: 'stretch',\n },\n itemKey: {\n flex: 1,\n fontSize: LAYOUT.fontSize,\n fontWeight: '500',\n color: colors.text,\n },\n itemChars: {\n fontSize: 12,\n color: colors.textSecondary,\n marginTop: 2,\n },\n itemRowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n marginLeft: LAYOUT.iconGap,\n gap: LAYOUT.iconGap,\n },\n itemRowExpanded: {\n paddingTop: 4,\n },\n valueBox: {\n backgroundColor: colors.backgroundSecondary,\n borderRadius: 8,\n padding: 12,\n marginTop: 8,\n marginBottom: 8,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: colors.border,\n },\n valueBoxLabel: {\n fontSize: 11,\n fontWeight: '600',\n color: colors.textSecondary,\n marginBottom: 4,\n textTransform: 'uppercase',\n },\n valueBoxText: {\n fontSize: LAYOUT.fontSize,\n color: colors.text,\n },\n empty: {\n padding: LAYOUT.padding * 2,\n alignItems: 'center',\n marginHorizontal: LAYOUT.padding,\n },\n emptyText: {\n fontSize: LAYOUT.fontSize,\n color: colors.textMuted,\n },\n loading: {\n padding: LAYOUT.padding * 2,\n alignItems: 'center',\n marginHorizontal: LAYOUT.padding,\n },\n loadingText: {\n fontSize: LAYOUT.fontSize,\n color: colors.textSecondary,\n },\n error: {\n padding: LAYOUT.padding,\n backgroundColor: colors.backgroundTertiary,\n marginHorizontal: LAYOUT.padding,\n marginVertical: 8,\n borderRadius: 8,\n },\n errorText: {\n fontSize: LAYOUT.fontSize,\n color: colors.text,\n },\n keychainHint: {\n padding: LAYOUT.padding,\n marginHorizontal: LAYOUT.padding,\n marginTop: 8,\n marginBottom: 4,\n backgroundColor: colors.backgroundSecondary,\n borderRadius: 8,\n },\n keychainHintText: {\n fontSize: LAYOUT.fontSize - 1,\n color: colors.textSecondary,\n },\n list: {\n flex: 1,\n },\n listContent: {\n flexGrow: 1,\n paddingBottom: LAYOUT.fabSize + LAYOUT.padding + 20,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n minHeight: LAYOUT.rowMinHeight,\n paddingHorizontal: LAYOUT.padding,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.borderLight,\n backgroundColor: colors.background,\n marginHorizontal: LAYOUT.padding,\n },\n rowKey: {\n flex: 1,\n fontSize: LAYOUT.fontSize,\n fontWeight: '500',\n color: colors.text,\n },\n rowValue: {\n fontSize: LAYOUT.fontSize - 1,\n color: colors.textSecondary,\n },\n rowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n marginLeft: LAYOUT.iconGap,\n gap: LAYOUT.iconGap,\n },\n rowButton: {\n paddingVertical: 8,\n paddingHorizontal: 12,\n },\n rowButtonText: {\n fontSize: 14,\n fontWeight: '600',\n color: colors.text,\n },\n rowButtonDanger: {\n color: colors.text,\n },\n addButton: {\n position: 'absolute',\n bottom: LAYOUT.padding + 16,\n right: LAYOUT.padding + 16,\n width: LAYOUT.fabSize,\n height: LAYOUT.fabSize,\n borderRadius: LAYOUT.fabSize / 2,\n backgroundColor: colors.text,\n alignItems: 'center',\n justifyContent: 'center',\n },\n addButtonText: {\n fontSize: 16,\n fontWeight: '600',\n color: colors.inverted,\n },\n fab: {\n position: 'absolute',\n bottom: LAYOUT.padding + 16,\n right: LAYOUT.padding + 16,\n width: LAYOUT.fabSize,\n height: LAYOUT.fabSize,\n borderRadius: LAYOUT.fabSize / 2,\n backgroundColor: colors.text,\n alignItems: 'center',\n justifyContent: 'center',\n },\n formOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'flex-end',\n alignItems: 'center',\n },\n formModal: {\n width: '100%',\n maxWidth: LAYOUT.screenWidth,\n backgroundColor: colors.background,\n borderTopLeftRadius: LAYOUT.modalRadius,\n borderTopRightRadius: LAYOUT.modalRadius,\n padding: LAYOUT.padding,\n paddingBottom: LAYOUT.padding + 34,\n },\n formHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: LAYOUT.padding,\n },\n formTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: colors.text,\n flex: 1,\n },\n formCloseButton: {\n width: 44,\n height: 44,\n alignItems: 'flex-end',\n justifyContent: 'center',\n },\n formStorageType: {\n fontSize: 13,\n color: colors.textSecondary,\n marginBottom: 12,\n },\n formLabel: {\n fontSize: 12,\n fontWeight: '600',\n color: colors.textSecondary,\n marginBottom: 6,\n },\n formInput: {\n borderWidth: 1,\n borderColor: colors.border,\n borderRadius: 10,\n padding: 12,\n fontSize: LAYOUT.fontSize,\n marginBottom: LAYOUT.padding,\n color: colors.text,\n backgroundColor: colors.background,\n },\n formInputDisabled: {\n backgroundColor: colors.backgroundSecondary,\n color: colors.textSecondary,\n },\n formActions: {\n flexDirection: 'row',\n justifyContent: 'flex-end',\n gap: 12,\n marginTop: 8,\n },\n formButton: {\n paddingVertical: 12,\n paddingHorizontal: 20,\n borderRadius: 10,\n minWidth: 100,\n alignItems: 'center',\n },\n formButtonCancel: {\n backgroundColor: 'transparent',\n borderWidth: 1,\n borderColor: colors.text,\n },\n formButtonSubmit: {\n backgroundColor: colors.text,\n },\n formButtonText: {\n fontSize: 16,\n fontWeight: '600',\n },\n formButtonTextCancel: {\n color: colors.text,\n },\n formButtonTextSubmit: {\n color: colors.inverted,\n },\n confirmOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'flex-end',\n alignItems: 'center',\n },\n confirmModal: {\n width: '100%',\n maxWidth: LAYOUT.screenWidth,\n backgroundColor: colors.background,\n borderTopLeftRadius: LAYOUT.modalRadius,\n borderTopRightRadius: LAYOUT.modalRadius,\n padding: LAYOUT.padding,\n paddingBottom: LAYOUT.padding + 34,\n },\n confirmHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 12,\n },\n confirmTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: colors.text,\n flex: 1,\n },\n confirmMessage: {\n fontSize: 15,\n color: colors.textSecondary,\n lineHeight: 22,\n marginBottom: 20,\n },\n confirmActions: {\n flexDirection: 'row',\n gap: 12,\n },\n confirmButton: {\n flex: 1,\n paddingVertical: 14,\n borderRadius: 10,\n alignItems: 'center',\n },\n confirmButtonSecondary: {\n backgroundColor: 'transparent',\n borderWidth: 1,\n borderColor: colors.text,\n },\n confirmButtonDanger: {\n backgroundColor: colors.text,\n },\n confirmButtonText: {\n fontSize: 16,\n fontWeight: '600',\n },\n confirmButtonTextSecondary: {\n color: colors.text,\n },\n confirmButtonTextDanger: {\n color: colors.inverted,\n },\n});\n","import React from 'react';\nimport { TouchableOpacity, StyleSheet, ViewStyle } from 'react-native';\nimport type { IconName } from '@/components/Icon';\nimport { Icon } from '@/components/Icon';\nimport { theme } from '@/theme';\nimport { LAYOUT } from '@/constants';\nimport { styles as sharedStyles } from '@/components/styles';\n\nexport interface IconButtonProps {\n name: IconName;\n onPress: () => void;\n size?: number;\n tintColor?: string;\n disabled?: boolean;\n hitSlop?: { top: number; bottom: number; left: number; right: number };\n style?: ViewStyle;\n activeOpacity?: number;\n}\n\nexport function IconButton({\n name,\n onPress,\n size = LAYOUT.iconSize,\n tintColor = theme.colors.text,\n disabled = false,\n hitSlop = LAYOUT.hitSlop,\n style,\n activeOpacity = 0.6,\n}: IconButtonProps) {\n return (\n <TouchableOpacity\n style={[sharedStyles.iconButton, style]}\n onPress={onPress}\n disabled={disabled}\n hitSlop={hitSlop}\n activeOpacity={activeOpacity}\n >\n <Icon\n name={name}\n size={size}\n tintColor={disabled ? theme.colors.textMuted : tintColor}\n />\n </TouchableOpacity>\n );\n}\n","/**\n * Centralized user-facing text for the storage inspector.\n * Enables localization and consistent messaging.\n */\nexport const strings = {\n // StorageInspector\n noAdapterAvailable:\n 'No storage adapter available. Install at least one of: react-native-mmkv, @react-native-async-storage/async-storage, react-native-keychain, expo-secure-store',\n\n // StorageSection\n keychainHint:\n 'No generic password items yet. Add a key using + above, or pass keychainKeys for internet credentials.',\n secureStoreHint:\n 'Secure Store has no list API. Pass secureStoreKeys prop with known keys, or add a key using + above.',\n loading: 'Loading…',\n noItems: 'No items',\n valueLabel: 'Value',\n emptyValue: '(empty)',\n charCount: (n: number) => (n === 1 ? '1 char' : `${n} chars`),\n deleteItemTitle: (key: string) => `Delete ${key}?`,\n deleteItemMessage: (key: string) =>\n `This will permanently delete the ${key} storage item. Do you wish to continue?`,\n clearAllTitle: (name: string) => `Clear All ${name}?`,\n clearAllMessage: (count: number, name: string) =>\n `This will permanently delete all ${count} ${name} items. Do you wish to continue?`,\n\n // StorageList\n storageNotAvailable: 'This storage is not available.',\n keychainHintShort:\n 'No items yet. Add a key below, or pass keychainKeys for internet credentials.',\n edit: 'Edit',\n delete: 'Delete',\n addItem: 'Add item',\n\n // ItemForm\n keyRequired: 'Key is required',\n saveFailed: 'Save failed',\n editItemTitle: (key: string) => `Edit ${key}`,\n addItemTitle: (storageName: string) => `Add ${storageName} Item`,\n storageTypeLabel: (name: string) => `Storage Type: ${name}`,\n keyLabel: 'Key',\n enterKeyPlaceholder: 'Enter key',\n enterValuePlaceholder: 'Enter value',\n cancel: 'Cancel',\n saving: 'Saving…',\n save: 'Save',\n add: 'Add',\n\n // ConfirmModal defaults\n confirmDelete: 'Yes, delete',\n cancelKeep: 'No, keep it',\n} as const;\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, TextInput, TouchableOpacity, Modal } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { LAYOUT } from '@/constants';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\n\nexport interface ItemFormProps {\n visible: boolean;\n storageName: string;\n editingItem: StorageItem | null;\n onSave: (key: string, value: string) => Promise<void>;\n onCancel: () => void;\n}\n\nexport function ItemForm({\n visible,\n storageName,\n editingItem,\n onSave,\n onCancel,\n}: ItemFormProps) {\n const [key, setKey] = useState('');\n const [value, setValue] = useState('');\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const isEdit = editingItem !== null;\n\n useEffect(() => {\n if (visible) {\n setKey(editingItem?.key ?? '');\n setValue(editingItem?.value ?? '');\n setError(null);\n }\n }, [visible, editingItem]);\n\n const handleSubmit = async () => {\n const k = key.trim();\n if (!k) {\n setError(strings.keyRequired);\n return;\n }\n setSaving(true);\n setError(null);\n try {\n await onSave(k, value);\n onCancel();\n } catch (e) {\n setError(e instanceof Error ? e.message : strings.saveFailed);\n } finally {\n setSaving(false);\n }\n };\n\n const title = isEdit\n ? strings.editItemTitle(editingItem?.key ?? '')\n : strings.addItemTitle(storageName);\n\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onCancel}>\n <View style={styles.formOverlay}>\n <TouchableOpacity\n style={{ flex: 1, width: '100%' }}\n activeOpacity={1}\n onPress={onCancel}\n />\n <View style={styles.formModal}>\n <View style={styles.formHeader}>\n <Text style={styles.formTitle} numberOfLines={1}>\n {title}\n </Text>\n <IconButton\n name=\"close\"\n onPress={onCancel}\n size={24}\n tintColor={theme.colors.textSecondary}\n style={styles.formCloseButton}\n hitSlop={LAYOUT.hitSlopLarge}\n />\n </View>\n <Text style={styles.formStorageType}>\n {strings.storageTypeLabel(storageName)}\n </Text>\n <Text style={styles.formLabel}>{strings.keyLabel}</Text>\n <TextInput\n style={[styles.formInput, isEdit && styles.formInputDisabled]}\n value={key}\n onChangeText={setKey}\n placeholder={strings.enterKeyPlaceholder}\n placeholderTextColor={theme.colors.textMuted}\n editable={!isEdit}\n autoCapitalize=\"none\"\n multiline\n />\n <Text style={styles.formLabel}>{strings.valueLabel}</Text>\n <TextInput\n style={styles.formInput}\n value={value}\n onChangeText={setValue}\n placeholder={strings.enterValuePlaceholder}\n placeholderTextColor={theme.colors.textMuted}\n multiline\n numberOfLines={3}\n />\n {error ? (\n <Text style={[styles.errorText, { marginBottom: 12 }]}>{error}</Text>\n ) : null}\n <View style={styles.formActions}>\n <TouchableOpacity\n style={[styles.formButton, styles.formButtonCancel]}\n onPress={onCancel}\n disabled={saving}\n >\n <Text style={[styles.formButtonText, styles.formButtonTextCancel]}>\n {strings.cancel}\n </Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[styles.formButton, styles.formButtonSubmit]}\n onPress={handleSubmit}\n disabled={saving}\n >\n <Text style={[styles.formButtonText, styles.formButtonTextSubmit]}>\n {saving ? strings.saving : isEdit ? strings.save : strings.add}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </Modal>\n );\n}\n","import React from 'react';\nimport { View, Text, Modal, TouchableOpacity } from 'react-native';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { LAYOUT } from '@/constants';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\n\nexport interface ConfirmModalProps {\n visible: boolean;\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n danger?: boolean;\n onConfirm: () => void | Promise<void>;\n onCancel: () => void;\n}\n\nexport function ConfirmModal({\n visible,\n title,\n message,\n confirmLabel = strings.confirmDelete,\n cancelLabel = strings.cancelKeep,\n danger = true,\n onConfirm,\n onCancel,\n}: ConfirmModalProps) {\n const handleConfirm = () => {\n void Promise.resolve(onConfirm());\n };\n\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onCancel}>\n <View style={styles.confirmOverlay}>\n <TouchableOpacity\n style={{ flex: 1, width: '100%' }}\n activeOpacity={1}\n onPress={onCancel}\n />\n <View style={styles.confirmModal}>\n <View style={styles.confirmHeader}>\n <Text style={styles.confirmTitle}>{title}</Text>\n <IconButton\n name=\"close\"\n onPress={onCancel}\n size={24}\n tintColor={theme.colors.textSecondary}\n style={styles.formCloseButton}\n hitSlop={LAYOUT.hitSlopLarge}\n />\n </View>\n <Text style={styles.confirmMessage}>{message}</Text>\n <View style={styles.confirmActions}>\n <TouchableOpacity\n style={[styles.confirmButton, styles.confirmButtonSecondary]}\n onPress={onCancel}\n >\n <Text style={[styles.confirmButtonText, styles.confirmButtonTextSecondary]}>\n {cancelLabel}\n </Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[\n styles.confirmButton,\n danger ? styles.confirmButtonDanger : styles.formButtonSubmit,\n ]}\n onPress={handleConfirm}\n >\n <Text\n style={[\n styles.confirmButtonText,\n danger ? styles.confirmButtonTextDanger : styles.formButtonTextSubmit,\n ]}\n >\n {confirmLabel}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </Modal>\n );\n}\n","import React from 'react';\nimport { View } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { theme } from '@/theme';\nimport { LAYOUT } from '@/constants';\n\nexport interface ItemRowActionsProps {\n item: StorageItem;\n onCopy: (item: StorageItem) => void;\n onEdit: (item: StorageItem) => void;\n onDelete: (item: StorageItem) => void;\n showChevron?: boolean;\n chevronDirection?: 'up' | 'down';\n}\n\nexport function ItemRowActions({\n item,\n onCopy,\n onEdit,\n onDelete,\n showChevron = false,\n chevronDirection = 'down',\n}: ItemRowActionsProps) {\n return (\n <View style={styles.itemRowActions}>\n <IconButton name=\"copy\" onPress={() => onCopy(item)} />\n <IconButton name=\"edit\" onPress={() => onEdit(item)} />\n <IconButton name=\"trash\" onPress={() => onDelete(item)} />\n {showChevron && (\n <View style={styles.iconSlot}>\n <Icon\n name={chevronDirection === 'up' ? 'chevronUp' : 'chevronDown'}\n size={LAYOUT.chevronSize}\n tintColor={theme.colors.text}\n />\n </View>\n )}\n </View>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, TouchableOpacity, Share } from 'react-native';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport type { StorageItem } from '@/adapters/types';\nimport { useStorageItems } from '@/hooks/useStorageItems';\nimport { ItemForm } from '@/components/ItemForm';\nimport { ConfirmModal } from '@/components/ConfirmModal';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\nimport { ItemRowActions } from '@/components/ItemRowActions';\nimport { styles } from '@/components/styles';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageSectionProps {\n key?: React.Key;\n adapter: IStorageAdapter;\n keychainKeys?: string[];\n onKeychainKeyAdded?: (key: string) => void;\n onSecureStoreKeyAdded?: (key: string) => void;\n defaultExpanded?: boolean;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n refreshTrigger?: number;\n}\n\nexport function StorageSection({\n adapter,\n keychainKeys,\n onKeychainKeyAdded,\n onSecureStoreKeyAdded,\n defaultExpanded = true,\n expanded: expandedProp,\n onToggleExpanded,\n refreshTrigger,\n}: StorageSectionProps) {\n const { items, loading, error, refresh } = useStorageItems(adapter);\n const [expandedInternal, setExpandedInternal] = useState(defaultExpanded);\n const expanded = expandedProp !== undefined ? expandedProp : expandedInternal;\n\n const handleToggleExpanded = () => {\n if (onToggleExpanded) onToggleExpanded();\n else setExpandedInternal((p: boolean) => !p);\n };\n\n useEffect(() => {\n if (refreshTrigger !== undefined) refresh();\n }, [refreshTrigger, refresh]);\n\n const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());\n const [formVisible, setFormVisible] = useState(false);\n const [editingItem, setEditingItem] = useState<StorageItem | null>(null);\n const [deleteItem, setDeleteItem] = useState<StorageItem | null>(null);\n const [clearAllVisible, setClearAllVisible] = useState(false);\n\n const handleAdd = () => {\n setEditingItem(null);\n setFormVisible(true);\n };\n\n const handleEdit = (item: StorageItem) => {\n setEditingItem(item);\n setFormVisible(true);\n };\n\n const handleSave = async (key: string, value: string) => {\n const isNewKey = !editingItem || editingItem.key !== key;\n await adapter.setItem(key, value);\n if (adapter.type === 'keychain' && isNewKey) {\n onKeychainKeyAdded?.(key);\n }\n if (adapter.type === 'expo-secure-store' && isNewKey) {\n onSecureStoreKeyAdded?.(key);\n }\n await refresh();\n };\n\n const handleDeleteItem = async () => {\n if (deleteItem) {\n await adapter.removeItem(deleteItem.key);\n setDeleteItem(null);\n await refresh();\n }\n };\n\n const handleClearAll = async () => {\n for (const item of items) {\n await adapter.removeItem(item.key);\n }\n setClearAllVisible(false);\n await refresh();\n };\n\n const handleCopy = async (item: StorageItem) => {\n try {\n await Share.share({\n message: item.value,\n title: item.key,\n });\n } catch {\n // Share cancelled or not available\n }\n };\n\n const isKeychain = adapter.type === 'keychain';\n const isSecureStore = adapter.type === 'expo-secure-store';\n const showKeychainHint =\n isKeychain && items.length === 0 && (keychainKeys?.length ?? 0) === 0;\n const showSecureStoreHint = isSecureStore && items.length === 0;\n\n if (!adapter.isAvailable()) return null;\n\n return (\n <>\n <TouchableOpacity\n style={styles.sectionHeader}\n onPress={handleToggleExpanded}\n activeOpacity={0.7}\n >\n <View style={styles.sectionHeaderLabelWrap}>\n <Text style={styles.sectionHeaderLabel}>\n {adapter.name}\n <Text style={styles.sectionHeaderCount}> ({items.length})</Text>\n </Text>\n </View>\n <View style={styles.storageRowActions}>\n <IconButton name=\"plus\" onPress={handleAdd} />\n <IconButton\n name=\"trash\"\n onPress={() => items.length > 0 && setClearAllVisible(true)}\n disabled={items.length === 0}\n />\n <View style={styles.iconSlot}>\n <Icon\n name={expanded ? 'chevronUp' : 'chevronDown'}\n size={LAYOUT.chevronSize}\n tintColor={theme.colors.text}\n />\n </View>\n </View>\n </TouchableOpacity>\n\n {expanded && (\n <>\n {showKeychainHint ? (\n <View style={styles.keychainHint}>\n <Text style={styles.keychainHintText}>{strings.keychainHint}</Text>\n </View>\n ) : null}\n {showSecureStoreHint ? (\n <View style={styles.keychainHint}>\n <Text style={styles.keychainHintText}>{strings.secureStoreHint}</Text>\n </View>\n ) : null}\n {error ? (\n <View style={styles.error}>\n <Text style={styles.errorText}>{error}</Text>\n </View>\n ) : null}\n {loading ? (\n <View style={styles.loading}>\n <Text style={styles.loadingText}>{strings.loading}</Text>\n </View>\n ) : (\n items.map((item) => {\n const isItemExpanded = expandedKeys.has(item.key);\n const charCount = item.value.length;\n const toggleItemExpanded = () => {\n setExpandedKeys((prev: Set<string>) => {\n const next = new Set(prev);\n if (next.has(item.key)) next.delete(item.key);\n else next.add(item.key);\n return next;\n });\n };\n return (\n <TouchableOpacity\n key={item.key}\n style={styles.itemRow}\n onPress={toggleItemExpanded}\n activeOpacity={0.7}\n >\n <View style={styles.itemRowCollapsed}>\n <View style={{ flex: 1 }}>\n <Text style={styles.itemKey} numberOfLines={1}>\n {item.key}\n </Text>\n <Text style={styles.itemChars}>{strings.charCount(charCount)}</Text>\n </View>\n {!isItemExpanded ? (\n <ItemRowActions\n item={item}\n onCopy={handleCopy}\n onEdit={handleEdit}\n onDelete={setDeleteItem}\n showChevron\n chevronDirection=\"down\"\n />\n ) : (\n <View style={styles.iconSlot}>\n <Icon\n name=\"chevronUp\"\n size={LAYOUT.chevronSize}\n tintColor={theme.colors.text}\n />\n </View>\n )}\n </View>\n {isItemExpanded && (\n <View style={styles.itemRowExpanded}>\n <View style={styles.valueBox}>\n <Text style={styles.valueBoxLabel}>{strings.valueLabel}</Text>\n <Text style={styles.valueBoxText} selectable>\n {item.value || strings.emptyValue}\n </Text>\n </View>\n <ItemRowActions\n item={item}\n onCopy={handleCopy}\n onEdit={handleEdit}\n onDelete={setDeleteItem}\n />\n </View>\n )}\n </TouchableOpacity>\n );\n })\n )}\n {!loading && items.length === 0 && !showKeychainHint && !showSecureStoreHint ? (\n <View style={styles.empty}>\n <Text style={styles.emptyText}>{strings.noItems}</Text>\n </View>\n ) : null}\n </>\n )}\n\n <ItemForm\n visible={formVisible}\n storageName={adapter.name}\n editingItem={editingItem}\n onSave={handleSave}\n onCancel={() => {\n setFormVisible(false);\n setEditingItem(null);\n }}\n />\n\n <ConfirmModal\n visible={deleteItem !== null}\n title={strings.deleteItemTitle(deleteItem?.key ?? '')}\n message={strings.deleteItemMessage(deleteItem?.key ?? '')}\n onConfirm={handleDeleteItem}\n onCancel={() => setDeleteItem(null)}\n />\n\n <ConfirmModal\n visible={clearAllVisible}\n title={strings.clearAllTitle(adapter.name)}\n message={strings.clearAllMessage(items.length, adapter.name)}\n onConfirm={handleClearAll}\n onCancel={() => setClearAllVisible(false)}\n />\n </>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport { View, Text, ScrollView, RefreshControl } from 'react-native';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport { createMMKVAdapter } from '@/adapters/mmkv';\nimport {\n createAsyncStorageAdapter,\n type AsyncStorageModule,\n} from '@/adapters/async-storage';\nimport { createKeychainAdapter, type KeychainModule } from '@/adapters/keychain';\nimport {\n createSecureStoreAdapter,\n type SecureStoreModule,\n} from '@/adapters/secure-store';\nimport { StorageSection } from '@/components/StorageSection';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\n\nexport interface StorageInspectorProps {\n mmkvInstances?: Array<{\n getAllKeys(): string[];\n getString(k: string): string | undefined;\n set(k: string, v: string | number | boolean): void;\n delete(k: string): void;\n }>;\n /** Pass AsyncStorage to avoid Metro \"unknown module\" in Expo. */\n asyncStorageInstance?: AsyncStorageModule | null;\n keychainKeys?: string[];\n /** Pass Keychain module to avoid Metro \"unknown module\" in Expo. */\n keychainInstance?: KeychainModule | null;\n secureStoreKeys?: string[];\n /** Pass SecureStore module to avoid Metro \"unknown module\" in Expo. */\n secureStoreInstance?: SecureStoreModule | null;\n customAdapters?: IStorageAdapter[];\n}\n\nexport function StorageInspector({\n mmkvInstances = [],\n asyncStorageInstance,\n keychainKeys: keychainKeysProp,\n keychainInstance,\n secureStoreKeys: secureStoreKeysProp,\n secureStoreInstance,\n customAdapters = [],\n}: StorageInspectorProps) {\n const [keychainKeysAdded, setKeychainKeysAdded] = useState<string[]>([]);\n const [secureStoreKeysAdded, setSecureStoreKeysAdded] = useState<string[]>([]);\n const [refreshKey, setRefreshKey] = useState(0);\n const [refreshing, setRefreshing] = useState(false);\n const [expandedIndices, setExpandedIndices] = useState<Set<number>>(() => new Set([0]));\n\n const keychainKeys = useMemo(\n () => [...(keychainKeysProp ?? []), ...keychainKeysAdded],\n [keychainKeysProp, keychainKeysAdded]\n );\n\n const secureStoreKeys = useMemo(\n () => [...(secureStoreKeysProp ?? []), ...secureStoreKeysAdded],\n [secureStoreKeysProp, secureStoreKeysAdded]\n );\n\n const adapters = useMemo(() => {\n const list: IStorageAdapter[] = [];\n\n mmkvInstances.forEach((inst, i) => {\n list.push(\n createMMKVAdapter(inst, mmkvInstances.length > 1 ? `MMKV ${i + 1}` : 'MMKV')\n );\n });\n\n const asyncAdapter = createAsyncStorageAdapter(asyncStorageInstance);\n if (asyncAdapter.isAvailable()) list.push(asyncAdapter);\n\n const keychainAdapter = createKeychainAdapter(keychainKeys, keychainInstance);\n if (keychainAdapter.isAvailable()) list.push(keychainAdapter);\n\n const secureStoreAdapter = createSecureStoreAdapter(\n secureStoreKeys,\n secureStoreInstance\n );\n if (secureStoreAdapter.isAvailable()) list.push(secureStoreAdapter);\n\n list.push(...customAdapters);\n return list;\n }, [\n mmkvInstances,\n asyncStorageInstance,\n keychainKeys,\n keychainInstance,\n secureStoreKeys,\n secureStoreInstance,\n customAdapters,\n ]);\n\n const handleKeychainKeyAdded = (key: string) => {\n setKeychainKeysAdded((prev: string[]) =>\n prev.includes(key) ? prev : [...prev, key]\n );\n };\n\n const handleSecureStoreKeyAdded = (key: string) => {\n setSecureStoreKeysAdded((prev: string[]) =>\n prev.includes(key) ? prev : [...prev, key]\n );\n };\n\n const handleRefresh = () => {\n setRefreshing(true);\n setRefreshKey((k: number) => k + 1);\n setTimeout(() => setRefreshing(false), 400);\n };\n\n return (\n <View style={styles.container}>\n <View style={styles.content}>\n {adapters.length > 0 ? (\n <>\n <ScrollView\n style={styles.scroll}\n contentContainerStyle={styles.scrollContent}\n keyboardShouldPersistTaps=\"handled\"\n showsVerticalScrollIndicator\n refreshControl={\n <RefreshControl refreshing={refreshing} onRefresh={handleRefresh} />\n }\n >\n {adapters.map((adapter: IStorageAdapter, index: number) => (\n <StorageSection\n key={`${adapter.type}-${index}`}\n adapter={adapter}\n keychainKeys={keychainKeysProp}\n onKeychainKeyAdded={handleKeychainKeyAdded}\n onSecureStoreKeyAdded={handleSecureStoreKeyAdded}\n expanded={expandedIndices.has(index)}\n onToggleExpanded={() => {\n setExpandedIndices((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n }}\n refreshTrigger={refreshKey}\n />\n ))}\n </ScrollView>\n\n <IconButton\n name=\"refresh\"\n onPress={handleRefresh}\n size={24}\n tintColor={theme.colors.inverted}\n style={styles.fab}\n activeOpacity={0.85}\n />\n </>\n ) : (\n <View style={styles.empty}>\n <Text style={styles.emptyText}>{strings.noAdapterAvailable}</Text>\n </View>\n )}\n </View>\n </View>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/mmkv.ts","../src/adapters/async-storage.ts","../src/adapters/keychain.ts","../src/adapters/secure-store.ts","../src/hooks/useStorageItems.ts","../src/theme.ts","../src/components/Icon.tsx","../src/constants.ts","../src/components/styles.ts","../src/components/IconButton.tsx","../src/strings.ts","../src/components/ItemForm.tsx","../src/components/ConfirmModal.tsx","../src/components/ItemRowActions.tsx","../src/components/StorageSection.tsx","../src/components/StorageInspector.tsx"],"names":["creds","result","React","styles","StyleSheet","useState","useEffect","TouchableOpacity","Text","Modal","View"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { IStorageAdapter } from '@/adapters/types';\n\ntype MMKVInstance = {\n getAllKeys(): string[];\n getString(key: string): string | undefined;\n set(key: string, value: string | number | boolean): void;\n delete(key: string): void;\n};\n\nexport function createMMKVAdapter(\n instance: MMKVInstance,\n name?: string\n): IStorageAdapter {\n return {\n type: 'mmkv',\n name: name ?? 'MMKV',\n getAllKeys(): Promise<string[]> {\n return Promise.resolve(instance.getAllKeys());\n },\n getItem(key: string): Promise<string | null> {\n const value = instance.getString(key);\n return Promise.resolve(value ?? null);\n },\n setItem(key: string, value: string): Promise<void> {\n instance.set(key, value);\n return Promise.resolve();\n },\n removeItem(key: string): Promise<void> {\n instance.delete(key);\n return Promise.resolve();\n },\n isAvailable(): boolean {\n return true;\n },\n };\n}\n\nexport function isMMKVAvailable(): boolean {\n try {\n require('react-native-mmkv');\n return true;\n } catch {\n return false;\n }\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * AsyncStorage-compatible module interface.\n * Pass your AsyncStorage instance to avoid Metro \"unknown module\" errors in Expo:\n * @example\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * createAsyncStorageAdapter(AsyncStorage)\n */\nexport type AsyncStorageModule = {\n getAllKeys(): Promise<string[]>;\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\nlet asyncStorage: AsyncStorageModule | null = null;\n\nfunction getAsyncStorageFromRequire(): AsyncStorageModule | null {\n try {\n const mod = require('@react-native-async-storage/async-storage') as\n | { default: AsyncStorageModule }\n | AsyncStorageModule;\n return (\n (mod as { default?: AsyncStorageModule }).default ?? (mod as AsyncStorageModule)\n );\n } catch {\n return null;\n }\n}\n\n/**\n * Creates an AsyncStorage adapter. Pass the AsyncStorage instance for reliable\n * bundling in Expo/Metro (avoids \"unknown module\" errors):\n *\n * @example\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * createAsyncStorageAdapter(AsyncStorage)\n */\nexport function createAsyncStorageAdapter(\n instance?: AsyncStorageModule | null\n): IStorageAdapter {\n const getStorage = () => instance ?? (asyncStorage ??= getAsyncStorageFromRequire());\n return {\n type: 'async-storage',\n name: 'Async Storage',\n async getAllKeys(): Promise<string[]> {\n const storage = getStorage();\n if (!storage) return [];\n return storage.getAllKeys();\n },\n async getItem(key: string): Promise<string | null> {\n const storage = getStorage();\n if (!storage) return null;\n return storage.getItem(key);\n },\n async setItem(key: string, value: string): Promise<void> {\n const storage = getStorage();\n if (!storage) throw new Error('AsyncStorage is not available');\n await storage.setItem(key, value);\n },\n async removeItem(key: string): Promise<void> {\n const storage = getStorage();\n if (!storage) throw new Error('AsyncStorage is not available');\n await storage.removeItem(key);\n },\n isAvailable(): boolean {\n return getStorage() !== null;\n },\n };\n}\n\nexport function isAsyncStorageAvailable(instance?: AsyncStorageModule | null): boolean {\n return (instance ?? getAsyncStorageFromRequire()) !== null;\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * Keychain-compatible module. Pass your keychain instance to avoid Metro\n * \"unknown module\" errors in Expo.\n */\nexport type KeychainModule = {\n getAllGenericPasswordServices?(options?: object): Promise<string[]>;\n getGenericPassword?(options?: {\n service?: string;\n }): Promise<{ password: string } | false>;\n setGenericPassword?(\n username: string,\n password: string,\n options?: { service?: string }\n ): Promise<{ storage: string } | false>;\n resetGenericPassword?(options?: { service?: string }): Promise<void>;\n setInternetCredentials(\n server: string,\n username: string,\n password: string\n ): Promise<{ storage: string } | false>;\n getInternetCredentials(server: string): Promise<{\n username: string;\n password: string;\n } | null>;\n resetInternetCredentials(server: string): Promise<void>;\n};\n\nlet keychain: KeychainModule | null = null;\n\nfunction getKeychainFromRequire(): KeychainModule | null {\n try {\n return require('react-native-keychain') as KeychainModule;\n } catch {\n return null;\n }\n}\n\n/**\n * Keychain adapter. Pass the keychain instance for reliable bundling in Expo:\n * @example import * as Keychain from 'react-native-keychain';\n * createKeychainAdapter([], Keychain)\n */\nexport function createKeychainAdapter(\n knownKeys: string[] = [],\n instance?: KeychainModule | null\n): IStorageAdapter {\n const getKc = () => instance ?? (keychain ??= getKeychainFromRequire());\n return {\n type: 'keychain',\n name: 'Keychain',\n async getAllKeys(): Promise<string[]> {\n const kc = getKc();\n if (!kc) return [...knownKeys];\n\n const genericServices: string[] = [];\n if (typeof kc.getAllGenericPasswordServices === 'function') {\n try {\n const services = await kc.getAllGenericPasswordServices();\n if (Array.isArray(services)) genericServices.push(...services);\n } catch {\n // Ignore – fall back to knownKeys\n }\n }\n\n const merged = new Set([...genericServices, ...knownKeys]);\n return Array.from(merged);\n },\n async getItem(key: string): Promise<string | null> {\n const kc = getKc();\n if (!kc) return null;\n\n if (typeof kc.getGenericPassword === 'function') {\n try {\n const creds = await kc.getGenericPassword({ service: key });\n if (creds && typeof creds === 'object' && 'password' in creds) {\n return creds.password;\n }\n } catch {\n // Fall through to internet credentials\n }\n }\n\n const creds = await kc.getInternetCredentials(key);\n return creds?.password ?? null;\n },\n async setItem(key: string, value: string): Promise<void> {\n const kc = getKc();\n if (!kc) throw new Error('react-native-keychain is not available');\n\n if (typeof kc.setGenericPassword === 'function') {\n const result = await kc.setGenericPassword(key, value, { service: key });\n if (result === false) throw new Error('Keychain set failed');\n return;\n }\n\n const result = await kc.setInternetCredentials(key, key, value);\n if (result === false) throw new Error('Keychain set failed');\n },\n async removeItem(key: string): Promise<void> {\n const kc = getKc();\n if (!kc) throw new Error('react-native-keychain is not available');\n\n if (typeof kc.resetGenericPassword === 'function') {\n await kc.resetGenericPassword({ service: key });\n }\n await kc.resetInternetCredentials(key);\n },\n isAvailable(): boolean {\n return getKc() !== null;\n },\n };\n}\n\nexport function isKeychainAvailable(instance?: KeychainModule | null): boolean {\n return (instance ?? getKeychainFromRequire()) !== null;\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * expo-secure-store compatible module. Pass the module to avoid Metro\n * \"unknown module\" errors in Expo.\n */\nexport type SecureStoreModule = {\n getItemAsync(key: string): Promise<string | null>;\n setItemAsync(key: string, value: string): Promise<void>;\n deleteItemAsync(key: string): Promise<void>;\n};\n\nlet secureStore: SecureStoreModule | null = null;\n\nfunction getSecureStoreFromRequire(): SecureStoreModule | null {\n try {\n return require('expo-secure-store') as SecureStoreModule;\n } catch {\n return null;\n }\n}\n\n/**\n * expo-secure-store has no API to list all keys. Pass knownKeys to inspect\n * those entries. Pass the module for reliable bundling in Expo:\n * @example import * as SecureStore from 'expo-secure-store';\n * createSecureStoreAdapter([], SecureStore)\n */\nexport function createSecureStoreAdapter(\n knownKeys: string[] = [],\n instance?: SecureStoreModule | null\n): IStorageAdapter {\n const getStore = () => instance ?? (secureStore ??= getSecureStoreFromRequire());\n return {\n type: 'expo-secure-store',\n name: 'Secure Store',\n async getAllKeys(): Promise<string[]> {\n return [...knownKeys];\n },\n async getItem(key: string): Promise<string | null> {\n const store = getStore();\n if (!store) return null;\n return store.getItemAsync(key);\n },\n async setItem(key: string, value: string): Promise<void> {\n const store = getStore();\n if (!store) throw new Error('expo-secure-store is not available');\n await store.setItemAsync(key, value);\n },\n async removeItem(key: string): Promise<void> {\n const store = getStore();\n if (!store) throw new Error('expo-secure-store is not available');\n await store.deleteItemAsync(key);\n },\n isAvailable(): boolean {\n return getStore() !== null;\n },\n };\n}\n\nexport function isSecureStoreAvailable(instance?: SecureStoreModule | null): boolean {\n return (instance ?? getSecureStoreFromRequire()) !== null;\n}\n","import { useState, useCallback, useEffect } from 'react';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport type { StorageItem } from '@/adapters/types';\n\nexport function useStorageItems(adapter: IStorageAdapter | null): {\n items: StorageItem[];\n loading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n} {\n const [items, setItems] = useState<StorageItem[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(async () => {\n if (!adapter || !adapter.isAvailable()) {\n setItems([]);\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const keys = await adapter.getAllKeys();\n const pairs: StorageItem[] = [];\n for (const key of keys) {\n const value = await adapter.getItem(key);\n pairs.push({ key, value: value ?? '' });\n }\n setItems(pairs);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to load items');\n setItems([]);\n } finally {\n setLoading(false);\n }\n }, [adapter]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return { items, loading, error, refresh };\n}\n","/**\n * Theme: minimalistic black and white palette.\n * All colors centralized here - no direct hex values in components.\n */\nexport const theme = {\n colors: {\n background: '#ffffff',\n backgroundSecondary: '#f5f5f5',\n backgroundTertiary: '#eeeeee',\n border: '#e0e0e0',\n borderLight: '#ebebeb',\n text: '#000000',\n textSecondary: '#666666',\n textMuted: '#999999',\n inverted: '#ffffff',\n },\n} as const;\n\nexport type Theme = typeof theme;\n","import React from 'react';\nimport { Text, StyleSheet, TextStyle } from 'react-native';\nimport { theme } from '@/theme';\n\nconst GLYPHS: Record<string, string> = {\n chevronBack: '‹',\n refresh: '↻',\n plus: '+',\n chevronDown: '›',\n chevronUp: '›',\n chevronRight: '›',\n close: '×',\n copy: '⎘',\n edit: '✎',\n trash: '⌫',\n};\n\nconst ROTATION: Partial<Record<string, string>> = {\n chevronDown: '90deg',\n chevronUp: '-90deg',\n};\n\nexport type IconName = keyof typeof GLYPHS;\n\nexport interface IconProps {\n name: IconName;\n size?: number;\n tintColor?: string;\n iconStyle?: TextStyle;\n}\n\nexport function Icon({\n name,\n size = 20,\n tintColor = theme.colors.text,\n iconStyle,\n}: IconProps) {\n const glyph = GLYPHS[name] ?? '?';\n const rotation = ROTATION[name];\n\n return (\n <Text\n style={[\n styles.icon,\n { fontSize: size, color: tintColor, lineHeight: size },\n ...(rotation ? [{ transform: [{ rotate: rotation }] }] : []),\n iconStyle,\n ]}\n >\n {glyph}\n </Text>\n );\n}\n\nconst styles = StyleSheet.create({\n icon: {\n alignSelf: 'center',\n fontWeight: '300',\n },\n});\n","import { Dimensions } from 'react-native';\n\nconst { width: SCREEN_WIDTH } = Dimensions.get('window');\n\nexport const LAYOUT = {\n padding: 16,\n fontSize: 14,\n headerHeight: 52,\n rowMinHeight: 48,\n sectionHeaderHeight: 48,\n iconSize: 20,\n chevronSize: 24,\n iconGap: 2,\n iconButtonSize: 36,\n hitSlop: { top: 8, bottom: 8, left: 8, right: 8 },\n hitSlopLarge: { top: 10, bottom: 10, left: 10, right: 10 },\n fabSize: 52,\n modalRadius: 16,\n sectionRadius: 4,\n screenWidth: SCREEN_WIDTH,\n} as const;\n","import { StyleSheet } from 'react-native';\nimport { theme } from '@/theme';\nimport { LAYOUT } from '@/constants';\n\nconst { colors } = theme;\n\nexport const styles = StyleSheet.create({\n container: {\n flex: 1,\n width: '100%',\n backgroundColor: colors.background,\n },\n content: {\n flex: 1,\n },\n scroll: {\n flex: 1,\n },\n header: {\n height: LAYOUT.headerHeight,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: LAYOUT.padding,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.border,\n backgroundColor: colors.background,\n },\n headerLeft: {\n minWidth: 44,\n alignItems: 'flex-start',\n },\n headerCenter: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n headerRight: {\n minWidth: 44,\n alignItems: 'flex-end',\n },\n sectionHeaderLabelWrap: {\n flex: 1,\n },\n headerTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: colors.text,\n },\n headerButton: {\n width: 44,\n height: 44,\n alignItems: 'center',\n justifyContent: 'center',\n },\n scrollContent: {\n flexGrow: 1,\n paddingBottom: LAYOUT.fabSize + LAYOUT.padding + 20,\n paddingTop: LAYOUT.padding,\n },\n sectionHeader: {\n height: LAYOUT.sectionHeaderHeight,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: LAYOUT.padding,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.border,\n backgroundColor: colors.backgroundSecondary,\n marginTop: LAYOUT.padding,\n marginHorizontal: LAYOUT.padding,\n borderRadius: LAYOUT.sectionRadius,\n },\n sectionHeaderLabel: {\n fontSize: 15,\n fontWeight: '600',\n color: colors.text,\n },\n sectionHeaderCount: {\n color: colors.textSecondary,\n fontWeight: '400',\n },\n storageRowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: LAYOUT.iconGap,\n },\n iconButton: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\n },\n iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\n },\n itemRow: {\n minHeight: LAYOUT.rowMinHeight,\n paddingHorizontal: LAYOUT.padding,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.borderLight,\n backgroundColor: colors.background,\n marginHorizontal: LAYOUT.padding,\n marginBottom: 4,\n },\n itemRowCollapsed: {\n flexDirection: 'row',\n alignItems: 'center',\n alignSelf: 'stretch',\n },\n itemKey: {\n flex: 1,\n fontSize: LAYOUT.fontSize,\n fontWeight: '500',\n color: colors.text,\n },\n itemChars: {\n fontSize: 12,\n color: colors.textSecondary,\n marginTop: 2,\n },\n itemRowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n marginLeft: LAYOUT.iconGap,\n gap: LAYOUT.iconGap,\n },\n itemRowExpanded: {\n paddingTop: 4,\n },\n valueBox: {\n backgroundColor: colors.backgroundSecondary,\n borderRadius: 8,\n padding: 12,\n marginTop: 8,\n marginBottom: 8,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: colors.border,\n },\n valueBoxLabel: {\n fontSize: 11,\n fontWeight: '600',\n color: colors.textSecondary,\n marginBottom: 4,\n textTransform: 'uppercase',\n },\n valueBoxText: {\n fontSize: LAYOUT.fontSize,\n color: colors.text,\n },\n empty: {\n padding: LAYOUT.padding * 2,\n alignItems: 'center',\n marginHorizontal: LAYOUT.padding,\n },\n emptyText: {\n fontSize: LAYOUT.fontSize,\n color: colors.textMuted,\n },\n loading: {\n padding: LAYOUT.padding * 2,\n alignItems: 'center',\n marginHorizontal: LAYOUT.padding,\n },\n loadingText: {\n fontSize: LAYOUT.fontSize,\n color: colors.textSecondary,\n },\n error: {\n padding: LAYOUT.padding,\n backgroundColor: colors.backgroundTertiary,\n marginHorizontal: LAYOUT.padding,\n marginVertical: 8,\n borderRadius: 8,\n },\n errorText: {\n fontSize: LAYOUT.fontSize,\n color: colors.text,\n },\n keychainHint: {\n padding: LAYOUT.padding,\n marginHorizontal: LAYOUT.padding,\n marginTop: 8,\n marginBottom: 4,\n backgroundColor: colors.backgroundSecondary,\n borderRadius: 8,\n },\n keychainHintText: {\n fontSize: LAYOUT.fontSize - 1,\n color: colors.textSecondary,\n },\n list: {\n flex: 1,\n },\n listContent: {\n flexGrow: 1,\n paddingBottom: LAYOUT.fabSize + LAYOUT.padding + 20,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n minHeight: LAYOUT.rowMinHeight,\n paddingHorizontal: LAYOUT.padding,\n paddingVertical: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: colors.borderLight,\n backgroundColor: colors.background,\n marginHorizontal: LAYOUT.padding,\n },\n rowKey: {\n flex: 1,\n fontSize: LAYOUT.fontSize,\n fontWeight: '500',\n color: colors.text,\n },\n rowValue: {\n fontSize: LAYOUT.fontSize - 1,\n color: colors.textSecondary,\n },\n rowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n marginLeft: LAYOUT.iconGap,\n gap: LAYOUT.iconGap,\n },\n rowButton: {\n paddingVertical: 8,\n paddingHorizontal: 12,\n },\n rowButtonText: {\n fontSize: 14,\n fontWeight: '600',\n color: colors.text,\n },\n rowButtonDanger: {\n color: colors.text,\n },\n addButton: {\n position: 'absolute',\n bottom: LAYOUT.padding + 16,\n right: LAYOUT.padding + 16,\n width: LAYOUT.fabSize,\n height: LAYOUT.fabSize,\n borderRadius: LAYOUT.fabSize / 2,\n backgroundColor: colors.text,\n alignItems: 'center',\n justifyContent: 'center',\n },\n addButtonText: {\n fontSize: 16,\n fontWeight: '600',\n color: colors.inverted,\n },\n fab: {\n position: 'absolute',\n bottom: LAYOUT.padding + 16,\n right: LAYOUT.padding + 16,\n width: LAYOUT.fabSize,\n height: LAYOUT.fabSize,\n borderRadius: LAYOUT.fabSize / 2,\n backgroundColor: colors.text,\n alignItems: 'center',\n justifyContent: 'center',\n },\n formOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'flex-end',\n alignItems: 'center',\n },\n formModal: {\n width: '100%',\n maxWidth: LAYOUT.screenWidth,\n backgroundColor: colors.background,\n borderTopLeftRadius: LAYOUT.modalRadius,\n borderTopRightRadius: LAYOUT.modalRadius,\n padding: LAYOUT.padding,\n paddingBottom: LAYOUT.padding + 34,\n },\n formHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: LAYOUT.padding,\n },\n formTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: colors.text,\n flex: 1,\n },\n formCloseButton: {\n width: 44,\n height: 44,\n alignItems: 'flex-end',\n justifyContent: 'center',\n },\n formStorageType: {\n fontSize: 13,\n color: colors.textSecondary,\n marginBottom: 12,\n },\n formLabel: {\n fontSize: 12,\n fontWeight: '600',\n color: colors.textSecondary,\n marginBottom: 6,\n },\n formInput: {\n borderWidth: 1,\n borderColor: colors.border,\n borderRadius: 10,\n padding: 12,\n fontSize: LAYOUT.fontSize,\n marginBottom: LAYOUT.padding,\n color: colors.text,\n backgroundColor: colors.background,\n },\n formInputDisabled: {\n backgroundColor: colors.backgroundSecondary,\n color: colors.textSecondary,\n },\n formActions: {\n flexDirection: 'row',\n justifyContent: 'flex-end',\n gap: 12,\n marginTop: 8,\n },\n formButton: {\n paddingVertical: 12,\n paddingHorizontal: 20,\n borderRadius: 10,\n minWidth: 100,\n alignItems: 'center',\n },\n formButtonCancel: {\n backgroundColor: 'transparent',\n borderWidth: 1,\n borderColor: colors.text,\n },\n formButtonSubmit: {\n backgroundColor: colors.text,\n },\n formButtonText: {\n fontSize: 16,\n fontWeight: '600',\n },\n formButtonTextCancel: {\n color: colors.text,\n },\n formButtonTextSubmit: {\n color: colors.inverted,\n },\n confirmOverlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'flex-end',\n alignItems: 'center',\n },\n confirmModal: {\n width: '100%',\n maxWidth: LAYOUT.screenWidth,\n backgroundColor: colors.background,\n borderTopLeftRadius: LAYOUT.modalRadius,\n borderTopRightRadius: LAYOUT.modalRadius,\n padding: LAYOUT.padding,\n paddingBottom: LAYOUT.padding + 34,\n },\n confirmHeader: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 12,\n },\n confirmTitle: {\n fontSize: 17,\n fontWeight: '600',\n color: colors.text,\n flex: 1,\n },\n confirmMessage: {\n fontSize: 15,\n color: colors.textSecondary,\n lineHeight: 22,\n marginBottom: 20,\n },\n confirmActions: {\n flexDirection: 'row',\n gap: 12,\n },\n confirmButton: {\n flex: 1,\n paddingVertical: 14,\n borderRadius: 10,\n alignItems: 'center',\n },\n confirmButtonSecondary: {\n backgroundColor: 'transparent',\n borderWidth: 1,\n borderColor: colors.text,\n },\n confirmButtonDanger: {\n backgroundColor: colors.text,\n },\n confirmButtonText: {\n fontSize: 16,\n fontWeight: '600',\n },\n confirmButtonTextSecondary: {\n color: colors.text,\n },\n confirmButtonTextDanger: {\n color: colors.inverted,\n },\n});\n","import React from 'react';\nimport { TouchableOpacity, StyleSheet, ViewStyle } from 'react-native';\nimport type { IconName } from '@/components/Icon';\nimport { Icon } from '@/components/Icon';\nimport { theme } from '@/theme';\nimport { LAYOUT } from '@/constants';\nimport { styles as sharedStyles } from '@/components/styles';\n\nexport interface IconButtonProps {\n name: IconName;\n onPress: () => void;\n size?: number;\n tintColor?: string;\n disabled?: boolean;\n hitSlop?: { top: number; bottom: number; left: number; right: number };\n style?: ViewStyle;\n activeOpacity?: number;\n}\n\nexport function IconButton({\n name,\n onPress,\n size = LAYOUT.iconSize,\n tintColor = theme.colors.text,\n disabled = false,\n hitSlop = LAYOUT.hitSlop,\n style,\n activeOpacity = 0.6,\n}: IconButtonProps) {\n return (\n <TouchableOpacity\n style={[sharedStyles.iconButton, style]}\n onPress={onPress}\n disabled={disabled}\n hitSlop={hitSlop}\n activeOpacity={activeOpacity}\n >\n <Icon\n name={name}\n size={size}\n tintColor={disabled ? theme.colors.textMuted : tintColor}\n />\n </TouchableOpacity>\n );\n}\n","/**\n * Centralized user-facing text for the storage inspector.\n * Enables localization and consistent messaging.\n */\nexport const strings = {\n // StorageInspector\n noAdapterAvailable:\n 'No storage adapter available. Install at least one of: react-native-mmkv, @react-native-async-storage/async-storage, react-native-keychain, expo-secure-store',\n\n // StorageSection\n keychainHint:\n 'No generic password items yet. Add a key using + above, or pass keychainKeys for internet credentials.',\n secureStoreHint:\n 'Secure Store has no list API. Pass secureStoreKeys prop with known keys, or add a key using + above.',\n loading: 'Loading…',\n noItems: 'No items',\n valueLabel: 'Value',\n emptyValue: '(empty)',\n charCount: (n: number) => (n === 1 ? '1 char' : `${n} chars`),\n deleteItemTitle: (key: string) => `Delete ${key}?`,\n deleteItemMessage: (key: string) =>\n `This will permanently delete the ${key} storage item. Do you wish to continue?`,\n clearAllTitle: (name: string) => `Clear All ${name}?`,\n clearAllMessage: (count: number, name: string) =>\n `This will permanently delete all ${count} ${name} items. Do you wish to continue?`,\n\n // StorageList\n storageNotAvailable: 'This storage is not available.',\n keychainHintShort:\n 'No items yet. Add a key below, or pass keychainKeys for internet credentials.',\n edit: 'Edit',\n delete: 'Delete',\n addItem: 'Add item',\n\n // ItemForm\n keyRequired: 'Key is required',\n saveFailed: 'Save failed',\n editItemTitle: (key: string) => `Edit ${key}`,\n addItemTitle: (storageName: string) => `Add ${storageName} Item`,\n storageTypeLabel: (name: string) => `Storage Type: ${name}`,\n keyLabel: 'Key',\n enterKeyPlaceholder: 'Enter key',\n enterValuePlaceholder: 'Enter value',\n cancel: 'Cancel',\n saving: 'Saving…',\n save: 'Save',\n add: 'Add',\n\n // ConfirmModal defaults\n confirmDelete: 'Yes, delete',\n cancelKeep: 'No, keep it',\n} as const;\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, TextInput, TouchableOpacity, Modal } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { LAYOUT } from '@/constants';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\n\nexport interface ItemFormProps {\n visible: boolean;\n storageName: string;\n editingItem: StorageItem | null;\n onSave: (key: string, value: string) => Promise<void>;\n onCancel: () => void;\n}\n\nexport function ItemForm({\n visible,\n storageName,\n editingItem,\n onSave,\n onCancel,\n}: ItemFormProps) {\n const [key, setKey] = useState('');\n const [value, setValue] = useState('');\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const isEdit = editingItem !== null;\n\n useEffect(() => {\n if (visible) {\n setKey(editingItem?.key ?? '');\n setValue(editingItem?.value ?? '');\n setError(null);\n }\n }, [visible, editingItem]);\n\n const handleSubmit = async () => {\n const k = key.trim();\n if (!k) {\n setError(strings.keyRequired);\n return;\n }\n setSaving(true);\n setError(null);\n try {\n await onSave(k, value);\n onCancel();\n } catch (e) {\n setError(e instanceof Error ? e.message : strings.saveFailed);\n } finally {\n setSaving(false);\n }\n };\n\n const title = isEdit\n ? strings.editItemTitle(editingItem?.key ?? '')\n : strings.addItemTitle(storageName);\n\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onCancel}>\n <View style={styles.formOverlay}>\n <TouchableOpacity\n style={{ flex: 1, width: '100%' }}\n activeOpacity={1}\n onPress={onCancel}\n />\n <View style={styles.formModal}>\n <View style={styles.formHeader}>\n <Text style={styles.formTitle} numberOfLines={1}>\n {title}\n </Text>\n <IconButton\n name=\"close\"\n onPress={onCancel}\n size={24}\n tintColor={theme.colors.textSecondary}\n style={styles.formCloseButton}\n hitSlop={LAYOUT.hitSlopLarge}\n />\n </View>\n <Text style={styles.formStorageType}>\n {strings.storageTypeLabel(storageName)}\n </Text>\n <Text style={styles.formLabel}>{strings.keyLabel}</Text>\n <TextInput\n style={[styles.formInput, isEdit && styles.formInputDisabled]}\n value={key}\n onChangeText={setKey}\n placeholder={strings.enterKeyPlaceholder}\n placeholderTextColor={theme.colors.textMuted}\n editable={!isEdit}\n autoCapitalize=\"none\"\n multiline\n />\n <Text style={styles.formLabel}>{strings.valueLabel}</Text>\n <TextInput\n style={styles.formInput}\n value={value}\n onChangeText={setValue}\n placeholder={strings.enterValuePlaceholder}\n placeholderTextColor={theme.colors.textMuted}\n multiline\n numberOfLines={3}\n />\n {error ? (\n <Text style={[styles.errorText, { marginBottom: 12 }]}>{error}</Text>\n ) : null}\n <View style={styles.formActions}>\n <TouchableOpacity\n style={[styles.formButton, styles.formButtonCancel]}\n onPress={onCancel}\n disabled={saving}\n >\n <Text style={[styles.formButtonText, styles.formButtonTextCancel]}>\n {strings.cancel}\n </Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[styles.formButton, styles.formButtonSubmit]}\n onPress={handleSubmit}\n disabled={saving}\n >\n <Text style={[styles.formButtonText, styles.formButtonTextSubmit]}>\n {saving ? strings.saving : isEdit ? strings.save : strings.add}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </Modal>\n );\n}\n","import React from 'react';\nimport { View, Text, Modal, TouchableOpacity } from 'react-native';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { LAYOUT } from '@/constants';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\n\nexport interface ConfirmModalProps {\n visible: boolean;\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n danger?: boolean;\n onConfirm: () => void | Promise<void>;\n onCancel: () => void;\n}\n\nexport function ConfirmModal({\n visible,\n title,\n message,\n confirmLabel = strings.confirmDelete,\n cancelLabel = strings.cancelKeep,\n danger = true,\n onConfirm,\n onCancel,\n}: ConfirmModalProps) {\n const handleConfirm = () => {\n void Promise.resolve(onConfirm());\n };\n\n return (\n <Modal visible={visible} transparent animationType=\"slide\" onRequestClose={onCancel}>\n <View style={styles.confirmOverlay}>\n <TouchableOpacity\n style={{ flex: 1, width: '100%' }}\n activeOpacity={1}\n onPress={onCancel}\n />\n <View style={styles.confirmModal}>\n <View style={styles.confirmHeader}>\n <Text style={styles.confirmTitle}>{title}</Text>\n <IconButton\n name=\"close\"\n onPress={onCancel}\n size={24}\n tintColor={theme.colors.textSecondary}\n style={styles.formCloseButton}\n hitSlop={LAYOUT.hitSlopLarge}\n />\n </View>\n <Text style={styles.confirmMessage}>{message}</Text>\n <View style={styles.confirmActions}>\n <TouchableOpacity\n style={[styles.confirmButton, styles.confirmButtonSecondary]}\n onPress={onCancel}\n >\n <Text style={[styles.confirmButtonText, styles.confirmButtonTextSecondary]}>\n {cancelLabel}\n </Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[\n styles.confirmButton,\n danger ? styles.confirmButtonDanger : styles.formButtonSubmit,\n ]}\n onPress={handleConfirm}\n >\n <Text\n style={[\n styles.confirmButtonText,\n danger ? styles.confirmButtonTextDanger : styles.formButtonTextSubmit,\n ]}\n >\n {confirmLabel}\n </Text>\n </TouchableOpacity>\n </View>\n </View>\n </View>\n </Modal>\n );\n}\n","import React from 'react';\nimport { View } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { theme } from '@/theme';\nimport { LAYOUT } from '@/constants';\n\nexport interface ItemRowActionsProps {\n item: StorageItem;\n onCopy: (item: StorageItem) => void;\n onEdit: (item: StorageItem) => void;\n onDelete: (item: StorageItem) => void;\n showChevron?: boolean;\n chevronDirection?: 'up' | 'down';\n}\n\nexport function ItemRowActions({\n item,\n onCopy,\n onEdit,\n onDelete,\n showChevron = false,\n chevronDirection = 'down',\n}: ItemRowActionsProps) {\n return (\n <View style={styles.itemRowActions}>\n <IconButton name=\"copy\" onPress={() => onCopy(item)} />\n <IconButton name=\"edit\" onPress={() => onEdit(item)} />\n <IconButton name=\"trash\" onPress={() => onDelete(item)} />\n {showChevron && (\n <View style={styles.iconSlot}>\n <Icon\n name={chevronDirection === 'up' ? 'chevronUp' : 'chevronDown'}\n size={LAYOUT.chevronSize}\n tintColor={theme.colors.text}\n />\n </View>\n )}\n </View>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, TouchableOpacity, Share } from 'react-native';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport type { StorageItem } from '@/adapters/types';\nimport { useStorageItems } from '@/hooks/useStorageItems';\nimport { ItemForm } from '@/components/ItemForm';\nimport { ConfirmModal } from '@/components/ConfirmModal';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\nimport { ItemRowActions } from '@/components/ItemRowActions';\nimport { styles } from '@/components/styles';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageSectionProps {\n key?: React.Key;\n adapter: IStorageAdapter;\n keychainKeys?: string[];\n onKeychainKeyAdded?: (key: string) => void;\n onSecureStoreKeyAdded?: (key: string) => void;\n defaultExpanded?: boolean;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n refreshTrigger?: number;\n}\n\nexport function StorageSection({\n adapter,\n keychainKeys,\n onKeychainKeyAdded,\n onSecureStoreKeyAdded,\n defaultExpanded = true,\n expanded: expandedProp,\n onToggleExpanded,\n refreshTrigger,\n}: StorageSectionProps) {\n const { items, loading, error, refresh } = useStorageItems(adapter);\n const [expandedInternal, setExpandedInternal] = useState(defaultExpanded);\n const expanded = expandedProp !== undefined ? expandedProp : expandedInternal;\n\n const handleToggleExpanded = () => {\n if (onToggleExpanded) onToggleExpanded();\n else setExpandedInternal((p: boolean) => !p);\n };\n\n useEffect(() => {\n if (refreshTrigger !== undefined) refresh();\n }, [refreshTrigger, refresh]);\n\n const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());\n const [formVisible, setFormVisible] = useState(false);\n const [editingItem, setEditingItem] = useState<StorageItem | null>(null);\n const [deleteItem, setDeleteItem] = useState<StorageItem | null>(null);\n const [clearAllVisible, setClearAllVisible] = useState(false);\n\n const handleAdd = () => {\n setEditingItem(null);\n setFormVisible(true);\n };\n\n const handleEdit = (item: StorageItem) => {\n setEditingItem(item);\n setFormVisible(true);\n };\n\n const handleSave = async (key: string, value: string) => {\n const isNewKey = !editingItem || editingItem.key !== key;\n await adapter.setItem(key, value);\n if (adapter.type === 'keychain' && isNewKey) {\n onKeychainKeyAdded?.(key);\n }\n if (adapter.type === 'expo-secure-store' && isNewKey) {\n onSecureStoreKeyAdded?.(key);\n }\n await refresh();\n };\n\n const handleDeleteItem = async () => {\n if (deleteItem) {\n await adapter.removeItem(deleteItem.key);\n setDeleteItem(null);\n await refresh();\n }\n };\n\n const handleClearAll = async () => {\n for (const item of items) {\n await adapter.removeItem(item.key);\n }\n setClearAllVisible(false);\n await refresh();\n };\n\n const handleCopy = async (item: StorageItem) => {\n try {\n await Share.share({\n message: item.value,\n title: item.key,\n });\n } catch {\n // Share cancelled or not available\n }\n };\n\n const isKeychain = adapter.type === 'keychain';\n const isSecureStore = adapter.type === 'expo-secure-store';\n const showKeychainHint =\n isKeychain && items.length === 0 && (keychainKeys?.length ?? 0) === 0;\n const showSecureStoreHint = isSecureStore && items.length === 0;\n\n if (!adapter.isAvailable()) return null;\n\n return (\n <>\n <TouchableOpacity\n style={styles.sectionHeader}\n onPress={handleToggleExpanded}\n activeOpacity={0.7}\n >\n <View style={styles.sectionHeaderLabelWrap}>\n <Text style={styles.sectionHeaderLabel}>\n {adapter.name}\n <Text style={styles.sectionHeaderCount}> ({items.length})</Text>\n </Text>\n </View>\n <View style={styles.storageRowActions}>\n <IconButton name=\"plus\" onPress={handleAdd} />\n <IconButton\n name=\"trash\"\n onPress={() => items.length > 0 && setClearAllVisible(true)}\n disabled={items.length === 0}\n />\n <View style={styles.iconSlot}>\n <Icon\n name={expanded ? 'chevronUp' : 'chevronDown'}\n size={LAYOUT.chevronSize}\n tintColor={theme.colors.text}\n />\n </View>\n </View>\n </TouchableOpacity>\n\n {expanded && (\n <>\n {showKeychainHint ? (\n <View style={styles.keychainHint}>\n <Text style={styles.keychainHintText}>{strings.keychainHint}</Text>\n </View>\n ) : null}\n {showSecureStoreHint ? (\n <View style={styles.keychainHint}>\n <Text style={styles.keychainHintText}>{strings.secureStoreHint}</Text>\n </View>\n ) : null}\n {error ? (\n <View style={styles.error}>\n <Text style={styles.errorText}>{error}</Text>\n </View>\n ) : null}\n {loading ? (\n <View style={styles.loading}>\n <Text style={styles.loadingText}>{strings.loading}</Text>\n </View>\n ) : (\n items.map((item) => {\n const isItemExpanded = expandedKeys.has(item.key);\n const charCount = item.value.length;\n const toggleItemExpanded = () => {\n setExpandedKeys((prev: Set<string>) => {\n const next = new Set(prev);\n if (next.has(item.key)) next.delete(item.key);\n else next.add(item.key);\n return next;\n });\n };\n return (\n <View key={item.key} style={styles.itemRow}>\n <TouchableOpacity\n key={item.key}\n onPress={toggleItemExpanded}\n activeOpacity={0.7}\n >\n <View style={styles.itemRowCollapsed}>\n <View style={{ flex: 1 }}>\n <Text style={styles.itemKey} numberOfLines={1}>\n {item.key}\n </Text>\n <Text style={styles.itemChars}>\n {strings.charCount(charCount)}\n </Text>\n </View>\n {!isItemExpanded ? (\n <ItemRowActions\n item={item}\n onCopy={handleCopy}\n onEdit={handleEdit}\n onDelete={setDeleteItem}\n showChevron\n chevronDirection=\"down\"\n />\n ) : (\n <View style={styles.iconSlot}>\n <Icon\n name=\"chevronUp\"\n size={LAYOUT.chevronSize}\n tintColor={theme.colors.text}\n />\n </View>\n )}\n </View>\n </TouchableOpacity>\n {isItemExpanded && (\n <View style={styles.itemRowExpanded}>\n <TouchableOpacity\n onPress={() => handleEdit(item)}\n style={styles.valueBox}\n >\n <Text style={styles.valueBoxLabel}>{strings.valueLabel}</Text>\n <Text style={styles.valueBoxText} selectable>\n {item.value || strings.emptyValue}\n </Text>\n </TouchableOpacity>\n <ItemRowActions\n item={item}\n onCopy={handleCopy}\n onEdit={handleEdit}\n onDelete={setDeleteItem}\n />\n </View>\n )}\n </View>\n );\n })\n )}\n {!loading && items.length === 0 && !showKeychainHint && !showSecureStoreHint ? (\n <View style={styles.empty}>\n <Text style={styles.emptyText}>{strings.noItems}</Text>\n </View>\n ) : null}\n </>\n )}\n\n <ItemForm\n visible={formVisible}\n storageName={adapter.name}\n editingItem={editingItem}\n onSave={handleSave}\n onCancel={() => {\n setFormVisible(false);\n setEditingItem(null);\n }}\n />\n\n <ConfirmModal\n visible={deleteItem !== null}\n title={strings.deleteItemTitle(deleteItem?.key ?? '')}\n message={strings.deleteItemMessage(deleteItem?.key ?? '')}\n onConfirm={handleDeleteItem}\n onCancel={() => setDeleteItem(null)}\n />\n\n <ConfirmModal\n visible={clearAllVisible}\n title={strings.clearAllTitle(adapter.name)}\n message={strings.clearAllMessage(items.length, adapter.name)}\n onConfirm={handleClearAll}\n onCancel={() => setClearAllVisible(false)}\n />\n </>\n );\n}\n","import React, { useMemo, useState } from 'react';\nimport { View, Text, ScrollView, RefreshControl } from 'react-native';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport { createMMKVAdapter } from '@/adapters/mmkv';\nimport {\n createAsyncStorageAdapter,\n type AsyncStorageModule,\n} from '@/adapters/async-storage';\nimport { createKeychainAdapter, type KeychainModule } from '@/adapters/keychain';\nimport {\n createSecureStoreAdapter,\n type SecureStoreModule,\n} from '@/adapters/secure-store';\nimport { StorageSection } from '@/components/StorageSection';\nimport { IconButton } from '@/components/IconButton';\nimport { styles } from '@/components/styles';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\n\nexport interface StorageInspectorProps {\n mmkvInstances?: Array<{\n getAllKeys(): string[];\n getString(k: string): string | undefined;\n set(k: string, v: string | number | boolean): void;\n delete(k: string): void;\n }>;\n /** Pass AsyncStorage to avoid Metro \"unknown module\" in Expo. */\n asyncStorageInstance?: AsyncStorageModule | null;\n keychainKeys?: string[];\n /** Pass Keychain module to avoid Metro \"unknown module\" in Expo. */\n keychainInstance?: KeychainModule | null;\n secureStoreKeys?: string[];\n /** Pass SecureStore module to avoid Metro \"unknown module\" in Expo. */\n secureStoreInstance?: SecureStoreModule | null;\n customAdapters?: IStorageAdapter[];\n}\n\nexport function StorageInspector({\n mmkvInstances = [],\n asyncStorageInstance,\n keychainKeys: keychainKeysProp,\n keychainInstance,\n secureStoreKeys: secureStoreKeysProp,\n secureStoreInstance,\n customAdapters = [],\n}: StorageInspectorProps) {\n const [keychainKeysAdded, setKeychainKeysAdded] = useState<string[]>([]);\n const [secureStoreKeysAdded, setSecureStoreKeysAdded] = useState<string[]>([]);\n const [refreshKey, setRefreshKey] = useState(0);\n const [refreshing, setRefreshing] = useState(false);\n const [expandedIndices, setExpandedIndices] = useState<Set<number>>(() => new Set([0]));\n\n const keychainKeys = useMemo(\n () => [...(keychainKeysProp ?? []), ...keychainKeysAdded],\n [keychainKeysProp, keychainKeysAdded]\n );\n\n const secureStoreKeys = useMemo(\n () => [...(secureStoreKeysProp ?? []), ...secureStoreKeysAdded],\n [secureStoreKeysProp, secureStoreKeysAdded]\n );\n\n const adapters = useMemo(() => {\n const list: IStorageAdapter[] = [];\n\n mmkvInstances.forEach((inst, i) => {\n list.push(\n createMMKVAdapter(inst, mmkvInstances.length > 1 ? `MMKV ${i + 1}` : 'MMKV')\n );\n });\n\n const asyncAdapter = createAsyncStorageAdapter(asyncStorageInstance);\n if (asyncAdapter.isAvailable()) list.push(asyncAdapter);\n\n const keychainAdapter = createKeychainAdapter(keychainKeys, keychainInstance);\n if (keychainAdapter.isAvailable()) list.push(keychainAdapter);\n\n const secureStoreAdapter = createSecureStoreAdapter(\n secureStoreKeys,\n secureStoreInstance\n );\n if (secureStoreAdapter.isAvailable()) list.push(secureStoreAdapter);\n\n list.push(...customAdapters);\n return list;\n }, [\n mmkvInstances,\n asyncStorageInstance,\n keychainKeys,\n keychainInstance,\n secureStoreKeys,\n secureStoreInstance,\n customAdapters,\n ]);\n\n const handleKeychainKeyAdded = (key: string) => {\n setKeychainKeysAdded((prev: string[]) =>\n prev.includes(key) ? prev : [...prev, key]\n );\n };\n\n const handleSecureStoreKeyAdded = (key: string) => {\n setSecureStoreKeysAdded((prev: string[]) =>\n prev.includes(key) ? prev : [...prev, key]\n );\n };\n\n const handleRefresh = () => {\n setRefreshing(true);\n setRefreshKey((k: number) => k + 1);\n setTimeout(() => setRefreshing(false), 400);\n };\n\n return (\n <View style={styles.container}>\n <View style={styles.content}>\n {adapters.length > 0 ? (\n <>\n <ScrollView\n style={styles.scroll}\n contentContainerStyle={styles.scrollContent}\n keyboardShouldPersistTaps=\"handled\"\n showsVerticalScrollIndicator\n refreshControl={\n <RefreshControl refreshing={refreshing} onRefresh={handleRefresh} />\n }\n >\n {adapters.map((adapter: IStorageAdapter, index: number) => (\n <StorageSection\n key={`${adapter.type}-${index}`}\n adapter={adapter}\n keychainKeys={keychainKeysProp}\n onKeychainKeyAdded={handleKeychainKeyAdded}\n onSecureStoreKeyAdded={handleSecureStoreKeyAdded}\n expanded={expandedIndices.has(index)}\n onToggleExpanded={() => {\n setExpandedIndices((prev) => {\n const next = new Set(prev);\n if (next.has(index)) next.delete(index);\n else next.add(index);\n return next;\n });\n }}\n refreshTrigger={refreshKey}\n />\n ))}\n </ScrollView>\n\n <IconButton\n name=\"refresh\"\n onPress={handleRefresh}\n size={24}\n tintColor={theme.colors.inverted}\n style={styles.fab}\n activeOpacity={0.85}\n />\n </>\n ) : (\n <View style={styles.empty}>\n <Text style={styles.emptyText}>{strings.noAdapterAvailable}</Text>\n </View>\n )}\n </View>\n </View>\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-storage-inspector",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Storage inspector for React Native and Expo: MMKV, AsyncStorage, Keychain, Expo Secure Store",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -37,6 +37,10 @@
|
|
|
37
37
|
"url": "https://github.com/Ajaymaurya1008/react-native-storage-inspector/issues"
|
|
38
38
|
},
|
|
39
39
|
"homepage": "https://github.com/Ajaymaurya1008/react-native-storage-inspector#readme",
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public",
|
|
42
|
+
"provenance": true
|
|
43
|
+
},
|
|
40
44
|
"peerDependencies": {
|
|
41
45
|
"react": "*",
|
|
42
46
|
"react-native": "*"
|