UNPKG

@oxyhq/services

Version:

Reusable OxyHQ module to handle authentication, user management, karma system, device-based session management and more 🚀

421 lines (415 loc) • 14.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = require("react"); var _reactNative = require("react-native"); var _OxyContext = require("../context/OxyContext"); var _fonts = require("../styles/fonts"); var _version = require("../../constants/version"); var _sonner = require("../../lib/sonner"); var _vectorIcons = require("@expo/vector-icons"); var _OxyServices = _interopRequireDefault(require("../../assets/icons/OxyServices")); var _components = require("../components"); var _jsxRuntime = require("react/jsx-runtime"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const AppInfoScreen = ({ onClose, theme, navigate }) => { const { user, sessions, oxyServices, isAuthenticated } = (0, _OxyContext.useOxy)(); const [systemInfo, setSystemInfo] = (0, _react.useState)(null); const [isRunningSystemCheck, setIsRunningSystemCheck] = (0, _react.useState)(false); const [connectionStatus, setConnectionStatus] = (0, _react.useState)('unknown'); const isDarkTheme = theme === 'dark'; const backgroundColor = isDarkTheme ? '#121212' : '#f2f2f2'; const primaryColor = '#007AFF'; (0, _react.useEffect)(() => { const updateDimensions = () => { const dimensions = _reactNative.Dimensions.get('window'); setSystemInfo(prev => ({ ...prev, platform: _reactNative.Platform.OS, version: _reactNative.Platform.Version?.toString() || 'Unknown', screenDimensions: { width: dimensions.width, height: dimensions.height }, timestamp: new Date().toISOString() })); }; // Set initial dimensions updateDimensions(); // Listen for dimension changes const subscription = _reactNative.Dimensions.addEventListener('change', updateDimensions); // Check API connection on mount const checkConnection = async () => { setConnectionStatus('checking'); if (!oxyServices) { setConnectionStatus('disconnected'); return; } try { await oxyServices.healthCheck(); setConnectionStatus('connected'); } catch (error) { setConnectionStatus('disconnected'); } }; checkConnection(); // Cleanup listener on unmount return () => { subscription?.remove(); }; }, []); const copyToClipboard = async (text, label) => { try { await _reactNative.Clipboard.setString(text); _sonner.toast.success(`${label} copied to clipboard`); } catch (error) { _sonner.toast.error('Failed to copy to clipboard'); } }; const runSystemCheck = async () => { setIsRunningSystemCheck(true); try { // Simulate system check await new Promise(resolve => setTimeout(resolve, 2000)); // Check API connection if (oxyServices) { try { await oxyServices.healthCheck(); setConnectionStatus('connected'); } catch (error) { setConnectionStatus('disconnected'); } } _sonner.toast.success('System check completed successfully'); } catch (error) { _sonner.toast.error('System check failed'); } finally { setIsRunningSystemCheck(false); } }; const generateFullReport = () => { const report = { package: _version.packageInfo, system: systemInfo, user: user ? { id: user.id, username: user.username, email: user.email, isPremium: user.isPremium } : null, sessions: sessions?.length || 0, connection: connectionStatus, timestamp: new Date().toISOString() }; return JSON.stringify(report, null, 2); }; const handleCopyFullReport = () => { const report = generateFullReport(); copyToClipboard(report, 'Full system report'); }; return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, { style: [styles.container, { backgroundColor }], children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, { style: styles.header, children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, { style: styles.cancelButton, onPress: onClose, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_vectorIcons.Ionicons, { name: "close", size: 24, color: "#666" }) }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, { style: styles.headerTitle, children: "App Information" }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, { style: styles.placeholder })] }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.ScrollView, { style: styles.content, showsVerticalScrollIndicator: false, children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Section, { title: "Package Information", theme: theme, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.GroupedSection, { items: [{ id: 'name', icon: 'information-circle', iconColor: '#007AFF', title: 'Name', subtitle: _version.packageInfo.name, onPress: () => copyToClipboard(_version.packageInfo.name, 'Package name'), customContent: /*#__PURE__*/(0, _jsxRuntime.jsx)(_OxyServices.default, { width: 20, height: 20, style: styles.settingIcon }) }, { id: 'version', icon: 'pricetag', iconColor: '#5856D6', title: 'Version', subtitle: _version.packageInfo.version, onPress: () => copyToClipboard(_version.packageInfo.version, 'Version') }, { id: 'description', icon: 'document-text', iconColor: '#34C759', title: 'Description', subtitle: _version.packageInfo.description || 'No description' }, { id: 'main-entry', icon: 'code', iconColor: '#FF9500', title: 'Main Entry', subtitle: _version.packageInfo.main || 'N/A', onPress: () => copyToClipboard(_version.packageInfo.main || 'N/A', 'Main entry') }, { id: 'module-entry', icon: 'library', iconColor: '#FF3B30', title: 'Module Entry', subtitle: _version.packageInfo.module || 'N/A', onPress: () => copyToClipboard(_version.packageInfo.module || 'N/A', 'Module entry') }, { id: 'types-entry', icon: 'construct', iconColor: '#32D74B', title: 'Types Entry', subtitle: _version.packageInfo.types || 'N/A', onPress: () => copyToClipboard(_version.packageInfo.types || 'N/A', 'Types entry') }], theme: theme }) }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Section, { title: "System Information", theme: theme, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.GroupedSection, { items: [{ id: 'platform', icon: 'phone-portrait', iconColor: '#007AFF', title: 'Platform', subtitle: _reactNative.Platform.OS }, { id: 'platform-version', icon: 'hardware-chip', iconColor: '#5856D6', title: 'Platform Version', subtitle: systemInfo?.version || 'Loading...' }, { id: 'screen-width', icon: 'resize', iconColor: '#FF9500', title: 'Screen Width', subtitle: `${systemInfo?.screenDimensions.width || 0}px` }, { id: 'screen-height', icon: 'resize', iconColor: '#FF3B30', title: 'Screen Height', subtitle: `${systemInfo?.screenDimensions.height || 0}px` }, { id: 'environment', icon: 'settings', iconColor: '#34C759', title: 'Environment', subtitle: __DEV__ ? 'Development' : 'Production' }], theme: theme }) }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Section, { title: "User Information", theme: theme, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.GroupedSection, { items: [{ id: 'auth-status', icon: 'shield-checkmark', iconColor: isAuthenticated ? '#34C759' : '#FF3B30', title: 'Authentication Status', subtitle: isAuthenticated ? 'Authenticated' : 'Not Authenticated' }, ...(user ? [{ id: 'user-id', icon: 'person', iconColor: '#007AFF', title: 'User ID', subtitle: user.id, onPress: () => copyToClipboard(user.id, 'User ID') }, { id: 'username', icon: 'at', iconColor: '#5856D6', title: 'Username', subtitle: user.username || 'N/A', onPress: () => { if (user?.username && navigate) { navigate('Profile', { userId: user.id }); } else { _sonner.toast.info('No username available or navigation not supported'); } } }, { id: 'email', icon: 'mail', iconColor: '#FF9500', title: 'Email', subtitle: user.email || 'N/A' }, { id: 'premium-status', icon: 'star', iconColor: user.isPremium ? '#FFD700' : '#8E8E93', title: 'Premium Status', subtitle: user.isPremium ? 'Premium' : 'Standard' }] : []), { id: 'active-sessions', icon: 'people', iconColor: '#32D74B', title: 'Total Active Sessions', subtitle: sessions?.length?.toString() || '0' }], theme: theme }) }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Section, { title: "API Configuration", theme: theme, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.GroupedSection, { items: [{ id: 'api-base-url', icon: 'server', iconColor: '#007AFF', title: 'API Base URL', subtitle: oxyServices?.getBaseURL() || 'Not configured', onPress: () => copyToClipboard(oxyServices?.getBaseURL() || 'Not configured', 'API Base URL') }, { id: 'connection-status', icon: connectionStatus === 'checking' ? 'sync' : connectionStatus === 'connected' ? 'wifi' : 'wifi-off', iconColor: connectionStatus === 'checking' ? '#FF9500' : connectionStatus === 'connected' ? '#34C759' : '#FF3B30', title: 'Connection Status', subtitle: connectionStatus === 'checking' ? 'Checking...' : connectionStatus === 'connected' ? 'Connected' : connectionStatus === 'disconnected' ? 'Disconnected' : 'Unknown', onPress: async () => { setConnectionStatus('checking'); if (!oxyServices) { setConnectionStatus('disconnected'); _sonner.toast.error('OxyServices not initialized'); return; } try { await oxyServices.healthCheck(); setConnectionStatus('connected'); _sonner.toast.success('API connection successful'); } catch (error) { setConnectionStatus('disconnected'); _sonner.toast.error('Failed to connect to API server'); } } }], theme: theme }) }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Section, { title: "Build Information", theme: theme, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.GroupedSection, { items: [{ id: 'build-timestamp', icon: 'time', iconColor: '#007AFF', title: 'Build Timestamp', subtitle: systemInfo?.timestamp || 'Loading...', onPress: () => copyToClipboard(systemInfo?.timestamp || 'Loading...', 'Build timestamp') }, { id: 'react-native', icon: 'logo-react', iconColor: '#61DAFB', title: 'React Native', subtitle: 'Expo/React Native' }, { id: 'js-engine', icon: 'flash', iconColor: '#FF3B30', title: 'JavaScript Engine', subtitle: 'Hermes' }], theme: theme }) }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Section, { title: "Quick Actions", theme: theme, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.GroupedSection, { items: [{ id: 'copy-full-report', icon: 'copy', iconColor: '#007AFF', title: 'Copy Full Report', subtitle: 'Copy complete application information to clipboard', onPress: handleCopyFullReport }, { id: 'run-system-check', icon: isRunningSystemCheck ? 'sync' : 'checkmark-circle', iconColor: isRunningSystemCheck ? '#FF9500' : '#34C759', title: isRunningSystemCheck ? 'Running System Check...' : 'Run System Check', subtitle: isRunningSystemCheck ? 'Checking API, authentication, and platform status...' : 'Verify application health and status', onPress: runSystemCheck, disabled: isRunningSystemCheck, customContent: isRunningSystemCheck ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, { color: "#FF9500", size: "small", style: { marginRight: 16 } }) : null }], theme: theme }) })] })] }); }; const styles = _reactNative.StyleSheet.create({ container: { flex: 1 }, header: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', paddingHorizontal: 16, paddingVertical: 12, backgroundColor: '#fff' }, cancelButton: { padding: 5 }, headerTitle: { fontSize: 24, fontWeight: 'bold', color: '#000', fontFamily: _fonts.fontFamilies.phuduBold }, placeholder: { width: 34 // Same width as cancel button to center title }, content: { flex: 1, padding: 16 }, settingIcon: { marginRight: 12 } }); var _default = exports.default = AppInfoScreen; //# sourceMappingURL=AppInfoScreen.js.map