diff --git a/lib/main.dart b/lib/main.dart index 4b7228c8c..d82cdcc56 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -233,7 +233,7 @@ Future _initialState(bool isTesting) async { prefState = serializers.deserializeWith( PrefState.serializer, json.decode(prefString)); } catch (e) { - print('Failed to load prefs: $e'); + print('## Error: Failed to load prefs: $e'); } } diff --git a/lib/redux/app/app_actions.dart b/lib/redux/app/app_actions.dart index d2c512610..47559fa66 100644 --- a/lib/redux/app/app_actions.dart +++ b/lib/redux/app/app_actions.dart @@ -105,6 +105,10 @@ class DismissGatewayWarningPermanently implements PersistUI, PersistPrefs {} class DismissReviewAppPermanently implements PersistUI, PersistPrefs {} +class DismissOneYearReviewAppPermanently implements PersistUI, PersistPrefs {} + +class DismissTwoYearReviewAppPermanently implements PersistUI, PersistPrefs {} + class ViewMainScreen { ViewMainScreen({this.addDelay = false}); diff --git a/lib/redux/app/app_state.dart b/lib/redux/app/app_state.dart index 77f2cb1ac..e406b05ce 100644 --- a/lib/redux/app/app_state.dart +++ b/lib/redux/app/app_state.dart @@ -192,6 +192,14 @@ abstract class AppState implements Built { return color.isNotEmpty; } + bool get showReviewApp => !prefState.hideReviewApp && company.daysActive > 60; + + bool get showOneYearReviewApp => + !prefState.hideOneYearReviewApp && company.daysActive > 365; + + bool get showTwoYearReviewApp => + !prefState.hideTwoYearReviewApp && company.daysActive > 730; + Color get linkColor => prefState.enableDarkMode ? convertHexStringToColor('#FFFFFF') : accentColor; diff --git a/lib/redux/ui/pref_reducer.dart b/lib/redux/ui/pref_reducer.dart index fc3ccb98b..7a125cc0f 100644 --- a/lib/redux/ui/pref_reducer.dart +++ b/lib/redux/ui/pref_reducer.dart @@ -67,6 +67,10 @@ PrefState prefReducer( ..hideGatewayWarning = hideGatewayWarningReducer(state.hideGatewayWarning, action) ..hideReviewApp = hideReviewAppReducer(state.hideReviewApp, action) + ..hideOneYearReviewApp = + hideOneYearReviewAppReducer(state.hideOneYearReviewApp, action) + ..hideTwoYearReviewApp = + hideTwoYearReviewAppReducer(state.hideTwoYearReviewApp, action) ..textScaleFactor = textScaleFactorReducer(state.textScaleFactor, action) ..isMenuVisible = menuVisibleReducer(state.isMenuVisible, action) ..isHistoryVisible = historyVisibleReducer(state.isHistoryVisible, action) @@ -253,6 +257,27 @@ Reducer hideReviewAppReducer = combineReducers([ TypedReducer((filter, action) { return true; }), + TypedReducer((filter, action) { + return true; + }), + TypedReducer((filter, action) { + return true; + }), +]); + +Reducer hideOneYearReviewAppReducer = combineReducers([ + TypedReducer((filter, action) { + return true; + }), + TypedReducer((filter, action) { + return true; + }), +]); + +Reducer hideTwoYearReviewAppReducer = combineReducers([ + TypedReducer((filter, action) { + return true; + }), ]); Reducer filterClearedAtReducer = combineReducers([ diff --git a/lib/redux/ui/pref_state.dart b/lib/redux/ui/pref_state.dart index ce125d390..0117e7b5d 100644 --- a/lib/redux/ui/pref_state.dart +++ b/lib/redux/ui/pref_state.dart @@ -40,6 +40,8 @@ abstract class PrefState implements Built { hideDesktopWarning: false, hideGatewayWarning: false, hideReviewApp: false, + hideOneYearReviewApp: false, + hideTwoYearReviewApp: false, showKanban: false, showPdfPreview: true, showPdfPreviewSideBySide: false, @@ -151,6 +153,10 @@ abstract class PrefState implements Built { bool get hideReviewApp; + bool get hideOneYearReviewApp; + + bool get hideTwoYearReviewApp; + bool get editAfterSaving; double get textScaleFactor; @@ -233,6 +239,8 @@ abstract class PrefState implements Built { ..hideDesktopWarning = false ..hideGatewayWarning = false ..hideReviewApp = false + ..hideOneYearReviewApp = false + ..hideTwoYearReviewApp = false ..tapSelectedToEdit = false ..persistData = false ..persistUI = true diff --git a/lib/redux/ui/pref_state.g.dart b/lib/redux/ui/pref_state.g.dart index 5ea1ae125..2ff7770bc 100644 --- a/lib/redux/ui/pref_state.g.dart +++ b/lib/redux/ui/pref_state.g.dart @@ -200,6 +200,12 @@ class _$PrefStateSerializer implements StructuredSerializer { 'hideReviewApp', serializers.serialize(object.hideReviewApp, specifiedType: const FullType(bool)), + 'hideOneYearReviewApp', + serializers.serialize(object.hideOneYearReviewApp, + specifiedType: const FullType(bool)), + 'hideTwoYearReviewApp', + serializers.serialize(object.hideTwoYearReviewApp, + specifiedType: const FullType(bool)), 'editAfterSaving', serializers.serialize(object.editAfterSaving, specifiedType: const FullType(bool)), @@ -349,6 +355,14 @@ class _$PrefStateSerializer implements StructuredSerializer { result.hideReviewApp = serializers.deserialize(value, specifiedType: const FullType(bool)) as bool; break; + case 'hideOneYearReviewApp': + result.hideOneYearReviewApp = serializers.deserialize(value, + specifiedType: const FullType(bool)) as bool; + break; + case 'hideTwoYearReviewApp': + result.hideTwoYearReviewApp = serializers.deserialize(value, + specifiedType: const FullType(bool)) as bool; + break; case 'editAfterSaving': result.editAfterSaving = serializers.deserialize(value, specifiedType: const FullType(bool)) as bool; @@ -658,6 +672,10 @@ class _$PrefState extends PrefState { @override final bool hideReviewApp; @override + final bool hideOneYearReviewApp; + @override + final bool hideTwoYearReviewApp; + @override final bool editAfterSaving; @override final double textScaleFactor; @@ -698,6 +716,8 @@ class _$PrefState extends PrefState { this.hideDesktopWarning, this.hideGatewayWarning, this.hideReviewApp, + this.hideOneYearReviewApp, + this.hideTwoYearReviewApp, this.editAfterSaving, this.textScaleFactor, this.sortFields, @@ -757,6 +777,10 @@ class _$PrefState extends PrefState { hideGatewayWarning, r'PrefState', 'hideGatewayWarning'); BuiltValueNullFieldError.checkNotNull( hideReviewApp, r'PrefState', 'hideReviewApp'); + BuiltValueNullFieldError.checkNotNull( + hideOneYearReviewApp, r'PrefState', 'hideOneYearReviewApp'); + BuiltValueNullFieldError.checkNotNull( + hideTwoYearReviewApp, r'PrefState', 'hideTwoYearReviewApp'); BuiltValueNullFieldError.checkNotNull( editAfterSaving, r'PrefState', 'editAfterSaving'); BuiltValueNullFieldError.checkNotNull( @@ -806,6 +830,8 @@ class _$PrefState extends PrefState { hideDesktopWarning == other.hideDesktopWarning && hideGatewayWarning == other.hideGatewayWarning && hideReviewApp == other.hideReviewApp && + hideOneYearReviewApp == other.hideOneYearReviewApp && + hideTwoYearReviewApp == other.hideTwoYearReviewApp && editAfterSaving == other.editAfterSaving && textScaleFactor == other.textScaleFactor && sortFields == other.sortFields && @@ -845,6 +871,8 @@ class _$PrefState extends PrefState { _$hash = $jc(_$hash, hideDesktopWarning.hashCode); _$hash = $jc(_$hash, hideGatewayWarning.hashCode); _$hash = $jc(_$hash, hideReviewApp.hashCode); + _$hash = $jc(_$hash, hideOneYearReviewApp.hashCode); + _$hash = $jc(_$hash, hideTwoYearReviewApp.hashCode); _$hash = $jc(_$hash, editAfterSaving.hashCode); _$hash = $jc(_$hash, textScaleFactor.hashCode); _$hash = $jc(_$hash, sortFields.hashCode); @@ -884,6 +912,8 @@ class _$PrefState extends PrefState { ..add('hideDesktopWarning', hideDesktopWarning) ..add('hideGatewayWarning', hideGatewayWarning) ..add('hideReviewApp', hideReviewApp) + ..add('hideOneYearReviewApp', hideOneYearReviewApp) + ..add('hideTwoYearReviewApp', hideTwoYearReviewApp) ..add('editAfterSaving', editAfterSaving) ..add('textScaleFactor', textScaleFactor) ..add('sortFields', sortFields) @@ -1032,6 +1062,16 @@ class PrefStateBuilder implements Builder { set hideReviewApp(bool hideReviewApp) => _$this._hideReviewApp = hideReviewApp; + bool _hideOneYearReviewApp; + bool get hideOneYearReviewApp => _$this._hideOneYearReviewApp; + set hideOneYearReviewApp(bool hideOneYearReviewApp) => + _$this._hideOneYearReviewApp = hideOneYearReviewApp; + + bool _hideTwoYearReviewApp; + bool get hideTwoYearReviewApp => _$this._hideTwoYearReviewApp; + set hideTwoYearReviewApp(bool hideTwoYearReviewApp) => + _$this._hideTwoYearReviewApp = hideTwoYearReviewApp; + bool _editAfterSaving; bool get editAfterSaving => _$this._editAfterSaving; set editAfterSaving(bool editAfterSaving) => @@ -1089,6 +1129,8 @@ class PrefStateBuilder implements Builder { _hideDesktopWarning = $v.hideDesktopWarning; _hideGatewayWarning = $v.hideGatewayWarning; _hideReviewApp = $v.hideReviewApp; + _hideOneYearReviewApp = $v.hideOneYearReviewApp; + _hideTwoYearReviewApp = $v.hideTwoYearReviewApp; _editAfterSaving = $v.editAfterSaving; _textScaleFactor = $v.textScaleFactor; _sortFields = $v.sortFields.toBuilder(); @@ -1153,6 +1195,8 @@ class PrefStateBuilder implements Builder { hideDesktopWarning: BuiltValueNullFieldError.checkNotNull(hideDesktopWarning, r'PrefState', 'hideDesktopWarning'), hideGatewayWarning: BuiltValueNullFieldError.checkNotNull(hideGatewayWarning, r'PrefState', 'hideGatewayWarning'), hideReviewApp: BuiltValueNullFieldError.checkNotNull(hideReviewApp, r'PrefState', 'hideReviewApp'), + hideOneYearReviewApp: BuiltValueNullFieldError.checkNotNull(hideOneYearReviewApp, r'PrefState', 'hideOneYearReviewApp'), + hideTwoYearReviewApp: BuiltValueNullFieldError.checkNotNull(hideTwoYearReviewApp, r'PrefState', 'hideTwoYearReviewApp'), editAfterSaving: BuiltValueNullFieldError.checkNotNull(editAfterSaving, r'PrefState', 'editAfterSaving'), textScaleFactor: BuiltValueNullFieldError.checkNotNull(textScaleFactor, r'PrefState', 'textScaleFactor'), sortFields: sortFields.build(), diff --git a/lib/ui/app/review_app.dart b/lib/ui/app/review_app.dart index 90e66a7c4..0f51184ca 100644 --- a/lib/ui/app/review_app.dart +++ b/lib/ui/app/review_app.dart @@ -21,6 +21,7 @@ class _ReviewAppState extends State { Widget build(BuildContext context) { final localization = AppLocalization.of(context); final store = StoreProvider.of(context); + final state = store.state; if (kIsWeb || isLinux()) { return SizedBox(); @@ -53,7 +54,13 @@ class _ReviewAppState extends State { AppReview.openStoreListing(); } - store.dispatch(DismissReviewAppPermanently()); + if (state.showTwoYearReviewApp) { + store.dispatch(DismissTwoYearReviewAppPermanently()); + } else if (state.showOneYearReviewApp) { + store.dispatch(DismissOneYearReviewAppPermanently()); + } else if (state.showReviewApp) { + store.dispatch(DismissReviewAppPermanently()); + } }, child: ConstrainedBox( constraints: const BoxConstraints(minWidth: 100), @@ -68,7 +75,13 @@ class _ReviewAppState extends State { ), TextButton( onPressed: () async { - store.dispatch(DismissReviewAppPermanently()); + if (state.showTwoYearReviewApp) { + store.dispatch(DismissTwoYearReviewAppPermanently()); + } else if (state.showOneYearReviewApp) { + store.dispatch(DismissOneYearReviewAppPermanently()); + } else if (state.showReviewApp) { + store.dispatch(DismissReviewAppPermanently()); + } }, child: ConstrainedBox( constraints: const BoxConstraints(minWidth: 100), diff --git a/lib/ui/dashboard/dashboard_panels.dart b/lib/ui/dashboard/dashboard_panels.dart index 56fa24473..d2e794523 100644 --- a/lib/ui/dashboard/dashboard_panels.dart +++ b/lib/ui/dashboard/dashboard_panels.dart @@ -459,8 +459,9 @@ class DashboardPanels extends StatelessWidget { case DashboardSections.messages: return Column( children: [ - if (!state.prefState.hideReviewApp && - state.company.daysActive > (isMobileOS() ? 60 : 120)) + if (state.showReviewApp || + state.showOneYearReviewApp || + state.showTwoYearReviewApp) ReviewApp(), if (state.userCompany.isAdmin && state.company.daysActive < 30 &&