@umituz/react-native-settings 4.19.6 → 4.20.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 +14 -12
- package/src/domains/about/presentation/components/AboutContent.tsx +12 -9
- package/src/domains/about/presentation/components/AboutHeader.tsx +12 -11
- package/src/domains/about/presentation/components/AboutSettingItem.tsx +18 -17
- package/src/domains/about/presentation/screens/AboutScreen.tsx +13 -12
- package/src/domains/appearance/presentation/components/AppearanceHeader.tsx +2 -2
- package/src/domains/appearance/presentation/components/AppearancePreview.tsx +11 -11
- package/src/domains/appearance/presentation/components/ColorPicker.tsx +3 -3
- package/src/domains/appearance/presentation/components/CustomColorsSection.tsx +4 -4
- package/src/domains/appearance/presentation/components/ThemeModeSection.tsx +3 -3
- package/src/domains/appearance/presentation/components/ThemeOption.tsx +20 -20
- package/src/domains/appearance/presentation/screens/AppearanceScreen.tsx +5 -5
- package/src/domains/disclaimer/presentation/components/DisclaimerCard.tsx +15 -15
- package/src/domains/disclaimer/presentation/components/DisclaimerModal.tsx +5 -5
- package/src/domains/disclaimer/presentation/screens/DisclaimerScreen.tsx +9 -9
- package/src/domains/faqs/presentation/components/FAQCategory.tsx +17 -8
- package/src/domains/faqs/presentation/components/FAQEmptyState.tsx +2 -2
- package/src/domains/faqs/presentation/components/FAQItem.tsx +37 -22
- package/src/domains/faqs/presentation/components/FAQSearchBar.tsx +13 -12
- package/src/domains/faqs/presentation/screens/FAQScreen.tsx +38 -28
- package/src/domains/feedback/presentation/components/FeedbackForm.tsx +21 -19
- package/src/domains/feedback/presentation/components/FeedbackModal.tsx +11 -9
- package/src/domains/legal/presentation/screens/LegalScreen.tsx +8 -8
- package/src/domains/legal/presentation/screens/PrivacyPolicyScreen.tsx +15 -12
- package/src/domains/legal/presentation/screens/TermsOfServiceScreen.tsx +15 -12
- package/src/domains/rating/presentation/components/StarRating.tsx +9 -4
- package/src/domains/video-tutorials/index.ts +1 -0
- package/src/domains/video-tutorials/infrastructure/services/video-tutorial.service.ts +2 -2
- package/src/domains/video-tutorials/presentation/components/VideoTutorialCard.tsx +35 -31
- package/src/domains/video-tutorials/presentation/screens/VideoTutorialsScreen.tsx +11 -9
- package/src/presentation/components/DevSettingsSection.tsx +2 -2
- package/src/presentation/components/SettingItem.tsx +2 -2
- package/src/presentation/components/SettingsErrorBoundary.tsx +2 -2
- package/src/presentation/components/SettingsFooter.tsx +2 -2
- package/src/presentation/components/SettingsItemCard.tsx +2 -2
- package/src/presentation/components/SettingsSection.tsx +2 -2
- package/src/presentation/navigation/SettingsStackNavigator.tsx +2 -2
- package/src/presentation/screens/SettingsScreen.tsx +2 -2
- package/src/presentation/screens/components/SettingsContent.tsx +2 -2
- package/src/presentation/screens/components/SettingsHeader.tsx +2 -2
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import React from "react";
|
|
11
11
|
import { View, StyleSheet } from "react-native";
|
|
12
|
-
import {
|
|
12
|
+
import { useAppDesignTokens, type DesignTokens } from "@umituz/react-native-design-system";
|
|
13
13
|
import { AtomicText } from "@umituz/react-native-design-system";
|
|
14
14
|
import { ScreenLayout } from "@umituz/react-native-design-system";
|
|
15
15
|
import { LegalItem } from "../components/LegalItem";
|
|
@@ -93,7 +93,7 @@ export const LegalScreen: React.FC<LegalScreenProps> = React.memo(({
|
|
|
93
93
|
eulaUrl,
|
|
94
94
|
testID = "legal-screen",
|
|
95
95
|
}) => {
|
|
96
|
-
const tokens =
|
|
96
|
+
const tokens = useAppDesignTokens();
|
|
97
97
|
|
|
98
98
|
// Memoize styles to prevent recreation on every render
|
|
99
99
|
const styles = React.useMemo(() => {
|
|
@@ -220,18 +220,18 @@ export const LegalScreen: React.FC<LegalScreenProps> = React.memo(({
|
|
|
220
220
|
const createLegalScreenStyles = (tokens: DesignTokens) => {
|
|
221
221
|
return StyleSheet.create({
|
|
222
222
|
header: {
|
|
223
|
-
paddingBottom: tokens.spacing.lg,
|
|
224
|
-
paddingTop: tokens.spacing.md,
|
|
223
|
+
paddingBottom: tokens.spacing.lg * tokens.spacingMultiplier,
|
|
224
|
+
paddingTop: tokens.spacing.md * tokens.spacingMultiplier,
|
|
225
225
|
},
|
|
226
226
|
headerSubtitle: {
|
|
227
|
-
marginTop: tokens.spacing.xs,
|
|
227
|
+
marginTop: tokens.spacing.xs * tokens.spacingMultiplier,
|
|
228
228
|
},
|
|
229
229
|
section: {
|
|
230
|
-
marginTop: tokens.spacing.md,
|
|
230
|
+
marginTop: tokens.spacing.md * tokens.spacingMultiplier,
|
|
231
231
|
},
|
|
232
232
|
sectionHeader: {
|
|
233
|
-
marginBottom: tokens.spacing.sm,
|
|
234
|
-
paddingHorizontal: tokens.spacing.md,
|
|
233
|
+
marginBottom: tokens.spacing.sm * tokens.spacingMultiplier,
|
|
234
|
+
paddingHorizontal: tokens.spacing.md * tokens.spacingMultiplier,
|
|
235
235
|
},
|
|
236
236
|
});
|
|
237
237
|
};
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React from "react";
|
|
7
7
|
import { View, ScrollView, StyleSheet } from "react-native";
|
|
8
8
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
9
|
-
import {
|
|
9
|
+
import { useAppDesignTokens } from "@umituz/react-native-design-system";
|
|
10
10
|
import { AtomicText, AtomicButton } from "@umituz/react-native-design-system";
|
|
11
11
|
import { UrlHandlerService } from "../../domain/services/UrlHandlerService";
|
|
12
12
|
import { ContentValidationService } from "../../domain/services/ContentValidationService";
|
|
@@ -54,7 +54,7 @@ export const PrivacyPolicyScreen: React.FC<PrivacyPolicyScreenProps> = React.mem
|
|
|
54
54
|
onUrlPress,
|
|
55
55
|
testID = "privacy-policy-screen",
|
|
56
56
|
}) => {
|
|
57
|
-
const tokens =
|
|
57
|
+
const tokens = useAppDesignTokens();
|
|
58
58
|
const insets = useSafeAreaInsets();
|
|
59
59
|
|
|
60
60
|
// Validate required props
|
|
@@ -71,12 +71,13 @@ export const PrivacyPolicyScreen: React.FC<PrivacyPolicyScreenProps> = React.mem
|
|
|
71
71
|
|
|
72
72
|
// Use cached styles
|
|
73
73
|
const styles = React.useMemo(() => {
|
|
74
|
+
const cacheKey = StyleCacheService.createTokenCacheKey(tokens);
|
|
74
75
|
return StyleCacheService.getCachedStyles(
|
|
75
76
|
'PrivacyPolicyScreen',
|
|
76
|
-
|
|
77
|
-
createPrivacyPolicyStyles
|
|
77
|
+
cacheKey,
|
|
78
|
+
() => createPrivacyPolicyStyles(tokens)
|
|
78
79
|
);
|
|
79
|
-
}, []);
|
|
80
|
+
}, [tokens]);
|
|
80
81
|
|
|
81
82
|
// Memoize URL press handler to prevent child re-renders
|
|
82
83
|
const handleUrlPress = React.useCallback(async () => {
|
|
@@ -170,34 +171,36 @@ export const PrivacyPolicyScreen: React.FC<PrivacyPolicyScreenProps> = React.mem
|
|
|
170
171
|
);
|
|
171
172
|
});
|
|
172
173
|
|
|
173
|
-
const createPrivacyPolicyStyles = () => {
|
|
174
|
+
const createPrivacyPolicyStyles = (tokens: any) => {
|
|
174
175
|
return StyleSheet.create({
|
|
175
176
|
container: {
|
|
176
177
|
flex: 1,
|
|
177
178
|
},
|
|
178
179
|
scrollContent: {
|
|
179
180
|
flexGrow: 1,
|
|
180
|
-
padding: 20,
|
|
181
|
+
padding: 20 * tokens.spacingMultiplier,
|
|
181
182
|
},
|
|
182
183
|
content: {
|
|
183
184
|
flex: 1,
|
|
184
185
|
},
|
|
185
186
|
title: {
|
|
186
|
-
marginBottom: 24,
|
|
187
|
+
marginBottom: 24 * tokens.spacingMultiplier,
|
|
187
188
|
},
|
|
188
189
|
text: {
|
|
189
|
-
lineHeight: 24,
|
|
190
|
+
lineHeight: 24 * tokens.spacingMultiplier,
|
|
191
|
+
fontSize: tokens.typography.bodyMedium.responsiveFontSize,
|
|
190
192
|
},
|
|
191
193
|
urlContainer: {
|
|
192
|
-
marginTop: 32,
|
|
194
|
+
marginTop: 32 * tokens.spacingMultiplier,
|
|
193
195
|
alignItems: "center",
|
|
194
196
|
},
|
|
195
197
|
urlText: {
|
|
196
|
-
marginBottom: 16,
|
|
198
|
+
marginBottom: 16 * tokens.spacingMultiplier,
|
|
197
199
|
textAlign: "center",
|
|
200
|
+
fontSize: tokens.typography.bodyMedium.responsiveFontSize,
|
|
198
201
|
},
|
|
199
202
|
urlButton: {
|
|
200
|
-
marginTop: 8,
|
|
203
|
+
marginTop: 8 * tokens.spacingMultiplier,
|
|
201
204
|
},
|
|
202
205
|
});
|
|
203
206
|
};
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React from "react";
|
|
7
7
|
import { View, ScrollView, StyleSheet } from "react-native";
|
|
8
8
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
9
|
-
import {
|
|
9
|
+
import { useAppDesignTokens } from "@umituz/react-native-design-system";
|
|
10
10
|
import { AtomicText, AtomicButton } from "@umituz/react-native-design-system";
|
|
11
11
|
import { UrlHandlerService } from "../../domain/services/UrlHandlerService";
|
|
12
12
|
import { ContentValidationService } from "../../domain/services/ContentValidationService";
|
|
@@ -54,7 +54,7 @@ export const TermsOfServiceScreen: React.FC<TermsOfServiceScreenProps> = React.m
|
|
|
54
54
|
onUrlPress,
|
|
55
55
|
testID = "terms-of-service-screen",
|
|
56
56
|
}) => {
|
|
57
|
-
const tokens =
|
|
57
|
+
const tokens = useAppDesignTokens();
|
|
58
58
|
const insets = useSafeAreaInsets();
|
|
59
59
|
|
|
60
60
|
// Validate required props
|
|
@@ -71,12 +71,13 @@ export const TermsOfServiceScreen: React.FC<TermsOfServiceScreenProps> = React.m
|
|
|
71
71
|
|
|
72
72
|
// Use cached styles
|
|
73
73
|
const styles = React.useMemo(() => {
|
|
74
|
+
const cacheKey = StyleCacheService.createTokenCacheKey(tokens);
|
|
74
75
|
return StyleCacheService.getCachedStyles(
|
|
75
76
|
'TermsOfServiceScreen',
|
|
76
|
-
|
|
77
|
-
createTermsOfServiceStyles
|
|
77
|
+
cacheKey,
|
|
78
|
+
() => createTermsOfServiceStyles(tokens)
|
|
78
79
|
);
|
|
79
|
-
}, []);
|
|
80
|
+
}, [tokens]);
|
|
80
81
|
|
|
81
82
|
// Memoize URL press handler to prevent child re-renders
|
|
82
83
|
const handleUrlPress = React.useCallback(async () => {
|
|
@@ -170,34 +171,36 @@ export const TermsOfServiceScreen: React.FC<TermsOfServiceScreenProps> = React.m
|
|
|
170
171
|
);
|
|
171
172
|
});
|
|
172
173
|
|
|
173
|
-
const createTermsOfServiceStyles = () => {
|
|
174
|
+
const createTermsOfServiceStyles = (tokens: any) => {
|
|
174
175
|
return StyleSheet.create({
|
|
175
176
|
container: {
|
|
176
177
|
flex: 1,
|
|
177
178
|
},
|
|
178
179
|
scrollContent: {
|
|
179
180
|
flexGrow: 1,
|
|
180
|
-
padding: 20,
|
|
181
|
+
padding: 20 * tokens.spacingMultiplier,
|
|
181
182
|
},
|
|
182
183
|
content: {
|
|
183
184
|
flex: 1,
|
|
184
185
|
},
|
|
185
186
|
title: {
|
|
186
|
-
marginBottom: 24,
|
|
187
|
+
marginBottom: 24 * tokens.spacingMultiplier,
|
|
187
188
|
},
|
|
188
189
|
text: {
|
|
189
|
-
lineHeight: 24,
|
|
190
|
+
lineHeight: 24 * tokens.spacingMultiplier,
|
|
191
|
+
fontSize: tokens.typography.bodyMedium.responsiveFontSize,
|
|
190
192
|
},
|
|
191
193
|
urlContainer: {
|
|
192
|
-
marginTop: 32,
|
|
194
|
+
marginTop: 32 * tokens.spacingMultiplier,
|
|
193
195
|
alignItems: "center",
|
|
194
196
|
},
|
|
195
197
|
urlText: {
|
|
196
|
-
marginBottom: 16,
|
|
198
|
+
marginBottom: 16 * tokens.spacingMultiplier,
|
|
197
199
|
textAlign: "center",
|
|
200
|
+
fontSize: tokens.typography.bodyMedium.responsiveFontSize,
|
|
198
201
|
},
|
|
199
202
|
urlButton: {
|
|
200
|
-
marginTop: 8,
|
|
203
|
+
marginTop: 8 * tokens.spacingMultiplier,
|
|
201
204
|
},
|
|
202
205
|
});
|
|
203
206
|
};
|
|
@@ -24,10 +24,14 @@ export const StarRating: React.FC<StarRatingProps> = ({
|
|
|
24
24
|
style,
|
|
25
25
|
}) => {
|
|
26
26
|
const tokens = useAppDesignTokens();
|
|
27
|
+
const styles = getStyles(tokens);
|
|
27
28
|
const [internalRating, setInternalRating] = useState(rating);
|
|
28
29
|
|
|
29
30
|
const filledColor = activeColor || tokens.colors.warning || "#FFD700";
|
|
30
31
|
const emptyColor = inactiveColor || tokens.colors.border || "#E0E0E0";
|
|
32
|
+
|
|
33
|
+
// Scale the size
|
|
34
|
+
const responsiveSize = size * tokens.spacingMultiplier;
|
|
31
35
|
|
|
32
36
|
const handlePress = (index: number) => {
|
|
33
37
|
if (disabled) return;
|
|
@@ -48,7 +52,7 @@ export const StarRating: React.FC<StarRatingProps> = ({
|
|
|
48
52
|
>
|
|
49
53
|
<AtomicIcon
|
|
50
54
|
name={index < (onRatingChange ? internalRating : rating) ? "star" : "star-outline"}
|
|
51
|
-
customSize={
|
|
55
|
+
customSize={responsiveSize}
|
|
52
56
|
customColor={index < (onRatingChange ? internalRating : rating) ? filledColor : emptyColor}
|
|
53
57
|
/>
|
|
54
58
|
</TouchableOpacity>
|
|
@@ -57,13 +61,14 @@ export const StarRating: React.FC<StarRatingProps> = ({
|
|
|
57
61
|
);
|
|
58
62
|
};
|
|
59
63
|
|
|
60
|
-
const
|
|
64
|
+
const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
|
|
65
|
+
StyleSheet.create({
|
|
61
66
|
container: {
|
|
62
67
|
flexDirection: "row",
|
|
63
68
|
alignItems: "center",
|
|
64
|
-
gap: 4,
|
|
69
|
+
gap: 4 * tokens.spacingMultiplier,
|
|
65
70
|
},
|
|
66
71
|
starContainer: {
|
|
67
|
-
padding: 4,
|
|
72
|
+
padding: 4 * tokens.spacingMultiplier,
|
|
68
73
|
},
|
|
69
74
|
});
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
where,
|
|
12
12
|
limit,
|
|
13
13
|
} from "firebase/firestore";
|
|
14
|
-
import type { Firestore } from "firebase/firestore";
|
|
14
|
+
import type { Firestore, QueryConstraint } from "firebase/firestore";
|
|
15
15
|
import type {
|
|
16
16
|
VideoTutorial,
|
|
17
17
|
VideoTutorialCategory,
|
|
@@ -46,7 +46,7 @@ class VideoTutorialService {
|
|
|
46
46
|
async getAllTutorials(
|
|
47
47
|
filters?: VideoTutorialFilters,
|
|
48
48
|
): Promise<VideoTutorial[]> {
|
|
49
|
-
const constraints = [];
|
|
49
|
+
const constraints: QueryConstraint[] = [];
|
|
50
50
|
|
|
51
51
|
if (filters?.category) {
|
|
52
52
|
constraints.push(where("category", "==", filters.category));
|
|
@@ -20,6 +20,7 @@ export const VideoTutorialCard: React.FC<VideoTutorialCardProps> = ({
|
|
|
20
20
|
horizontal = false,
|
|
21
21
|
}) => {
|
|
22
22
|
const tokens = useAppDesignTokens();
|
|
23
|
+
const styles = getStyles(tokens);
|
|
23
24
|
|
|
24
25
|
const formatDuration = (seconds: number): string => {
|
|
25
26
|
const minutes = Math.floor(seconds / 60);
|
|
@@ -107,16 +108,17 @@ export const VideoTutorialCard: React.FC<VideoTutorialCardProps> = ({
|
|
|
107
108
|
);
|
|
108
109
|
};
|
|
109
110
|
|
|
110
|
-
const
|
|
111
|
+
const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
|
|
112
|
+
StyleSheet.create({
|
|
111
113
|
container: {
|
|
112
|
-
borderRadius: 12,
|
|
114
|
+
borderRadius: 12 * tokens.spacingMultiplier,
|
|
113
115
|
borderWidth: 1,
|
|
114
|
-
marginBottom: 12,
|
|
116
|
+
marginBottom: 12 * tokens.spacingMultiplier,
|
|
115
117
|
overflow: "hidden",
|
|
116
118
|
},
|
|
117
119
|
horizontalContainer: {
|
|
118
|
-
width: 280,
|
|
119
|
-
marginRight: 12,
|
|
120
|
+
width: 280 * tokens.spacingMultiplier,
|
|
121
|
+
marginRight: 12 * tokens.spacingMultiplier,
|
|
120
122
|
marginBottom: 0,
|
|
121
123
|
},
|
|
122
124
|
imageContainer: {
|
|
@@ -124,56 +126,56 @@ const styles = StyleSheet.create({
|
|
|
124
126
|
},
|
|
125
127
|
thumbnail: {
|
|
126
128
|
width: "100%",
|
|
127
|
-
height: 180,
|
|
129
|
+
height: 180 * tokens.spacingMultiplier,
|
|
128
130
|
},
|
|
129
131
|
horizontalThumbnail: {
|
|
130
|
-
height: 140,
|
|
132
|
+
height: 140 * tokens.spacingMultiplier,
|
|
131
133
|
},
|
|
132
134
|
durationBadge: {
|
|
133
135
|
position: "absolute",
|
|
134
|
-
bottom: 8,
|
|
135
|
-
right: 8,
|
|
136
|
-
paddingHorizontal: 6,
|
|
137
|
-
paddingVertical: 2,
|
|
138
|
-
borderRadius: 4,
|
|
136
|
+
bottom: 8 * tokens.spacingMultiplier,
|
|
137
|
+
right: 8 * tokens.spacingMultiplier,
|
|
138
|
+
paddingHorizontal: 6 * tokens.spacingMultiplier,
|
|
139
|
+
paddingVertical: 2 * tokens.spacingMultiplier,
|
|
140
|
+
borderRadius: 4 * tokens.spacingMultiplier,
|
|
139
141
|
},
|
|
140
142
|
durationText: {
|
|
141
143
|
color: "white",
|
|
142
|
-
fontSize: 12,
|
|
144
|
+
fontSize: 12 * tokens.spacingMultiplier,
|
|
143
145
|
fontWeight: "500",
|
|
144
146
|
},
|
|
145
147
|
featuredBadge: {
|
|
146
148
|
position: "absolute",
|
|
147
|
-
top: 8,
|
|
148
|
-
left: 8,
|
|
149
|
-
paddingHorizontal: 8,
|
|
150
|
-
paddingVertical: 4,
|
|
151
|
-
borderRadius: 4,
|
|
149
|
+
top: 8 * tokens.spacingMultiplier,
|
|
150
|
+
left: 8 * tokens.spacingMultiplier,
|
|
151
|
+
paddingHorizontal: 8 * tokens.spacingMultiplier,
|
|
152
|
+
paddingVertical: 4 * tokens.spacingMultiplier,
|
|
153
|
+
borderRadius: 4 * tokens.spacingMultiplier,
|
|
152
154
|
},
|
|
153
155
|
featuredText: {
|
|
154
|
-
fontSize: 11,
|
|
156
|
+
fontSize: 11 * tokens.spacingMultiplier,
|
|
155
157
|
fontWeight: "600",
|
|
156
158
|
},
|
|
157
159
|
content: {
|
|
158
|
-
padding: 12,
|
|
160
|
+
padding: 12 * tokens.spacingMultiplier,
|
|
159
161
|
},
|
|
160
162
|
title: {
|
|
161
|
-
fontSize:
|
|
163
|
+
fontSize: tokens.typography.titleMedium.responsiveFontSize,
|
|
162
164
|
fontWeight: "600",
|
|
163
|
-
marginBottom: 6,
|
|
165
|
+
marginBottom: 6 * tokens.spacingMultiplier,
|
|
164
166
|
},
|
|
165
167
|
horizontalTitle: {
|
|
166
|
-
fontSize:
|
|
168
|
+
fontSize: tokens.typography.bodyLarge.responsiveFontSize,
|
|
167
169
|
},
|
|
168
170
|
description: {
|
|
169
|
-
fontSize:
|
|
170
|
-
lineHeight: 20,
|
|
171
|
-
marginBottom: 8,
|
|
171
|
+
fontSize: tokens.typography.bodyMedium.responsiveFontSize,
|
|
172
|
+
lineHeight: 20 * tokens.spacingMultiplier,
|
|
173
|
+
marginBottom: 8 * tokens.spacingMultiplier,
|
|
172
174
|
},
|
|
173
175
|
horizontalDescription: {
|
|
174
|
-
fontSize:
|
|
175
|
-
lineHeight: 16,
|
|
176
|
-
marginBottom: 6,
|
|
176
|
+
fontSize: tokens.typography.bodySmall.responsiveFontSize,
|
|
177
|
+
lineHeight: 16 * tokens.spacingMultiplier,
|
|
178
|
+
marginBottom: 6 * tokens.spacingMultiplier,
|
|
177
179
|
},
|
|
178
180
|
metadata: {
|
|
179
181
|
flexDirection: "row",
|
|
@@ -181,11 +183,13 @@ const styles = StyleSheet.create({
|
|
|
181
183
|
alignItems: "center",
|
|
182
184
|
},
|
|
183
185
|
category: {
|
|
184
|
-
fontSize: 12,
|
|
186
|
+
fontSize: 12 * tokens.spacingMultiplier,
|
|
185
187
|
textTransform: "capitalize",
|
|
188
|
+
fontWeight: "500",
|
|
186
189
|
},
|
|
187
190
|
difficulty: {
|
|
188
|
-
fontSize: 12,
|
|
191
|
+
fontSize: 12 * tokens.spacingMultiplier,
|
|
189
192
|
textTransform: "capitalize",
|
|
193
|
+
fontWeight: "500",
|
|
190
194
|
},
|
|
191
195
|
});
|
|
@@ -68,6 +68,7 @@ export const VideoTutorialsScreen: React.FC<VideoTutorialsScreenProps> =
|
|
|
68
68
|
customFeaturedTutorials,
|
|
69
69
|
}) => {
|
|
70
70
|
const tokens = useAppDesignTokens();
|
|
71
|
+
const styles = getStyles(tokens);
|
|
71
72
|
|
|
72
73
|
const featuredQuery = useFeaturedTutorials(maxFeaturedCount);
|
|
73
74
|
const allQuery = useVideoTutorials();
|
|
@@ -169,30 +170,31 @@ export const VideoTutorialsScreen: React.FC<VideoTutorialsScreenProps> =
|
|
|
169
170
|
},
|
|
170
171
|
);
|
|
171
172
|
|
|
172
|
-
const
|
|
173
|
+
const getStyles = (tokens: ReturnType<typeof useAppDesignTokens>) =>
|
|
174
|
+
StyleSheet.create({
|
|
173
175
|
title: {
|
|
174
|
-
fontSize:
|
|
176
|
+
fontSize: tokens.typography.headlineLarge.responsiveFontSize,
|
|
175
177
|
fontWeight: "600",
|
|
176
|
-
marginBottom: 24,
|
|
178
|
+
marginBottom: 24 * tokens.spacingMultiplier,
|
|
177
179
|
},
|
|
178
180
|
section: {
|
|
179
|
-
marginBottom: 24,
|
|
181
|
+
marginBottom: 24 * tokens.spacingMultiplier,
|
|
180
182
|
},
|
|
181
183
|
sectionTitle: {
|
|
182
|
-
fontSize:
|
|
184
|
+
fontSize: tokens.typography.titleLarge.responsiveFontSize,
|
|
183
185
|
fontWeight: "500",
|
|
184
|
-
marginBottom: 12,
|
|
186
|
+
marginBottom: 12 * tokens.spacingMultiplier,
|
|
185
187
|
},
|
|
186
188
|
horizontalList: {
|
|
187
|
-
paddingRight: 16,
|
|
189
|
+
paddingRight: 16 * tokens.spacingMultiplier,
|
|
188
190
|
},
|
|
189
191
|
verticalList: {
|
|
190
|
-
paddingBottom: 16,
|
|
192
|
+
paddingBottom: 16 * tokens.spacingMultiplier,
|
|
191
193
|
},
|
|
192
194
|
errorContainer: {
|
|
193
195
|
flex: 1,
|
|
194
196
|
justifyContent: "center",
|
|
195
197
|
alignItems: "center",
|
|
196
|
-
padding: 20,
|
|
198
|
+
padding: 20 * tokens.spacingMultiplier,
|
|
197
199
|
},
|
|
198
200
|
});
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import React from "react";
|
|
11
11
|
import { Alert } from "react-native";
|
|
12
|
-
import {
|
|
12
|
+
import { useAppDesignTokens } from "@umituz/react-native-design-system";
|
|
13
13
|
import { storageRepository } from "@umituz/react-native-storage";
|
|
14
14
|
import { SettingsSection } from "./SettingsSection";
|
|
15
15
|
import { SettingItem } from "./SettingItem";
|
|
@@ -46,7 +46,7 @@ export const DevSettingsSection: React.FC<DevSettingsProps> = ({
|
|
|
46
46
|
texts = {},
|
|
47
47
|
customDevComponents = [],
|
|
48
48
|
}) => {
|
|
49
|
-
const tokens =
|
|
49
|
+
const tokens = useAppDesignTokens();
|
|
50
50
|
|
|
51
51
|
// Merge custom texts with defaults
|
|
52
52
|
const t = { ...DEFAULT_TEXTS, ...texts };
|
|
@@ -3,7 +3,7 @@ import { View, StyleSheet, Switch } from "react-native";
|
|
|
3
3
|
import {
|
|
4
4
|
AtomicIcon,
|
|
5
5
|
AtomicText,
|
|
6
|
-
|
|
6
|
+
useAppDesignTokens,
|
|
7
7
|
} from "@umituz/react-native-design-system";
|
|
8
8
|
import { SettingsItemCard } from "./SettingsItemCard";
|
|
9
9
|
|
|
@@ -40,7 +40,7 @@ export const SettingItem: React.FC<SettingItemProps> = ({
|
|
|
40
40
|
testID,
|
|
41
41
|
disabled = false,
|
|
42
42
|
}) => {
|
|
43
|
-
const tokens =
|
|
43
|
+
const tokens = useAppDesignTokens();
|
|
44
44
|
|
|
45
45
|
// For switch items, we need custom rendering
|
|
46
46
|
if (showSwitch) {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import React, { Component, ReactNode } from 'react';
|
|
7
7
|
import { View, StyleSheet } from 'react-native';
|
|
8
|
-
import {
|
|
8
|
+
import { useAppDesignTokens } from '@umituz/react-native-design-system';
|
|
9
9
|
import { AtomicText, AtomicIcon } from '@umituz/react-native-design-system';
|
|
10
10
|
import { useLocalization } from '@umituz/react-native-localization';
|
|
11
11
|
|
|
@@ -67,7 +67,7 @@ const ErrorBoundaryFallback: React.FC<ErrorBoundaryFallbackProps> = ({
|
|
|
67
67
|
fallbackTitle,
|
|
68
68
|
fallbackMessage
|
|
69
69
|
}) => {
|
|
70
|
-
const tokens =
|
|
70
|
+
const tokens = useAppDesignTokens();
|
|
71
71
|
const { t } = useLocalization();
|
|
72
72
|
|
|
73
73
|
const title = __DEV__ && error?.message
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { View, StyleSheet } from "react-native";
|
|
3
|
-
import {
|
|
3
|
+
import { useAppDesignTokens, AtomicText } from "@umituz/react-native-design-system";
|
|
4
4
|
|
|
5
5
|
export interface SettingsFooterProps {
|
|
6
6
|
versionText?: string;
|
|
@@ -13,7 +13,7 @@ export const SettingsFooter: React.FC<SettingsFooterProps> = ({
|
|
|
13
13
|
appVersion,
|
|
14
14
|
versionLabel,
|
|
15
15
|
}) => {
|
|
16
|
-
const tokens =
|
|
16
|
+
const tokens = useAppDesignTokens();
|
|
17
17
|
const colors = tokens.colors;
|
|
18
18
|
|
|
19
19
|
const displayText = versionText || (appVersion && versionLabel
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { View, Pressable, StyleSheet, ViewStyle } from "react-native";
|
|
3
3
|
import {
|
|
4
|
-
|
|
4
|
+
useAppDesignTokens,
|
|
5
5
|
AtomicIcon,
|
|
6
6
|
AtomicText,
|
|
7
7
|
type IconName,
|
|
@@ -45,7 +45,7 @@ export const SettingsItemCard: React.FC<SettingsItemCardProps> = ({
|
|
|
45
45
|
iconBgColor,
|
|
46
46
|
iconColor,
|
|
47
47
|
}) => {
|
|
48
|
-
const tokens =
|
|
48
|
+
const tokens = useAppDesignTokens();
|
|
49
49
|
const colors = tokens.colors;
|
|
50
50
|
|
|
51
51
|
const defaultIconBg = iconBgColor || `${colors.primary}15`;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { View, StyleSheet } from "react-native";
|
|
3
|
-
import {
|
|
3
|
+
import { useAppDesignTokens, AtomicText } from "@umituz/react-native-design-system";
|
|
4
4
|
|
|
5
5
|
export interface SettingsSectionProps {
|
|
6
6
|
title: string;
|
|
@@ -11,7 +11,7 @@ export const SettingsSection: React.FC<SettingsSectionProps> = ({
|
|
|
11
11
|
title,
|
|
12
12
|
children,
|
|
13
13
|
}) => {
|
|
14
|
-
const tokens =
|
|
14
|
+
const tokens = useAppDesignTokens();
|
|
15
15
|
const colors = tokens.colors;
|
|
16
16
|
|
|
17
17
|
return (
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import React from "react";
|
|
9
9
|
import { createStackNavigator } from "@react-navigation/stack";
|
|
10
|
-
import {
|
|
10
|
+
import { useAppDesignTokens } from "@umituz/react-native-design-system";
|
|
11
11
|
import { SettingsScreen } from "../screens/SettingsScreen";
|
|
12
12
|
import { AppearanceScreen } from "../screens/AppearanceScreen";
|
|
13
13
|
import type { SettingsConfig, CustomSettingsSection } from "../screens/types";
|
|
@@ -83,7 +83,7 @@ export const SettingsStackNavigator: React.FC<SettingsStackNavigatorProps> = ({
|
|
|
83
83
|
devSettings,
|
|
84
84
|
customSections = [],
|
|
85
85
|
}) => {
|
|
86
|
-
const tokens =
|
|
86
|
+
const tokens = useAppDesignTokens();
|
|
87
87
|
|
|
88
88
|
const screenOptions = {
|
|
89
89
|
headerStyle: {
|
|
@@ -8,7 +8,7 @@ import { View, StatusBar, StyleSheet } from "react-native";
|
|
|
8
8
|
import { useNavigation } from "@react-navigation/native";
|
|
9
9
|
import {
|
|
10
10
|
useDesignSystemTheme,
|
|
11
|
-
|
|
11
|
+
useAppDesignTokens,
|
|
12
12
|
} from "@umituz/react-native-design-system";
|
|
13
13
|
import { SettingsHeader } from "./components/SettingsHeader";
|
|
14
14
|
import { SettingsContent } from "./components/SettingsContent";
|
|
@@ -68,7 +68,7 @@ export const SettingsScreen: React.FC<SettingsScreenProps> = ({
|
|
|
68
68
|
}) => {
|
|
69
69
|
const navigation = useNavigation();
|
|
70
70
|
const { themeMode } = useDesignSystemTheme();
|
|
71
|
-
const tokens =
|
|
71
|
+
const tokens = useAppDesignTokens();
|
|
72
72
|
|
|
73
73
|
const isDark = themeMode === "dark";
|
|
74
74
|
const colors = tokens.colors;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useMemo } from "react";
|
|
2
2
|
import { View, ScrollView, StyleSheet } from "react-native";
|
|
3
3
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
4
|
-
import {
|
|
4
|
+
import { useAppDesignTokens } from "@umituz/react-native-design-system";
|
|
5
5
|
import { useLocalization } from "@umituz/react-native-localization";
|
|
6
6
|
import { SettingsFooter } from "../../components/SettingsFooter";
|
|
7
7
|
import { SettingsSection } from "../../components/SettingsSection";
|
|
@@ -53,7 +53,7 @@ export const SettingsContent: React.FC<SettingsContentProps> = ({
|
|
|
53
53
|
showCloseButton = false,
|
|
54
54
|
devSettings,
|
|
55
55
|
}) => {
|
|
56
|
-
const tokens =
|
|
56
|
+
const tokens = useAppDesignTokens();
|
|
57
57
|
const insets = useSafeAreaInsets();
|
|
58
58
|
const { t } = useLocalization();
|
|
59
59
|
|
|
@@ -7,7 +7,7 @@ import React from "react";
|
|
|
7
7
|
import { View, TouchableOpacity, StyleSheet } from "react-native";
|
|
8
8
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
9
9
|
import { useNavigation } from "@react-navigation/native";
|
|
10
|
-
import {
|
|
10
|
+
import { useAppDesignTokens } from "@umituz/react-native-design-system";
|
|
11
11
|
import { AtomicIcon } from "@umituz/react-native-design-system";
|
|
12
12
|
|
|
13
13
|
interface SettingsHeaderProps {
|
|
@@ -20,7 +20,7 @@ export const SettingsHeader: React.FC<SettingsHeaderProps> = ({
|
|
|
20
20
|
onClose,
|
|
21
21
|
}) => {
|
|
22
22
|
const navigation = useNavigation();
|
|
23
|
-
const tokens =
|
|
23
|
+
const tokens = useAppDesignTokens();
|
|
24
24
|
const insets = useSafeAreaInsets();
|
|
25
25
|
|
|
26
26
|
const handleClose = () => {
|