Deep linking

This commit is contained in:
Hillel Coren 2021-04-19 16:15:23 +03:00
parent 3403077dd4
commit 5952a79e8c
4 changed files with 27 additions and 16 deletions

View File

@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:invoiceninja_flutter/.env.dart'; import 'package:invoiceninja_flutter/.env.dart';
import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/entities.dart';
import 'package:invoiceninja_flutter/data/models/serializers.dart'; import 'package:invoiceninja_flutter/data/models/serializers.dart';
import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/main_app.dart';
import 'package:invoiceninja_flutter/redux/app/app_middleware.dart'; import 'package:invoiceninja_flutter/redux/app/app_middleware.dart';
@ -139,6 +140,21 @@ Future<AppState> _initialState(bool isTesting) async {
} }
} }
String browserRoute;
if (kIsWeb && prefState.isDesktop) {
browserRoute = WebUtils.browserRoute;
if (browserRoute.isNotEmpty && browserRoute.length > 4) {
if (browserRoute == '/kanban') {
browserRoute = '/task';
prefState = prefState.rebuild((b) => b
..showKanban = true
..useSidebarEditor[EntityType.task] = true);
}
} else {
browserRoute = null;
}
}
bool reportErrors = false; bool reportErrors = false;
if (kIsWeb) { if (kIsWeb) {
reportErrors = WebUtils.getHtmlValue('report-errors') == '1'; reportErrors = WebUtils.getHtmlValue('report-errors') == '1';
@ -151,5 +167,6 @@ Future<AppState> _initialState(bool isTesting) async {
prefState: prefState, prefState: prefState,
url: Config.DEMO_MODE ? '' : url, url: Config.DEMO_MODE ? '' : url,
reportErrors: reportErrors, reportErrors: reportErrors,
currentRoute: browserRoute,
); );
} }

View File

@ -184,6 +184,7 @@ Middleware<AppState> _createLoadState(
final action = dynamicAction as LoadStateRequest; final action = dynamicAction as LoadStateRequest;
try { try {
final state = store.state;
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
final appVersion = prefs.getString(kSharedPrefAppVersion); final appVersion = prefs.getString(kSharedPrefAppVersion);
@ -204,7 +205,7 @@ Middleware<AppState> _createLoadState(
throw 'New app version - clearing state'; throw 'New app version - clearing state';
} }
var prefState = store.state.prefState; final prefState = state.prefState;
authState = await authRepository.loadAuthState(); authState = await authRepository.loadAuthState();
uiState = await uiRepository.loadUIState(); uiState = await uiRepository.loadUIState();
staticState = await staticRepository.loadStaticState(); staticState = await staticRepository.loadStaticState();
@ -212,18 +213,10 @@ Middleware<AppState> _createLoadState(
companyStates.add(await companyRepositories[i].loadCompanyState(i)); companyStates.add(await companyRepositories[i].loadCompanyState(i));
} }
if (kIsWeb && prefState.isDesktop) { // Carry over a deeplink URL on the web
var browserRoute = WebUtils.browserRoute; if (state.uiState.currentRoute != LoginScreen.route) {
if (browserRoute.isNotEmpty && browserRoute.length > 4) { uiState = uiState
if (browserRoute == '/kanban') { .rebuild((b) => b..currentRoute = state.uiState.currentRoute);
browserRoute = '/task';
prefState = prefState.rebuild((b) => b
..showKanban = true
..useSidebarEditor[EntityType.task] = true);
}
uiState = uiState.rebuild((b) => b..currentRoute = browserRoute);
}
} }
final AppState appState = AppState( final AppState appState = AppState(

View File

@ -94,6 +94,7 @@ abstract class AppState implements Built<AppState, AppStateBuilder> {
@required PrefState prefState, @required PrefState prefState,
@required bool reportErrors, @required bool reportErrors,
String url, String url,
String currentRoute,
}) { }) {
return _$AppState._( return _$AppState._(
isLoading: false, isLoading: false,
@ -106,7 +107,7 @@ abstract class AppState implements Built<AppState, AppStateBuilder> {
List<int>.generate(kMaxNumberOfCompanies, (i) => i + 1) List<int>.generate(kMaxNumberOfCompanies, (i) => i + 1)
.map((index) => UserCompanyState(reportErrors)) .map((index) => UserCompanyState(reportErrors))
.toList()), .toList()),
uiState: UIState(), uiState: UIState(currentRoute: currentRoute),
prefState: prefState ?? PrefState(), prefState: prefState ?? PrefState(),
); );
} }

View File

@ -40,11 +40,11 @@ import 'package:invoiceninja_flutter/utils/strings.dart';
part 'ui_state.g.dart'; part 'ui_state.g.dart';
abstract class UIState implements Built<UIState, UIStateBuilder> { abstract class UIState implements Built<UIState, UIStateBuilder> {
factory UIState() { factory UIState({String currentRoute}) {
return _$UIState._( return _$UIState._(
selectedCompanyIndex: 0, selectedCompanyIndex: 0,
filterClearedAt: 0, filterClearedAt: 0,
currentRoute: LoginScreen.route, currentRoute: currentRoute ?? LoginScreen.route,
previousRoute: '', previousRoute: '',
previewStack: BuiltList<EntityType>(), previewStack: BuiltList<EntityType>(),
dashboardUIState: DashboardUIState(), dashboardUIState: DashboardUIState(),