import 'package:invoiceninja_flutter/constants.dart'; import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/dashboard/dashboard_actions.dart'; import 'package:invoiceninja_flutter/ui/app/app_drawer_vm.dart'; import 'package:invoiceninja_flutter/ui/app/help_text.dart'; import 'package:invoiceninja_flutter/ui/app/screen_imports.dart'; import 'package:invoiceninja_flutter/ui/client/client_screen_vm.dart'; import 'package:invoiceninja_flutter/ui/company_gateway/company_gateway_screen.dart'; import 'package:invoiceninja_flutter/ui/company_gateway/edit/company_gateway_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/company_gateway/view/company_gateway_view_vm.dart'; import 'package:invoiceninja_flutter/ui/dashboard/dashboard_vm.dart'; import 'package:invoiceninja_flutter/ui/group/edit/group_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/group/group_screen.dart'; import 'package:invoiceninja_flutter/ui/group/view/group_view_vm.dart'; import 'package:invoiceninja_flutter/ui/product/product_screen_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/buy_now_buttons_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/client_portal_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/company_details_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/credit_cards_and_banks_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/data_visualizations_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/device_settings_list_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/email_settings_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/import_export_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/invoice_design_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/invoice_settings_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/localization_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/notifications_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/products_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/templates_and_reminders_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/user_details_vm.dart'; import 'package:invoiceninja_flutter/ui/tax_rate/edit/tax_rate_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/tax_rate/tax_rate_screen.dart'; import 'package:invoiceninja_flutter/ui/tax_rate/view/tax_rate_view_vm.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:redux/redux.dart'; class MainScreen extends StatelessWidget { static const String route = '/main'; @override Widget build(BuildContext context) { return StoreBuilder( onInit: (Store store) => store.dispatch(LoadDashboard()), builder: (BuildContext context, Store store) { final uiState = store.state.uiState; final mainRoute = uiState.mainRoute; int mainIndex = 0; // TODO use constants array to lookup index if (mainRoute == EntityType.client.name) { mainIndex = 1; } else if (mainRoute == EntityType.product.name) { mainIndex = 2; } else if (mainRoute == EntityType.invoice.name) { mainIndex = 3; } else if (mainRoute == EntityType.payment.name) { mainIndex = 4; } else if (mainRoute == EntityType.quote.name) { mainIndex = 5; } else if (mainRoute == EntityType.project.name) { mainIndex = 6; } else if (mainRoute == EntityType.task.name) { mainIndex = 7; } else if (mainRoute == EntityType.vendor.name) { mainIndex = 8; } else if (mainRoute == EntityType.expense.name) { mainIndex = 9; } else if (mainRoute == 'settings') { mainIndex = 10; } return Row( children: [ if (uiState.isMenuVisible) AppDrawerBuilder(), if (uiState.isMenuVisible) VerticalDivider(width: isDarkMode(context) ? 1 : .5), Expanded( child: IndexedStack( index: mainIndex, children: [ DashboardScreen(), EntityScreens( entityType: EntityType.client, listWidget: ClientScreenBuilder(), viewWidget: ClientViewScreen(), editWidget: ClientEditScreen()), EntityScreens( entityType: EntityType.product, listWidget: ProductScreenBuilder(), viewWidget: ProductViewScreen(), editWidget: ProductEditScreen(), ), EntityScreens( entityType: EntityType.invoice, listWidget: InvoiceScreen(), viewWidget: InvoiceViewScreen(), editWidget: InvoiceEditScreen(), ), EntityScreens( entityType: EntityType.payment, listWidget: PaymentScreen(), viewWidget: PaymentViewScreen(), editWidget: PaymentEditScreen(), ), EntityScreens( entityType: EntityType.quote, listWidget: QuoteScreen(), viewWidget: QuoteViewScreen(), editWidget: QuoteEditScreen(), ), EntityScreens( entityType: EntityType.project, listWidget: ProjectScreen(), viewWidget: ProjectViewScreen(), editWidget: ProjectEditScreen(), ), EntityScreens( entityType: EntityType.task, listWidget: TaskScreen(), viewWidget: TaskViewScreen(), editWidget: TaskEditScreen(), ), EntityScreens( entityType: EntityType.vendor, listWidget: VendorScreen(), viewWidget: VendorViewScreen(), editWidget: VendorEditScreen(), ), EntityScreens( entityType: EntityType.expense, listWidget: ExpenseScreen(), viewWidget: ExpenseViewScreen(), editWidget: ExpenseEditScreen(), ), SettingsScreens(), ], ), ), ], ); }); } } class SettingsScreens extends StatelessWidget { @override Widget build(BuildContext context) { final store = StoreProvider.of(context); final state = store.state; final uiState = state.uiState; Widget screen = BlankScreen(); switch (uiState.subRoute) { case kSettingsCompanyDetails: screen = CompanyDetailsScreen(); break; case kSettingsUserDetails: screen = UserDetailsScreen(); break; case kSettingsLocalization: screen = LocalizationScreen(); break; case kSettingsOnlinePayments: screen = CompanyGatewayScreen(); break; case kSettingsOnlinePaymentsView: screen = CompanyGatewayViewScreen(); break; case kSettingsOnlinePaymentsEdit: screen = CompanyGatewayEditScreen(); break; case kSettingsTaxRates: screen = TaxRateSettingsScreen(); break; case kSettingsTaxRatesView: screen = TaxRateViewScreen(); break; case kSettingsTaxRatesEdit: screen = TaxRateEditScreen(); break; case kSettingsProducts: screen = ProductSettingsScreen(); break; case kSettingsNotifications: screen = NotificationsSettingsScreen(); break; case kSettingsImportExport: screen = ImportExportScreen(); break; case kSettingsDeviceSettings: screen = DeviceSettingsScreen(); break; case kSettingsGroupSettings: screen = GroupSettingsScreen(); break; case kSettingsGroupSettingsView: screen = GroupViewScreen(); break; case kSettingsGroupSettingsEdit: screen = GroupEditScreen(); break; case kSettingsInvoiceSettings: screen = InvoiceSettingsScreen(); break; case kSettingsInvoiceDesign: screen = InvoiceDesignScreen(); break; case kSettingsClientPortal: screen = ClientPortalScreen(); break; case kSettingsBuyNowButtons: screen = BuyNowButtonsScreen(); break; case kSettingsEmailSettings: screen = EmailSettingsScreen(); break; case kSettingsTemplatesAndReminders: screen = TemplatesAndRemindersScreen(); break; case kSettingsCreditCardsAndBanks: screen = CreditCardsAndBanksScreen(); break; case kSettingsDataVisualizations: screen = DataVisualizationsScreen(); break; } return Row(children: [ Expanded( child: SettingsScreen(), flex: 2, ), VerticalDivider(width: isDarkMode(context) ? 1 : .5), Expanded( flex: 3, child: screen, ) ]); } } class EntityScreens extends StatelessWidget { const EntityScreens({ @required this.listWidget, @required this.editWidget, @required this.viewWidget, @required this.entityType, }); final Widget listWidget; final Widget viewWidget; final Widget editWidget; final EntityType entityType; @override Widget build(BuildContext context) { final store = StoreProvider.of(context); final state = store.state; final uiState = state.uiState; final subRoute = uiState.subRoute; final entityUIState = state.getUIState(entityType); return Row( children: [ Expanded( child: listWidget, flex: 2, ), VerticalDivider(width: isDarkMode(context) ? 1 : .5), Expanded( flex: 3, child: IndexedStack( index: subRoute == 'edit' ? 1 : 0, children: [ (entityUIState.selectedId ?? '').isNotEmpty ? viewWidget : BlankScreen(AppLocalization.of(context).noRecordSelected), editWidget, ], ), ), ], ); } } class BlankScreen extends StatelessWidget { const BlankScreen([this.message]); final String message; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: HelpText(message ?? ''), ); } }