@umituz/react-native-settings 2.4.1 → 3.0.1
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/package.json +5 -13
- package/src/presentation/components/CloudSyncSetting.tsx +2 -2
- package/src/presentation/components/SettingItem.tsx +4 -4
- package/src/presentation/components/StorageClearSetting.tsx +2 -2
- package/src/presentation/components/UserProfileHeader.tsx +3 -3
- package/src/presentation/screens/components/AboutLegalSection.tsx +3 -3
- package/src/presentation/screens/components/AppearanceSection.tsx +2 -2
- package/src/presentation/screens/components/LanguageSection.tsx +2 -2
- package/src/presentation/screens/components/NotificationsSection.tsx +3 -3
- package/lib/__tests__/setup.d.ts +0 -5
- package/lib/__tests__/setup.d.ts.map +0 -1
- package/lib/__tests__/setup.js +0 -143
- package/lib/__tests__/setup.js.map +0 -1
- package/lib/domain/repositories/ISettingsRepository.d.ts +0 -51
- package/lib/domain/repositories/ISettingsRepository.d.ts.map +0 -1
- package/lib/domain/repositories/ISettingsRepository.js +0 -8
- package/lib/domain/repositories/ISettingsRepository.js.map +0 -1
- package/lib/index.d.ts +0 -35
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -32
- package/lib/index.js.map +0 -1
- package/lib/infrastructure/storage/SettingsStore.d.ts +0 -36
- package/lib/infrastructure/storage/SettingsStore.d.ts.map +0 -1
- package/lib/infrastructure/storage/SettingsStore.js +0 -144
- package/lib/infrastructure/storage/SettingsStore.js.map +0 -1
- package/lib/presentation/components/CloudSyncSetting.d.ts +0 -16
- package/lib/presentation/components/CloudSyncSetting.d.ts.map +0 -1
- package/lib/presentation/components/CloudSyncSetting.js +0 -30
- package/lib/presentation/components/CloudSyncSetting.js.map +0 -1
- package/lib/presentation/components/DisclaimerCard.d.ts +0 -15
- package/lib/presentation/components/DisclaimerCard.d.ts.map +0 -1
- package/lib/presentation/components/DisclaimerCard.js +0 -73
- package/lib/presentation/components/DisclaimerCard.js.map +0 -1
- package/lib/presentation/components/DisclaimerModal.d.ts +0 -13
- package/lib/presentation/components/DisclaimerModal.d.ts.map +0 -1
- package/lib/presentation/components/DisclaimerModal.js +0 -62
- package/lib/presentation/components/DisclaimerModal.js.map +0 -1
- package/lib/presentation/components/DisclaimerSetting.d.ts +0 -39
- package/lib/presentation/components/DisclaimerSetting.d.ts.map +0 -1
- package/lib/presentation/components/DisclaimerSetting.js +0 -59
- package/lib/presentation/components/DisclaimerSetting.js.map +0 -1
- package/lib/presentation/components/SettingItem.d.ts +0 -45
- package/lib/presentation/components/SettingItem.d.ts.map +0 -1
- package/lib/presentation/components/SettingItem.js +0 -113
- package/lib/presentation/components/SettingItem.js.map +0 -1
- package/lib/presentation/components/SettingsErrorBoundary.d.ts +0 -23
- package/lib/presentation/components/SettingsErrorBoundary.d.ts.map +0 -1
- package/lib/presentation/components/SettingsErrorBoundary.js +0 -73
- package/lib/presentation/components/SettingsErrorBoundary.js.map +0 -1
- package/lib/presentation/components/SettingsFooter.d.ts +0 -11
- package/lib/presentation/components/SettingsFooter.d.ts.map +0 -1
- package/lib/presentation/components/SettingsFooter.js +0 -31
- package/lib/presentation/components/SettingsFooter.js.map +0 -1
- package/lib/presentation/components/SettingsSection.d.ts +0 -13
- package/lib/presentation/components/SettingsSection.d.ts.map +0 -1
- package/lib/presentation/components/SettingsSection.js +0 -37
- package/lib/presentation/components/SettingsSection.js.map +0 -1
- package/lib/presentation/components/StorageClearSetting.d.ts +0 -16
- package/lib/presentation/components/StorageClearSetting.d.ts.map +0 -1
- package/lib/presentation/components/StorageClearSetting.js +0 -21
- package/lib/presentation/components/StorageClearSetting.js.map +0 -1
- package/lib/presentation/components/UserProfileHeader.d.ts +0 -30
- package/lib/presentation/components/UserProfileHeader.d.ts.map +0 -1
- package/lib/presentation/components/UserProfileHeader.js +0 -119
- package/lib/presentation/components/UserProfileHeader.js.map +0 -1
- package/lib/presentation/screens/AppearanceScreen.d.ts +0 -8
- package/lib/presentation/screens/AppearanceScreen.d.ts.map +0 -1
- package/lib/presentation/screens/AppearanceScreen.js +0 -8
- package/lib/presentation/screens/AppearanceScreen.js.map +0 -1
- package/lib/presentation/screens/SettingsScreen.d.ts +0 -38
- package/lib/presentation/screens/SettingsScreen.d.ts.map +0 -1
- package/lib/presentation/screens/SettingsScreen.js +0 -37
- package/lib/presentation/screens/SettingsScreen.js.map +0 -1
- package/lib/presentation/screens/components/AboutLegalSection.d.ts +0 -15
- package/lib/presentation/screens/components/AboutLegalSection.d.ts.map +0 -1
- package/lib/presentation/screens/components/AboutLegalSection.js +0 -28
- package/lib/presentation/screens/components/AboutLegalSection.js.map +0 -1
- package/lib/presentation/screens/components/AppearanceSection.d.ts +0 -12
- package/lib/presentation/screens/components/AppearanceSection.d.ts.map +0 -1
- package/lib/presentation/screens/components/AppearanceSection.js +0 -21
- package/lib/presentation/screens/components/AppearanceSection.js.map +0 -1
- package/lib/presentation/screens/components/LanguageSection.d.ts +0 -12
- package/lib/presentation/screens/components/LanguageSection.d.ts.map +0 -1
- package/lib/presentation/screens/components/LanguageSection.js +0 -26
- package/lib/presentation/screens/components/LanguageSection.js.map +0 -1
- package/lib/presentation/screens/components/NotificationsSection.d.ts +0 -12
- package/lib/presentation/screens/components/NotificationsSection.d.ts.map +0 -1
- package/lib/presentation/screens/components/NotificationsSection.js +0 -58
- package/lib/presentation/screens/components/NotificationsSection.js.map +0 -1
- package/lib/presentation/screens/components/SettingsContent.d.ts +0 -36
- package/lib/presentation/screens/components/SettingsContent.d.ts.map +0 -1
- package/lib/presentation/screens/components/SettingsContent.js +0 -81
- package/lib/presentation/screens/components/SettingsContent.js.map +0 -1
- package/lib/presentation/screens/components/SettingsHeader.d.ts +0 -12
- package/lib/presentation/screens/components/SettingsHeader.d.ts.map +0 -1
- package/lib/presentation/screens/components/SettingsHeader.js +0 -59
- package/lib/presentation/screens/components/SettingsHeader.js.map +0 -1
- package/lib/presentation/screens/components/index.d.ts +0 -9
- package/lib/presentation/screens/components/index.d.ts.map +0 -1
- package/lib/presentation/screens/components/index.js +0 -9
- package/lib/presentation/screens/components/index.js.map +0 -1
- package/lib/presentation/screens/hooks/useFeatureDetection.d.ts +0 -21
- package/lib/presentation/screens/hooks/useFeatureDetection.d.ts.map +0 -1
- package/lib/presentation/screens/hooks/useFeatureDetection.js +0 -82
- package/lib/presentation/screens/hooks/useFeatureDetection.js.map +0 -1
- package/lib/presentation/screens/types/CustomSection.d.ts +0 -19
- package/lib/presentation/screens/types/CustomSection.d.ts.map +0 -1
- package/lib/presentation/screens/types/CustomSection.js +0 -6
- package/lib/presentation/screens/types/CustomSection.js.map +0 -1
- package/lib/presentation/screens/types/ExtendedConfig.d.ts +0 -68
- package/lib/presentation/screens/types/ExtendedConfig.d.ts.map +0 -1
- package/lib/presentation/screens/types/ExtendedConfig.js +0 -6
- package/lib/presentation/screens/types/ExtendedConfig.js.map +0 -1
- package/lib/presentation/screens/types/FeatureConfig.d.ts +0 -95
- package/lib/presentation/screens/types/FeatureConfig.d.ts.map +0 -1
- package/lib/presentation/screens/types/FeatureConfig.js +0 -6
- package/lib/presentation/screens/types/FeatureConfig.js.map +0 -1
- package/lib/presentation/screens/types/SettingsConfig.d.ts +0 -97
- package/lib/presentation/screens/types/SettingsConfig.d.ts.map +0 -1
- package/lib/presentation/screens/types/SettingsConfig.js +0 -6
- package/lib/presentation/screens/types/SettingsConfig.js.map +0 -1
- package/lib/presentation/screens/types/index.d.ts +0 -10
- package/lib/presentation/screens/types/index.d.ts.map +0 -1
- package/lib/presentation/screens/types/index.js +0 -6
- package/lib/presentation/screens/types/index.js.map +0 -1
- package/lib/presentation/screens/utils/normalizeConfig.d.ts +0 -44
- package/lib/presentation/screens/utils/normalizeConfig.d.ts.map +0 -1
- package/lib/presentation/screens/utils/normalizeConfig.js +0 -38
- package/lib/presentation/screens/utils/normalizeConfig.js.map +0 -1
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Settings Store - Zustand State Management
|
|
3
|
-
*
|
|
4
|
-
* Global settings state for app preferences
|
|
5
|
-
* Manages theme, language, notifications, and privacy settings
|
|
6
|
-
*
|
|
7
|
-
* DDD ARCHITECTURE: Uses @umituz/react-native-storage for all storage operations
|
|
8
|
-
* - Type-safe storage with StorageKey enum
|
|
9
|
-
* - Result pattern for error handling
|
|
10
|
-
* - Single source of truth for all storage
|
|
11
|
-
*/
|
|
12
|
-
import { create } from 'zustand';
|
|
13
|
-
import { storageRepository, StorageKey, createUserKey, unwrap } from '@umituz/react-native-storage';
|
|
14
|
-
const DEFAULT_OFFLINE_USER_ID = 'offline_user';
|
|
15
|
-
const DEFAULT_SETTINGS_CACHE = new Map();
|
|
16
|
-
const getDefaultSettings = (userId) => {
|
|
17
|
-
if (DEFAULT_SETTINGS_CACHE.has(userId)) {
|
|
18
|
-
return DEFAULT_SETTINGS_CACHE.get(userId);
|
|
19
|
-
}
|
|
20
|
-
const settings = {
|
|
21
|
-
userId,
|
|
22
|
-
theme: 'auto',
|
|
23
|
-
language: 'en-US',
|
|
24
|
-
notificationsEnabled: true,
|
|
25
|
-
emailNotifications: true,
|
|
26
|
-
pushNotifications: true,
|
|
27
|
-
soundEnabled: true,
|
|
28
|
-
vibrationEnabled: true,
|
|
29
|
-
privacyMode: false,
|
|
30
|
-
updatedAt: new Date(),
|
|
31
|
-
};
|
|
32
|
-
DEFAULT_SETTINGS_CACHE.set(userId, settings);
|
|
33
|
-
return settings;
|
|
34
|
-
};
|
|
35
|
-
export const useSettingsStore = create((set, get) => ({
|
|
36
|
-
settings: null,
|
|
37
|
-
loading: false,
|
|
38
|
-
error: null,
|
|
39
|
-
loadSettings: async (userId) => {
|
|
40
|
-
if (__DEV__) {
|
|
41
|
-
console.log('SettingsStore: Loading settings for user:', userId);
|
|
42
|
-
}
|
|
43
|
-
set({ loading: true, error: null });
|
|
44
|
-
try {
|
|
45
|
-
const defaultSettings = getDefaultSettings(userId);
|
|
46
|
-
const storageKey = createUserKey(StorageKey.SETTINGS, userId);
|
|
47
|
-
// ✅ DRY: Storage domain handles JSON parse, error handling
|
|
48
|
-
const result = await storageRepository.getItem(storageKey, defaultSettings);
|
|
49
|
-
const data = unwrap(result, defaultSettings);
|
|
50
|
-
// ✅ CLEAN CODE: Auto-save defaults if not exists
|
|
51
|
-
if (!result.success) {
|
|
52
|
-
await storageRepository.setItem(storageKey, defaultSettings);
|
|
53
|
-
}
|
|
54
|
-
set({
|
|
55
|
-
settings: data,
|
|
56
|
-
loading: false,
|
|
57
|
-
error: null,
|
|
58
|
-
});
|
|
59
|
-
if (__DEV__) {
|
|
60
|
-
console.log('SettingsStore: Settings loaded successfully');
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
catch (error) {
|
|
64
|
-
if (__DEV__) {
|
|
65
|
-
console.error('SettingsStore: Failed to load settings:', error);
|
|
66
|
-
}
|
|
67
|
-
set({ loading: false, error: 'Failed to load settings' });
|
|
68
|
-
}
|
|
69
|
-
},
|
|
70
|
-
updateSettings: async (updates) => {
|
|
71
|
-
if (__DEV__) {
|
|
72
|
-
console.log('SettingsStore: Updating settings with:', updates);
|
|
73
|
-
}
|
|
74
|
-
const { settings } = get();
|
|
75
|
-
// ✅ CLEAN CODE: Auto-initialize if settings not loaded
|
|
76
|
-
if (!settings) {
|
|
77
|
-
await get().loadSettings(DEFAULT_OFFLINE_USER_ID);
|
|
78
|
-
}
|
|
79
|
-
// ✅ DEFENSIVE: Verify settings loaded successfully
|
|
80
|
-
const currentSettings = get().settings;
|
|
81
|
-
if (!currentSettings) {
|
|
82
|
-
const errorMsg = 'Failed to initialize settings';
|
|
83
|
-
if (__DEV__) {
|
|
84
|
-
console.error('SettingsStore:', errorMsg);
|
|
85
|
-
}
|
|
86
|
-
set({ error: errorMsg });
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
set({ loading: true, error: null });
|
|
90
|
-
try {
|
|
91
|
-
const updatedSettings = {
|
|
92
|
-
...currentSettings,
|
|
93
|
-
...updates,
|
|
94
|
-
updatedAt: new Date(),
|
|
95
|
-
};
|
|
96
|
-
const storageKey = createUserKey(StorageKey.SETTINGS, currentSettings.userId);
|
|
97
|
-
// ✅ DRY: Storage domain replaces JSON.stringify + AsyncStorage + try/catch
|
|
98
|
-
const result = await storageRepository.setItem(storageKey, updatedSettings);
|
|
99
|
-
set({
|
|
100
|
-
settings: result.success ? updatedSettings : currentSettings,
|
|
101
|
-
loading: false,
|
|
102
|
-
error: null,
|
|
103
|
-
});
|
|
104
|
-
if (__DEV__) {
|
|
105
|
-
console.log('SettingsStore: Settings updated successfully');
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
catch (error) {
|
|
109
|
-
if (__DEV__) {
|
|
110
|
-
console.error('SettingsStore: Failed to update settings:', error);
|
|
111
|
-
}
|
|
112
|
-
set({ loading: false, error: 'Failed to update settings' });
|
|
113
|
-
}
|
|
114
|
-
},
|
|
115
|
-
resetSettings: async (userId) => {
|
|
116
|
-
set({ loading: true, error: null });
|
|
117
|
-
const defaultSettings = getDefaultSettings(userId);
|
|
118
|
-
const storageKey = createUserKey(StorageKey.SETTINGS, userId);
|
|
119
|
-
// ✅ DRY: Storage domain replaces JSON.stringify + AsyncStorage + try/catch
|
|
120
|
-
const result = await storageRepository.setItem(storageKey, defaultSettings);
|
|
121
|
-
set({
|
|
122
|
-
settings: result.success ? defaultSettings : get().settings,
|
|
123
|
-
loading: false,
|
|
124
|
-
error: null,
|
|
125
|
-
});
|
|
126
|
-
},
|
|
127
|
-
clearError: () => set({ error: null }),
|
|
128
|
-
}));
|
|
129
|
-
/**
|
|
130
|
-
* Hook for accessing settings state
|
|
131
|
-
*/
|
|
132
|
-
export const useSettings = () => {
|
|
133
|
-
const { settings, loading, error, loadSettings, updateSettings, resetSettings, clearError } = useSettingsStore();
|
|
134
|
-
return {
|
|
135
|
-
settings,
|
|
136
|
-
loading,
|
|
137
|
-
error,
|
|
138
|
-
loadSettings,
|
|
139
|
-
updateSettings,
|
|
140
|
-
resetSettings,
|
|
141
|
-
clearError,
|
|
142
|
-
};
|
|
143
|
-
};
|
|
144
|
-
//# sourceMappingURL=SettingsStore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsStore.js","sourceRoot":"","sources":["../../../src/infrastructure/storage/SettingsStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAgBpG,MAAM,uBAAuB,GAAG,cAAc,CAAC;AAE/C,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAwB,CAAC;AAE/D,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAgB,EAAE;IAC1D,IAAI,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,OAAO,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;IAC7C,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,MAAM;QACN,KAAK,EAAE,MAAe;QACtB,QAAQ,EAAE,OAAO;QACjB,oBAAoB,EAAE,IAAI;QAC1B,kBAAkB,EAAE,IAAI;QACxB,iBAAiB,EAAE,IAAI;QACvB,YAAY,EAAE,IAAI;QAClB,gBAAgB,EAAE,IAAI;QACtB,WAAW,EAAE,KAAK;QAClB,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC;IAEF,sBAAsB,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACnE,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,IAAI;IAEX,YAAY,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;QACrC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,MAAM,CAAC,CAAC;QACnE,CAAC;QAED,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE9D,2DAA2D;YAC3D,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAe,UAAU,EAAE,eAAe,CAAC,CAAC;YAC1F,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YAE7C,iDAAiD;YACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YAC/D,CAAC;YAED,GAAG,CAAC;gBACF,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YAEH,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YAClE,CAAC;YACD,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,cAAc,EAAE,KAAK,EAAE,OAA8B,EAAE,EAAE;QACvD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,OAAO,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,EAAE,CAAC;QAE3B,uDAAuD;QACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;QACpD,CAAC;QAED,mDAAmD;QACnD,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC;QACvC,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,+BAA+B,CAAC;YACjD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YAC5C,CAAC;YACD,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QAED,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,eAAe,GAAiB;gBACpC,GAAG,eAAe;gBAClB,GAAG,OAAO;gBACV,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;YAEF,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;YAE9E,2EAA2E;YAC3E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YAE5E,GAAG,CAAC;gBACF,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe;gBAC5D,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YAEH,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;YACpE,CAAC;YACD,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,aAAa,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;QACtC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpC,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE9D,2EAA2E;QAC3E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAE5E,GAAG,CAAC;YACF,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ;YAC3D,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC;IAED,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;CACvC,CAAC,CAAC,CAAC;AAEJ;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE;IAC9B,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,GACzF,gBAAgB,EAAE,CAAC;IAErB,OAAO;QACL,QAAQ;QACR,OAAO;QACP,KAAK;QACL,YAAY;QACZ,cAAc;QACd,aAAa;QACb,UAAU;KACX,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cloud Sync Setting Component
|
|
3
|
-
* Single Responsibility: Display cloud sync setting item
|
|
4
|
-
*/
|
|
5
|
-
import React from "react";
|
|
6
|
-
export interface CloudSyncSettingProps {
|
|
7
|
-
title?: string;
|
|
8
|
-
description?: string;
|
|
9
|
-
isSyncing?: boolean;
|
|
10
|
-
lastSynced?: Date | null;
|
|
11
|
-
onPress?: () => void;
|
|
12
|
-
iconColor?: string;
|
|
13
|
-
titleColor?: string;
|
|
14
|
-
}
|
|
15
|
-
export declare const CloudSyncSetting: React.FC<CloudSyncSettingProps>;
|
|
16
|
-
//# sourceMappingURL=CloudSyncSetting.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CloudSyncSetting.d.ts","sourceRoot":"","sources":["../../../src/presentation/components/CloudSyncSetting.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAsB,MAAM,OAAO,CAAC;AAK3C,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAqC5D,CAAC"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cloud Sync Setting Component
|
|
3
|
-
* Single Responsibility: Display cloud sync setting item
|
|
4
|
-
*/
|
|
5
|
-
import React, { useCallback } from "react";
|
|
6
|
-
import { Cloud } from "lucide-react-native";
|
|
7
|
-
import { SettingItem } from "./SettingItem";
|
|
8
|
-
export const CloudSyncSetting = ({ title, description, isSyncing = false, lastSynced, onPress, iconColor, titleColor, }) => {
|
|
9
|
-
const formatLastSynced = useCallback((date) => {
|
|
10
|
-
if (!date)
|
|
11
|
-
return "never_synced";
|
|
12
|
-
const now = new Date();
|
|
13
|
-
const diff = now.getTime() - date.getTime();
|
|
14
|
-
const minutes = Math.floor(diff / 60000);
|
|
15
|
-
const hours = Math.floor(minutes / 60);
|
|
16
|
-
const days = Math.floor(hours / 24);
|
|
17
|
-
if (minutes < 1)
|
|
18
|
-
return "just_now";
|
|
19
|
-
if (minutes < 60)
|
|
20
|
-
return `${minutes}m_ago`;
|
|
21
|
-
if (hours < 24)
|
|
22
|
-
return `${hours}h_ago`;
|
|
23
|
-
if (days < 7)
|
|
24
|
-
return `${days}d_ago`;
|
|
25
|
-
return date.toLocaleDateString();
|
|
26
|
-
}, []);
|
|
27
|
-
const displayDescription = description || (isSyncing ? "syncing" : lastSynced ? `last_synced_${formatLastSynced(lastSynced)}` : "sync_to_cloud");
|
|
28
|
-
return (<SettingItem icon={Cloud} title={title || "cloud_sync"} value={displayDescription} onPress={onPress} iconColor={iconColor} titleColor={titleColor} disabled={isSyncing}/>);
|
|
29
|
-
};
|
|
30
|
-
//# sourceMappingURL=CloudSyncSetting.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CloudSyncSetting.js","sourceRoot":"","sources":["../../../src/presentation/components/CloudSyncSetting.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAa5C,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAChE,KAAK,EACL,WAAW,EACX,SAAS,GAAG,KAAK,EACjB,UAAU,EACV,OAAO,EACP,SAAS,EACT,UAAU,GACX,EAAE,EAAE;IACH,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,IAA6B,EAAU,EAAE;QAC7E,IAAI,CAAC,IAAI;YAAE,OAAO,cAAc,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAEpC,IAAI,OAAO,GAAG,CAAC;YAAE,OAAO,UAAU,CAAC;QACnC,IAAI,OAAO,GAAG,EAAE;YAAE,OAAO,GAAG,OAAO,OAAO,CAAC;QAC3C,IAAI,KAAK,GAAG,EAAE;YAAE,OAAO,GAAG,KAAK,OAAO,CAAC;QACvC,IAAI,IAAI,GAAG,CAAC;YAAE,OAAO,GAAG,IAAI,OAAO,CAAC;QACpC,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACnC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,kBAAkB,GAAG,WAAW,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAEjJ,OAAO,CACL,CAAC,WAAW,CACV,IAAI,CAAC,CAAC,KAAK,CAAC,CACZ,KAAK,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,CAC7B,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,SAAS,CAAC,CAAC,SAAS,CAAC,CACrB,UAAU,CAAC,CAAC,UAAU,CAAC,CACvB,QAAQ,CAAC,CAAC,SAAS,CAAC,EACpB,CACH,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Disclaimer Card Component
|
|
3
|
-
* Extracted from DisclaimerSetting to follow single responsibility and 200-line rules
|
|
4
|
-
*/
|
|
5
|
-
import React from 'react';
|
|
6
|
-
export interface DisclaimerCardProps {
|
|
7
|
-
title: string;
|
|
8
|
-
shortMessage: string;
|
|
9
|
-
iconName: string;
|
|
10
|
-
iconColor: string;
|
|
11
|
-
backgroundColor: string;
|
|
12
|
-
onPress: () => void;
|
|
13
|
-
}
|
|
14
|
-
export declare const DisclaimerCard: React.FC<DisclaimerCardProps>;
|
|
15
|
-
//# sourceMappingURL=DisclaimerCard.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DisclaimerCard.d.ts","sourceRoot":"","sources":["../../../src/presentation/components/DisclaimerCard.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAmDxD,CAAC"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Disclaimer Card Component
|
|
3
|
-
* Extracted from DisclaimerSetting to follow single responsibility and 200-line rules
|
|
4
|
-
*/
|
|
5
|
-
import React from 'react';
|
|
6
|
-
import { View, StyleSheet, TouchableOpacity, } from 'react-native';
|
|
7
|
-
import { useAppDesignTokens, withAlpha } from '@umituz/react-native-design-system-theme';
|
|
8
|
-
import { AtomicText, AtomicIcon } from '@umituz/react-native-design-system-atoms';
|
|
9
|
-
export const DisclaimerCard = ({ title, shortMessage, iconName, iconColor, backgroundColor, onPress, }) => {
|
|
10
|
-
const tokens = useAppDesignTokens();
|
|
11
|
-
const styles = getStyles(tokens);
|
|
12
|
-
return (<TouchableOpacity style={[
|
|
13
|
-
styles.container,
|
|
14
|
-
{ backgroundColor },
|
|
15
|
-
]} onPress={onPress} activeOpacity={0.7} testID="disclaimer-setting">
|
|
16
|
-
{/* Icon and Title Row */}
|
|
17
|
-
<View style={styles.headerRow}>
|
|
18
|
-
<View style={[
|
|
19
|
-
styles.iconContainer,
|
|
20
|
-
{
|
|
21
|
-
backgroundColor: withAlpha(iconColor, 0.2),
|
|
22
|
-
borderColor: withAlpha(iconColor, 0.4),
|
|
23
|
-
borderWidth: 1,
|
|
24
|
-
},
|
|
25
|
-
]}>
|
|
26
|
-
<AtomicIcon name={iconName} color="warning"/>
|
|
27
|
-
</View>
|
|
28
|
-
<AtomicText type="bodyLarge" color="primary" style={styles.title}>
|
|
29
|
-
{title}
|
|
30
|
-
</AtomicText>
|
|
31
|
-
<AtomicIcon name="ArrowRight" color="secondary" size="sm"/>
|
|
32
|
-
</View>
|
|
33
|
-
|
|
34
|
-
{/* Short Message */}
|
|
35
|
-
<AtomicText type="bodySmall" color="secondary" style={styles.shortMessage}>
|
|
36
|
-
{shortMessage}
|
|
37
|
-
</AtomicText>
|
|
38
|
-
</TouchableOpacity>);
|
|
39
|
-
};
|
|
40
|
-
const getStyles = (tokens) => StyleSheet.create({
|
|
41
|
-
container: {
|
|
42
|
-
paddingHorizontal: tokens.spacing.md,
|
|
43
|
-
paddingVertical: tokens.spacing.md,
|
|
44
|
-
marginHorizontal: tokens.spacing.md,
|
|
45
|
-
marginTop: 8,
|
|
46
|
-
marginBottom: 8,
|
|
47
|
-
borderRadius: 12,
|
|
48
|
-
},
|
|
49
|
-
headerRow: {
|
|
50
|
-
flexDirection: 'row',
|
|
51
|
-
alignItems: 'center',
|
|
52
|
-
marginBottom: 12,
|
|
53
|
-
},
|
|
54
|
-
iconContainer: {
|
|
55
|
-
width: 40,
|
|
56
|
-
height: 40,
|
|
57
|
-
borderRadius: 20,
|
|
58
|
-
alignItems: 'center',
|
|
59
|
-
justifyContent: 'center',
|
|
60
|
-
marginRight: 12,
|
|
61
|
-
},
|
|
62
|
-
title: {
|
|
63
|
-
flex: 1,
|
|
64
|
-
fontWeight: tokens.typography.labelLarge.fontWeight,
|
|
65
|
-
fontSize: tokens.typography.labelLarge.fontSize,
|
|
66
|
-
},
|
|
67
|
-
shortMessage: {
|
|
68
|
-
lineHeight: 18,
|
|
69
|
-
paddingLeft: 52, // Align with title (40px icon + 12px margin)
|
|
70
|
-
fontSize: 13,
|
|
71
|
-
},
|
|
72
|
-
});
|
|
73
|
-
//# sourceMappingURL=DisclaimerCard.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DisclaimerCard.js","sourceRoot":"","sources":["../../../src/presentation/components/DisclaimerCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Disclaimer Modal Component
|
|
3
|
-
* Extracted from DisclaimerSetting to follow single responsibility and 200-line rules
|
|
4
|
-
*/
|
|
5
|
-
import React from 'react';
|
|
6
|
-
export interface DisclaimerModalProps {
|
|
7
|
-
visible: boolean;
|
|
8
|
-
title: string;
|
|
9
|
-
content: string;
|
|
10
|
-
onClose: () => void;
|
|
11
|
-
}
|
|
12
|
-
export declare const DisclaimerModal: React.FC<DisclaimerModalProps>;
|
|
13
|
-
//# sourceMappingURL=DisclaimerModal.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DisclaimerModal.d.ts","sourceRoot":"","sources":["../../../src/presentation/components/DisclaimerModal.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAmD1D,CAAC"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Disclaimer Modal Component
|
|
3
|
-
* Extracted from DisclaimerSetting to follow single responsibility and 200-line rules
|
|
4
|
-
*/
|
|
5
|
-
import React from 'react';
|
|
6
|
-
import { View, StyleSheet, TouchableOpacity, ScrollView, } from 'react-native';
|
|
7
|
-
import { useAppDesignTokens } from '@umituz/react-native-design-system-theme';
|
|
8
|
-
import { AtomicText, AtomicIcon } from '@umituz/react-native-design-system-atoms';
|
|
9
|
-
export const DisclaimerModal = ({ visible, title, content, onClose, }) => {
|
|
10
|
-
const tokens = useAppDesignTokens();
|
|
11
|
-
const styles = getStyles(tokens);
|
|
12
|
-
if (!visible)
|
|
13
|
-
return null;
|
|
14
|
-
return (<View style={[
|
|
15
|
-
styles.modalContainer,
|
|
16
|
-
{ backgroundColor: tokens.colors.backgroundPrimary },
|
|
17
|
-
]}>
|
|
18
|
-
{/* Modal Header */}
|
|
19
|
-
<View style={[
|
|
20
|
-
styles.modalHeader,
|
|
21
|
-
{ borderBottomColor: tokens.colors.borderLight },
|
|
22
|
-
]}>
|
|
23
|
-
<AtomicText type="headlineMedium" color="primary">
|
|
24
|
-
{title}
|
|
25
|
-
</AtomicText>
|
|
26
|
-
<TouchableOpacity onPress={onClose} testID="close-disclaimer-modal">
|
|
27
|
-
<AtomicIcon name="X" color="primary" size="md"/>
|
|
28
|
-
</TouchableOpacity>
|
|
29
|
-
</View>
|
|
30
|
-
|
|
31
|
-
{/* Scrollable Content */}
|
|
32
|
-
<ScrollView style={styles.modalContent} contentContainerStyle={styles.modalContentContainer}>
|
|
33
|
-
<AtomicText type="bodyMedium" color="primary" style={styles.modalText}>
|
|
34
|
-
{content}
|
|
35
|
-
</AtomicText>
|
|
36
|
-
</ScrollView>
|
|
37
|
-
</View>);
|
|
38
|
-
};
|
|
39
|
-
const getStyles = (tokens) => StyleSheet.create({
|
|
40
|
-
modalContainer: {
|
|
41
|
-
flex: 1,
|
|
42
|
-
},
|
|
43
|
-
modalHeader: {
|
|
44
|
-
flexDirection: 'row',
|
|
45
|
-
justifyContent: 'space-between',
|
|
46
|
-
alignItems: 'center',
|
|
47
|
-
paddingHorizontal: 20,
|
|
48
|
-
paddingVertical: 16,
|
|
49
|
-
borderBottomWidth: 1,
|
|
50
|
-
},
|
|
51
|
-
modalContent: {
|
|
52
|
-
flex: 1,
|
|
53
|
-
},
|
|
54
|
-
modalContentContainer: {
|
|
55
|
-
padding: 20,
|
|
56
|
-
},
|
|
57
|
-
modalText: {
|
|
58
|
-
lineHeight: 24,
|
|
59
|
-
fontSize: 15,
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
//# sourceMappingURL=DisclaimerModal.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DisclaimerModal.js","sourceRoot":"","sources":["../../../src/presentation/components/DisclaimerModal.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,IAAI,EACJ,UAAU,EACV,gBAAgB,EAChB,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AASlF,MAAM,CAAC,MAAM,eAAe,GAAmC,CAAC,EAC9D,OAAO,EACP,KAAK,EACL,OAAO,EACP,OAAO,GACR,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAEjC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO,CACL,CAAC,IAAI,CACH,KAAK,CAAC,CAAC;YACL,MAAM,CAAC,cAAc;YACrB,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE;SACrD,CAAC,CAEF;MAAA,CAAC,kBAAkB,CACnB;MAAA,CAAC,IAAI,CACH,KAAK,CAAC,CAAC;YACL,MAAM,CAAC,WAAW;YAClB,EAAE,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;SACjD,CAAC,CAEF;QAAA,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAC/C;UAAA,CAAC,KAAK,CACR;QAAA,EAAE,UAAU,CACZ;QAAA,CAAC,gBAAgB,CACf,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,MAAM,CAAC,wBAAwB,CAE/B;UAAA,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAChD;QAAA,EAAE,gBAAgB,CACpB;MAAA,EAAE,IAAI,CAEN;;MAAA,CAAC,wBAAwB,CACzB;MAAA,CAAC,UAAU,CACT,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAC3B,qBAAqB,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAEpD;QAAA,CAAC,UAAU,CACT,IAAI,CAAC,YAAY,CACjB,KAAK,CAAC,SAAS,CACf,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAExB;UAAA,CAAC,OAAO,CACV;QAAA,EAAE,UAAU,CACd;MAAA,EAAE,UAAU,CACd;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,MAA6C,EAAE,EAAE,CAClE,UAAU,CAAC,MAAM,CAAC;IAChB,cAAc,EAAE;QACd,IAAI,EAAE,CAAC;KACR;IAED,WAAW,EAAE;QACX,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,eAAe;QAC/B,UAAU,EAAE,QAAQ;QACpB,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,iBAAiB,EAAE,CAAC;KACrB;IAED,YAAY,EAAE;QACZ,IAAI,EAAE,CAAC;KACR;IAED,qBAAqB,EAAE;QACrB,OAAO,EAAE,EAAE;KACZ;IAED,SAAS,EAAE;QACT,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;KACb;CACF,CAAC,CAAC"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DisclaimerSetting Component
|
|
3
|
-
*
|
|
4
|
-
* Displays customizable disclaimer with important legal notice
|
|
5
|
-
* Used in About screens for apps that require disclaimers
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Tappable card that opens full disclaimer modal
|
|
9
|
-
* - Warning icon with background color
|
|
10
|
-
* - Internationalized title and message
|
|
11
|
-
* - Full-screen modal with scrollable content
|
|
12
|
-
* - NO shadows (CLAUDE.md compliance)
|
|
13
|
-
* - Universal across iOS, Android, Web (NO Platform.OS checks)
|
|
14
|
-
*
|
|
15
|
-
* Usage:
|
|
16
|
-
* - Import and use in AboutScreen
|
|
17
|
-
* - Requires translations: settings.disclaimer.title, settings.disclaimer.message, settings.disclaimer.shortMessage
|
|
18
|
-
*/
|
|
19
|
-
import React from 'react';
|
|
20
|
-
export interface DisclaimerSettingProps {
|
|
21
|
-
/** Custom title translation key */
|
|
22
|
-
titleKey?: string;
|
|
23
|
-
/** Custom message translation key */
|
|
24
|
-
messageKey?: string;
|
|
25
|
-
/** Custom short message translation key */
|
|
26
|
-
shortMessageKey?: string;
|
|
27
|
-
/** Custom icon name */
|
|
28
|
-
iconName?: string;
|
|
29
|
-
/** Custom icon color */
|
|
30
|
-
iconColor?: string;
|
|
31
|
-
/** Custom background color */
|
|
32
|
-
backgroundColor?: string;
|
|
33
|
-
/** Custom modal title */
|
|
34
|
-
modalTitle?: string;
|
|
35
|
-
/** Custom modal content */
|
|
36
|
-
modalContent?: string;
|
|
37
|
-
}
|
|
38
|
-
export declare const DisclaimerSetting: React.FC<DisclaimerSettingProps>;
|
|
39
|
-
//# sourceMappingURL=DisclaimerSetting.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DisclaimerSetting.d.ts","sourceRoot":"","sources":["../../../src/presentation/components/DisclaimerSetting.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAQhE,MAAM,WAAW,sBAAsB;IACrC,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAkE9D,CAAC"}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DisclaimerSetting Component
|
|
3
|
-
*
|
|
4
|
-
* Displays customizable disclaimer with important legal notice
|
|
5
|
-
* Used in About screens for apps that require disclaimers
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Tappable card that opens full disclaimer modal
|
|
9
|
-
* - Warning icon with background color
|
|
10
|
-
* - Internationalized title and message
|
|
11
|
-
* - Full-screen modal with scrollable content
|
|
12
|
-
* - NO shadows (CLAUDE.md compliance)
|
|
13
|
-
* - Universal across iOS, Android, Web (NO Platform.OS checks)
|
|
14
|
-
*
|
|
15
|
-
* Usage:
|
|
16
|
-
* - Import and use in AboutScreen
|
|
17
|
-
* - Requires translations: settings.disclaimer.title, settings.disclaimer.message, settings.disclaimer.shortMessage
|
|
18
|
-
*/
|
|
19
|
-
import React, { useState, useEffect, useCallback } from 'react';
|
|
20
|
-
import { Modal } from 'react-native';
|
|
21
|
-
import { useAppDesignTokens, withAlpha } from '@umituz/react-native-design-system-theme';
|
|
22
|
-
import { useLocalization } from '@umituz/react-native-localization';
|
|
23
|
-
import { DisclaimerCard } from './DisclaimerCard';
|
|
24
|
-
import { DisclaimerModal } from './DisclaimerModal';
|
|
25
|
-
export const DisclaimerSetting = ({ titleKey = "settings.disclaimer.title", messageKey = "settings.disclaimer.message", shortMessageKey = "settings.disclaimer.shortMessage", iconName = "AlertTriangle", iconColor, backgroundColor, modalTitle, modalContent, }) => {
|
|
26
|
-
const { t } = useLocalization();
|
|
27
|
-
const tokens = useAppDesignTokens();
|
|
28
|
-
const [modalVisible, setModalVisible] = useState(false);
|
|
29
|
-
useEffect(() => {
|
|
30
|
-
return () => {
|
|
31
|
-
setModalVisible(false);
|
|
32
|
-
};
|
|
33
|
-
}, []);
|
|
34
|
-
const title = modalTitle || t(titleKey);
|
|
35
|
-
const content = modalContent || t(messageKey);
|
|
36
|
-
const shortMessage = t(shortMessageKey);
|
|
37
|
-
const finalIconColor = iconColor || tokens.colors.warning;
|
|
38
|
-
const finalBackgroundColor = backgroundColor || withAlpha(finalIconColor, 0.1);
|
|
39
|
-
const handleOpenModal = useCallback(() => {
|
|
40
|
-
setModalVisible(true);
|
|
41
|
-
if (__DEV__) {
|
|
42
|
-
console.log('DisclaimerSetting: Modal opened');
|
|
43
|
-
}
|
|
44
|
-
}, []);
|
|
45
|
-
const handleCloseModal = useCallback(() => {
|
|
46
|
-
setModalVisible(false);
|
|
47
|
-
if (__DEV__) {
|
|
48
|
-
console.log('DisclaimerSetting: Modal closed');
|
|
49
|
-
}
|
|
50
|
-
}, []);
|
|
51
|
-
return (<>
|
|
52
|
-
<DisclaimerCard title={title} shortMessage={shortMessage} iconName={iconName} iconColor={finalIconColor} backgroundColor={finalBackgroundColor} onPress={handleOpenModal}/>
|
|
53
|
-
|
|
54
|
-
<Modal visible={modalVisible} animationType="slide" presentationStyle="pageSheet" onRequestClose={handleCloseModal}>
|
|
55
|
-
<DisclaimerModal visible={modalVisible} title={title} content={content} onClose={handleCloseModal}/>
|
|
56
|
-
</Modal>
|
|
57
|
-
</>);
|
|
58
|
-
};
|
|
59
|
-
//# sourceMappingURL=DisclaimerSetting.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DisclaimerSetting.js","sourceRoot":"","sources":["../../../src/presentation/components/DisclaimerSetting.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAqBpD,MAAM,CAAC,MAAM,iBAAiB,GAAqC,CAAC,EAClE,QAAQ,GAAG,2BAA2B,EACtC,UAAU,GAAG,6BAA6B,EAC1C,eAAe,GAAG,kCAAkC,EACpD,QAAQ,GAAG,eAAe,EAC1B,SAAS,EACT,eAAe,EACf,UAAU,EACV,YAAY,GACb,EAAE,EAAE;IACH,MAAM,EAAE,CAAC,EAAE,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,YAAY,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;IAC1D,MAAM,oBAAoB,GAAG,eAAe,IAAI,SAAS,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAE/E,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,eAAe,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,EACE;MAAA,CAAC,cAAc,CACb,KAAK,CAAC,CAAC,KAAK,CAAC,CACb,YAAY,CAAC,CAAC,YAAY,CAAC,CAC3B,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,SAAS,CAAC,CAAC,cAAc,CAAC,CAC1B,eAAe,CAAC,CAAC,oBAAoB,CAAC,CACtC,OAAO,CAAC,CAAC,eAAe,CAAC,EAG3B;;MAAA,CAAC,KAAK,CACJ,OAAO,CAAC,CAAC,YAAY,CAAC,CACtB,aAAa,CAAC,OAAO,CACrB,iBAAiB,CAAC,WAAW,CAC7B,cAAc,CAAC,CAAC,gBAAgB,CAAC,CAEjC;QAAA,CAAC,eAAe,CACd,OAAO,CAAC,CAAC,YAAY,CAAC,CACtB,KAAK,CAAC,CAAC,KAAK,CAAC,CACb,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,OAAO,CAAC,CAAC,gBAAgB,CAAC,EAE9B;MAAA,EAAE,KAAK,CACT;IAAA,GAAG,CACJ,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Setting Item Component
|
|
3
|
-
* Single Responsibility: Render a single settings item
|
|
4
|
-
* Material Design 3 style with hover effects and modern spacing
|
|
5
|
-
*/
|
|
6
|
-
import React from "react";
|
|
7
|
-
import { type LucideIcon } from "lucide-react-native";
|
|
8
|
-
export interface SettingItemProps {
|
|
9
|
-
/** Icon component from lucide-react-native */
|
|
10
|
-
icon: LucideIcon | React.ComponentType<{
|
|
11
|
-
size?: number;
|
|
12
|
-
color?: string;
|
|
13
|
-
}>;
|
|
14
|
-
/** Main title text */
|
|
15
|
-
title: string;
|
|
16
|
-
/** Optional description/value text */
|
|
17
|
-
value?: string;
|
|
18
|
-
/** Callback when pressed */
|
|
19
|
-
onPress?: () => void;
|
|
20
|
-
/** Show switch instead of chevron */
|
|
21
|
-
showSwitch?: boolean;
|
|
22
|
-
/** Switch value */
|
|
23
|
-
switchValue?: boolean;
|
|
24
|
-
/** Switch change handler */
|
|
25
|
-
onSwitchChange?: (value: boolean) => void;
|
|
26
|
-
/** Is last item in section (no divider) */
|
|
27
|
-
isLast?: boolean;
|
|
28
|
-
/** Custom icon color */
|
|
29
|
-
iconColor?: string;
|
|
30
|
-
/** Custom title color */
|
|
31
|
-
titleColor?: string;
|
|
32
|
-
/** Test ID for E2E testing */
|
|
33
|
-
testID?: string;
|
|
34
|
-
/** Disable the item */
|
|
35
|
-
disabled?: boolean;
|
|
36
|
-
/** Custom switch thumb color */
|
|
37
|
-
switchThumbColor?: string;
|
|
38
|
-
/** Custom switch track colors */
|
|
39
|
-
switchTrackColors?: {
|
|
40
|
-
false: string;
|
|
41
|
-
true: string;
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
export declare const SettingItem: React.FC<SettingItemProps>;
|
|
45
|
-
//# sourceMappingURL=SettingItem.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SettingItem.d.ts","sourceRoot":"","sources":["../../../src/presentation/components/SettingItem.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGpE,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,IAAI,EAAE,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mBAAmB;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4BAA4B;IAC5B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,2CAA2C;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iCAAiC;IACjC,iBAAiB,CAAC,EAAE;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAsGlD,CAAC"}
|