react-native-storage-inspector 1.0.3 → 1.0.5
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/README.md +27 -60
- package/dist/index.d.mts +12 -15
- package/dist/index.d.ts +12 -15
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +16 -3
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# react-native-storage-inspector
|
|
2
2
|
|
|
3
|
-
react-native-storage-inspector is a plug-and-play developer tool that empowers you to browse, search, and edit all your app
|
|
3
|
+
react-native-storage-inspector is a plug-and-play developer tool that empowers you to browse, search, and edit all your app's persisted data.
|
|
4
4
|
|
|
5
5
|
## Supported libraries
|
|
6
6
|
|
|
@@ -15,22 +15,13 @@ Tabs appear only when the corresponding package is installed (optional peer depe
|
|
|
15
15
|
|
|
16
16
|
## Installation
|
|
17
17
|
|
|
18
|
-
Install the inspector and at least one storage library you use:
|
|
19
|
-
|
|
20
18
|
```bash
|
|
21
19
|
npm install react-native-storage-inspector
|
|
22
|
-
# And one or more:
|
|
23
|
-
npm install react-native-mmkv
|
|
24
|
-
npm install @react-native-async-storage/async-storage
|
|
25
|
-
npm install react-native-keychain
|
|
26
|
-
npm install expo-secure-store
|
|
27
20
|
```
|
|
28
21
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
Use `StorageInspector` as a **full-page component**. It renders only the content area, no header, back button, or status bar. The consumer screen must handle those.
|
|
22
|
+
Then install one or more storage libraries above. See [Installation docs](website/docs/installation.md) for yarn/pnpm and peer dependency notes.
|
|
32
23
|
|
|
33
|
-
|
|
24
|
+
## Usage
|
|
34
25
|
|
|
35
26
|
```tsx
|
|
36
27
|
import { SafeAreaView } from 'react-native';
|
|
@@ -45,71 +36,47 @@ export function StorageInspectorScreen() {
|
|
|
45
36
|
}
|
|
46
37
|
```
|
|
47
38
|
|
|
48
|
-
The component fills its container.
|
|
49
|
-
|
|
50
|
-
### Props
|
|
51
|
-
|
|
52
|
-
| Prop | Type | Description |
|
|
53
|
-
| ----------------- | ------------------- | ------------------------------------------------------------------------------------------------- |
|
|
54
|
-
| `mmkvInstances` | `MMKV[]` | **Required for MMKV.** Pass your MMKV instances to inspect. |
|
|
55
|
-
| `secureStoreKeys` | `string[]` | Optional. Known keys for Secure Store (no list API). Merged with keys persisted by the inspector. |
|
|
56
|
-
| `customAdapters` | `IStorageAdapter[]` | Optional. Custom adapters for other storages. |
|
|
57
|
-
|
|
58
|
-
## Expo
|
|
39
|
+
The component fills its container. Wrap with `SafeAreaView` and provide a header/back button via your navigation setup.
|
|
59
40
|
|
|
60
|
-
|
|
61
|
-
- **Development build**: All four storages work with `expo-dev-client`.
|
|
41
|
+
For full usage, props, Expo support, custom adapters, and troubleshooting: see the **[Documentation](#documentation)** section below.
|
|
62
42
|
|
|
63
|
-
##
|
|
43
|
+
## Documentation
|
|
64
44
|
|
|
65
|
-
|
|
45
|
+
Full docs are built with [Docusaurus](https://docusaurus.io) and cover installation, usage, all supported storages, API reference, Expo, custom adapters, troubleshooting, and examples:
|
|
66
46
|
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
const config = getDefaultConfig(__dirname);
|
|
70
|
-
config.transformer ??= {};
|
|
71
|
-
config.transformer.allowOptionalDependencies = true;
|
|
72
|
-
module.exports = config;
|
|
47
|
+
```bash
|
|
48
|
+
cd website && npm install && npm run start
|
|
73
49
|
```
|
|
74
50
|
|
|
75
|
-
|
|
51
|
+
Key pages (also readable as Markdown in [`website/docs/`](website/docs/)):
|
|
76
52
|
|
|
77
|
-
|
|
53
|
+
| Topic | File |
|
|
54
|
+
| --------------- | ------------------------------------------------------------------ |
|
|
55
|
+
| Installation | [website/docs/installation.md](website/docs/installation.md) |
|
|
56
|
+
| Usage & props | [website/docs/usage.md](website/docs/usage.md) |
|
|
57
|
+
| Storages | [website/docs/storages/](website/docs/storages/) |
|
|
58
|
+
| API reference | [website/docs/api/](website/docs/api/) |
|
|
59
|
+
| Expo | [website/docs/expo.md](website/docs/expo.md) |
|
|
60
|
+
| Custom adapters | [website/docs/custom-adapters.md](website/docs/custom-adapters.md) |
|
|
61
|
+
| Troubleshooting | [website/docs/troubleshooting.md](website/docs/troubleshooting.md) |
|
|
62
|
+
| Examples | [website/docs/examples.md](website/docs/examples.md) |
|
|
78
63
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
name: string;
|
|
83
|
-
getAllKeys(): Promise<string[]>;
|
|
84
|
-
getItem(key: string): Promise<string | null>;
|
|
85
|
-
setItem(key: string, value: string): Promise<void>;
|
|
86
|
-
removeItem(key: string): Promise<void>;
|
|
87
|
-
isAvailable(): boolean;
|
|
88
|
-
}
|
|
89
|
-
```
|
|
64
|
+
## Development & Contributing
|
|
65
|
+
|
|
66
|
+
See [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md) for setup, git hooks, commit format, CI, and PR process.
|
|
90
67
|
|
|
91
|
-
|
|
68
|
+
Key commands:
|
|
92
69
|
|
|
93
70
|
```bash
|
|
71
|
+
npm run commit # Guided commit (Commitizen)
|
|
94
72
|
npm run format # Format all files with Prettier
|
|
95
|
-
npm run format:check # Check formatting (fails if any file is unformatted)
|
|
96
|
-
npm run lint # Same as format:check
|
|
97
73
|
npm test # Run tests
|
|
98
74
|
npm run build # Build src/ to dist/
|
|
99
75
|
```
|
|
100
76
|
|
|
101
|
-
|
|
102
|
-
- **Commits:** Use [Conventional Commits](https://www.conventionalcommits.org/) (enforced by `commit-msg` hook).
|
|
103
|
-
- **Before publish:** `prepublishOnly` runs `format:check`, `test`, and `build`.
|
|
104
|
-
|
|
105
|
-
### Publishing
|
|
106
|
-
|
|
107
|
-
1. Run `npm version patch` (or `minor`/`major`).
|
|
108
|
-
2. Run `npm publish` (prepublishOnly will run checks and build).
|
|
109
|
-
|
|
110
|
-
See [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md) for full guidelines. [Code of Conduct](docs/CODE_OF_CONDUCT.md).
|
|
77
|
+
Releases are automated by **semantic-release** on push to `main`. See [docs/RELEASES.md](docs/RELEASES.md).
|
|
111
78
|
|
|
112
|
-
For AI assistants:
|
|
79
|
+
[Code of Conduct](docs/CODE_OF_CONDUCT.md) · For AI assistants: [ai/PRIMER.md](ai/PRIMER.md)
|
|
113
80
|
|
|
114
81
|
## License
|
|
115
82
|
|
package/dist/index.d.mts
CHANGED
|
@@ -16,13 +16,18 @@ interface IStorageAdapter {
|
|
|
16
16
|
isAvailable(): boolean;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
/** Raw MMKV instance from createMMKV() (react-native-mmkv). */
|
|
20
|
+
type MMKVInstance = {
|
|
21
|
+
getAllKeys(): string[];
|
|
22
|
+
getString(key: string): string | undefined;
|
|
23
|
+
set(key: string, value: string | number | boolean): void;
|
|
24
|
+
remove(key: string): void | boolean;
|
|
25
|
+
};
|
|
26
|
+
declare function createMMKVAdapter(instance: MMKVInstance, name?: string): IStorageAdapter;
|
|
27
|
+
|
|
19
28
|
interface StorageInspectorProps {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
getString(k: string): string | undefined;
|
|
23
|
-
set(k: string, v: string | number | boolean): void;
|
|
24
|
-
delete(k: string): void;
|
|
25
|
-
}>;
|
|
29
|
+
/** Raw MMKV instances from createMMKV() (react-native-mmkv). */
|
|
30
|
+
mmkvInstances?: MMKVInstance[];
|
|
26
31
|
secureStoreKeys?: string[];
|
|
27
32
|
customAdapters?: IStorageAdapter[];
|
|
28
33
|
}
|
|
@@ -85,14 +90,6 @@ declare const theme: {
|
|
|
85
90
|
};
|
|
86
91
|
type Theme = typeof theme;
|
|
87
92
|
|
|
88
|
-
type MMKVInstance = {
|
|
89
|
-
getAllKeys(): string[];
|
|
90
|
-
getString(key: string): string | undefined;
|
|
91
|
-
set(key: string, value: string | number | boolean): void;
|
|
92
|
-
delete(key: string): void;
|
|
93
|
-
};
|
|
94
|
-
declare function createMMKVAdapter(instance: MMKVInstance, name?: string): IStorageAdapter;
|
|
95
|
-
|
|
96
93
|
/**
|
|
97
94
|
* AsyncStorage-compatible module interface.
|
|
98
95
|
*/
|
|
@@ -145,4 +142,4 @@ type SecureStoreModule = {
|
|
|
145
142
|
*/
|
|
146
143
|
declare function createSecureStoreAdapter(knownKeys?: string[]): IStorageAdapter;
|
|
147
144
|
|
|
148
|
-
export { type AsyncStorageModule, type IStorageAdapter, type KeychainModule, type SecureStoreModule, StorageInspector, type StorageInspectorProps, type StorageItem, type Theme, createAsyncStorageAdapter, createKeychainAdapter, createMMKVAdapter, createSecureStoreAdapter, strings, theme };
|
|
145
|
+
export { type AsyncStorageModule, type IStorageAdapter, type KeychainModule, type MMKVInstance, type SecureStoreModule, StorageInspector, type StorageInspectorProps, type StorageItem, type Theme, createAsyncStorageAdapter, createKeychainAdapter, createMMKVAdapter, createSecureStoreAdapter, strings, theme };
|
package/dist/index.d.ts
CHANGED
|
@@ -16,13 +16,18 @@ interface IStorageAdapter {
|
|
|
16
16
|
isAvailable(): boolean;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
/** Raw MMKV instance from createMMKV() (react-native-mmkv). */
|
|
20
|
+
type MMKVInstance = {
|
|
21
|
+
getAllKeys(): string[];
|
|
22
|
+
getString(key: string): string | undefined;
|
|
23
|
+
set(key: string, value: string | number | boolean): void;
|
|
24
|
+
remove(key: string): void | boolean;
|
|
25
|
+
};
|
|
26
|
+
declare function createMMKVAdapter(instance: MMKVInstance, name?: string): IStorageAdapter;
|
|
27
|
+
|
|
19
28
|
interface StorageInspectorProps {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
getString(k: string): string | undefined;
|
|
23
|
-
set(k: string, v: string | number | boolean): void;
|
|
24
|
-
delete(k: string): void;
|
|
25
|
-
}>;
|
|
29
|
+
/** Raw MMKV instances from createMMKV() (react-native-mmkv). */
|
|
30
|
+
mmkvInstances?: MMKVInstance[];
|
|
26
31
|
secureStoreKeys?: string[];
|
|
27
32
|
customAdapters?: IStorageAdapter[];
|
|
28
33
|
}
|
|
@@ -85,14 +90,6 @@ declare const theme: {
|
|
|
85
90
|
};
|
|
86
91
|
type Theme = typeof theme;
|
|
87
92
|
|
|
88
|
-
type MMKVInstance = {
|
|
89
|
-
getAllKeys(): string[];
|
|
90
|
-
getString(key: string): string | undefined;
|
|
91
|
-
set(key: string, value: string | number | boolean): void;
|
|
92
|
-
delete(key: string): void;
|
|
93
|
-
};
|
|
94
|
-
declare function createMMKVAdapter(instance: MMKVInstance, name?: string): IStorageAdapter;
|
|
95
|
-
|
|
96
93
|
/**
|
|
97
94
|
* AsyncStorage-compatible module interface.
|
|
98
95
|
*/
|
|
@@ -145,4 +142,4 @@ type SecureStoreModule = {
|
|
|
145
142
|
*/
|
|
146
143
|
declare function createSecureStoreAdapter(knownKeys?: string[]): IStorageAdapter;
|
|
147
144
|
|
|
148
|
-
export { type AsyncStorageModule, type IStorageAdapter, type KeychainModule, type SecureStoreModule, StorageInspector, type StorageInspectorProps, type StorageItem, type Theme, createAsyncStorageAdapter, createKeychainAdapter, createMMKVAdapter, createSecureStoreAdapter, strings, theme };
|
|
145
|
+
export { type AsyncStorageModule, type IStorageAdapter, type KeychainModule, type MMKVInstance, type SecureStoreModule, StorageInspector, type StorageInspectorProps, type StorageItem, type Theme, createAsyncStorageAdapter, createKeychainAdapter, createMMKVAdapter, createSecureStoreAdapter, strings, theme };
|
package/dist/index.js
CHANGED
|
@@ -31,7 +31,7 @@ function createMMKVAdapter(instance, name) {
|
|
|
31
31
|
return Promise.resolve();
|
|
32
32
|
},
|
|
33
33
|
removeItem(key) {
|
|
34
|
-
instance.
|
|
34
|
+
instance.remove(key);
|
|
35
35
|
return Promise.resolve();
|
|
36
36
|
},
|
|
37
37
|
isAvailable() {
|
|
@@ -104,7 +104,7 @@ function createKeychainAdapter() {
|
|
|
104
104
|
} catch {
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
|
-
return genericServices;
|
|
107
|
+
return [...new Set(genericServices)];
|
|
108
108
|
},
|
|
109
109
|
async getItem(key) {
|
|
110
110
|
const kc = getKc();
|
|
@@ -1071,7 +1071,7 @@ function StorageInspector(props) {
|
|
|
1071
1071
|
const secureStoreAdapter = createSecureStoreAdapter(secureStoreKeys ?? []);
|
|
1072
1072
|
if (secureStoreAdapter.isAvailable()) list.push(secureStoreAdapter);
|
|
1073
1073
|
list.push(...customAdapters);
|
|
1074
|
-
return list;
|
|
1074
|
+
return list.sort((a, b) => a.name.localeCompare(b.name));
|
|
1075
1075
|
}, [mmkvInstances, secureStoreKeys, customAdapters]);
|
|
1076
1076
|
const handleRefresh = () => {
|
|
1077
1077
|
setRefreshing(true);
|
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/utils.ts","../src/adapters/secure-store.ts","../src/hooks/useStorageItems.ts","../src/theme.ts","../src/components/Icon.tsx","../src/constants.ts","../src/components/IconButton.tsx","../src/strings.ts","../src/components/ItemForm.tsx","../src/components/ConfirmModal.tsx","../src/components/ItemRowActions.tsx","../src/components/StorageList.tsx","../src/components/StorageSection.tsx","../src/components/StorageInspector.tsx"],"names":["useState","useCallback","useEffect","React","Text","StyleSheet","Dimensions","TouchableOpacity","styles","Modal","View","TextInput","colors","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 */\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\n// Optional require; support both ESM (mod.default) and CJS (mod) so we always get the API object.\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.\n */\nexport function createAsyncStorageAdapter(): IStorageAdapter {\n const getStorage = () => 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(): boolean {\n return getAsyncStorageFromRequire() !== null;\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * Keychain-compatible module (generic password only).\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};\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 * Creates a Keychain adapter.\n */\nexport function createKeychainAdapter(): IStorageAdapter {\n const getKc = () => getKeychainFromRequire();\n return {\n type: 'keychain',\n name: 'Keychain',\n async getAllKeys(): Promise<string[]> {\n const kc = getKc();\n if (!kc) return [];\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\n }\n }\n\n return genericServices;\n },\n async getItem(key: string): Promise<string | null> {\n const kc = getKc();\n if (!kc?.getGenericPassword) return null;\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 // ignore\n }\n return null;\n },\n async setItem(key: string, value: string): Promise<void> {\n const kc = getKc();\n if (!kc?.setGenericPassword)\n throw new Error('react-native-keychain is not available');\n const result = await kc.setGenericPassword(key, value, { service: key });\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?.resetGenericPassword)\n throw new Error('react-native-keychain is not available');\n await kc.resetGenericPassword({ service: key });\n },\n isAvailable(): boolean {\n return getKc() !== null;\n },\n };\n}\n\nexport function isKeychainAvailable(): boolean {\n return getKeychainFromRequire() !== null;\n}\n","/**\n * Parses a string (JSON array) to string[]. Returns [] for null, empty,\n * invalid JSON, or when the value is not an array of strings.\n */\nexport function parsePersistedKeys(raw: string | null): string[] {\n if (raw == null || raw === '') return [];\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item): item is string => typeof item === 'string');\n } catch {\n return [];\n }\n}\n","import type { IStorageAdapter } from '@/adapters/types';\nimport { parsePersistedKeys } from '@/utils';\n\n/** Reserved key in Secure Store where we persist the list of keys (so it survives restart). */\nconst PERSISTED_KEYS_STORAGE_KEY = '__storage_inspector_secure_store_keys__';\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 * Creates a Secure Store adapter. Since expo-secure-store has no API to list all keys, we persist the list of keys in Secure Store.\n */\nexport function createSecureStoreAdapter(knownKeys: string[] = []): IStorageAdapter {\n const getStore = () => getSecureStoreFromRequire();\n return {\n type: 'expo-secure-store',\n name: 'Secure Store',\n async getAllKeys(): Promise<string[]> {\n const store = getStore();\n if (!store) return [];\n const persistedKeysString = await store.getItemAsync(PERSISTED_KEYS_STORAGE_KEY);\n const persistedKeys = parsePersistedKeys(persistedKeysString);\n return [...new Set([...knownKeys, ...persistedKeys])];\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 if (key === PERSISTED_KEYS_STORAGE_KEY) return;\n const persistedKeysString = await store.getItemAsync(PERSISTED_KEYS_STORAGE_KEY);\n const persistedKeys = parsePersistedKeys(persistedKeysString);\n const newPersistedKeys = [...new Set([...persistedKeys, key])];\n await store.setItemAsync(\n PERSISTED_KEYS_STORAGE_KEY,\n JSON.stringify(newPersistedKeys)\n );\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 const persistedKeysString = await store.getItemAsync(PERSISTED_KEYS_STORAGE_KEY);\n const persistedKeys = parsePersistedKeys(persistedKeysString);\n const newPersistedKeys = persistedKeys.filter((k) => k !== key);\n await store.setItemAsync(\n PERSISTED_KEYS_STORAGE_KEY,\n JSON.stringify(newPersistedKeys)\n );\n },\n isAvailable(): boolean {\n return getStore() !== null;\n },\n };\n}\n\nexport function isSecureStoreAvailable(): boolean {\n return 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 if (value === null) continue;\n pairs.push({ key, 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 overlayBackdrop: 'rgba(0,0,0,0.5)',\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(props: IconProps) {\n const { name, size = 20, tintColor = theme.colors.text, iconStyle } = props;\n\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 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';\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(props: IconButtonProps) {\n const {\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 } = props;\n\n return (\n <TouchableOpacity\n style={[styles.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\nconst styles = StyleSheet.create({\n iconButton: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\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: 'No generic password items yet. Add a key using + above.',\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 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: 'No items yet. Add a key below.',\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, StyleSheet } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { IconButton } from '@/components/IconButton';\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(props: ItemFormProps) {\n const { visible, storageName, editingItem, onSave, onCancel } = props;\n\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\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\n formOverlay: {\n flex: 1,\n backgroundColor: colors.overlayBackdrop,\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 errorText: {\n fontSize: LAYOUT.fontSize,\n color: colors.text,\n },\n});\n","import React from 'react';\nimport { View, Text, Modal, TouchableOpacity, StyleSheet } from 'react-native';\nimport { IconButton } from '@/components/IconButton';\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(props: ConfirmModalProps) {\n const {\n visible,\n title,\n message,\n confirmLabel = strings.confirmDelete,\n cancelLabel = strings.cancelKeep,\n danger = true,\n onConfirm,\n onCancel,\n } = props;\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={onConfirm}\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\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\n confirmOverlay: {\n flex: 1,\n backgroundColor: colors.overlayBackdrop,\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 formCloseButton: {\n width: 44,\n height: 44,\n alignItems: 'flex-end',\n justifyContent: 'center',\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 formButtonSubmit: {\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 formButtonTextSubmit: {\n color: colors.inverted,\n },\n});\n","import React from 'react';\nimport { View, StyleSheet } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\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(props: ItemRowActionsProps) {\n const {\n item,\n onCopy,\n onEdit,\n onDelete,\n showChevron = false,\n chevronDirection = 'down',\n } = props;\n\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\nconst styles = StyleSheet.create({\n itemRowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n marginLeft: LAYOUT.iconGap,\n gap: LAYOUT.iconGap,\n },\n iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n","import React, { useState } from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { Icon } from '@/components/Icon';\nimport { ItemRowActions } from '@/components/ItemRowActions';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageListProps {\n item: StorageItem;\n onCopy: (item: StorageItem) => void;\n onEdit: (item: StorageItem) => void;\n onDelete: (item: StorageItem) => void;\n}\n\nexport function StorageList(props: StorageListProps) {\n const { item, onCopy, onEdit, onDelete } = props;\n\n const [expandedKeys, setExpandedKeys] = useState(new Set<string>());\n const charCount = item.value.length;\n\n const handleToggleExpanded = () => {\n setExpandedKeys((prev) => {\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 const isExpanded = expandedKeys.has(item.key);\n return (\n <View style={styles.itemRow}>\n <TouchableOpacity onPress={handleToggleExpanded} activeOpacity={0.7}>\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 {!isExpanded ? (\n <ItemRowActions\n item={item}\n onCopy={onCopy}\n onEdit={onEdit}\n onDelete={onDelete}\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 {isExpanded && (\n <View style={styles.itemRowExpanded}>\n <TouchableOpacity onPress={() => onEdit(item)} style={styles.valueBox}>\n <Text style={styles.valueBoxLabel}>{strings.valueLabel}</Text>\n <Text style={styles.valueBoxText} selectable>\n {item.value}\n </Text>\n </TouchableOpacity>\n <ItemRowActions\n item={item}\n onCopy={onCopy}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n </View>\n )}\n </View>\n );\n}\n\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\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 iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\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});\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, TouchableOpacity, Share, StyleSheet } 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 { StorageList } from '@/components/StorageList';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageSectionProps {\n key?: React.Key;\n adapter: IStorageAdapter;\n defaultExpanded?: boolean;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n refreshTrigger?: number;\n}\n\nexport function StorageSection(props: StorageSectionProps) {\n const {\n adapter,\n defaultExpanded = true,\n expanded: expandedProp,\n onToggleExpanded,\n refreshTrigger,\n } = props;\n\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 [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 await adapter.setItem(key, value);\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 = isKeychain && items.length === 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 <StorageList\n key={item.key}\n item={item}\n onCopy={handleCopy}\n onEdit={handleEdit}\n onDelete={setDeleteItem}\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\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\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 sectionHeaderLabelWrap: {\n flex: 1,\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 iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\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 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 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 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});\n","import React, { useMemo, useState } from 'react';\nimport { View, Text, ScrollView, RefreshControl, StyleSheet } from 'react-native';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport { createMMKVAdapter } from '@/adapters/mmkv';\nimport { createAsyncStorageAdapter } from '@/adapters/async-storage';\nimport { createKeychainAdapter } from '@/adapters/keychain';\nimport { createSecureStoreAdapter } from '@/adapters/secure-store';\nimport { StorageSection } from '@/components/StorageSection';\nimport { IconButton } from '@/components/IconButton';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\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 secureStoreKeys?: string[];\n customAdapters?: IStorageAdapter[];\n}\n\nexport function StorageInspector(props: StorageInspectorProps) {\n const { mmkvInstances = [], secureStoreKeys, customAdapters = [] } = props;\n\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 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();\n if (asyncAdapter.isAvailable()) list.push(asyncAdapter);\n\n const keychainAdapter = createKeychainAdapter();\n if (keychainAdapter.isAvailable()) list.push(keychainAdapter);\n\n const secureStoreAdapter = createSecureStoreAdapter(secureStoreKeys ?? []);\n if (secureStoreAdapter.isAvailable()) list.push(secureStoreAdapter);\n\n list.push(...customAdapters);\n return list;\n }, [mmkvInstances, secureStoreKeys, customAdapters]);\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 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\nconst { colors } = theme;\n\nconst 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 scrollContent: {\n flexGrow: 1,\n paddingBottom: LAYOUT.fabSize + LAYOUT.padding + 20,\n paddingTop: LAYOUT.padding,\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 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});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/mmkv.ts","../src/adapters/async-storage.ts","../src/adapters/keychain.ts","../src/utils.ts","../src/adapters/secure-store.ts","../src/hooks/useStorageItems.ts","../src/theme.ts","../src/components/Icon.tsx","../src/constants.ts","../src/components/IconButton.tsx","../src/strings.ts","../src/components/ItemForm.tsx","../src/components/ConfirmModal.tsx","../src/components/ItemRowActions.tsx","../src/components/StorageList.tsx","../src/components/StorageSection.tsx","../src/components/StorageInspector.tsx"],"names":["useState","useCallback","useEffect","React","Text","StyleSheet","Dimensions","TouchableOpacity","styles","Modal","View","TextInput","colors","Share","useMemo","ScrollView","RefreshControl"],"mappings":"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","file":"index.js","sourcesContent":["import type { IStorageAdapter } from '@/adapters/types';\n\n/** Raw MMKV instance from createMMKV() (react-native-mmkv). */\nexport type MMKVInstance = {\n getAllKeys(): string[];\n getString(key: string): string | undefined;\n set(key: string, value: string | number | boolean): void;\n remove(key: string): void | boolean;\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.remove(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 */\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\n// Optional require; support both ESM (mod.default) and CJS (mod) so we always get the API object.\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.\n */\nexport function createAsyncStorageAdapter(): IStorageAdapter {\n const getStorage = () => 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(): boolean {\n return getAsyncStorageFromRequire() !== null;\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * Keychain-compatible module (generic password only).\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};\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 * Creates a Keychain adapter.\n */\nexport function createKeychainAdapter(): IStorageAdapter {\n const getKc = () => getKeychainFromRequire();\n return {\n type: 'keychain',\n name: 'Keychain',\n async getAllKeys(): Promise<string[]> {\n const kc = getKc();\n if (!kc) return [];\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\n }\n }\n\n return [...new Set(genericServices)];\n },\n async getItem(key: string): Promise<string | null> {\n const kc = getKc();\n if (!kc?.getGenericPassword) return null;\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 // ignore\n }\n return null;\n },\n async setItem(key: string, value: string): Promise<void> {\n const kc = getKc();\n if (!kc?.setGenericPassword)\n throw new Error('react-native-keychain is not available');\n const result = await kc.setGenericPassword(key, value, { service: key });\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?.resetGenericPassword)\n throw new Error('react-native-keychain is not available');\n await kc.resetGenericPassword({ service: key });\n },\n isAvailable(): boolean {\n return getKc() !== null;\n },\n };\n}\n\nexport function isKeychainAvailable(): boolean {\n return getKeychainFromRequire() !== null;\n}\n","/**\n * Parses a string (JSON array) to string[]. Returns [] for null, empty,\n * invalid JSON, or when the value is not an array of strings.\n */\nexport function parsePersistedKeys(raw: string | null): string[] {\n if (raw == null || raw === '') return [];\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item): item is string => typeof item === 'string');\n } catch {\n return [];\n }\n}\n","import type { IStorageAdapter } from '@/adapters/types';\nimport { parsePersistedKeys } from '@/utils';\n\n/** Reserved key in Secure Store where we persist the list of keys (so it survives restart). */\nconst PERSISTED_KEYS_STORAGE_KEY = '__storage_inspector_secure_store_keys__';\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 * Creates a Secure Store adapter. Since expo-secure-store has no API to list all keys, we persist the list of keys in Secure Store.\n */\nexport function createSecureStoreAdapter(knownKeys: string[] = []): IStorageAdapter {\n const getStore = () => getSecureStoreFromRequire();\n return {\n type: 'expo-secure-store',\n name: 'Secure Store',\n async getAllKeys(): Promise<string[]> {\n const store = getStore();\n if (!store) return [];\n const persistedKeysString = await store.getItemAsync(PERSISTED_KEYS_STORAGE_KEY);\n const persistedKeys = parsePersistedKeys(persistedKeysString);\n return [...new Set([...knownKeys, ...persistedKeys])];\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 if (key === PERSISTED_KEYS_STORAGE_KEY) return;\n const persistedKeysString = await store.getItemAsync(PERSISTED_KEYS_STORAGE_KEY);\n const persistedKeys = parsePersistedKeys(persistedKeysString);\n const newPersistedKeys = [...new Set([...persistedKeys, key])];\n await store.setItemAsync(\n PERSISTED_KEYS_STORAGE_KEY,\n JSON.stringify(newPersistedKeys)\n );\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 const persistedKeysString = await store.getItemAsync(PERSISTED_KEYS_STORAGE_KEY);\n const persistedKeys = parsePersistedKeys(persistedKeysString);\n const newPersistedKeys = persistedKeys.filter((k) => k !== key);\n await store.setItemAsync(\n PERSISTED_KEYS_STORAGE_KEY,\n JSON.stringify(newPersistedKeys)\n );\n },\n isAvailable(): boolean {\n return getStore() !== null;\n },\n };\n}\n\nexport function isSecureStoreAvailable(): boolean {\n return 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 if (value === null) continue;\n pairs.push({ key, 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 overlayBackdrop: 'rgba(0,0,0,0.5)',\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(props: IconProps) {\n const { name, size = 20, tintColor = theme.colors.text, iconStyle } = props;\n\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 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';\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(props: IconButtonProps) {\n const {\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 } = props;\n\n return (\n <TouchableOpacity\n style={[styles.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\nconst styles = StyleSheet.create({\n iconButton: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\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: 'No generic password items yet. Add a key using + above.',\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 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: 'No items yet. Add a key below.',\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, StyleSheet } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { IconButton } from '@/components/IconButton';\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(props: ItemFormProps) {\n const { visible, storageName, editingItem, onSave, onCancel } = props;\n\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\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\n formOverlay: {\n flex: 1,\n backgroundColor: colors.overlayBackdrop,\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 errorText: {\n fontSize: LAYOUT.fontSize,\n color: colors.text,\n },\n});\n","import React from 'react';\nimport { View, Text, Modal, TouchableOpacity, StyleSheet } from 'react-native';\nimport { IconButton } from '@/components/IconButton';\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(props: ConfirmModalProps) {\n const {\n visible,\n title,\n message,\n confirmLabel = strings.confirmDelete,\n cancelLabel = strings.cancelKeep,\n danger = true,\n onConfirm,\n onCancel,\n } = props;\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={onConfirm}\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\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\n confirmOverlay: {\n flex: 1,\n backgroundColor: colors.overlayBackdrop,\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 formCloseButton: {\n width: 44,\n height: 44,\n alignItems: 'flex-end',\n justifyContent: 'center',\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 formButtonSubmit: {\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 formButtonTextSubmit: {\n color: colors.inverted,\n },\n});\n","import React from 'react';\nimport { View, StyleSheet } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\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(props: ItemRowActionsProps) {\n const {\n item,\n onCopy,\n onEdit,\n onDelete,\n showChevron = false,\n chevronDirection = 'down',\n } = props;\n\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\nconst styles = StyleSheet.create({\n itemRowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n marginLeft: LAYOUT.iconGap,\n gap: LAYOUT.iconGap,\n },\n iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n","import React, { useState } from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { Icon } from '@/components/Icon';\nimport { ItemRowActions } from '@/components/ItemRowActions';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageListProps {\n item: StorageItem;\n onCopy: (item: StorageItem) => void;\n onEdit: (item: StorageItem) => void;\n onDelete: (item: StorageItem) => void;\n}\n\nexport function StorageList(props: StorageListProps) {\n const { item, onCopy, onEdit, onDelete } = props;\n\n const [expandedKeys, setExpandedKeys] = useState(new Set<string>());\n const charCount = item.value.length;\n\n const handleToggleExpanded = () => {\n setExpandedKeys((prev) => {\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 const isExpanded = expandedKeys.has(item.key);\n return (\n <View style={styles.itemRow}>\n <TouchableOpacity onPress={handleToggleExpanded} activeOpacity={0.7}>\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 {!isExpanded ? (\n <ItemRowActions\n item={item}\n onCopy={onCopy}\n onEdit={onEdit}\n onDelete={onDelete}\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 {isExpanded && (\n <View style={styles.itemRowExpanded}>\n <TouchableOpacity onPress={() => onEdit(item)} style={styles.valueBox}>\n <Text style={styles.valueBoxLabel}>{strings.valueLabel}</Text>\n <Text style={styles.valueBoxText} selectable>\n {item.value}\n </Text>\n </TouchableOpacity>\n <ItemRowActions\n item={item}\n onCopy={onCopy}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n </View>\n )}\n </View>\n );\n}\n\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\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 iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\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});\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, TouchableOpacity, Share, StyleSheet } 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 { StorageList } from '@/components/StorageList';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageSectionProps {\n key?: React.Key;\n adapter: IStorageAdapter;\n defaultExpanded?: boolean;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n refreshTrigger?: number;\n}\n\nexport function StorageSection(props: StorageSectionProps) {\n const {\n adapter,\n defaultExpanded = true,\n expanded: expandedProp,\n onToggleExpanded,\n refreshTrigger,\n } = props;\n\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 [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 await adapter.setItem(key, value);\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 = isKeychain && items.length === 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 <StorageList\n key={item.key}\n item={item}\n onCopy={handleCopy}\n onEdit={handleEdit}\n onDelete={setDeleteItem}\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\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\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 sectionHeaderLabelWrap: {\n flex: 1,\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 iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\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 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 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 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});\n","import React, { useMemo, useState } from 'react';\nimport { View, Text, ScrollView, RefreshControl, StyleSheet } from 'react-native';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport { createMMKVAdapter, type MMKVInstance } from '@/adapters/mmkv';\nimport { createAsyncStorageAdapter } from '@/adapters/async-storage';\nimport { createKeychainAdapter } from '@/adapters/keychain';\nimport { createSecureStoreAdapter } from '@/adapters/secure-store';\nimport { StorageSection } from '@/components/StorageSection';\nimport { IconButton } from '@/components/IconButton';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageInspectorProps {\n /** Raw MMKV instances from createMMKV() (react-native-mmkv). */\n mmkvInstances?: MMKVInstance[];\n secureStoreKeys?: string[];\n customAdapters?: IStorageAdapter[];\n}\n\nexport function StorageInspector(props: StorageInspectorProps) {\n const { mmkvInstances = [], secureStoreKeys, customAdapters = [] } = props;\n\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 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();\n if (asyncAdapter.isAvailable()) list.push(asyncAdapter);\n\n const keychainAdapter = createKeychainAdapter();\n if (keychainAdapter.isAvailable()) list.push(keychainAdapter);\n\n const secureStoreAdapter = createSecureStoreAdapter(secureStoreKeys ?? []);\n if (secureStoreAdapter.isAvailable()) list.push(secureStoreAdapter);\n\n list.push(...customAdapters);\n return list.sort((a, b) => a.name.localeCompare(b.name));\n }, [mmkvInstances, secureStoreKeys, customAdapters]);\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 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\nconst { colors } = theme;\n\nconst 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 scrollContent: {\n flexGrow: 1,\n paddingBottom: LAYOUT.fabSize + LAYOUT.padding + 20,\n paddingTop: LAYOUT.padding,\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 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});\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -25,7 +25,7 @@ function createMMKVAdapter(instance, name) {
|
|
|
25
25
|
return Promise.resolve();
|
|
26
26
|
},
|
|
27
27
|
removeItem(key) {
|
|
28
|
-
instance.
|
|
28
|
+
instance.remove(key);
|
|
29
29
|
return Promise.resolve();
|
|
30
30
|
},
|
|
31
31
|
isAvailable() {
|
|
@@ -98,7 +98,7 @@ function createKeychainAdapter() {
|
|
|
98
98
|
} catch {
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
|
-
return genericServices;
|
|
101
|
+
return [...new Set(genericServices)];
|
|
102
102
|
},
|
|
103
103
|
async getItem(key) {
|
|
104
104
|
const kc = getKc();
|
|
@@ -1065,7 +1065,7 @@ function StorageInspector(props) {
|
|
|
1065
1065
|
const secureStoreAdapter = createSecureStoreAdapter(secureStoreKeys ?? []);
|
|
1066
1066
|
if (secureStoreAdapter.isAvailable()) list.push(secureStoreAdapter);
|
|
1067
1067
|
list.push(...customAdapters);
|
|
1068
|
-
return list;
|
|
1068
|
+
return list.sort((a, b) => a.name.localeCompare(b.name));
|
|
1069
1069
|
}, [mmkvInstances, secureStoreKeys, customAdapters]);
|
|
1070
1070
|
const handleRefresh = () => {
|
|
1071
1071
|
setRefreshing(true);
|
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/utils.ts","../src/adapters/secure-store.ts","../src/hooks/useStorageItems.ts","../src/theme.ts","../src/components/Icon.tsx","../src/constants.ts","../src/components/IconButton.tsx","../src/strings.ts","../src/components/ItemForm.tsx","../src/components/ConfirmModal.tsx","../src/components/ItemRowActions.tsx","../src/components/StorageList.tsx","../src/components/StorageSection.tsx","../src/components/StorageInspector.tsx"],"names":["React","styles","StyleSheet","useState","useEffect","TouchableOpacity","Text","Modal","View","colors"],"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 */\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\n// Optional require; support both ESM (mod.default) and CJS (mod) so we always get the API object.\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.\n */\nexport function createAsyncStorageAdapter(): IStorageAdapter {\n const getStorage = () => 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(): boolean {\n return getAsyncStorageFromRequire() !== null;\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * Keychain-compatible module (generic password only).\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};\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 * Creates a Keychain adapter.\n */\nexport function createKeychainAdapter(): IStorageAdapter {\n const getKc = () => getKeychainFromRequire();\n return {\n type: 'keychain',\n name: 'Keychain',\n async getAllKeys(): Promise<string[]> {\n const kc = getKc();\n if (!kc) return [];\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\n }\n }\n\n return genericServices;\n },\n async getItem(key: string): Promise<string | null> {\n const kc = getKc();\n if (!kc?.getGenericPassword) return null;\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 // ignore\n }\n return null;\n },\n async setItem(key: string, value: string): Promise<void> {\n const kc = getKc();\n if (!kc?.setGenericPassword)\n throw new Error('react-native-keychain is not available');\n const result = await kc.setGenericPassword(key, value, { service: key });\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?.resetGenericPassword)\n throw new Error('react-native-keychain is not available');\n await kc.resetGenericPassword({ service: key });\n },\n isAvailable(): boolean {\n return getKc() !== null;\n },\n };\n}\n\nexport function isKeychainAvailable(): boolean {\n return getKeychainFromRequire() !== null;\n}\n","/**\n * Parses a string (JSON array) to string[]. Returns [] for null, empty,\n * invalid JSON, or when the value is not an array of strings.\n */\nexport function parsePersistedKeys(raw: string | null): string[] {\n if (raw == null || raw === '') return [];\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item): item is string => typeof item === 'string');\n } catch {\n return [];\n }\n}\n","import type { IStorageAdapter } from '@/adapters/types';\nimport { parsePersistedKeys } from '@/utils';\n\n/** Reserved key in Secure Store where we persist the list of keys (so it survives restart). */\nconst PERSISTED_KEYS_STORAGE_KEY = '__storage_inspector_secure_store_keys__';\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 * Creates a Secure Store adapter. Since expo-secure-store has no API to list all keys, we persist the list of keys in Secure Store.\n */\nexport function createSecureStoreAdapter(knownKeys: string[] = []): IStorageAdapter {\n const getStore = () => getSecureStoreFromRequire();\n return {\n type: 'expo-secure-store',\n name: 'Secure Store',\n async getAllKeys(): Promise<string[]> {\n const store = getStore();\n if (!store) return [];\n const persistedKeysString = await store.getItemAsync(PERSISTED_KEYS_STORAGE_KEY);\n const persistedKeys = parsePersistedKeys(persistedKeysString);\n return [...new Set([...knownKeys, ...persistedKeys])];\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 if (key === PERSISTED_KEYS_STORAGE_KEY) return;\n const persistedKeysString = await store.getItemAsync(PERSISTED_KEYS_STORAGE_KEY);\n const persistedKeys = parsePersistedKeys(persistedKeysString);\n const newPersistedKeys = [...new Set([...persistedKeys, key])];\n await store.setItemAsync(\n PERSISTED_KEYS_STORAGE_KEY,\n JSON.stringify(newPersistedKeys)\n );\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 const persistedKeysString = await store.getItemAsync(PERSISTED_KEYS_STORAGE_KEY);\n const persistedKeys = parsePersistedKeys(persistedKeysString);\n const newPersistedKeys = persistedKeys.filter((k) => k !== key);\n await store.setItemAsync(\n PERSISTED_KEYS_STORAGE_KEY,\n JSON.stringify(newPersistedKeys)\n );\n },\n isAvailable(): boolean {\n return getStore() !== null;\n },\n };\n}\n\nexport function isSecureStoreAvailable(): boolean {\n return 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 if (value === null) continue;\n pairs.push({ key, 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 overlayBackdrop: 'rgba(0,0,0,0.5)',\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(props: IconProps) {\n const { name, size = 20, tintColor = theme.colors.text, iconStyle } = props;\n\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 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';\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(props: IconButtonProps) {\n const {\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 } = props;\n\n return (\n <TouchableOpacity\n style={[styles.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\nconst styles = StyleSheet.create({\n iconButton: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\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: 'No generic password items yet. Add a key using + above.',\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 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: 'No items yet. Add a key below.',\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, StyleSheet } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { IconButton } from '@/components/IconButton';\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(props: ItemFormProps) {\n const { visible, storageName, editingItem, onSave, onCancel } = props;\n\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\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\n formOverlay: {\n flex: 1,\n backgroundColor: colors.overlayBackdrop,\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 errorText: {\n fontSize: LAYOUT.fontSize,\n color: colors.text,\n },\n});\n","import React from 'react';\nimport { View, Text, Modal, TouchableOpacity, StyleSheet } from 'react-native';\nimport { IconButton } from '@/components/IconButton';\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(props: ConfirmModalProps) {\n const {\n visible,\n title,\n message,\n confirmLabel = strings.confirmDelete,\n cancelLabel = strings.cancelKeep,\n danger = true,\n onConfirm,\n onCancel,\n } = props;\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={onConfirm}\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\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\n confirmOverlay: {\n flex: 1,\n backgroundColor: colors.overlayBackdrop,\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 formCloseButton: {\n width: 44,\n height: 44,\n alignItems: 'flex-end',\n justifyContent: 'center',\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 formButtonSubmit: {\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 formButtonTextSubmit: {\n color: colors.inverted,\n },\n});\n","import React from 'react';\nimport { View, StyleSheet } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\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(props: ItemRowActionsProps) {\n const {\n item,\n onCopy,\n onEdit,\n onDelete,\n showChevron = false,\n chevronDirection = 'down',\n } = props;\n\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\nconst styles = StyleSheet.create({\n itemRowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n marginLeft: LAYOUT.iconGap,\n gap: LAYOUT.iconGap,\n },\n iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n","import React, { useState } from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { Icon } from '@/components/Icon';\nimport { ItemRowActions } from '@/components/ItemRowActions';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageListProps {\n item: StorageItem;\n onCopy: (item: StorageItem) => void;\n onEdit: (item: StorageItem) => void;\n onDelete: (item: StorageItem) => void;\n}\n\nexport function StorageList(props: StorageListProps) {\n const { item, onCopy, onEdit, onDelete } = props;\n\n const [expandedKeys, setExpandedKeys] = useState(new Set<string>());\n const charCount = item.value.length;\n\n const handleToggleExpanded = () => {\n setExpandedKeys((prev) => {\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 const isExpanded = expandedKeys.has(item.key);\n return (\n <View style={styles.itemRow}>\n <TouchableOpacity onPress={handleToggleExpanded} activeOpacity={0.7}>\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 {!isExpanded ? (\n <ItemRowActions\n item={item}\n onCopy={onCopy}\n onEdit={onEdit}\n onDelete={onDelete}\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 {isExpanded && (\n <View style={styles.itemRowExpanded}>\n <TouchableOpacity onPress={() => onEdit(item)} style={styles.valueBox}>\n <Text style={styles.valueBoxLabel}>{strings.valueLabel}</Text>\n <Text style={styles.valueBoxText} selectable>\n {item.value}\n </Text>\n </TouchableOpacity>\n <ItemRowActions\n item={item}\n onCopy={onCopy}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n </View>\n )}\n </View>\n );\n}\n\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\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 iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\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});\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, TouchableOpacity, Share, StyleSheet } 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 { StorageList } from '@/components/StorageList';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageSectionProps {\n key?: React.Key;\n adapter: IStorageAdapter;\n defaultExpanded?: boolean;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n refreshTrigger?: number;\n}\n\nexport function StorageSection(props: StorageSectionProps) {\n const {\n adapter,\n defaultExpanded = true,\n expanded: expandedProp,\n onToggleExpanded,\n refreshTrigger,\n } = props;\n\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 [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 await adapter.setItem(key, value);\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 = isKeychain && items.length === 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 <StorageList\n key={item.key}\n item={item}\n onCopy={handleCopy}\n onEdit={handleEdit}\n onDelete={setDeleteItem}\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\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\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 sectionHeaderLabelWrap: {\n flex: 1,\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 iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\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 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 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 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});\n","import React, { useMemo, useState } from 'react';\nimport { View, Text, ScrollView, RefreshControl, StyleSheet } from 'react-native';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport { createMMKVAdapter } from '@/adapters/mmkv';\nimport { createAsyncStorageAdapter } from '@/adapters/async-storage';\nimport { createKeychainAdapter } from '@/adapters/keychain';\nimport { createSecureStoreAdapter } from '@/adapters/secure-store';\nimport { StorageSection } from '@/components/StorageSection';\nimport { IconButton } from '@/components/IconButton';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\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 secureStoreKeys?: string[];\n customAdapters?: IStorageAdapter[];\n}\n\nexport function StorageInspector(props: StorageInspectorProps) {\n const { mmkvInstances = [], secureStoreKeys, customAdapters = [] } = props;\n\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 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();\n if (asyncAdapter.isAvailable()) list.push(asyncAdapter);\n\n const keychainAdapter = createKeychainAdapter();\n if (keychainAdapter.isAvailable()) list.push(keychainAdapter);\n\n const secureStoreAdapter = createSecureStoreAdapter(secureStoreKeys ?? []);\n if (secureStoreAdapter.isAvailable()) list.push(secureStoreAdapter);\n\n list.push(...customAdapters);\n return list;\n }, [mmkvInstances, secureStoreKeys, customAdapters]);\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 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\nconst { colors } = theme;\n\nconst 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 scrollContent: {\n flexGrow: 1,\n paddingBottom: LAYOUT.fabSize + LAYOUT.padding + 20,\n paddingTop: LAYOUT.padding,\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 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});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/mmkv.ts","../src/adapters/async-storage.ts","../src/adapters/keychain.ts","../src/utils.ts","../src/adapters/secure-store.ts","../src/hooks/useStorageItems.ts","../src/theme.ts","../src/components/Icon.tsx","../src/constants.ts","../src/components/IconButton.tsx","../src/strings.ts","../src/components/ItemForm.tsx","../src/components/ConfirmModal.tsx","../src/components/ItemRowActions.tsx","../src/components/StorageList.tsx","../src/components/StorageSection.tsx","../src/components/StorageInspector.tsx"],"names":["React","styles","StyleSheet","useState","useEffect","TouchableOpacity","Text","Modal","View","colors"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { IStorageAdapter } from '@/adapters/types';\n\n/** Raw MMKV instance from createMMKV() (react-native-mmkv). */\nexport type MMKVInstance = {\n getAllKeys(): string[];\n getString(key: string): string | undefined;\n set(key: string, value: string | number | boolean): void;\n remove(key: string): void | boolean;\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.remove(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 */\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\n// Optional require; support both ESM (mod.default) and CJS (mod) so we always get the API object.\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.\n */\nexport function createAsyncStorageAdapter(): IStorageAdapter {\n const getStorage = () => 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(): boolean {\n return getAsyncStorageFromRequire() !== null;\n}\n","import type { IStorageAdapter } from '@/adapters/types';\n\n/**\n * Keychain-compatible module (generic password only).\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};\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 * Creates a Keychain adapter.\n */\nexport function createKeychainAdapter(): IStorageAdapter {\n const getKc = () => getKeychainFromRequire();\n return {\n type: 'keychain',\n name: 'Keychain',\n async getAllKeys(): Promise<string[]> {\n const kc = getKc();\n if (!kc) return [];\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\n }\n }\n\n return [...new Set(genericServices)];\n },\n async getItem(key: string): Promise<string | null> {\n const kc = getKc();\n if (!kc?.getGenericPassword) return null;\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 // ignore\n }\n return null;\n },\n async setItem(key: string, value: string): Promise<void> {\n const kc = getKc();\n if (!kc?.setGenericPassword)\n throw new Error('react-native-keychain is not available');\n const result = await kc.setGenericPassword(key, value, { service: key });\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?.resetGenericPassword)\n throw new Error('react-native-keychain is not available');\n await kc.resetGenericPassword({ service: key });\n },\n isAvailable(): boolean {\n return getKc() !== null;\n },\n };\n}\n\nexport function isKeychainAvailable(): boolean {\n return getKeychainFromRequire() !== null;\n}\n","/**\n * Parses a string (JSON array) to string[]. Returns [] for null, empty,\n * invalid JSON, or when the value is not an array of strings.\n */\nexport function parsePersistedKeys(raw: string | null): string[] {\n if (raw == null || raw === '') return [];\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((item): item is string => typeof item === 'string');\n } catch {\n return [];\n }\n}\n","import type { IStorageAdapter } from '@/adapters/types';\nimport { parsePersistedKeys } from '@/utils';\n\n/** Reserved key in Secure Store where we persist the list of keys (so it survives restart). */\nconst PERSISTED_KEYS_STORAGE_KEY = '__storage_inspector_secure_store_keys__';\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 * Creates a Secure Store adapter. Since expo-secure-store has no API to list all keys, we persist the list of keys in Secure Store.\n */\nexport function createSecureStoreAdapter(knownKeys: string[] = []): IStorageAdapter {\n const getStore = () => getSecureStoreFromRequire();\n return {\n type: 'expo-secure-store',\n name: 'Secure Store',\n async getAllKeys(): Promise<string[]> {\n const store = getStore();\n if (!store) return [];\n const persistedKeysString = await store.getItemAsync(PERSISTED_KEYS_STORAGE_KEY);\n const persistedKeys = parsePersistedKeys(persistedKeysString);\n return [...new Set([...knownKeys, ...persistedKeys])];\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 if (key === PERSISTED_KEYS_STORAGE_KEY) return;\n const persistedKeysString = await store.getItemAsync(PERSISTED_KEYS_STORAGE_KEY);\n const persistedKeys = parsePersistedKeys(persistedKeysString);\n const newPersistedKeys = [...new Set([...persistedKeys, key])];\n await store.setItemAsync(\n PERSISTED_KEYS_STORAGE_KEY,\n JSON.stringify(newPersistedKeys)\n );\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 const persistedKeysString = await store.getItemAsync(PERSISTED_KEYS_STORAGE_KEY);\n const persistedKeys = parsePersistedKeys(persistedKeysString);\n const newPersistedKeys = persistedKeys.filter((k) => k !== key);\n await store.setItemAsync(\n PERSISTED_KEYS_STORAGE_KEY,\n JSON.stringify(newPersistedKeys)\n );\n },\n isAvailable(): boolean {\n return getStore() !== null;\n },\n };\n}\n\nexport function isSecureStoreAvailable(): boolean {\n return 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 if (value === null) continue;\n pairs.push({ key, 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 overlayBackdrop: 'rgba(0,0,0,0.5)',\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(props: IconProps) {\n const { name, size = 20, tintColor = theme.colors.text, iconStyle } = props;\n\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 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';\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(props: IconButtonProps) {\n const {\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 } = props;\n\n return (\n <TouchableOpacity\n style={[styles.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\nconst styles = StyleSheet.create({\n iconButton: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\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: 'No generic password items yet. Add a key using + above.',\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 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: 'No items yet. Add a key below.',\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, StyleSheet } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { IconButton } from '@/components/IconButton';\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(props: ItemFormProps) {\n const { visible, storageName, editingItem, onSave, onCancel } = props;\n\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\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\n formOverlay: {\n flex: 1,\n backgroundColor: colors.overlayBackdrop,\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 errorText: {\n fontSize: LAYOUT.fontSize,\n color: colors.text,\n },\n});\n","import React from 'react';\nimport { View, Text, Modal, TouchableOpacity, StyleSheet } from 'react-native';\nimport { IconButton } from '@/components/IconButton';\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(props: ConfirmModalProps) {\n const {\n visible,\n title,\n message,\n confirmLabel = strings.confirmDelete,\n cancelLabel = strings.cancelKeep,\n danger = true,\n onConfirm,\n onCancel,\n } = props;\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={onConfirm}\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\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\n confirmOverlay: {\n flex: 1,\n backgroundColor: colors.overlayBackdrop,\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 formCloseButton: {\n width: 44,\n height: 44,\n alignItems: 'flex-end',\n justifyContent: 'center',\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 formButtonSubmit: {\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 formButtonTextSubmit: {\n color: colors.inverted,\n },\n});\n","import React from 'react';\nimport { View, StyleSheet } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { Icon } from '@/components/Icon';\nimport { IconButton } from '@/components/IconButton';\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(props: ItemRowActionsProps) {\n const {\n item,\n onCopy,\n onEdit,\n onDelete,\n showChevron = false,\n chevronDirection = 'down',\n } = props;\n\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\nconst styles = StyleSheet.create({\n itemRowActions: {\n flexDirection: 'row',\n alignItems: 'center',\n marginLeft: LAYOUT.iconGap,\n gap: LAYOUT.iconGap,\n },\n iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n","import React, { useState } from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet } from 'react-native';\nimport type { StorageItem } from '@/adapters/types';\nimport { Icon } from '@/components/Icon';\nimport { ItemRowActions } from '@/components/ItemRowActions';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageListProps {\n item: StorageItem;\n onCopy: (item: StorageItem) => void;\n onEdit: (item: StorageItem) => void;\n onDelete: (item: StorageItem) => void;\n}\n\nexport function StorageList(props: StorageListProps) {\n const { item, onCopy, onEdit, onDelete } = props;\n\n const [expandedKeys, setExpandedKeys] = useState(new Set<string>());\n const charCount = item.value.length;\n\n const handleToggleExpanded = () => {\n setExpandedKeys((prev) => {\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 const isExpanded = expandedKeys.has(item.key);\n return (\n <View style={styles.itemRow}>\n <TouchableOpacity onPress={handleToggleExpanded} activeOpacity={0.7}>\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 {!isExpanded ? (\n <ItemRowActions\n item={item}\n onCopy={onCopy}\n onEdit={onEdit}\n onDelete={onDelete}\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 {isExpanded && (\n <View style={styles.itemRowExpanded}>\n <TouchableOpacity onPress={() => onEdit(item)} style={styles.valueBox}>\n <Text style={styles.valueBoxLabel}>{strings.valueLabel}</Text>\n <Text style={styles.valueBoxText} selectable>\n {item.value}\n </Text>\n </TouchableOpacity>\n <ItemRowActions\n item={item}\n onCopy={onCopy}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n </View>\n )}\n </View>\n );\n}\n\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\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 iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\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});\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, TouchableOpacity, Share, StyleSheet } 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 { StorageList } from '@/components/StorageList';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageSectionProps {\n key?: React.Key;\n adapter: IStorageAdapter;\n defaultExpanded?: boolean;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n refreshTrigger?: number;\n}\n\nexport function StorageSection(props: StorageSectionProps) {\n const {\n adapter,\n defaultExpanded = true,\n expanded: expandedProp,\n onToggleExpanded,\n refreshTrigger,\n } = props;\n\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 [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 await adapter.setItem(key, value);\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 = isKeychain && items.length === 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 <StorageList\n key={item.key}\n item={item}\n onCopy={handleCopy}\n onEdit={handleEdit}\n onDelete={setDeleteItem}\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\nconst { colors } = theme;\n\nconst styles = StyleSheet.create({\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 sectionHeaderLabelWrap: {\n flex: 1,\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 iconSlot: {\n width: LAYOUT.iconButtonSize,\n height: LAYOUT.iconButtonSize,\n alignItems: 'center',\n justifyContent: 'center',\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 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 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 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});\n","import React, { useMemo, useState } from 'react';\nimport { View, Text, ScrollView, RefreshControl, StyleSheet } from 'react-native';\nimport type { IStorageAdapter } from '@/adapters/types';\nimport { createMMKVAdapter, type MMKVInstance } from '@/adapters/mmkv';\nimport { createAsyncStorageAdapter } from '@/adapters/async-storage';\nimport { createKeychainAdapter } from '@/adapters/keychain';\nimport { createSecureStoreAdapter } from '@/adapters/secure-store';\nimport { StorageSection } from '@/components/StorageSection';\nimport { IconButton } from '@/components/IconButton';\nimport { theme } from '@/theme';\nimport { strings } from '@/strings';\nimport { LAYOUT } from '@/constants';\n\nexport interface StorageInspectorProps {\n /** Raw MMKV instances from createMMKV() (react-native-mmkv). */\n mmkvInstances?: MMKVInstance[];\n secureStoreKeys?: string[];\n customAdapters?: IStorageAdapter[];\n}\n\nexport function StorageInspector(props: StorageInspectorProps) {\n const { mmkvInstances = [], secureStoreKeys, customAdapters = [] } = props;\n\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 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();\n if (asyncAdapter.isAvailable()) list.push(asyncAdapter);\n\n const keychainAdapter = createKeychainAdapter();\n if (keychainAdapter.isAvailable()) list.push(keychainAdapter);\n\n const secureStoreAdapter = createSecureStoreAdapter(secureStoreKeys ?? []);\n if (secureStoreAdapter.isAvailable()) list.push(secureStoreAdapter);\n\n list.push(...customAdapters);\n return list.sort((a, b) => a.name.localeCompare(b.name));\n }, [mmkvInstances, secureStoreKeys, customAdapters]);\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 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\nconst { colors } = theme;\n\nconst 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 scrollContent: {\n flexGrow: 1,\n paddingBottom: LAYOUT.fabSize + LAYOUT.padding + 20,\n paddingTop: LAYOUT.padding,\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 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});\n"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-storage-inspector",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
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",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"scripts": {
|
|
9
|
+
"commit": "cz",
|
|
9
10
|
"test": "jest",
|
|
10
11
|
"test:coverage": "jest --coverage",
|
|
11
12
|
"build": "tsup && node scripts/postbuild.js",
|
|
@@ -14,7 +15,8 @@
|
|
|
14
15
|
"format:check": "prettier --check .",
|
|
15
16
|
"lint": "prettier --check .",
|
|
16
17
|
"prepublishOnly": "npm run format:check && npm test && npm run build",
|
|
17
|
-
"prepare": "husky"
|
|
18
|
+
"prepare": "husky",
|
|
19
|
+
"release": "semantic-release"
|
|
18
20
|
},
|
|
19
21
|
"keywords": [
|
|
20
22
|
"react-native",
|
|
@@ -37,6 +39,11 @@
|
|
|
37
39
|
"url": "https://github.com/Ajaymaurya1008/react-native-storage-inspector/issues"
|
|
38
40
|
},
|
|
39
41
|
"homepage": "https://github.com/Ajaymaurya1008/react-native-storage-inspector#readme",
|
|
42
|
+
"config": {
|
|
43
|
+
"commitizen": {
|
|
44
|
+
"path": "cz-conventional-changelog"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
40
47
|
"publishConfig": {
|
|
41
48
|
"access": "public",
|
|
42
49
|
"provenance": true
|
|
@@ -71,7 +78,13 @@
|
|
|
71
78
|
"prettier": "^3.8.1",
|
|
72
79
|
"ts-jest": "^29.4.6",
|
|
73
80
|
"tsup": "^8.5.1",
|
|
74
|
-
"typescript": "^5.0.0"
|
|
81
|
+
"typescript": "^5.0.0",
|
|
82
|
+
"commitizen": "^4.3.1",
|
|
83
|
+
"cz-conventional-changelog": "^3.3.0",
|
|
84
|
+
"semantic-release": "^25.0.3",
|
|
85
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
86
|
+
"@semantic-release/git": "^10.0.1",
|
|
87
|
+
"@semantic-release/npm": "^13.1.4"
|
|
75
88
|
},
|
|
76
89
|
"files": [
|
|
77
90
|
"dist"
|