@umituz/react-native-design-system 2.8.4 → 2.8.6
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 +10 -2
- package/src/atoms/image/AtomicImage.tsx +0 -1
- package/src/device/infrastructure/services/DeviceFeatureService.ts +0 -1
- package/src/haptics/infrastructure/services/HapticService.ts +0 -1
- package/src/image/infrastructure/services/ImageConversionService.ts +1 -1
- package/src/image/infrastructure/services/ImageEditorService.ts +6 -8
- package/src/image/infrastructure/services/ImageTransformService.ts +1 -1
- package/src/image/infrastructure/utils/BatchProcessor.ts +2 -3
- package/src/image/infrastructure/utils/MetadataExtractor.ts +10 -7
- package/src/image/presentation/components/GalleryHeader.tsx +1 -3
- package/src/image/presentation/components/ImageGallery.tsx +2 -2
- package/src/image/presentation/components/editor/FilterPickerSheet.tsx +5 -7
- package/src/image/presentation/components/editor/StickerPickerSheet.tsx +4 -6
- package/src/image/presentation/components/editor/TextEditorSheet.tsx +5 -7
- package/src/image/presentation/components/editor/TextEditorTabs.tsx +7 -6
- package/src/image/presentation/components/image/AtomicImage.tsx +0 -1
- package/src/infinite-scroll/presentation/hooks/pagination.helper.ts +1 -1
- package/src/molecules/bottom-sheet/SafeBottomSheetModalProvider.tsx +0 -1
- package/src/molecules/navigation/utils/createScreenOptions.ts +1 -0
- package/src/offline/infrastructure/events/NetworkEvents.ts +0 -1
- package/src/offline/infrastructure/utils/healthCheck.ts +0 -5
- package/src/offline/presentation/hooks/useOffline.ts +0 -1
- package/src/offline/presentation/hooks/useOfflineWithMutations.ts +0 -2
- package/src/onboarding/infrastructure/utils/layouts/screenDimensions.ts +1 -1
- package/src/onboarding/presentation/components/BackgroundImageCollage.tsx +1 -1
- package/src/onboarding/presentation/components/BaseSlide.tsx +1 -2
- package/src/onboarding/presentation/components/OnboardingFooter.tsx +1 -1
- package/src/onboarding/presentation/components/OnboardingHeader.tsx +2 -1
- package/src/onboarding/presentation/components/OnboardingResetSetting.tsx +3 -1
- package/src/onboarding/presentation/components/OnboardingScreenContent.tsx +1 -1
- package/src/onboarding/presentation/components/OnboardingSlide.tsx +2 -1
- package/src/onboarding/presentation/components/QuestionSlide.tsx +1 -2
- package/src/onboarding/presentation/components/QuestionSlideHeader.tsx +2 -1
- package/src/onboarding/presentation/components/questions/MultipleChoiceQuestion.tsx +1 -1
- package/src/onboarding/presentation/components/questions/QuestionOptionItem.tsx +2 -1
- package/src/onboarding/presentation/components/questions/RatingQuestion.tsx +2 -1
- package/src/onboarding/presentation/components/questions/SingleChoiceQuestion.tsx +2 -1
- package/src/onboarding/presentation/components/questions/TextInputQuestion.tsx +1 -1
- package/src/onboarding/presentation/hooks/__tests__/useOnboardingContainerStyle.test.ts +2 -2
- package/src/onboarding/presentation/hooks/useOnboardingContainerStyle.ts +1 -1
- package/src/onboarding/presentation/screens/OnboardingScreen.tsx +1 -2
- package/src/timezone/infrastructure/services/TimezoneProvider.ts +2 -2
- package/src/molecules/calendar/infrastructure/storage/CalendarStore.ts.bak +0 -116
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umituz/react-native-design-system",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.6",
|
|
4
4
|
"description": "Universal design system for React Native apps - Consolidated package with atoms, molecules, organisms, theme, typography, responsive, safe area, exception, infinite scroll, UUID, image, timezone, offline, and onboarding utilities",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"types": "./src/index.ts",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"./package.json": "./package.json"
|
|
27
27
|
},
|
|
28
28
|
"scripts": {
|
|
29
|
-
"typecheck": "tsc --noEmit",
|
|
29
|
+
"typecheck": "tsc --noEmit --skipLibCheck",
|
|
30
30
|
"lint": "eslint . --ext .ts,.tsx",
|
|
31
31
|
"version:patch": "npm version patch -m 'chore: release v%s'",
|
|
32
32
|
"version:minor": "npm version minor -m 'chore: release v%s'",
|
|
@@ -58,6 +58,7 @@
|
|
|
58
58
|
"peerDependencies": {
|
|
59
59
|
"@expo/vector-icons": ">=15.0.0",
|
|
60
60
|
"@react-native-community/datetimepicker": ">=8.0.0",
|
|
61
|
+
"@react-native-community/slider": ">=4.0.0",
|
|
61
62
|
"@react-navigation/bottom-tabs": ">=7.0.0",
|
|
62
63
|
"@react-navigation/native": ">=7.0.0",
|
|
63
64
|
"@react-navigation/stack": ">=7.0.0",
|
|
@@ -72,6 +73,7 @@
|
|
|
72
73
|
"expo-device": ">=5.0.0",
|
|
73
74
|
"expo-font": ">=12.0.0",
|
|
74
75
|
"expo-image": ">=3.0.0",
|
|
76
|
+
"expo-image-manipulator": ">=12.0.0",
|
|
75
77
|
"expo-network": ">=8.0.0",
|
|
76
78
|
"expo-secure-store": ">=14.0.0",
|
|
77
79
|
"expo-sharing": ">=12.0.0",
|
|
@@ -98,6 +100,7 @@
|
|
|
98
100
|
"@expo/vector-icons": "^15.0.0",
|
|
99
101
|
"@react-native-async-storage/async-storage": "^2.2.0",
|
|
100
102
|
"@react-native-community/datetimepicker": "^8.5.1",
|
|
103
|
+
"@react-native-community/slider": "^4.5.5",
|
|
101
104
|
"@react-navigation/bottom-tabs": "^7.9.0",
|
|
102
105
|
"@react-navigation/native": "^7.1.26",
|
|
103
106
|
"@react-navigation/stack": "^7.6.13",
|
|
@@ -123,10 +126,15 @@
|
|
|
123
126
|
"expo-device": "~7.0.2",
|
|
124
127
|
"expo-file-system": "^19.0.21",
|
|
125
128
|
"expo-font": "~13.0.0",
|
|
129
|
+
"expo-network": "~8.0.0",
|
|
130
|
+
"expo-video": "~3.0.0",
|
|
126
131
|
"expo-haptics": "~14.0.0",
|
|
132
|
+
"expo-image-manipulator": "~13.0.0",
|
|
127
133
|
"expo-image": "~3.0.11",
|
|
128
134
|
"expo-localization": "~16.0.1",
|
|
129
135
|
"expo-secure-store": "~14.0.0",
|
|
136
|
+
"i18next": "^25.0.0",
|
|
137
|
+
"react-i18next": "^16.0.0",
|
|
130
138
|
"expo-sharing": "~14.0.8",
|
|
131
139
|
"react": "19.1.0",
|
|
132
140
|
"react-native": "0.81.5",
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
|
|
11
11
|
import * as Haptics from 'expo-haptics';
|
|
12
12
|
import type { ImpactStyle, NotificationType, HapticPattern } from '../../domain/entities/Haptic';
|
|
13
|
-
import { isImpactStyle, isNotificationType, isHapticPattern } from '../../domain/entities/Haptic';
|
|
14
13
|
|
|
15
14
|
/**
|
|
16
15
|
* Log error in development mode only
|
|
@@ -13,7 +13,7 @@ import type {
|
|
|
13
13
|
import { IMAGE_CONSTANTS } from '../../domain/entities/ImageConstants';
|
|
14
14
|
import { ImageTransformService } from './ImageTransformService';
|
|
15
15
|
import { ImageValidator } from '../utils/ImageValidator';
|
|
16
|
-
import { ImageErrorHandler
|
|
16
|
+
import { ImageErrorHandler } from '../utils/ImageErrorHandler';
|
|
17
17
|
import { ImageTransformUtils } from '../utils/ImageTransformUtils';
|
|
18
18
|
|
|
19
19
|
export class ImageConversionService {
|
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
* Core editing functionality with layer and tool management
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
EditorTool,
|
|
9
|
-
type EditorState,
|
|
10
|
-
type EditorLayer,
|
|
11
|
-
type EditorHistory
|
|
12
|
-
type EditorOptions
|
|
7
|
+
import {
|
|
8
|
+
EditorTool,
|
|
9
|
+
type EditorState,
|
|
10
|
+
type EditorLayer,
|
|
11
|
+
type EditorHistory
|
|
13
12
|
} from '../../domain/entities/EditorTypes';
|
|
14
13
|
import { ImageErrorHandler, IMAGE_ERROR_CODES } from '../utils/ImageErrorHandler';
|
|
15
14
|
import { ImageEditorHistoryUtils } from '../utils/ImageEditorHistoryUtils';
|
|
@@ -21,8 +20,7 @@ export class ImageEditorService {
|
|
|
21
20
|
|
|
22
21
|
static createInitialState(
|
|
23
22
|
uri: string,
|
|
24
|
-
dimensions: { width: number; height: number }
|
|
25
|
-
options: EditorOptions = {}
|
|
23
|
+
dimensions: { width: number; height: number }
|
|
26
24
|
): EditorState {
|
|
27
25
|
const defaultLayer: EditorLayer = {
|
|
28
26
|
id: 'background',
|
|
@@ -14,7 +14,7 @@ import type {
|
|
|
14
14
|
} from '../../domain/entities/ImageTypes';
|
|
15
15
|
import { ImageUtils } from '../../domain/utils/ImageUtils';
|
|
16
16
|
import { ImageValidator } from '../utils/ImageValidator';
|
|
17
|
-
import { ImageErrorHandler
|
|
17
|
+
import { ImageErrorHandler } from '../utils/ImageErrorHandler';
|
|
18
18
|
import { ImageTransformUtils } from '../utils/ImageTransformUtils';
|
|
19
19
|
|
|
20
20
|
export class ImageTransformService {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { ImageManipulationResult, ImageCropArea, SaveFormat } from '../../domain/entities/ImageTypes';
|
|
8
|
-
import type { BatchOperation
|
|
8
|
+
import type { BatchOperation } from '../services/ImageBatchService';
|
|
9
9
|
import { ImageTransformService } from '../services/ImageTransformService';
|
|
10
10
|
import { ImageConversionService } from '../services/ImageConversionService';
|
|
11
11
|
import { ImageValidator } from './ImageValidator';
|
|
@@ -13,8 +13,7 @@ import { ImageErrorHandler, IMAGE_ERROR_CODES } from './ImageErrorHandler';
|
|
|
13
13
|
|
|
14
14
|
export class BatchProcessor {
|
|
15
15
|
static async processBatchItem(
|
|
16
|
-
operation: BatchOperation
|
|
17
|
-
options: BatchProcessingOptions = {}
|
|
16
|
+
operation: BatchOperation
|
|
18
17
|
): Promise<{ uri: string; result: ImageManipulationResult | null; error?: Error }> {
|
|
19
18
|
try {
|
|
20
19
|
const uriValidation = ImageValidator.validateUri(operation.uri);
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* Helper functions for extracting metadata from images
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type { ImageMetadataExtractionOptions } from '../../infrastructure/services/ImageMetadataService';
|
|
8
7
|
import { ImageErrorHandler } from './ImageErrorHandler';
|
|
9
8
|
|
|
10
9
|
export class MetadataExtractor {
|
|
11
|
-
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
11
|
+
static async getImageDimensions(_uri: string): Promise<{ width: number; height: number }> {
|
|
12
12
|
try {
|
|
13
13
|
// In a real implementation, we would use:
|
|
14
14
|
// - expo-image-manipulator for basic dimensions
|
|
@@ -25,7 +25,8 @@ export class MetadataExtractor {
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
29
|
+
static async getFileSize(_uri: string): Promise<number> {
|
|
29
30
|
try {
|
|
30
31
|
// In real implementation, use expo-file-system or similar
|
|
31
32
|
return Math.floor(Math.random() * 5000000) + 10000; // Random size between 10KB-5MB
|
|
@@ -34,7 +35,8 @@ export class MetadataExtractor {
|
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
39
|
+
static async extractExifData(_uri: string): Promise<any> {
|
|
38
40
|
try {
|
|
39
41
|
// Mock EXIF data extraction
|
|
40
42
|
return {
|
|
@@ -47,19 +49,20 @@ export class MetadataExtractor {
|
|
|
47
49
|
ExposureTime: `1/${Math.floor(Math.random() * 1000) + 100}`,
|
|
48
50
|
FNumber: Math.random() * 8 + 1.4,
|
|
49
51
|
};
|
|
50
|
-
} catch
|
|
52
|
+
} catch {
|
|
51
53
|
return null;
|
|
52
54
|
}
|
|
53
55
|
}
|
|
54
56
|
|
|
55
|
-
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
58
|
+
static async extractGPSData(_uri: string): Promise<{ latitude: number; longitude: number } | null> {
|
|
56
59
|
try {
|
|
57
60
|
// Mock GPS data extraction
|
|
58
61
|
return Math.random() > 0.7 ? {
|
|
59
62
|
latitude: Math.random() * 180 - 90,
|
|
60
63
|
longitude: Math.random() * 360 - 180,
|
|
61
64
|
} : null;
|
|
62
|
-
} catch
|
|
65
|
+
} catch {
|
|
63
66
|
return null;
|
|
64
67
|
}
|
|
65
68
|
}
|
|
@@ -8,8 +8,7 @@
|
|
|
8
8
|
import React from 'react';
|
|
9
9
|
import { View, TouchableOpacity, StyleSheet } from 'react-native';
|
|
10
10
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
11
|
-
import {
|
|
12
|
-
import { AtomicText } from '@umituz/react-native-design-system';
|
|
11
|
+
import { AtomicText } from '../../../atoms/AtomicText';
|
|
13
12
|
|
|
14
13
|
interface GalleryHeaderProps {
|
|
15
14
|
onEdit?: () => void;
|
|
@@ -19,7 +18,6 @@ interface GalleryHeaderProps {
|
|
|
19
18
|
|
|
20
19
|
export function GalleryHeader({ onEdit, onClose, title }: GalleryHeaderProps) {
|
|
21
20
|
const insets = useSafeAreaInsets();
|
|
22
|
-
const tokens = useAppDesignTokens();
|
|
23
21
|
|
|
24
22
|
return (
|
|
25
23
|
<View style={[
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* Replaces slow standard image components for instant loading.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import React, { useCallback,
|
|
9
|
-
import { Modal, View, StyleSheet, FlatList, Dimensions
|
|
8
|
+
import React, { useCallback, useState, useEffect } from 'react';
|
|
9
|
+
import { Modal, View, StyleSheet, FlatList, Dimensions } from 'react-native';
|
|
10
10
|
import { Image } from 'expo-image';
|
|
11
11
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
12
12
|
import type { ImageViewerItem, ImageGalleryOptions } from '../../domain/entities/ImageTypes';
|
|
@@ -4,13 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { forwardRef } from 'react';
|
|
6
6
|
import { View, TouchableOpacity, ScrollView } from 'react-native';
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
BottomSheetModalRef
|
|
13
|
-
} from '@umituz/react-native-design-system';
|
|
7
|
+
import { BottomSheetModal } from '../../../../molecules/bottom-sheet/components/BottomSheetModal';
|
|
8
|
+
import type { BottomSheetModalRef } from '../../../../molecules/bottom-sheet/types/BottomSheet';
|
|
9
|
+
import { AtomicText } from '../../../../atoms/AtomicText';
|
|
10
|
+
import { AtomicIcon } from '../../../../atoms/AtomicIcon';
|
|
11
|
+
import { useAppDesignTokens } from '../../../../theme/hooks/useAppDesignTokens';
|
|
14
12
|
import { FilterProcessor, type FilterPreset } from '../../../infrastructure/utils/FilterProcessor';
|
|
15
13
|
|
|
16
14
|
export interface FilterPickerSheetProps {
|
|
@@ -4,12 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { forwardRef } from 'react';
|
|
6
6
|
import { View, TouchableOpacity, ScrollView, Image, Dimensions } from 'react-native';
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
BottomSheetModalRef
|
|
12
|
-
} from '@umituz/react-native-design-system';
|
|
7
|
+
import { BottomSheetModal } from '../../../../molecules/bottom-sheet/components/BottomSheetModal';
|
|
8
|
+
import type { BottomSheetModalRef } from '../../../../molecules/bottom-sheet/types/BottomSheet';
|
|
9
|
+
import { AtomicText } from '../../../../atoms/AtomicText';
|
|
10
|
+
import { useAppDesignTokens } from '../../../../theme/hooks/useAppDesignTokens';
|
|
13
11
|
|
|
14
12
|
const { width: SCREEN_WIDTH } = Dimensions.get('window');
|
|
15
13
|
|
|
@@ -4,13 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { forwardRef, useState } from 'react';
|
|
6
6
|
import { View, TouchableOpacity, ScrollView } from 'react-native';
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
BottomSheetModalRef
|
|
13
|
-
} from '@umituz/react-native-design-system';
|
|
7
|
+
import { BottomSheetModal } from '../../../../molecules/bottom-sheet/components/BottomSheetModal';
|
|
8
|
+
import type { BottomSheetModalRef } from '../../../../molecules/bottom-sheet/types/BottomSheet';
|
|
9
|
+
import { AtomicText } from '../../../../atoms/AtomicText';
|
|
10
|
+
import { AtomicIcon } from '../../../../atoms/AtomicIcon';
|
|
11
|
+
import { useAppDesignTokens } from '../../../../theme/hooks/useAppDesignTokens';
|
|
14
12
|
import { TextContentTab, TextStyleTab, TextTransformTab } from './TextEditorTabs';
|
|
15
13
|
|
|
16
14
|
export interface TextEditorSheetProps {
|
|
@@ -5,20 +5,22 @@
|
|
|
5
5
|
import React from 'react';
|
|
6
6
|
import { View, TextInput, ScrollView, TouchableOpacity } from 'react-native';
|
|
7
7
|
import Slider from '@react-native-community/slider';
|
|
8
|
-
import { AtomicText
|
|
8
|
+
import { AtomicText } from '../../../../atoms/AtomicText';
|
|
9
|
+
import { AtomicIcon } from '../../../../atoms/AtomicIcon';
|
|
10
|
+
import { useAppDesignTokens } from '../../../../theme/hooks/useAppDesignTokens';
|
|
9
11
|
|
|
10
12
|
interface TabProps {
|
|
11
13
|
t: (key: string) => string;
|
|
12
14
|
}
|
|
13
15
|
|
|
14
|
-
export const TextContentTab: React.FC<TabProps & { text: string; onTextChange: (t: string) => void }> = ({ text, onTextChange, t }) => {
|
|
16
|
+
export const TextContentTab: React.FC<TabProps & { text: string; onTextChange: (t: string) => void }> = ({ text, onTextChange, t: translate }) => {
|
|
15
17
|
const tokens = useAppDesignTokens();
|
|
16
18
|
return (
|
|
17
19
|
<View style={{ gap: tokens.spacing.lg }}>
|
|
18
20
|
<TextInput
|
|
19
21
|
value={text}
|
|
20
22
|
onChangeText={onTextChange}
|
|
21
|
-
placeholder={
|
|
23
|
+
placeholder={translate('editor.text_placeholder')}
|
|
22
24
|
style={{
|
|
23
25
|
...tokens.typography.bodyLarge,
|
|
24
26
|
borderWidth: 1,
|
|
@@ -38,7 +40,7 @@ export const TextStyleTab: React.FC<TabProps & {
|
|
|
38
40
|
fontSize: number; setFontSize: (s: number) => void;
|
|
39
41
|
color: string; setColor: (c: string) => void;
|
|
40
42
|
fontFamily: string; setFontFamily: (f: string) => void;
|
|
41
|
-
}> = ({ fontSize, setFontSize, color, setColor, fontFamily, setFontFamily
|
|
43
|
+
}> = ({ fontSize, setFontSize, color, setColor, fontFamily, setFontFamily }) => {
|
|
42
44
|
const tokens = useAppDesignTokens();
|
|
43
45
|
const colors = ['#FFFFFF', '#000000', '#FF0000', '#FFFF00', '#0000FF', '#00FF00', '#FF00FF', '#FFA500'];
|
|
44
46
|
const fonts = ['System', 'serif', 'sans-serif', 'monospace'];
|
|
@@ -83,9 +85,8 @@ export const TextStyleTab: React.FC<TabProps & {
|
|
|
83
85
|
export const TextTransformTab: React.FC<TabProps & {
|
|
84
86
|
scale: number; setScale: (s: number) => void;
|
|
85
87
|
rotation: number; setRotation: (r: number) => void;
|
|
86
|
-
opacity: number; setOpacity: (o: number) => void;
|
|
87
88
|
onDelete?: () => void;
|
|
88
|
-
}> = ({ scale, setScale, rotation, setRotation,
|
|
89
|
+
}> = ({ scale, setScale, rotation, setRotation, onDelete }) => {
|
|
89
90
|
const tokens = useAppDesignTokens();
|
|
90
91
|
return (
|
|
91
92
|
<View style={{ gap: tokens.spacing.xl }}>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* SOLID: Single Responsibility - Handle pagination operations
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { InfiniteScrollConfig
|
|
6
|
+
import type { InfiniteScrollConfig } from "../../domain/types/infinite-scroll-config";
|
|
7
7
|
import type { InfiniteScrollState } from "../../domain/types/infinite-scroll-state";
|
|
8
8
|
|
|
9
9
|
export function isCursorMode<T>(
|
|
@@ -48,14 +48,12 @@ export class HealthCheck {
|
|
|
48
48
|
const isHealthy = response.ok;
|
|
49
49
|
|
|
50
50
|
if (this.config.debug) {
|
|
51
|
-
// eslint-disable-next-line no-console
|
|
52
51
|
console.log('[HealthCheck] Result:', isHealthy ? 'HEALTHY' : 'UNHEALTHY');
|
|
53
52
|
}
|
|
54
53
|
|
|
55
54
|
return isHealthy;
|
|
56
55
|
} catch (error) {
|
|
57
56
|
if (this.config.debug) {
|
|
58
|
-
// eslint-disable-next-line no-console
|
|
59
57
|
console.warn('[HealthCheck] Failed:', error);
|
|
60
58
|
}
|
|
61
59
|
|
|
@@ -71,7 +69,6 @@ export class HealthCheck {
|
|
|
71
69
|
start(callback: (isHealthy: boolean) => void): void {
|
|
72
70
|
if (this.config.healthCheckInterval === 0) {
|
|
73
71
|
if (this.config.debug) {
|
|
74
|
-
// eslint-disable-next-line no-console
|
|
75
72
|
console.log('[HealthCheck] Disabled (interval = 0)');
|
|
76
73
|
}
|
|
77
74
|
return;
|
|
@@ -82,7 +79,6 @@ export class HealthCheck {
|
|
|
82
79
|
}
|
|
83
80
|
|
|
84
81
|
if (this.config.debug) {
|
|
85
|
-
// eslint-disable-next-line no-console
|
|
86
82
|
console.log('[HealthCheck] Starting (interval:', this.config.healthCheckInterval + 'ms)');
|
|
87
83
|
}
|
|
88
84
|
|
|
@@ -101,7 +97,6 @@ export class HealthCheck {
|
|
|
101
97
|
this.intervalId = null;
|
|
102
98
|
|
|
103
99
|
if (this.config.debug) {
|
|
104
|
-
// eslint-disable-next-line no-console
|
|
105
100
|
console.log('[HealthCheck] Stopped');
|
|
106
101
|
}
|
|
107
102
|
}
|
|
@@ -62,7 +62,6 @@ export const useOffline = (config?: OfflineConfig) => {
|
|
|
62
62
|
})
|
|
63
63
|
.catch((error: Error) => {
|
|
64
64
|
if (__DEV__ || mergedConfig.debug) {
|
|
65
|
-
// eslint-disable-next-line no-console
|
|
66
65
|
console.error('[react-native-offline] Failed to fetch network state:', error);
|
|
67
66
|
}
|
|
68
67
|
});
|
|
@@ -18,13 +18,11 @@ export const useOfflineWithMutations = (onOnline: () => Promise<void>) => {
|
|
|
18
18
|
isProcessingRef.current = true;
|
|
19
19
|
try {
|
|
20
20
|
if (__DEV__) {
|
|
21
|
-
// eslint-disable-next-line no-console
|
|
22
21
|
console.log('[react-native-offline] Executing online callback');
|
|
23
22
|
}
|
|
24
23
|
await onOnline();
|
|
25
24
|
} catch (error) {
|
|
26
25
|
if (__DEV__) {
|
|
27
|
-
// eslint-disable-next-line no-console
|
|
28
26
|
console.error('[react-native-offline] Online callback failed:', error);
|
|
29
27
|
}
|
|
30
28
|
} finally {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Centralized screen dimension values using design system utilities
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { getScreenDimensions } from "
|
|
6
|
+
import { getScreenDimensions } from "../../../../device/detection/deviceDetection";
|
|
7
7
|
|
|
8
8
|
const dimensions = getScreenDimensions();
|
|
9
9
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React, { useMemo } from "react";
|
|
7
7
|
import { View, StyleSheet } from "react-native";
|
|
8
8
|
import { Image } from "expo-image";
|
|
9
|
-
import { useSafeAreaInsets } from "
|
|
9
|
+
import { useSafeAreaInsets } from "../../../safe-area/hooks/useSafeAreaInsets";
|
|
10
10
|
import {
|
|
11
11
|
generateGridLayout,
|
|
12
12
|
generateDenseGridLayout,
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import React, { useMemo } from "react";
|
|
7
7
|
import { View, ScrollView } from "react-native";
|
|
8
|
-
import {
|
|
8
|
+
import { useResponsive } from "../../../responsive/useResponsive";
|
|
9
9
|
import type { ContentPosition } from "../../domain/entities/OnboardingSlide";
|
|
10
10
|
|
|
11
11
|
export interface BaseSlideProps {
|
|
@@ -17,7 +17,6 @@ export const BaseSlide = ({
|
|
|
17
17
|
children,
|
|
18
18
|
contentPosition = "center",
|
|
19
19
|
}: BaseSlideProps) => {
|
|
20
|
-
const tokens = useAppDesignTokens();
|
|
21
20
|
const { verticalPadding, horizontalPadding } = useResponsive();
|
|
22
21
|
const isBottom = contentPosition === "bottom";
|
|
23
22
|
|
|
@@ -2,7 +2,7 @@ import React from "react";
|
|
|
2
2
|
import { View, StyleSheet, TouchableOpacity } from "react-native";
|
|
3
3
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
4
4
|
import { useLocalization } from "@umituz/react-native-localization";
|
|
5
|
-
import { AtomicText } from "
|
|
5
|
+
import { AtomicText } from "../../../atoms/AtomicText";
|
|
6
6
|
import { useOnboardingProvider } from "../providers/OnboardingProvider";
|
|
7
7
|
|
|
8
8
|
export interface OnboardingFooterProps {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { View, TouchableOpacity, StyleSheet } from "react-native";
|
|
3
|
-
import { AtomicIcon
|
|
3
|
+
import { AtomicIcon } from "../../../atoms/AtomicIcon";
|
|
4
|
+
import { AtomicText } from "../../../atoms/AtomicText";
|
|
4
5
|
import { useLocalization } from "@umituz/react-native-localization";
|
|
5
6
|
import { useOnboardingProvider } from "../providers/OnboardingProvider";
|
|
6
7
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import React, { useCallback } from "react";
|
|
2
2
|
import { View, TouchableOpacity, StyleSheet } from "react-native";
|
|
3
|
-
import { AtomicIcon
|
|
3
|
+
import { AtomicIcon } from "../../../atoms/AtomicIcon";
|
|
4
|
+
import { AtomicText } from "../../../atoms/AtomicText";
|
|
5
|
+
import { useAppDesignTokens } from "../../../theme/hooks/useAppDesignTokens";
|
|
4
6
|
|
|
5
7
|
export interface OnboardingResetSettingProps {
|
|
6
8
|
onReset: () => void | Promise<void>;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import React from "react";
|
|
7
7
|
import { View, StyleSheet, StatusBar } from "react-native";
|
|
8
|
-
import { useTheme } from "
|
|
8
|
+
import { useTheme } from "../../../theme/infrastructure/stores/themeStore";
|
|
9
9
|
import { OnboardingHeader } from "./OnboardingHeader";
|
|
10
10
|
import { OnboardingSlide as OnboardingSlideComponent } from "./OnboardingSlide";
|
|
11
11
|
import { QuestionSlide } from "./QuestionSlide";
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
|
|
6
6
|
import React from "react";
|
|
7
7
|
import { View, StyleSheet } from "react-native";
|
|
8
|
-
import { AtomicIcon
|
|
8
|
+
import { AtomicIcon } from "../../../atoms/AtomicIcon";
|
|
9
|
+
import { AtomicText } from "../../../atoms/AtomicText";
|
|
9
10
|
import type { OnboardingSlide as OnboardingSlideType } from "../../domain/entities/OnboardingSlide";
|
|
10
11
|
import { BaseSlide } from "./BaseSlide";
|
|
11
12
|
import { useOnboardingProvider } from "../providers/OnboardingProvider";
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import React from "react";
|
|
7
7
|
import { View, StyleSheet } from "react-native";
|
|
8
|
-
import { AtomicText } from "
|
|
8
|
+
import { AtomicText } from "../../../atoms/AtomicText";
|
|
9
9
|
import type { OnboardingSlide } from "../../domain/entities/OnboardingSlide";
|
|
10
10
|
import { QuestionSlideHeader } from "./QuestionSlideHeader";
|
|
11
11
|
import { QuestionRenderer } from "./QuestionRenderer";
|
|
@@ -24,7 +24,6 @@ export const QuestionSlide = ({
|
|
|
24
24
|
slide,
|
|
25
25
|
value,
|
|
26
26
|
onChange,
|
|
27
|
-
variant: _variant = "default",
|
|
28
27
|
}: QuestionSlideProps) => {
|
|
29
28
|
const {
|
|
30
29
|
theme: { colors },
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { View, StyleSheet } from "react-native";
|
|
3
|
-
import { AtomicIcon
|
|
3
|
+
import { AtomicIcon } from "../../../atoms/AtomicIcon";
|
|
4
|
+
import { AtomicText } from "../../../atoms/AtomicText";
|
|
4
5
|
import type { OnboardingSlide } from "../../domain/entities/OnboardingSlide";
|
|
5
6
|
import { useOnboardingProvider } from "../providers/OnboardingProvider";
|
|
6
7
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import React from "react";
|
|
7
7
|
import { View, StyleSheet } from "react-native";
|
|
8
|
-
import { AtomicText } from "
|
|
8
|
+
import { AtomicText } from "../../../../atoms/AtomicText";
|
|
9
9
|
import { useOnboardingProvider } from "../../providers/OnboardingProvider";
|
|
10
10
|
import { ensureArray } from "../../../infrastructure/utils/arrayUtils";
|
|
11
11
|
import type { OnboardingQuestion } from "../../../domain/entities/OnboardingQuestion";
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
|
|
6
6
|
import React from "react";
|
|
7
7
|
import { View, TouchableOpacity, StyleSheet } from "react-native";
|
|
8
|
-
import { AtomicIcon
|
|
8
|
+
import { AtomicIcon } from "../../../../atoms/AtomicIcon";
|
|
9
|
+
import { AtomicText } from "../../../../atoms/AtomicText";
|
|
9
10
|
import type { QuestionOption } from "../../../domain/entities/OnboardingQuestion";
|
|
10
11
|
import type { OnboardingColors } from "../../types/OnboardingTheme";
|
|
11
12
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { View, TouchableOpacity, StyleSheet } from "react-native";
|
|
3
|
-
import { AtomicIcon
|
|
3
|
+
import { AtomicIcon } from "../../../../atoms/AtomicIcon";
|
|
4
|
+
import { AtomicText } from "../../../../atoms/AtomicText";
|
|
4
5
|
import { useOnboardingProvider } from "../../providers/OnboardingProvider";
|
|
5
6
|
import type { OnboardingQuestion } from "../../../domain/entities/OnboardingQuestion";
|
|
6
7
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { View, TouchableOpacity, StyleSheet } from "react-native";
|
|
3
|
-
import { AtomicIcon
|
|
3
|
+
import { AtomicIcon } from "../../../../atoms/AtomicIcon";
|
|
4
|
+
import { AtomicText } from "../../../../atoms/AtomicText";
|
|
4
5
|
import { useOnboardingProvider } from "../../providers/OnboardingProvider";
|
|
5
6
|
import type { OnboardingQuestion, QuestionOption } from "../../../domain/entities/OnboardingQuestion";
|
|
6
7
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { View, TextInput, StyleSheet } from "react-native";
|
|
3
|
-
import { AtomicText } from "
|
|
3
|
+
import { AtomicText } from "../../../../atoms/AtomicText";
|
|
4
4
|
import { useOnboardingProvider } from "../../providers/OnboardingProvider";
|
|
5
5
|
import type { OnboardingQuestion } from "../../../domain/entities/OnboardingQuestion";
|
|
6
6
|
|
|
@@ -6,7 +6,7 @@ import { renderHook } from '@testing-library/react-native';
|
|
|
6
6
|
import { useOnboardingContainerStyle } from '../useOnboardingContainerStyle';
|
|
7
7
|
|
|
8
8
|
// Mock theme hook
|
|
9
|
-
jest.mock('
|
|
9
|
+
jest.mock('../../../../theme/hooks/useAppDesignTokens', () => ({
|
|
10
10
|
useAppDesignTokens: jest.fn(),
|
|
11
11
|
}));
|
|
12
12
|
|
|
@@ -15,7 +15,7 @@ jest.mock('react-native-safe-area-context', () => ({
|
|
|
15
15
|
useSafeAreaInsets: jest.fn(),
|
|
16
16
|
}));
|
|
17
17
|
|
|
18
|
-
import { useAppDesignTokens } from '
|
|
18
|
+
import { useAppDesignTokens } from '../../../../theme/hooks/useAppDesignTokens';
|
|
19
19
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
20
20
|
|
|
21
21
|
const mockUseAppDesignTokens = useAppDesignTokens as jest.MockedFunction<typeof useAppDesignTokens>;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import { useMemo } from "react";
|
|
7
7
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
8
|
-
import { useAppDesignTokens } from "
|
|
8
|
+
import { useAppDesignTokens } from "../../../theme/hooks/useAppDesignTokens";
|
|
9
9
|
|
|
10
10
|
export interface UseOnboardingContainerStyleProps {
|
|
11
11
|
useCustomBackground: boolean;
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import React, { useMemo } from "react";
|
|
11
11
|
import { StyleSheet } from "react-native";
|
|
12
|
-
import { useAppDesignTokens } from "
|
|
12
|
+
import { useAppDesignTokens } from "../../../theme/hooks/useAppDesignTokens";
|
|
13
13
|
import type { OnboardingOptions } from "../../domain/entities/OnboardingOptions";
|
|
14
14
|
import { useOnboardingScreenState } from "../hooks/useOnboardingScreenState";
|
|
15
15
|
import { OnboardingScreenContent } from "../components/OnboardingScreenContent";
|
|
@@ -74,7 +74,6 @@ export const OnboardingScreen = ({
|
|
|
74
74
|
showDots = true,
|
|
75
75
|
showProgressText = true,
|
|
76
76
|
storageKey,
|
|
77
|
-
autoComplete: _autoComplete = false,
|
|
78
77
|
renderHeader,
|
|
79
78
|
renderFooter,
|
|
80
79
|
renderSlide,
|
|
@@ -84,7 +84,7 @@ export class TimezoneProvider {
|
|
|
84
84
|
displayName: namePart?.value || zone,
|
|
85
85
|
offset,
|
|
86
86
|
};
|
|
87
|
-
} catch
|
|
87
|
+
} catch {
|
|
88
88
|
return {
|
|
89
89
|
timezone: zone,
|
|
90
90
|
displayName: zone,
|
|
@@ -108,7 +108,7 @@ export class TimezoneProvider {
|
|
|
108
108
|
const tzDate = new Date(d.toLocaleString('en-US', { timeZone: timezone }));
|
|
109
109
|
|
|
110
110
|
return (tzDate.getTime() - utcDate.getTime()) / (1000 * 60);
|
|
111
|
-
} catch
|
|
111
|
+
} catch {
|
|
112
112
|
return 0;
|
|
113
113
|
}
|
|
114
114
|
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Calendar Store - Combined Hook
|
|
3
|
-
* Convenience hook that combines all calendar stores
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { useMemo } from 'react';
|
|
7
|
-
import { useCalendarEvents } from '../stores/useCalendarEvents';
|
|
8
|
-
import { useCalendarNavigation } from '../stores/useCalendarNavigation';
|
|
9
|
-
import { useCalendarView } from '../stores/useCalendarView';
|
|
10
|
-
import { CalendarService } from '../../services/CalendarService';
|
|
11
|
-
import type { CalendarDay } from '../../../domain/entities/CalendarDay.entity';
|
|
12
|
-
|
|
13
|
-
// Export individual stores
|
|
14
|
-
export { useCalendarEvents } from '../stores/useCalendarEvents';
|
|
15
|
-
export { useCalendarNavigation } from '../stores/useCalendarNavigation';
|
|
16
|
-
export { useCalendarView } from '../stores/useCalendarView';
|
|
17
|
-
|
|
18
|
-
// Export types
|
|
19
|
-
export type { CalendarViewMode } from '../stores/useCalendarView';
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Combined calendar hook
|
|
23
|
-
* Use this for convenience, or use individual stores for fine-grained control
|
|
24
|
-
*/
|
|
25
|
-
export const useCalendar = () => {
|
|
26
|
-
const events = useCalendarEvents();
|
|
27
|
-
const navigation = useCalendarNavigation();
|
|
28
|
-
const view = useCalendarView();
|
|
29
|
-
|
|
30
|
-
// Utility functions for backward compatibility
|
|
31
|
-
const getEventsForDate = (date: Date) => {
|
|
32
|
-
return events.events.filter(event => {
|
|
33
|
-
const eventDate = new Date(event.date);
|
|
34
|
-
return eventDate.toDateString() === date.toDateString();
|
|
35
|
-
});
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
const getEventsForMonth = (year: number, month: number) => {
|
|
39
|
-
return events.events.filter(event => {
|
|
40
|
-
const eventDate = new Date(event.date);
|
|
41
|
-
return eventDate.getFullYear() === year && eventDate.getMonth() === month;
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
return {
|
|
46
|
-
// Events state and actions
|
|
47
|
-
events: events.events,
|
|
48
|
-
isLoading: events.isLoading,
|
|
49
|
-
error: events.error,
|
|
50
|
-
loadEvents: events.loadEvents,
|
|
51
|
-
addEvent: events.addEvent,
|
|
52
|
-
updateEvent: events.updateEvent,
|
|
53
|
-
deleteEvent: events.deleteEvent,
|
|
54
|
-
completeEvent: events.completeEvent,
|
|
55
|
-
uncompleteEvent: events.uncompleteEvent,
|
|
56
|
-
clearError: events.clearError,
|
|
57
|
-
clearAllEvents: events.clearAllEvents,
|
|
58
|
-
|
|
59
|
-
// Navigation state and actions
|
|
60
|
-
selectedDate: navigation.selectedDate,
|
|
61
|
-
currentMonth: navigation.currentMonth,
|
|
62
|
-
setSelectedDate: navigation.setSelectedDate,
|
|
63
|
-
goToToday: navigation.goToToday,
|
|
64
|
-
navigateMonth: navigation.navigateMonth,
|
|
65
|
-
setCurrentMonth: navigation.setCurrentMonth,
|
|
66
|
-
|
|
67
|
-
// View state and actions
|
|
68
|
-
viewMode: view.viewMode,
|
|
69
|
-
setViewMode: view.setViewMode,
|
|
70
|
-
|
|
71
|
-
// Utility functions
|
|
72
|
-
getEventsForDate,
|
|
73
|
-
getEventsForMonth,
|
|
74
|
-
};
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Legacy alias for backward compatibility
|
|
79
|
-
* @deprecated Use useCalendar instead
|
|
80
|
-
*/
|
|
81
|
-
export const useCalendarStore = () => {
|
|
82
|
-
const calendar = useCalendar();
|
|
83
|
-
|
|
84
|
-
const days = useMemo(() => {
|
|
85
|
-
const year = calendar.currentMonth.getFullYear();
|
|
86
|
-
const month = calendar.currentMonth.getMonth();
|
|
87
|
-
return CalendarService.getMonthDays(year, month, calendar.events);
|
|
88
|
-
}, [calendar.currentMonth, calendar.events]);
|
|
89
|
-
|
|
90
|
-
return {
|
|
91
|
-
events: calendar.events,
|
|
92
|
-
selectedDate: calendar.selectedDate,
|
|
93
|
-
currentMonth: calendar.currentMonth,
|
|
94
|
-
viewMode: calendar.viewMode,
|
|
95
|
-
isLoading: calendar.isLoading,
|
|
96
|
-
error: calendar.error,
|
|
97
|
-
actions: {
|
|
98
|
-
loadEvents: calendar.loadEvents,
|
|
99
|
-
addEvent: calendar.addEvent,
|
|
100
|
-
updateEvent: calendar.updateEvent,
|
|
101
|
-
deleteEvent: calendar.deleteEvent,
|
|
102
|
-
completeEvent: calendar.completeEvent,
|
|
103
|
-
uncompleteEvent: calendar.uncompleteEvent,
|
|
104
|
-
setSelectedDate: calendar.setSelectedDate,
|
|
105
|
-
goToToday: calendar.goToToday,
|
|
106
|
-
navigateMonth: calendar.navigateMonth,
|
|
107
|
-
setCurrentMonth: calendar.setCurrentMonth,
|
|
108
|
-
setViewMode: calendar.setViewMode,
|
|
109
|
-
getEventsForDate: calendar.getEventsForDate,
|
|
110
|
-
getEventsForMonth: calendar.getEventsForMonth,
|
|
111
|
-
clearError: calendar.clearError,
|
|
112
|
-
clearAllEvents: calendar.clearAllEvents,
|
|
113
|
-
},
|
|
114
|
-
days,
|
|
115
|
-
};
|
|
116
|
-
};
|