diff --git a/lib/main.dart b/lib/main.dart index a935284..999f676 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,10 +2,10 @@ import 'dart:async'; import 'package:catcher/catcher.dart'; import 'package:client/models/navigation_model.dart'; +import 'package:client/models/token_model.dart'; import 'package:client/navigation/url_strategy/url_strategy.dart' show setUrlStrategyTo; import 'package:client_common/api/response_models/api_error.dart'; import 'package:client_common/config/config.dart'; -import 'package:client_common/models/auth_model.dart'; import 'package:client_common/models/build_model.dart'; import 'package:client_common/models/store_model.dart'; import 'package:client_common/models/user_application_model.dart'; @@ -139,11 +139,11 @@ class Store extends StatelessWidget { scopes: ['profile', 'store', 'resources', 'manage:account', 'app:websocket'], ), ), - ChangeNotifierProvider(create: (context) => AuthModel()), ChangeNotifierProvider(create: (context) => BuildModel()), ChangeNotifierProvider(create: (context) => StoreModel()), ChangeNotifierProvider(create: (context) => UserApplicationModel()), - ChangeNotifierProvider(create: (context) => NavigationModel()) + ChangeNotifierProvider(create: (context) => NavigationModel()), + ChangeNotifierProvider(create: (context) => TokenModel()), ], builder: (BuildContext context, _) => LenraTheme( themeData: themeData, diff --git a/lib/models/token_model.dart b/lib/models/token_model.dart new file mode 100644 index 0000000..4d096c5 --- /dev/null +++ b/lib/models/token_model.dart @@ -0,0 +1,5 @@ +import 'package:flutter/material.dart'; + +class TokenModel extends ChangeNotifier { + String? accessToken; +} diff --git a/lib/views/app_page.dart b/lib/views/app_page.dart index 90ec7c9..463b477 100644 --- a/lib/views/app_page.dart +++ b/lib/views/app_page.dart @@ -1,6 +1,6 @@ +import 'package:client/models/token_model.dart'; import 'package:client/navigation/store_navigator.dart'; import 'package:client_common/config/config.dart'; -import 'package:client_common/models/auth_model.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:lenra_ui_runner/app.dart'; @@ -20,21 +20,21 @@ class AppPage extends StatelessWidget { Widget build(BuildContext context) { return MultiProvider( providers: [ - ChangeNotifierProxyProvider( - create: (context) => AppSocketModel(context.read().accessToken?.accessToken ?? "", appName), - update: (_, authModel, socketModel) { + ChangeNotifierProxyProvider( + create: (context) => AppSocketModel(context.read().accessToken ?? "", appName), + update: (_, tokenModel, socketModel) { if (socketModel == null) { - return AppSocketModel(authModel.accessToken?.accessToken ?? "", appName); + return AppSocketModel(tokenModel.accessToken ?? "", appName); } - (socketModel as AppSocketModel).update(authModel.accessToken?.accessToken ?? ""); + (socketModel as AppSocketModel).update(tokenModel.accessToken ?? ""); return socketModel; }, ), ], builder: (BuildContext context, _) => App( appName: appName, - accessToken: context.watch().accessToken?.accessToken ?? "", + accessToken: context.watch().accessToken ?? "", httpEndpoint: Config.instance.httpEndpoint, wsEndpoint: Config.instance.wsEndpoint, baseRoute: "/app/$appName", diff --git a/lib/views/oauth_page.dart b/lib/views/oauth_page.dart index 93f395e..1e80969 100644 --- a/lib/views/oauth_page.dart +++ b/lib/views/oauth_page.dart @@ -1,11 +1,12 @@ // ignore_for_file: use_build_context_synchronously +import 'package:client/models/token_model.dart'; import 'package:client_common/api/application_api.dart'; import 'package:client_common/api/lenra_http_client.dart'; +import 'package:client_common/api/response_models/api_error.dart'; import 'package:client_common/api/response_models/app_response.dart'; import 'package:client_common/api/response_models/user_response.dart'; import 'package:client_common/api/user_api.dart'; -import 'package:client_common/models/auth_model.dart'; import 'package:client_common/oauth/oauth_model.dart'; import 'package:client_common/views/simple_page.dart'; import 'package:flutter/material.dart'; @@ -140,27 +141,32 @@ class OAuthPageState extends State { } static Future isAuthenticated(BuildContext context) async { - OAuthModel oauthModel = context.read(); - - AccessTokenResponse? token = await oauthModel.helper.getTokenFromStorage(); + AccessTokenResponse? token = await context.read().helper.getTokenFromStorage(); if (token?.accessToken != null) { return await authenticate(context); } - return oauthModel.accessToken != null; + return false; } static Future authenticate(BuildContext context) async { AccessTokenResponse? response = await context.read().authenticate(); if (response != null) { - context.read().accessToken = response; - // Set the token for the global API instance LenraApi.instance.token = response.accessToken; - - if (context.read().user == null) { - UserResponse user = await UserApi.me(); - context.read().user = user.user; + context.read().accessToken = response.accessToken; + + if (context.read().user == null) { + try { + UserResponse resp = await UserApi.me(); + context.read().user = resp.user; + } on ApiError catch (e) { + if (e.reason == 'invalid_token') { + // Delete access token from storage + await context.read().helper.removeAllTokens(); + return false; + } + } } return true; diff --git a/lib/views/profile_page/profile_page.dart b/lib/views/profile_page/profile_page.dart index 8b026eb..8dca5e6 100644 --- a/lib/views/profile_page/profile_page.dart +++ b/lib/views/profile_page/profile_page.dart @@ -1,5 +1,4 @@ import 'package:client/navigation/store_navigator.dart'; -import 'package:client_common/models/auth_model.dart'; import 'package:client_common/navigator/common_navigator.dart'; import 'package:client_common/oauth/oauth_model.dart'; import 'package:client_common/views/profile/change_password_form.dart'; @@ -28,7 +27,7 @@ class ProfilePage extends StatelessWidget { height: 8, ), Text( - context.read().user?.email ?? "", + context.read().user?.email ?? "", ), ], ), @@ -47,7 +46,7 @@ class ProfilePage extends StatelessWidget { LenraButton( leftIcon: const Icon(Icons.logout), onPressed: () async { - await context.read().helper.disconnect(); + await context.read().logout(); // ignore: use_build_context_synchronously context.go("/"); }, diff --git a/lib/views/store_page/logout_button.dart b/lib/views/store_page/logout_button.dart index b18f67e..71c2ff8 100644 --- a/lib/views/store_page/logout_button.dart +++ b/lib/views/store_page/logout_button.dart @@ -13,7 +13,7 @@ class LogoutButton extends StatelessWidget { Widget build(BuildContext context) { return ElevatedButton( onPressed: () async { - await context.read().helper.disconnect(); + await context.read().logout(); // ignore: use_build_context_synchronously context.go("/"); }, diff --git a/pubspec.lock b/pubspec.lock index 9e46a00..17544f2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -134,8 +134,8 @@ packages: dependency: "direct main" description: path: "." - ref: "v1.0.0-beta.49" - resolved-ref: "76b91eccac245dc8aeadb07c3a7ec4cd0629255c" + ref: "v1.1.2" + resolved-ref: "560a9d904a997885b740d94b1ca057b6d18065c9" url: "https://github.com/lenra-io/client-common.git" source: git version: "1.0.0" @@ -159,10 +159,10 @@ packages: dependency: transitive description: name: collection - sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.1" + version: "1.18.0" convert: dependency: transitive description: @@ -471,8 +471,8 @@ packages: dependency: "direct main" description: path: "." - ref: "v1.0.0-beta.120" - resolved-ref: "7f24e4f24dd0ce51c218eea3727b17364f369682" + ref: "v1.0.0-beta.122" + resolved-ref: "8fb36244fc08a45df4f093675681e6d7757369fc" url: "https://github.com/lenra-io/lenra_ui_runner.git" source: git version: "0.0.0" @@ -512,26 +512,26 @@ packages: dependency: transitive description: name: matcher - sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.15" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" meta: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" mime: dependency: transitive description: @@ -685,26 +685,26 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" string_scanner: dependency: transitive description: @@ -725,10 +725,10 @@ packages: dependency: transitive description: name: test_api - sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.dev" source: hosted - version: "0.5.1" + version: "0.6.1" typed_data: dependency: transitive description: @@ -841,6 +841,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" win32: dependency: transitive description: @@ -882,5 +890,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.0.0 <4.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index f8de426..6405fad 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,11 +17,11 @@ dependencies: client_common: git: url: https://github.com/lenra-io/client-common.git - ref: v1.0.0-beta.49 + ref: v1.1.2 lenra_ui_runner: git: url: https://github.com/lenra-io/lenra_ui_runner.git - ref: v1.0.0-beta.120 + ref: v1.0.0-beta.122 lenra_components: git: url: https://github.com/lenra-io/lenra_components.git