diff --git a/src/navigation/AppNavigator.tsx b/src/navigation/AppNavigator.tsx index 41586b8..a5196cc 100644 --- a/src/navigation/AppNavigator.tsx +++ b/src/navigation/AppNavigator.tsx @@ -85,6 +85,8 @@ const AnalyticsDashboard = lazyScreen(() => import('../../app/screens/AnalyticsD const RenewalWorkspaceScreen = lazyScreen(() => import('../../app/screens/RenewalWorkspaceScreen').then((m) => ({ default: m.default })) ); +const EntityManagementScreen = lazyScreen(() => import('../screens/EntityManagementScreen')); +const PauseSubscriptionScreen = lazyScreen(() => import('../screens/PauseSubscriptionScreen')); // Issue #547: GDPR const PrivacyCenterScreen = lazyScreen(() => import('../screens/PrivacyCenterScreen')); diff --git a/src/screens/EntityManagementScreen.tsx b/src/screens/EntityManagementScreen.tsx new file mode 100644 index 0000000..81bb3b9 --- /dev/null +++ b/src/screens/EntityManagementScreen.tsx @@ -0,0 +1,395 @@ +import React, { useMemo, useState } from 'react'; +import { Alert, StyleSheet, Text, TextInput, View } from 'react-native'; +import { Button } from '../components/common/Button'; +import { Card } from '../components/common/Card'; +import { ListScreen } from '../components/common/ScreenTemplates'; +import { useEntityStore } from '../store/entityStore'; +import { Entity, EntityRole, EntityStatus } from '../types/entity'; +import { colors, spacing, typography } from '../utils/constants'; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +const statusColor = (status: EntityStatus): string => { + switch (status) { + case EntityStatus.ACTIVE: + return colors.success; + case EntityStatus.INACTIVE: + return colors.warning; + case EntityStatus.ACQUIRED: + case EntityStatus.DIVESTED: + return colors.textSecondary; + default: + return colors.textSecondary; + } +}; + +const roleBadge = (role: EntityRole): string => { + switch (role) { + case EntityRole.GLOBAL_ADMIN: + return 'Global Admin'; + case EntityRole.ENTITY_ADMIN: + return 'Admin'; + default: + return 'Viewer'; + } +}; + +// --------------------------------------------------------------------------- +// AddEntityModal – inline form (no external modal dependency) +// --------------------------------------------------------------------------- + +interface AddEntityFormProps { + parentId: string | null; + existingCount: number; + onAdd: (name: string, currency: string, parentId: string | null) => void; + onCancel: () => void; +} + +const AddEntityForm: React.FC = ({ + parentId, + existingCount, + onAdd, + onCancel, +}) => { + const [name, setName] = useState(`Entity ${existingCount + 1}`); + const [currency, setCurrency] = useState('USD'); + + return ( + + {parentId ? 'Add Subsidiary' : 'Add Holding Entity'} + Display Name + + Currency (ISO 4217) + + +