// Flutter imports: import 'package:flutter/foundation.dart'; // Package imports: import 'package:built_collection/built_collection.dart'; import 'package:built_value/built_value.dart'; import 'package:built_value/serializer.dart'; // Project imports: import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/static/color_theme_model.dart'; part 'pref_state.g.dart'; abstract class PrefState implements Built { factory PrefState({ModuleLayout moduleLayout}) { return _$PrefState._( appLayout: AppLayout.desktop, moduleLayout: ModuleLayout.table, isPreviewVisible: false, useSidebarEditor: BuiltMap(), menuSidebarMode: AppSidebarMode.collapse, historySidebarMode: AppSidebarMode.float, rowsPerPage: 10, isMenuVisible: true, isHistoryVisible: false, enableDarkMode: false, requireAuthentication: false, colorTheme: kColorThemeLight, isFilterVisible: false, textScaleFactor: 1, longPressSelectionIsDefault: true, tapSelectedToEdit: false, hideDesktopWarning: false, showKanban: false, showPdfPreview: true, persistData: false, persistUI: true, companyPrefs: BuiltMap(), sortFields: BuiltMap(), customColors: BuiltMap(CONTRAST_COLORS), ); } PrefState._(); static const TEXT_SCALING_NORMAL = 1.0; static const TEXT_SCALING_LARGE = 1.2; static const TEXT_SCALING_LARGER = 1.4; static const TEXT_SCALING_LARGEST = 1.6; static const THEME_SIDEBAR_ACTIVE_BACKGROUND_COLOR = 'sidebar_active_background_color'; static const THEME_SIDEBAR_ACTIVE_FONT_COLOR = 'sidebar_active_font_color'; static const THEME_SIDEBAR_INACTIVE_BACKGROUND_COLOR = 'sidebar_inactive_background_color'; static const THEME_SIDEBAR_INACTIVE_FONT_COLOR = 'sidebar_inactive_font_color'; static const THEME_INVOICE_HEADER_BACKGROUND_COLOR = 'invoice_header_background_color'; static const THEME_INVOICE_HEADER_FONT_COLOR = 'invoice_header_font_color'; static const THEME_TABLE_ALTERNATE_ROW_BACKGROUND_COLOR = 'table_alternate_row_background_color'; static const THEME_COLORS = [ PrefState.THEME_SIDEBAR_ACTIVE_BACKGROUND_COLOR, PrefState.THEME_SIDEBAR_ACTIVE_FONT_COLOR, PrefState.THEME_SIDEBAR_INACTIVE_BACKGROUND_COLOR, PrefState.THEME_SIDEBAR_INACTIVE_FONT_COLOR, PrefState.THEME_INVOICE_HEADER_BACKGROUND_COLOR, PrefState.THEME_INVOICE_HEADER_FONT_COLOR, PrefState.THEME_TABLE_ALTERNATE_ROW_BACKGROUND_COLOR, ]; static const CONTRAST_COLORS = { PrefState.THEME_SIDEBAR_ACTIVE_BACKGROUND_COLOR: '#444444', PrefState.THEME_SIDEBAR_ACTIVE_FONT_COLOR: '#FFFFFF', PrefState.THEME_SIDEBAR_INACTIVE_BACKGROUND_COLOR: '#2F2F2F', PrefState.THEME_SIDEBAR_INACTIVE_FONT_COLOR: '#FFFFFF', PrefState.THEME_INVOICE_HEADER_BACKGROUND_COLOR: '#777777', PrefState.THEME_INVOICE_HEADER_FONT_COLOR: '#FFFFFF', PrefState.THEME_TABLE_ALTERNATE_ROW_BACKGROUND_COLOR: '#F9F9F9', }; @override @memoized int get hashCode; AppLayout get appLayout; ModuleLayout get moduleLayout; AppSidebarMode get menuSidebarMode; AppSidebarMode get historySidebarMode; BuiltMap get useSidebarEditor; BuiltMap get customColors; bool get isPreviewVisible; bool get isMenuVisible; bool get showKanban; bool get showPdfPreview; bool get isHistoryVisible; bool get enableDarkMode; bool get isFilterVisible; bool get persistData; bool get persistUI; bool get longPressSelectionIsDefault; bool get requireAuthentication; bool get tapSelectedToEdit; int get rowsPerPage; String get colorTheme; bool get hideDesktopWarning; double get textScaleFactor; BuiltMap get sortFields; ColorTheme get colorThemeModel => colorThemesMap.containsKey(colorTheme) ? colorThemesMap[colorTheme] : colorThemesMap[kColorThemeLight]; BuiltMap get companyPrefs; bool get isDesktop => appLayout == AppLayout.desktop; bool isEditorFullScreen(EntityType entityType) { if (!isDesktop) { return false; } if ([EntityType.product, EntityType.payment, EntityType.project] .contains(entityType)) { return false; } return !(useSidebarEditor[entityType.baseType] ?? false); } bool get isNotDesktop => !isDesktop; bool get isMobile => appLayout == AppLayout.mobile; bool get isNotMobile => !isMobile; bool get isModuleList => moduleLayout == ModuleLayout.list; bool get isModuleTable => !isModuleList; bool get isMenuFloated => appLayout == AppLayout.mobile || menuSidebarMode == AppSidebarMode.float; bool get isHistoryFloated => appLayout == AppLayout.mobile || historySidebarMode == AppSidebarMode.float; bool get showMenu => (isMenuVisible && menuSidebarMode == AppSidebarMode.visible) || menuSidebarMode == AppSidebarMode.collapse; bool get showHistory => isHistoryVisible && historySidebarMode == AppSidebarMode.visible; bool get isMenuCollapsed => isNotMobile && menuSidebarMode == AppSidebarMode.collapse && !isMenuVisible; // ignore: unused_element static void _initializeBuilder(PrefStateBuilder builder) => builder ..useSidebarEditor.replace(BuiltMap()) ..sortFields.replace(BuiltMap()) ..customColors.replace(builder.enableDarkMode == true ? BuiltMap() : BuiltMap(PrefState.CONTRAST_COLORS)) ..showKanban = false ..isPreviewVisible = false ..isFilterVisible = false ..hideDesktopWarning = false ..tapSelectedToEdit = false ..persistData = false ..persistUI = true ..showPdfPreview = true ..textScaleFactor = 1 ..colorTheme = builder.enableDarkMode == true ? kColorThemeLight : kColorThemeLight; static Serializer get serializer => _$prefStateSerializer; } abstract class PrefStateSortField implements Built { factory PrefStateSortField(String field, bool ascending) { return _$PrefStateSortField._( field: field, ascending: ascending, ); } PrefStateSortField._(); @override @memoized int get hashCode; String get field; bool get ascending; static Serializer get serializer => _$prefStateSortFieldSerializer; } abstract class CompanyPrefState implements Built { factory CompanyPrefState({ String accentColor, }) { return _$CompanyPrefState._( historyList: BuiltList(), ); } CompanyPrefState._(); @override @memoized int get hashCode; BuiltList get historyList; static Serializer get serializer => _$companyPrefStateSerializer; } class AppLayout extends EnumClass { const AppLayout._(String name) : super(name); static Serializer get serializer => _$appLayoutSerializer; static const AppLayout mobile = _$mobile; static const AppLayout desktop = _$desktop; static BuiltSet get values => _$values; static AppLayout valueOf(String name) => _$valueOf(name); } class ModuleLayout extends EnumClass { const ModuleLayout._(String name) : super(name); static Serializer get serializer => _$moduleLayoutSerializer; static const ModuleLayout list = _$list; static const ModuleLayout table = _$table; static BuiltSet get values => _$moduleLayoutValues; static ModuleLayout valueOf(String name) => _$moduleLayoutValueOf(name); } class AppSidebar extends EnumClass { const AppSidebar._(String name) : super(name); static Serializer get serializer => _$appSidebarSerializer; static const AppSidebar menu = _$menu; static const AppSidebar history = _$history; static BuiltSet get values => _$valuesSidebar; static AppSidebar valueOf(String name) => _$valueOfSidebar(name); } class AppSidebarMode extends EnumClass { const AppSidebarMode._(String name) : super(name); static Serializer get serializer => _$appSidebarModeSerializer; static const AppSidebarMode float = _$float; static const AppSidebarMode visible = _$visible; static const AppSidebarMode collapse = _$collapse; static BuiltSet get values => _$valuesSidebarMode; static AppSidebarMode valueOf(String name) => _$valueOfSidebarMode(name); } abstract class HistoryRecord implements Built { factory HistoryRecord({ @required EntityType entityType, String id, }) { return _$HistoryRecord._( id: id, entityType: entityType, timestamp: DateTime.now().millisecondsSinceEpoch, ); } HistoryRecord._(); @override @memoized int get hashCode; @nullable String get id; EntityType get entityType; int get timestamp; DateTime get dateTime => DateTime.fromMillisecondsSinceEpoch(timestamp); bool matchesRecord(HistoryRecord record) => isEqualTo(entityId: record.id, entityType: record.entityType); bool isEqualTo({EntityType entityType, String entityId}) => entityType == this.entityType && entityId == id; static Serializer get serializer => _$historyRecordSerializer; }