UNPKG

@oxyhq/services

Version:

OxyHQ Expo/React Native SDK — UI components, screens, and native features

118 lines (109 loc) 5.29 kB
import type { ComponentType } from 'react'; import type { BaseScreenProps } from '../types/navigation'; // Lazy loading: Screens are loaded on-demand to break require cycles // This prevents screens (which import OxyContext) from being loaded // before OxyContext is fully initialized // Define all available route names export type RouteName = | 'OxyAuth' // Sign in with Oxy (QR code / deep link to Accounts app) | 'AccountOverview' | 'AccountSettings' | 'AccountCenter' | 'AccountSwitcher' | 'AccountVerification' | 'SessionManagement' | 'PaymentGateway' | 'Profile' | 'LanguageSelector' | 'PrivacySettings' | 'SearchSettings' | 'FileManagement' | 'HelpSupport' | 'FAQ' | 'Feedback' | 'LegalDocuments' | 'AppInfo' | 'PremiumSubscription' | 'WelcomeNewUser' | 'UserLinks' | 'HistoryView' | 'SavesCollections' | 'EditProfileField' // Dedicated screen for editing a single profile field | 'LearnMoreUsernames' // Informational screen about usernames | 'KarmaCenter' | 'KarmaLeaderboard' | 'KarmaRewards' | 'KarmaRules' | 'AboutKarma' | 'KarmaFAQ' | 'FollowersList' // List of user's followers | 'FollowingList'; // List of users being followed // Lazy screen loaders - functions that return screen components on-demand // This breaks the require cycle by deferring imports until screens are actually needed const screenLoaders: Record<RouteName, () => ComponentType<BaseScreenProps>> = { OxyAuth: () => require('../screens/OxyAuthScreen').default, AccountOverview: () => require('../screens/AccountOverviewScreen').default, AccountSettings: () => require('../screens/AccountSettingsScreen').default, AccountCenter: () => require('../screens/AccountCenterScreen').default, AccountSwitcher: () => require('../screens/AccountSwitcherScreen').default, AccountVerification: () => require('../screens/AccountVerificationScreen').default, SessionManagement: () => require('../screens/SessionManagementScreen').default, PaymentGateway: () => require('../screens/PaymentGatewayScreen').default, Profile: () => require('../screens/ProfileScreen').default, LanguageSelector: () => require('../screens/LanguageSelectorScreen').default, PrivacySettings: () => require('../screens/PrivacySettingsScreen').default, SearchSettings: () => require('../screens/SearchSettingsScreen').default, FileManagement: () => require('../screens/FileManagementScreen').default, HelpSupport: () => require('../screens/HelpSupportScreen').default, FAQ: () => require('../screens/FAQScreen').default, Feedback: () => require('../screens/FeedbackScreen').default, LegalDocuments: () => require('../screens/LegalDocumentsScreen').default, AppInfo: () => require('../screens/AppInfoScreen').default, PremiumSubscription: () => require('../screens/PremiumSubscriptionScreen').default, WelcomeNewUser: () => require('../screens/WelcomeNewUserScreen').default, UserLinks: () => require('../screens/UserLinksScreen').default, HistoryView: () => require('../screens/HistoryViewScreen').default, SavesCollections: () => require('../screens/SavesCollectionsScreen').default, EditProfileField: () => require('../screens/EditProfileFieldScreen').default, // Informational screens LearnMoreUsernames: () => require('../screens/LearnMoreUsernamesScreen').default, // Karma screens KarmaCenter: () => require('../screens/karma/KarmaCenterScreen').default, KarmaLeaderboard: () => require('../screens/karma/KarmaLeaderboardScreen').default, KarmaRewards: () => require('../screens/karma/KarmaRewardsScreen').default, KarmaRules: () => require('../screens/karma/KarmaRulesScreen').default, AboutKarma: () => require('../screens/karma/KarmaAboutScreen').default, KarmaFAQ: () => require('../screens/karma/KarmaFAQScreen').default, // User list screens (followers/following) FollowersList: () => require('../screens/FollowersListScreen').default, FollowingList: () => require('../screens/FollowingListScreen').default, }; // Cache loaded components to avoid re-requiring const screenCache = new Map<RouteName, ComponentType<BaseScreenProps>>(); // Helper function to get a screen component by route name (lazy loaded) export const getScreenComponent = (routeName: RouteName): ComponentType<BaseScreenProps> | undefined => { // Return cached component if available if (screenCache.has(routeName)) { return screenCache.get(routeName); } // Lazy load the component const loader = screenLoaders[routeName]; if (loader) { try { const component = loader(); screenCache.set(routeName, component); return component; } catch (error) { if (__DEV__) { console.error(`[Routes] Failed to load screen: ${routeName}`, error); } return undefined; } } return undefined; }; // Helper function to check if a route exists // Uses the screenLoaders object to check existence without loading the screen export const isValidRoute = (routeName: string): routeName is RouteName => { return routeName in screenLoaders; };