@croacroa/react-native-template 2.1.0 → 3.2.0
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/.env.example +5 -0
- package/.eslintrc.js +8 -0
- package/.github/workflows/ci.yml +187 -187
- package/.github/workflows/eas-build.yml +55 -55
- package/.github/workflows/eas-update.yml +50 -50
- package/.github/workflows/npm-publish.yml +57 -0
- package/CHANGELOG.md +195 -106
- package/CONTRIBUTING.md +377 -377
- package/LICENSE +21 -21
- package/README.md +446 -402
- package/__tests__/accessibility/components.test.tsx +285 -0
- package/__tests__/components/Button.test.tsx +2 -4
- package/__tests__/components/__snapshots__/snapshots.test.tsx.snap +512 -0
- package/__tests__/components/snapshots.test.tsx +131 -131
- package/__tests__/helpers/a11y.ts +54 -0
- package/__tests__/hooks/useAnalytics.test.ts +100 -0
- package/__tests__/hooks/useAnimations.test.ts +70 -0
- package/__tests__/hooks/useAuth.test.tsx +71 -28
- package/__tests__/hooks/useMedia.test.ts +318 -0
- package/__tests__/hooks/usePayments.test.tsx +307 -0
- package/__tests__/hooks/usePermission.test.ts +230 -0
- package/__tests__/hooks/useWebSocket.test.ts +329 -0
- package/__tests__/integration/auth-api.test.tsx +224 -227
- package/__tests__/performance/VirtualizedList.perf.test.tsx +385 -362
- package/__tests__/services/api.test.ts +24 -6
- package/app/(auth)/home.tsx +11 -9
- package/app/(auth)/profile.tsx +8 -6
- package/app/(auth)/settings.tsx +11 -9
- package/app/(public)/forgot-password.tsx +25 -15
- package/app/(public)/login.tsx +48 -12
- package/app/(public)/onboarding.tsx +5 -5
- package/app/(public)/register.tsx +24 -15
- package/app/_layout.tsx +6 -3
- package/app.config.ts +27 -2
- package/assets/images/.gitkeep +7 -7
- package/assets/images/adaptive-icon.png +0 -0
- package/assets/images/favicon.png +0 -0
- package/assets/images/icon.png +0 -0
- package/assets/images/notification-icon.png +0 -0
- package/assets/images/splash.png +0 -0
- package/components/ErrorBoundary.tsx +73 -28
- package/components/auth/SocialLoginButtons.tsx +168 -0
- package/components/forms/FormInput.tsx +5 -3
- package/components/onboarding/OnboardingScreen.tsx +370 -370
- package/components/onboarding/index.ts +2 -2
- package/components/providers/AnalyticsProvider.tsx +67 -0
- package/components/providers/SuspenseBoundary.tsx +359 -357
- package/components/providers/index.ts +24 -21
- package/components/ui/AnimatedButton.tsx +1 -9
- package/components/ui/AnimatedList.tsx +98 -0
- package/components/ui/AnimatedScreen.tsx +89 -0
- package/components/ui/Avatar.tsx +319 -316
- package/components/ui/Badge.tsx +416 -416
- package/components/ui/BottomSheet.tsx +307 -307
- package/components/ui/Button.tsx +11 -3
- package/components/ui/Checkbox.tsx +261 -261
- package/components/ui/FeatureGate.tsx +57 -0
- package/components/ui/ForceUpdateScreen.tsx +108 -0
- package/components/ui/ImagePickerButton.tsx +180 -0
- package/components/ui/Input.stories.tsx +2 -10
- package/components/ui/Input.tsx +2 -10
- package/components/ui/OptimizedImage.tsx +369 -369
- package/components/ui/Paywall.tsx +253 -0
- package/components/ui/PermissionGate.tsx +155 -0
- package/components/ui/PurchaseButton.tsx +84 -0
- package/components/ui/Select.tsx +240 -240
- package/components/ui/Skeleton.tsx +3 -1
- package/components/ui/Toast.tsx +427 -418
- package/components/ui/UploadProgress.tsx +189 -0
- package/components/ui/VirtualizedList.tsx +288 -285
- package/components/ui/index.ts +28 -30
- package/constants/config.ts +135 -97
- package/docs/adr/001-state-management.md +79 -79
- package/docs/adr/002-styling-approach.md +130 -130
- package/docs/adr/003-data-fetching.md +155 -155
- package/docs/adr/004-auth-adapter-pattern.md +144 -144
- package/docs/adr/README.md +78 -78
- package/docs/guides/analytics-posthog.md +121 -0
- package/docs/guides/auth-supabase.md +162 -0
- package/docs/guides/feature-flags-launchdarkly.md +150 -0
- package/docs/guides/payments-revenuecat.md +169 -0
- package/docs/plans/2026-02-22-phase6-implementation.md +3222 -0
- package/docs/plans/2026-02-22-phase6-template-completion-design.md +196 -0
- package/docs/plans/2026-02-23-npm-publish-design.md +31 -0
- package/docs/plans/2026-02-23-phase7-polish-documentation-design.md +79 -0
- package/docs/plans/2026-02-23-phase8-additional-features-design.md +136 -0
- package/eas.json +2 -1
- package/hooks/index.ts +70 -40
- package/hooks/useAnimatedEntry.ts +204 -0
- package/hooks/useApi.ts +5 -4
- package/hooks/useAuth.tsx +7 -3
- package/hooks/useBiometrics.ts +295 -295
- package/hooks/useChannel.ts +111 -0
- package/hooks/useDeepLinking.ts +256 -256
- package/hooks/useExperiment.ts +36 -0
- package/hooks/useFeatureFlag.ts +59 -0
- package/hooks/useForceUpdate.ts +91 -0
- package/hooks/useImagePicker.ts +281 -375
- package/hooks/useInAppReview.ts +64 -0
- package/hooks/useMFA.ts +509 -499
- package/hooks/useParallax.ts +142 -0
- package/hooks/usePerformance.ts +434 -434
- package/hooks/usePermission.ts +190 -0
- package/hooks/usePresence.ts +129 -0
- package/hooks/useProducts.ts +36 -0
- package/hooks/usePurchase.ts +103 -0
- package/hooks/useRateLimit.ts +70 -0
- package/hooks/useSubscription.ts +49 -0
- package/hooks/useTrackEvent.ts +52 -0
- package/hooks/useTrackScreen.ts +40 -0
- package/hooks/useUpdates.ts +358 -358
- package/hooks/useUpload.ts +165 -0
- package/hooks/useWebSocket.ts +111 -0
- package/i18n/index.ts +197 -194
- package/i18n/locales/ar.json +170 -101
- package/i18n/locales/de.json +170 -101
- package/i18n/locales/en.json +170 -101
- package/i18n/locales/es.json +170 -101
- package/i18n/locales/fr.json +170 -101
- package/jest.config.js +1 -1
- package/maestro/README.md +113 -113
- package/maestro/config.yaml +35 -35
- package/maestro/flows/login.yaml +62 -62
- package/maestro/flows/mfa-login.yaml +92 -92
- package/maestro/flows/mfa-setup.yaml +86 -86
- package/maestro/flows/navigation.yaml +68 -68
- package/maestro/flows/offline-conflict.yaml +101 -101
- package/maestro/flows/offline-sync.yaml +128 -128
- package/maestro/flows/offline.yaml +60 -60
- package/maestro/flows/register.yaml +94 -94
- package/package.json +188 -176
- package/scripts/generate-placeholders.js +38 -0
- package/services/analytics/adapters/console.ts +50 -0
- package/services/analytics/analytics-adapter.ts +94 -0
- package/services/analytics/types.ts +73 -0
- package/services/analytics.ts +428 -428
- package/services/api.ts +419 -340
- package/services/auth/social/apple.ts +110 -0
- package/services/auth/social/google.ts +159 -0
- package/services/auth/social/social-auth.ts +100 -0
- package/services/auth/social/types.ts +80 -0
- package/services/authAdapter.ts +333 -333
- package/services/backgroundSync.ts +652 -626
- package/services/feature-flags/adapters/mock.ts +108 -0
- package/services/feature-flags/feature-flag-adapter.ts +174 -0
- package/services/feature-flags/types.ts +79 -0
- package/services/force-update.ts +140 -0
- package/services/index.ts +116 -54
- package/services/media/compression.ts +91 -0
- package/services/media/media-picker.ts +151 -0
- package/services/media/media-upload.ts +160 -0
- package/services/payments/adapters/mock.ts +159 -0
- package/services/payments/payment-adapter.ts +118 -0
- package/services/payments/types.ts +131 -0
- package/services/permissions/permission-manager.ts +284 -0
- package/services/permissions/types.ts +104 -0
- package/services/realtime/types.ts +100 -0
- package/services/realtime/websocket-manager.ts +441 -0
- package/services/security.ts +289 -286
- package/services/sentry.ts +4 -4
- package/stores/appStore.ts +9 -0
- package/stores/notificationStore.ts +3 -1
- package/tailwind.config.js +47 -47
- package/tsconfig.json +37 -13
- package/types/user.ts +1 -1
- package/utils/accessibility.ts +446 -446
- package/utils/animations/presets.ts +182 -0
- package/utils/animations/transitions.ts +62 -0
- package/utils/index.ts +63 -52
- package/utils/toast.ts +9 -2
- package/utils/validation.ts +4 -1
- package/utils/withAccessibility.tsx +272 -272
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Analytics adapter facade
|
|
3
|
+
* Delegates all analytics calls to the pre-existing multi-provider analytics
|
|
4
|
+
* system in `@/services/analytics` so there is a single source of truth.
|
|
5
|
+
*
|
|
6
|
+
* Consumers that import `Analytics` from this module (e.g. AnalyticsProvider,
|
|
7
|
+
* useTrackScreen, useTrackEvent) will ultimately go through the same pipeline
|
|
8
|
+
* as direct callers of `@/services/analytics`.
|
|
9
|
+
*
|
|
10
|
+
* @module services/analytics/analytics-adapter
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
track,
|
|
15
|
+
screen,
|
|
16
|
+
identify,
|
|
17
|
+
resetAnalytics,
|
|
18
|
+
setUserProperties,
|
|
19
|
+
} from "@/services/analytics";
|
|
20
|
+
import type { AnalyticsConfig } from "./types";
|
|
21
|
+
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Module-level state
|
|
24
|
+
// ============================================================================
|
|
25
|
+
|
|
26
|
+
/** Runtime configuration */
|
|
27
|
+
let config: AnalyticsConfig = {
|
|
28
|
+
enabled: true,
|
|
29
|
+
debug: __DEV__,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Public API
|
|
34
|
+
// ============================================================================
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Central analytics facade.
|
|
38
|
+
*
|
|
39
|
+
* Every method delegates to the pre-existing multi-provider analytics singleton
|
|
40
|
+
* exported from `@/services/analytics`.
|
|
41
|
+
*/
|
|
42
|
+
export const Analytics = {
|
|
43
|
+
/**
|
|
44
|
+
* Merge new configuration values.
|
|
45
|
+
*/
|
|
46
|
+
configure(newConfig: Partial<AnalyticsConfig>): void {
|
|
47
|
+
config = { ...config, ...newConfig };
|
|
48
|
+
|
|
49
|
+
if (config.debug) {
|
|
50
|
+
console.log("[Analytics] Configured:", config);
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Initialize analytics. The underlying system auto-initializes adapters on
|
|
56
|
+
* import, so this is effectively a no-op but kept for API compatibility.
|
|
57
|
+
*/
|
|
58
|
+
async initialize(): Promise<void> {
|
|
59
|
+
if (!config.enabled) return;
|
|
60
|
+
if (config.debug) {
|
|
61
|
+
console.log("[Analytics] Initialized (delegating to services/analytics)");
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
/** Track a named event with optional properties. */
|
|
66
|
+
track(event: string, properties?: Record<string, unknown>): void {
|
|
67
|
+
if (!config.enabled) return;
|
|
68
|
+
track(event, properties);
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
/** Track a screen view. */
|
|
72
|
+
screen(name: string, properties?: Record<string, unknown>): void {
|
|
73
|
+
if (!config.enabled) return;
|
|
74
|
+
screen(name, properties);
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
/** Identify the current user. */
|
|
78
|
+
identify(userId: string, traits?: Record<string, unknown>): void {
|
|
79
|
+
if (!config.enabled) return;
|
|
80
|
+
identify(userId, traits);
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
/** Reset analytics state (e.g. on sign out). */
|
|
84
|
+
reset(): void {
|
|
85
|
+
if (!config.enabled) return;
|
|
86
|
+
resetAnalytics();
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
/** Set persistent user properties. */
|
|
90
|
+
setUserProperties(properties: Record<string, unknown>): void {
|
|
91
|
+
if (!config.enabled) return;
|
|
92
|
+
setUserProperties(properties);
|
|
93
|
+
},
|
|
94
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Analytics type definitions
|
|
3
|
+
* Defines the adapter interface and configuration for the analytics system.
|
|
4
|
+
* @module services/analytics/types
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Adapter Interface
|
|
9
|
+
// ============================================================================
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Interface that all analytics adapters must implement.
|
|
13
|
+
* Swap adapters to switch between providers (Mixpanel, Amplitude, etc.)
|
|
14
|
+
* without changing application code.
|
|
15
|
+
*/
|
|
16
|
+
export interface AnalyticsAdapter {
|
|
17
|
+
/**
|
|
18
|
+
* Initialize the analytics provider.
|
|
19
|
+
* Called once when the app starts.
|
|
20
|
+
*/
|
|
21
|
+
initialize(): Promise<void> | void;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Track a custom event with optional properties.
|
|
25
|
+
*
|
|
26
|
+
* @param event - The event name (e.g. "Button Clicked")
|
|
27
|
+
* @param properties - Additional key-value data to attach to the event
|
|
28
|
+
*/
|
|
29
|
+
track(event: string, properties?: Record<string, unknown>): void;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Track a screen view.
|
|
33
|
+
*
|
|
34
|
+
* @param name - The screen name or route path
|
|
35
|
+
* @param properties - Additional data such as route segments
|
|
36
|
+
*/
|
|
37
|
+
screen(name: string, properties?: Record<string, unknown>): void;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Identify the current user.
|
|
41
|
+
*
|
|
42
|
+
* @param userId - Unique identifier for the user
|
|
43
|
+
* @param traits - Optional user traits (email, name, plan, etc.)
|
|
44
|
+
*/
|
|
45
|
+
identify(userId: string, traits?: Record<string, unknown>): void;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Reset analytics state (e.g. on sign out).
|
|
49
|
+
* Clears the identified user and any queued data.
|
|
50
|
+
*/
|
|
51
|
+
reset(): void;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Set persistent user properties that are sent with every subsequent event.
|
|
55
|
+
*
|
|
56
|
+
* @param properties - Key-value pairs to persist
|
|
57
|
+
*/
|
|
58
|
+
setUserProperties(properties: Record<string, unknown>): void;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Configuration
|
|
63
|
+
// ============================================================================
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Runtime configuration for the analytics system.
|
|
67
|
+
*/
|
|
68
|
+
export interface AnalyticsConfig {
|
|
69
|
+
/** Whether analytics tracking is enabled */
|
|
70
|
+
enabled: boolean;
|
|
71
|
+
/** Whether to log debug information to the console */
|
|
72
|
+
debug: boolean;
|
|
73
|
+
}
|