From 915c2d75a9b5371dd406cdb5ab1da17fc493af0f Mon Sep 17 00:00:00 2001 From: Prajapati Chintan Date: Mon, 31 Oct 2022 20:08:18 +0530 Subject: [PATCH 01/11] Added: route middleware, Fixed: error when pushing same route again --- lib/app_config.dart | 6 ++--- lib/routes/controller.dart | 0 lib/routes/middleware.dart | 30 ++++++++++++++++++++++++ lib/routes/routes.dart | 16 ++++++------- lib/view/pages/permission_denied.dart | 28 ++++++++++++++++++++++ lib/view/pages/something_went_wrong.dart | 17 +++----------- 6 files changed, 71 insertions(+), 26 deletions(-) create mode 100644 lib/routes/controller.dart create mode 100644 lib/routes/middleware.dart create mode 100644 lib/view/pages/permission_denied.dart diff --git a/lib/app_config.dart b/lib/app_config.dart index 74d2422b..378b7e81 100644 --- a/lib/app_config.dart +++ b/lib/app_config.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'env.dart'; -import 'routes/routes.dart'; import 'app_theme.dart'; +import 'env.dart'; +import 'routes/middleware.dart'; import 'vaahextendflutter/tag/tag_panel.dart'; import 'view/pages/home.dart'; @@ -23,7 +23,7 @@ class AppConfig extends StatelessWidget { onGenerateInitialRoutes: (String initialRoute) { return [TeamHomePage.route()]; }, - onGenerateRoute: onGenerateRoute, + onGenerateRoute: routeMiddleware, builder: (BuildContext context, Widget? child) { return TagPanelHost( navigatorKey: _navigatorKey, diff --git a/lib/routes/controller.dart b/lib/routes/controller.dart new file mode 100644 index 00000000..e69de29b diff --git a/lib/routes/middleware.dart b/lib/routes/middleware.dart new file mode 100644 index 00000000..ca46caad --- /dev/null +++ b/lib/routes/middleware.dart @@ -0,0 +1,30 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import '../view/pages/home.dart'; +import '../view/pages/permission_denied.dart'; +import '../view/pages/something_went_wrong.dart'; +import 'routes.dart'; + +List defalutPermissions = [ + '/', + TeamHomePage.routeName, + SomethingWentWrong.routeName, +]; + +Route? routeMiddleware(RouteSettings route) { + if (!routes.containsKey(route.name)) { + return SomethingWentWrong.route(); + } + // Fetch user permission from controller + // -> controller connects with model + // -> model connects with api/ service + // -> api sends back resp, model translates, it + // -> model sends back to controller + // -> From that controller response middleware checks permission + if (defalutPermissions.contains(route.name)) { + // include user specific permissions in if condition + return routes[route.name]!(); + } + return PermissionDenied.route(); +} diff --git a/lib/routes/routes.dart b/lib/routes/routes.dart index fd3f153e..c13322b4 100644 --- a/lib/routes/routes.dart +++ b/lib/routes/routes.dart @@ -1,14 +1,12 @@ import 'package:flutter/material.dart'; import '../view/pages/home.dart'; +import '../view/pages/permission_denied.dart'; import '../view/pages/something_went_wrong.dart'; - -Map> routes = { - '/': TeamHomePage.route(), - SomethingWentWrong.routeName: SomethingWentWrong.route(), -}; - -Route? onGenerateRoute(RouteSettings route) { - return routes[route.name] ?? SomethingWentWrong.route(); -} +final Map Function()> routes = { + '/': TeamHomePage.route, + TeamHomePage.routeName: TeamHomePage.route, + SomethingWentWrong.routeName: SomethingWentWrong.route, + PermissionDenied.routeName: PermissionDenied.route, +}; \ No newline at end of file diff --git a/lib/view/pages/permission_denied.dart b/lib/view/pages/permission_denied.dart new file mode 100644 index 00000000..9e07388d --- /dev/null +++ b/lib/view/pages/permission_denied.dart @@ -0,0 +1,28 @@ + +import 'package:flutter/material.dart'; + +import '../../vaahextendflutter/base/base_stateless.dart'; + +class PermissionDenied extends BaseStateless { + static const String routeName = '/permission-denied'; + + static Route route() { + return MaterialPageRoute( + settings: const RouteSettings(name: '/permission-denied'), + builder: (_) => const PermissionDenied(), + ); + } + + const PermissionDenied({super.key}); + + @override + Widget build(BuildContext context) { + super.build(context); + return Scaffold( + appBar: AppBar(), + body: const Center( + child: Text('Permission Denied'), + ), + ); + } +} diff --git a/lib/view/pages/something_went_wrong.dart b/lib/view/pages/something_went_wrong.dart index 8d85bb25..0f7666db 100644 --- a/lib/view/pages/something_went_wrong.dart +++ b/lib/view/pages/something_went_wrong.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; -import '../../vaahextendflutter/base/base_stateful.dart'; +import '../../vaahextendflutter/base/base_stateless.dart'; -class SomethingWentWrong extends StatefulWidget { - static String routeName = '/something-went-wrong'; +class SomethingWentWrong extends BaseStateless { + static const String routeName = '/something-went-wrong'; static Route route() { return MaterialPageRoute( @@ -15,17 +15,6 @@ class SomethingWentWrong extends StatefulWidget { const SomethingWentWrong({super.key}); - @override - State createState() => _SomethingWentWrongState(); -} - -class _SomethingWentWrongState extends BaseStateful { - - @override - void afterFirstBuild(BuildContext context) { - super.afterFirstBuild(context); - } - @override Widget build(BuildContext context) { super.build(context); From 1d3faa1cafee6f8d709571c26f761c66cf0237cc Mon Sep 17 00:00:00 2001 From: Prajapati Chintan Date: Fri, 4 Nov 2022 00:28:28 +0530 Subject: [PATCH 02/11] Added: route controller and permission models --- .../permission/modify_log/modify_log.dart | 25 ++ .../permission/modify_log/modify_log.g.dart | 19 ++ lib/models/user/permission/permission.dart | 24 ++ lib/models/user/permission/permission.g.dart | 22 ++ lib/models/user/permission/route/route.dart | 25 ++ lib/models/user/permission/route/route.g.dart | 20 ++ lib/models/user/user.dart | 26 ++ lib/models/user/user.g.dart | 20 ++ lib/routes/controller.dart | 22 ++ lib/routes/middleware.dart | 13 +- lib/view/pages/home.dart | 12 +- pubspec.lock | 287 ++++++++++++++++++ pubspec.yaml | 3 + 13 files changed, 513 insertions(+), 5 deletions(-) create mode 100644 lib/models/user/permission/modify_log/modify_log.dart create mode 100644 lib/models/user/permission/modify_log/modify_log.g.dart create mode 100644 lib/models/user/permission/permission.dart create mode 100644 lib/models/user/permission/permission.g.dart create mode 100644 lib/models/user/permission/route/route.dart create mode 100644 lib/models/user/permission/route/route.g.dart create mode 100644 lib/models/user/user.dart create mode 100644 lib/models/user/user.g.dart diff --git a/lib/models/user/permission/modify_log/modify_log.dart b/lib/models/user/permission/modify_log/modify_log.dart new file mode 100644 index 00000000..bc323c8c --- /dev/null +++ b/lib/models/user/permission/modify_log/modify_log.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'modify_log.g.dart'; + +@immutable +@JsonSerializable() +class ModifyLog { + @JsonKey(name: 'modified_by') + final String modifiedBy; + @JsonKey(name: 'post') + final String post; + @JsonKey(name: 'date_and_time') + final DateTime dateAndTime; + + const ModifyLog({ + required this.modifiedBy, + required this.post, + required this.dateAndTime, + }); + + factory ModifyLog.fromJson(Map json) => _$ModifyLogFromJson(json); + + Map toJson() => _$ModifyLogToJson(this); +} diff --git a/lib/models/user/permission/modify_log/modify_log.g.dart b/lib/models/user/permission/modify_log/modify_log.g.dart new file mode 100644 index 00000000..754221f8 --- /dev/null +++ b/lib/models/user/permission/modify_log/modify_log.g.dart @@ -0,0 +1,19 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'modify_log.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ModifyLog _$ModifyLogFromJson(Map json) => ModifyLog( + modifiedBy: json['modified_by'] as String, + post: json['post'] as String, + dateAndTime: DateTime.parse(json['date_and_time'] as String), + ); + +Map _$ModifyLogToJson(ModifyLog instance) => { + 'modified_by': instance.modifiedBy, + 'post': instance.post, + 'date_and_time': instance.dateAndTime.toIso8601String(), + }; diff --git a/lib/models/user/permission/permission.dart b/lib/models/user/permission/permission.dart new file mode 100644 index 00000000..a6ad6d8f --- /dev/null +++ b/lib/models/user/permission/permission.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:team/models/user/permission/modify_log/modify_log.dart'; +import 'package:team/models/user/permission/route/route.dart'; + +part 'permission.g.dart'; + +@immutable +@JsonSerializable() +class Permission { + @JsonKey(name: 'modify_log') + final List modifyLog; + @JsonKey(name: 'permissions') + final List routes; + + const Permission({ + required this.modifyLog, + required this.routes, + }); + + factory Permission.fromJson(Map json) => _$PermissionFromJson(json); + + Map toJson() => _$PermissionToJson(this); +} diff --git a/lib/models/user/permission/permission.g.dart b/lib/models/user/permission/permission.g.dart new file mode 100644 index 00000000..b6a1baca --- /dev/null +++ b/lib/models/user/permission/permission.g.dart @@ -0,0 +1,22 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'permission.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Permission _$PermissionFromJson(Map json) => Permission( + modifyLog: (json['modify_log'] as List) + .map((e) => ModifyLog.fromJson(e as Map)) + .toList(), + routes: (json['permissions'] as List) + .map((e) => RouteModel.fromJson(e as Map)) + .toList(), + ); + +Map _$PermissionToJson(Permission instance) => + { + 'modify_log': instance.modifyLog, + 'permissions': instance.routes, + }; diff --git a/lib/models/user/permission/route/route.dart b/lib/models/user/permission/route/route.dart new file mode 100644 index 00000000..80d46465 --- /dev/null +++ b/lib/models/user/permission/route/route.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'route.g.dart'; + +@immutable +@JsonSerializable() +class RouteModel { + @JsonKey(name: 'name') + final String? name; + @JsonKey(name: 'path') + final String path; + @JsonKey(name: 'description') + final String? description; + + const RouteModel({ + this.name, + required this.path, + this.description, + }); + + factory RouteModel.fromJson(Map json) => _$RouteModelFromJson(json); + + Map toJson() => _$RouteModelToJson(this); +} diff --git a/lib/models/user/permission/route/route.g.dart b/lib/models/user/permission/route/route.g.dart new file mode 100644 index 00000000..0ae8faee --- /dev/null +++ b/lib/models/user/permission/route/route.g.dart @@ -0,0 +1,20 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'route.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +RouteModel _$RouteModelFromJson(Map json) => RouteModel( + name: json['name'] as String?, + path: json['path'] as String, + description: json['description'] as String?, + ); + +Map _$RouteModelToJson(RouteModel instance) => + { + 'name': instance.name, + 'path': instance.path, + 'description': instance.description, + }; diff --git a/lib/models/user/user.dart b/lib/models/user/user.dart new file mode 100644 index 00000000..5c1cc52c --- /dev/null +++ b/lib/models/user/user.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:team/models/user/permission/permission.dart'; + +part 'user.g.dart'; + +@immutable +@JsonSerializable() +class User { + @JsonKey(name: 'first_name') + final String firstName; + @JsonKey(name: 'last_name') + final String? lastName; + @JsonKey(name: 'permissions') + final Permission permissions; + + const User({ + required this.firstName, + this.lastName, + required this.permissions, + }); + + factory User.fromJson(Map json) => _$UserFromJson(json); + + Map toJson() => _$UserToJson(this); +} diff --git a/lib/models/user/user.g.dart b/lib/models/user/user.g.dart new file mode 100644 index 00000000..38638c8f --- /dev/null +++ b/lib/models/user/user.g.dart @@ -0,0 +1,20 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +User _$UserFromJson(Map json) => User( + firstName: json['first_name'] as String, + lastName: json['last_name'] as String?, + permissions: + Permission.fromJson(json['permissions'] as Map), + ); + +Map _$UserToJson(User instance) => { + 'first_name': instance.firstName, + 'last_name': instance.lastName, + 'permissions': instance.permissions, + }; diff --git a/lib/routes/controller.dart b/lib/routes/controller.dart index e69de29b..95453578 100644 --- a/lib/routes/controller.dart +++ b/lib/routes/controller.dart @@ -0,0 +1,22 @@ +import 'package:get/get.dart'; +import 'package:team/models/user/permission/permission.dart'; +import 'package:team/models/user/permission/route/route.dart'; +import 'package:team/models/user/user.dart'; +import 'package:team/view/pages/something_went_wrong.dart'; + +class RouteController extends GetxController { + bool checkRoutePermission(String path) { + // check userController => isLoggedIn => currentUser.permissions.routes contain askedPath + // e.g. dummy user + User user = const User( + firstName: "Name", + permissions: Permission( + modifyLog: [], + routes: [ + RouteModel(path: SomethingWentWrong.routeName), + ], + ), + ); + return user.permissions.routes.where((element) => element.path == path).isNotEmpty; + } +} diff --git a/lib/routes/middleware.dart b/lib/routes/middleware.dart index ca46caad..46a6900f 100644 --- a/lib/routes/middleware.dart +++ b/lib/routes/middleware.dart @@ -1,5 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:team/routes/controller.dart'; import '../view/pages/home.dart'; import '../view/pages/permission_denied.dart'; @@ -9,21 +11,26 @@ import 'routes.dart'; List defalutPermissions = [ '/', TeamHomePage.routeName, - SomethingWentWrong.routeName, ]; Route? routeMiddleware(RouteSettings route) { if (!routes.containsKey(route.name)) { return SomethingWentWrong.route(); } + if (defalutPermissions.contains(route.name)) { + return routes[route.name]!(); + } // Fetch user permission from controller // -> controller connects with model // -> model connects with api/ service // -> api sends back resp, model translates, it // -> model sends back to controller // -> From that controller response middleware checks permission - if (defalutPermissions.contains(route.name)) { - // include user specific permissions in if condition + final RouteController routeController = Get.put( + RouteController(), + ); + bool userHasPermission = routeController.checkRoutePermission(route.name as String); + if (userHasPermission) { return routes[route.name]!(); } return PermissionDenied.route(); diff --git a/lib/view/pages/home.dart b/lib/view/pages/home.dart index 82885356..b725efa6 100644 --- a/lib/view/pages/home.dart +++ b/lib/view/pages/home.dart @@ -1,8 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:team/view/pages/something_went_wrong.dart'; import '../../vaahextendflutter/base/base_stateful.dart'; class TeamHomePage extends StatefulWidget { + static const String routeName = '/home'; + static Route route() { return MaterialPageRoute( settings: const RouteSettings(name: '/'), @@ -22,8 +25,13 @@ class _TeamHomePageState extends BaseStateful { super.build(context); return Scaffold( appBar: AppBar(), - body: const Center( - child: Text('Team App Home Page'), + body: Center( + child: ElevatedButton( + onPressed: () => Navigator.pushNamed(context, SomethingWentWrong.routeName), + child: const Text( + '404 Error page', + ), + ), ), ); } diff --git a/pubspec.lock b/pubspec.lock index e658acc1..1957b767 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,27 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + url: "https://pub.dartlang.org" + source: hosted + version: "50.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "5.2.0" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.1" async: dependency: transitive description: @@ -15,6 +36,62 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + build: + dependency: transitive + description: + name: build + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.1" + build_config: + dependency: transitive + description: + name: build_config + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + build_runner: + dependency: "direct dev" + description: + name: build_runner + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.2" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + url: "https://pub.dartlang.org" + source: hosted + version: "7.2.7" + built_collection: + dependency: transitive + description: + name: built_collection + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + url: "https://pub.dartlang.org" + source: hosted + version: "8.4.2" characters: dependency: transitive description: @@ -22,6 +99,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" clock: dependency: transitive description: @@ -29,6 +113,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + url: "https://pub.dartlang.org" + source: hosted + version: "4.3.0" collection: dependency: transitive description: @@ -43,6 +134,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.0" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" + copy_with_extension: + dependency: "direct main" + description: + name: copy_with_extension + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.4" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -50,6 +162,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.5" + dart_style: + dependency: transitive + description: + name: dart_style + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.4" dio: dependency: "direct main" description: @@ -64,6 +183,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.4" + fixnum: + dependency: transitive + description: + name: fixnum + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" flutter: dependency: "direct main" description: flutter @@ -100,6 +233,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.1.1" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" get: dependency: "direct main" description: @@ -107,6 +247,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.6.5" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + graphs: + dependency: transitive + description: + name: graphs + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.1" http_parser: dependency: transitive description: @@ -114,6 +275,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.2" + io: + dependency: transitive + description: + name: io + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" js: dependency: transitive description: @@ -121,6 +289,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.4" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "4.7.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + url: "https://pub.dartlang.org" + source: hosted + version: "6.5.4" lints: dependency: transitive description: @@ -128,6 +310,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" matcher: dependency: transitive description: @@ -149,6 +338,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" path: dependency: transitive description: @@ -156,11 +359,60 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.2" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + shelf: + dependency: transitive + description: + name: shelf + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.6" + source_helper: + dependency: transitive + description: + name: source_helper + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.3" source_span: dependency: transitive description: @@ -182,6 +434,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + stream_transform: + dependency: transitive + description: + name: stream_transform + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" string_scanner: dependency: transitive description: @@ -203,6 +462,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.12" + timing: + dependency: transitive + description: + name: timing + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" typed_data: dependency: transitive description: @@ -217,6 +483,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" sdks: dart: ">=2.18.2 <3.0.0" flutter: ">=3.3.4" diff --git a/pubspec.yaml b/pubspec.yaml index 814c6eb8..04ebbba8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,11 +18,14 @@ dependencies: flutter_screenutil: ^5.5.4 dio: ^4.0.6 fluttertoast: ^8.1.1 + json_annotation: ^4.7.0 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 + build_runner: ^2.3.2 + json_serializable: ^6.5.4 flutter: From 3c3b9bc731f5847434e473340743be7abdeec40b Mon Sep 17 00:00:00 2001 From: Prajapati Chintan Date: Sat, 5 Nov 2022 14:42:44 +0530 Subject: [PATCH 03/11] Added: user_controller, pages for testing, route observer, fixed routes Added: user_controller --- lib/app_config.dart | 15 +++--- lib/app_theme.dart | 5 +- lib/controllers/base_controller.dart | 20 ++++---- lib/controllers/user_controller.dart | 44 +++++++++++++++++ lib/env.dart | 6 +-- lib/main.dart | 5 +- lib/routes/controller.dart | 24 +++------ lib/routes/middleware.dart | 33 +++++-------- lib/routes/observer.dart | 41 ++++++++++++++++ lib/routes/routes.dart | 20 +++++--- lib/vaahextendflutter/helpers/constants.dart | 4 +- lib/vaahextendflutter/helpers/helpers.dart | 2 +- lib/vaahextendflutter/tag/tag_panel.dart | 8 +-- lib/view/pages/details.dart | 41 ++++++++++++++++ lib/view/pages/home.dart | 51 ++++++++++++++++---- lib/view/pages/more_details.dart | 40 +++++++++++++++ lib/view/pages/page_not_found.dart | 30 ++++++++++++ lib/view/pages/permission_denied.dart | 12 +++-- lib/view/pages/something_went_wrong.dart | 28 ----------- 19 files changed, 305 insertions(+), 124 deletions(-) create mode 100644 lib/controllers/user_controller.dart create mode 100644 lib/routes/observer.dart create mode 100644 lib/view/pages/details.dart create mode 100644 lib/view/pages/more_details.dart create mode 100644 lib/view/pages/page_not_found.dart delete mode 100644 lib/view/pages/something_went_wrong.dart diff --git a/lib/app_config.dart b/lib/app_config.dart index 378b7e81..00aef34d 100644 --- a/lib/app_config.dart +++ b/lib/app_config.dart @@ -1,11 +1,10 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; - -import 'app_theme.dart'; -import 'env.dart'; -import 'routes/middleware.dart'; -import 'vaahextendflutter/tag/tag_panel.dart'; -import 'view/pages/home.dart'; +import 'package:team/app_theme.dart'; +import 'package:team/env.dart'; +import 'package:team/routes/middleware.dart'; +import 'package:team/routes/observer.dart'; +import 'package:team/vaahextendflutter/tag/tag_panel.dart'; final _navigatorKey = GlobalKey(); @@ -20,9 +19,7 @@ class AppConfig extends StatelessWidget { theme: ThemeData( primarySwatch: AppTheme.colors['primary'], ), - onGenerateInitialRoutes: (String initialRoute) { - return [TeamHomePage.route()]; - }, + navigatorObservers: >>[routeObserver], onGenerateRoute: routeMiddleware, builder: (BuildContext context, Widget? child) { return TagPanelHost( diff --git a/lib/app_theme.dart b/lib/app_theme.dart index d824953f..95f1c475 100644 --- a/lib/app_theme.dart +++ b/lib/app_theme.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; - -import 'vaahextendflutter/base/base_theme.dart'; +import 'package:team/vaahextendflutter/base/base_theme.dart'; class AppTheme { static final Map colors = Map.of(BaseTheme.colors); @@ -11,8 +10,6 @@ class AppTheme { } } - - // To define new color developer should visit https://colors.eva.design/ const MaterialColor pink = MaterialColor( diff --git a/lib/controllers/base_controller.dart b/lib/controllers/base_controller.dart index ec3b1b93..74db7850 100644 --- a/lib/controllers/base_controller.dart +++ b/lib/controllers/base_controller.dart @@ -1,23 +1,23 @@ import 'package:get/get.dart'; - -import '../env.dart'; -import '../app_theme.dart'; -import '../vaahextendflutter/helpers/console.dart'; -import '../vaahextendflutter/services/api.dart'; +import 'package:team/app_theme.dart'; +import 'package:team/controllers/user_controller.dart'; +import 'package:team/env.dart'; +import 'package:team/routes/controller.dart'; +import 'package:team/vaahextendflutter/helpers/console.dart'; +import 'package:team/vaahextendflutter/services/api.dart'; class BaseController extends GetxController { Future init() async { - String environment = - const String.fromEnvironment('environment', defaultValue: 'default'); + String environment = const String.fromEnvironment('environment', defaultValue: 'default'); final EnvController envController = Get.put( EnvController( environment, ), ); Console.info('Env Type: ${envController.config.envType}'); - Console.info( - 'Version: ${envController.config.version}+${envController.config.build}', - ); + Console.info('Version: ${envController.config.version}+${envController.config.build}'); + Get.put(RouteController()); + Get.put(UserController()); await Api.initApi(); AppTheme.init(); } diff --git a/lib/controllers/user_controller.dart b/lib/controllers/user_controller.dart new file mode 100644 index 00000000..3741423d --- /dev/null +++ b/lib/controllers/user_controller.dart @@ -0,0 +1,44 @@ +import 'package:get/get.dart'; +import 'package:team/models/user/permission/permission.dart'; +import 'package:team/models/user/permission/route/route.dart'; +import 'package:team/models/user/user.dart'; +import 'package:team/vaahextendflutter/helpers/helpers.dart'; +import 'package:team/view/pages/details.dart'; +import 'package:team/view/pages/more_details.dart'; + +class UserController extends GetxController { + User? _user; + + User? get user => _user; + + set user(User? user) { + _user = user; + update(); + } + + Future login(String username, String password) async { + // Use user api services + user = const User( + firstName: "test", + permissions: Permission( + modifyLog: [], + routes: [ + RouteModel(path: DetailsPage.routeName), + RouteModel(path: MoreDetailsPage.routeName), + ], + ), + ); + Helpers.showSuccessToast(content: 'Successful'); + } + + Future forgotPassword(String username) async {} + + Future userLocallyExists() async { + // check and initialize + } + + Future logout() async { + user = null; + Helpers.showSuccessToast(content: 'Successful'); + } +} diff --git a/lib/env.dart b/lib/env.dart index 23c0c882..26474fe4 100644 --- a/lib/env.dart +++ b/lib/env.dart @@ -1,11 +1,9 @@ -// ignore_for_file: public_member_api_docs, sort_constructors_first import 'dart:io'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; - -import 'app_theme.dart'; -import 'vaahextendflutter/helpers/console.dart'; +import 'package:team/app_theme.dart'; +import 'package:team/vaahextendflutter/helpers/console.dart'; // After changing any const you will need to restart the app (Hot-reload won't work). diff --git a/lib/main.dart b/lib/main.dart index 796a91ff..f3e83704 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; - -import 'app_config.dart'; -import 'controllers/base_controller.dart'; +import 'package:team/app_config.dart'; +import 'package:team/controllers/base_controller.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); diff --git a/lib/routes/controller.dart b/lib/routes/controller.dart index 95453578..cd9f0d14 100644 --- a/lib/routes/controller.dart +++ b/lib/routes/controller.dart @@ -1,22 +1,14 @@ import 'package:get/get.dart'; -import 'package:team/models/user/permission/permission.dart'; -import 'package:team/models/user/permission/route/route.dart'; -import 'package:team/models/user/user.dart'; -import 'package:team/view/pages/something_went_wrong.dart'; +import 'package:team/controllers/user_controller.dart'; class RouteController extends GetxController { bool checkRoutePermission(String path) { - // check userController => isLoggedIn => currentUser.permissions.routes contain askedPath - // e.g. dummy user - User user = const User( - firstName: "Name", - permissions: Permission( - modifyLog: [], - routes: [ - RouteModel(path: SomethingWentWrong.routeName), - ], - ), - ); - return user.permissions.routes.where((element) => element.path == path).isNotEmpty; + UserController userController = Get.find(); + if (userController.user == null) { + return false; + } + return userController.user!.permissions.routes + .where((element) => element.path == path) + .isNotEmpty; } } diff --git a/lib/routes/middleware.dart b/lib/routes/middleware.dart index 46a6900f..9200e608 100644 --- a/lib/routes/middleware.dart +++ b/lib/routes/middleware.dart @@ -2,36 +2,25 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:team/routes/controller.dart'; - -import '../view/pages/home.dart'; -import '../view/pages/permission_denied.dart'; -import '../view/pages/something_went_wrong.dart'; -import 'routes.dart'; - -List defalutPermissions = [ - '/', - TeamHomePage.routeName, -]; +import 'package:team/routes/routes.dart'; +import 'package:team/view/pages/page_not_found.dart'; +import 'package:team/view/pages/permission_denied.dart'; Route? routeMiddleware(RouteSettings route) { if (!routes.containsKey(route.name)) { - return SomethingWentWrong.route(); + return PageNotFound.route(); } - if (defalutPermissions.contains(route.name)) { + if (defaultPermissions.contains(route.name)) { return routes[route.name]!(); } - // Fetch user permission from controller - // -> controller connects with model - // -> model connects with api/ service - // -> api sends back resp, model translates, it - // -> model sends back to controller - // -> From that controller response middleware checks permission - final RouteController routeController = Get.put( - RouteController(), - ); - bool userHasPermission = routeController.checkRoutePermission(route.name as String); + final bool userHasPermission = _checkRoutePermission(route.name as String); if (userHasPermission) { return routes[route.name]!(); } return PermissionDenied.route(); } + +bool _checkRoutePermission(String route) { + RouteController routeController = Get.find(); + return routeController.checkRoutePermission(route); +} diff --git a/lib/routes/observer.dart b/lib/routes/observer.dart new file mode 100644 index 00000000..4f962f06 --- /dev/null +++ b/lib/routes/observer.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:team/vaahextendflutter/helpers/console.dart'; + +final RouteObserver> routeObserver = RouteObserver>(); + +class RouteAwareWidget extends StatefulWidget { + final String name; + final Widget child; + + const RouteAwareWidget({super.key, required this.name, required this.child}); + + @override + State createState() => RouteAwareWidgetState(); +} + +class RouteAwareWidgetState extends State with RouteAware { + @override + void didChangeDependencies() { + super.didChangeDependencies(); + routeObserver.subscribe(this, ModalRoute.of(context)!); + } + + @override + void dispose() { + routeObserver.unsubscribe(this); + super.dispose(); + } + + @override + void didPush() { + Console.info('didPush ${widget.name}'); + } + + @override + void didPopNext() { + Console.info('didPopNext ${widget.name}'); + } + + @override + Widget build(BuildContext context) => widget.child; +} diff --git a/lib/routes/routes.dart b/lib/routes/routes.dart index c13322b4..461a620b 100644 --- a/lib/routes/routes.dart +++ b/lib/routes/routes.dart @@ -1,12 +1,20 @@ import 'package:flutter/material.dart'; - -import '../view/pages/home.dart'; -import '../view/pages/permission_denied.dart'; -import '../view/pages/something_went_wrong.dart'; +import 'package:team/view/pages/details.dart'; +import 'package:team/view/pages/home.dart'; +import 'package:team/view/pages/more_details.dart'; +import 'package:team/view/pages/page_not_found.dart'; +import 'package:team/view/pages/permission_denied.dart'; final Map Function()> routes = { '/': TeamHomePage.route, TeamHomePage.routeName: TeamHomePage.route, - SomethingWentWrong.routeName: SomethingWentWrong.route, + PageNotFound.routeName: PageNotFound.route, PermissionDenied.routeName: PermissionDenied.route, -}; \ No newline at end of file + DetailsPage.routeName: DetailsPage.route, + MoreDetailsPage.routeName: MoreDetailsPage.route, +}; + +const List defaultPermissions = [ + '/', + TeamHomePage.routeName, +]; diff --git a/lib/vaahextendflutter/helpers/constants.dart b/lib/vaahextendflutter/helpers/constants.dart index c785f268..baccc203 100644 --- a/lib/vaahextendflutter/helpers/constants.dart +++ b/lib/vaahextendflutter/helpers/constants.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -const double deafaultPadding = 16.0; -const double deafaultMargin = 16.0; +const double defaultPadding = 16.0; +const double defaultMargin = 16.0; // Common Widgets const emptyWidget = SizedBox(); diff --git a/lib/vaahextendflutter/helpers/helpers.dart b/lib/vaahextendflutter/helpers/helpers.dart index eefc12f9..7a9e7cba 100644 --- a/lib/vaahextendflutter/helpers/helpers.dart +++ b/lib/vaahextendflutter/helpers/helpers.dart @@ -34,7 +34,7 @@ class Helpers { AlertDialog( shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all( - Radius.circular(deafaultPadding), + Radius.circular(defaultPadding), ), ), contentPadding: EdgeInsets.zero, diff --git a/lib/vaahextendflutter/tag/tag_panel.dart b/lib/vaahextendflutter/tag/tag_panel.dart index a8fd794e..cdcbe1c2 100644 --- a/lib/vaahextendflutter/tag/tag_panel.dart +++ b/lib/vaahextendflutter/tag/tag_panel.dart @@ -160,11 +160,11 @@ class TagPanelHostState extends State padding: EdgeInsets.only( top: MediaQuery.of(context).padding.top + - deafaultPadding + + defaultPadding + _handleHeight, - bottom: deafaultPadding, - left: deafaultPadding, - right: deafaultPadding, + bottom: defaultPadding, + left: defaultPadding, + right: defaultPadding, ), children: [ SelectableText( diff --git a/lib/view/pages/details.dart b/lib/view/pages/details.dart new file mode 100644 index 00000000..f80eaeb5 --- /dev/null +++ b/lib/view/pages/details.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:team/routes/observer.dart'; +import 'package:team/vaahextendflutter/base/base_stateful.dart'; +import 'package:team/view/pages/more_details.dart'; + +class DetailsPage extends StatefulWidget { + static const String routeName = '/details'; + + static Route route() { + return MaterialPageRoute( + settings: const RouteSettings(name: '/details'), + builder: (_) => const RouteAwareWidget( + name: '/details', + child: DetailsPage(), + ), + ); + } + + const DetailsPage({super.key}); + + @override + State createState() => _DetailsPageState(); +} + +class _DetailsPageState extends BaseStateful { + @override + Widget build(BuildContext context) { + super.build(context); + return Scaffold( + appBar: AppBar(), + body: Center( + child: ElevatedButton( + onPressed: () => Navigator.pushNamed(context, MoreDetailsPage.routeName), + child: const Text( + 'More Details', + ), + ), + ), + ); + } +} diff --git a/lib/view/pages/home.dart b/lib/view/pages/home.dart index b725efa6..cf95178c 100644 --- a/lib/view/pages/home.dart +++ b/lib/view/pages/home.dart @@ -1,15 +1,21 @@ import 'package:flutter/material.dart'; -import 'package:team/view/pages/something_went_wrong.dart'; - -import '../../vaahextendflutter/base/base_stateful.dart'; +import 'package:get/get.dart'; +import 'package:team/controllers/user_controller.dart'; +import 'package:team/routes/observer.dart'; +import 'package:team/vaahextendflutter/base/base_stateful.dart'; +import 'package:team/vaahextendflutter/helpers/constants.dart'; +import 'package:team/view/pages/details.dart'; class TeamHomePage extends StatefulWidget { static const String routeName = '/home'; static Route route() { return MaterialPageRoute( - settings: const RouteSettings(name: '/'), - builder: (_) => const TeamHomePage(), + settings: const RouteSettings(name: '/home'), + builder: (_) => const RouteAwareWidget( + name: '/home', + child: TeamHomePage(), + ), ); } @@ -26,11 +32,36 @@ class _TeamHomePageState extends BaseStateful { return Scaffold( appBar: AppBar(), body: Center( - child: ElevatedButton( - onPressed: () => Navigator.pushNamed(context, SomethingWentWrong.routeName), - child: const Text( - '404 Error page', - ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ElevatedButton( + onPressed: () => Navigator.pushNamed(context, DetailsPage.routeName), + child: const Text( + 'Route Details', + ), + ), + horizontalMargin12, + ElevatedButton( + onPressed: () { + UserController userController = Get.find(); + userController.login('NA', 'NA'); + }, + child: const Text( + 'Login', + ), + ), + horizontalMargin12, + ElevatedButton( + onPressed: () { + UserController userController = Get.find(); + userController.logout(); + }, + child: const Text( + 'Logout', + ), + ), + ], ), ), ); diff --git a/lib/view/pages/more_details.dart b/lib/view/pages/more_details.dart new file mode 100644 index 00000000..46379430 --- /dev/null +++ b/lib/view/pages/more_details.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:team/routes/observer.dart'; +import 'package:team/vaahextendflutter/base/base_stateful.dart'; + +class MoreDetailsPage extends StatefulWidget { + static const String routeName = '/more-details'; + + static Route route() { + return MaterialPageRoute( + settings: const RouteSettings(name: '/more-details'), + builder: (_) => const RouteAwareWidget( + name: '/more-details', + child: MoreDetailsPage(), + ), + ); + } + + const MoreDetailsPage({super.key}); + + @override + State createState() => _MoreDetailsPageState(); +} + +class _MoreDetailsPageState extends BaseStateful { + @override + Widget build(BuildContext context) { + super.build(context); + return Scaffold( + appBar: AppBar(), + body: Center( + child: ElevatedButton( + onPressed: () => Navigator.pop(context), + child: const Text( + 'Back', + ), + ), + ), + ); + } +} diff --git a/lib/view/pages/page_not_found.dart b/lib/view/pages/page_not_found.dart new file mode 100644 index 00000000..6bee4fba --- /dev/null +++ b/lib/view/pages/page_not_found.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:team/routes/observer.dart'; +import 'package:team/vaahextendflutter/base/base_stateless.dart'; + +class PageNotFound extends BaseStateless { + static const String routeName = '/page-not-found'; + + static Route route() { + return MaterialPageRoute( + settings: const RouteSettings(name: '/page-not-found'), + builder: (_) => const RouteAwareWidget( + name: '/page-not-found', + child: PageNotFound(), + ), + ); + } + + const PageNotFound({super.key}); + + @override + Widget build(BuildContext context) { + super.build(context); + return Scaffold( + appBar: AppBar(), + body: const Center( + child: Text('Page Not Found!'), + ), + ); + } +} diff --git a/lib/view/pages/permission_denied.dart b/lib/view/pages/permission_denied.dart index 9e07388d..e744d9cb 100644 --- a/lib/view/pages/permission_denied.dart +++ b/lib/view/pages/permission_denied.dart @@ -1,15 +1,17 @@ - import 'package:flutter/material.dart'; - -import '../../vaahextendflutter/base/base_stateless.dart'; +import 'package:team/routes/observer.dart'; +import 'package:team/vaahextendflutter/base/base_stateless.dart'; class PermissionDenied extends BaseStateless { static const String routeName = '/permission-denied'; - + static Route route() { return MaterialPageRoute( settings: const RouteSettings(name: '/permission-denied'), - builder: (_) => const PermissionDenied(), + builder: (_) => const RouteAwareWidget( + name: '/permission-denied', + child: PermissionDenied(), + ), ); } diff --git a/lib/view/pages/something_went_wrong.dart b/lib/view/pages/something_went_wrong.dart deleted file mode 100644 index 0f7666db..00000000 --- a/lib/view/pages/something_went_wrong.dart +++ /dev/null @@ -1,28 +0,0 @@ - -import 'package:flutter/material.dart'; - -import '../../vaahextendflutter/base/base_stateless.dart'; - -class SomethingWentWrong extends BaseStateless { - static const String routeName = '/something-went-wrong'; - - static Route route() { - return MaterialPageRoute( - settings: const RouteSettings(name: '/something-went-wrong'), - builder: (_) => const SomethingWentWrong(), - ); - } - - const SomethingWentWrong({super.key}); - - @override - Widget build(BuildContext context) { - super.build(context); - return Scaffold( - appBar: AppBar(), - body: const Center( - child: Text('Something Went Wrong'), - ), - ); - } -} From 9f8ad3ab32be71720b452e607ad16d8d0d913bd6 Mon Sep 17 00:00:00 2001 From: Prajapati Chintan Date: Sat, 5 Nov 2022 16:20:02 +0530 Subject: [PATCH 04/11] Updated: enhanced if conditions and controller inits --- lib/controllers/base_controller.dart | 8 ++------ lib/controllers/user_controller.dart | 10 ++++++---- lib/routes/controller.dart | 5 +++++ lib/routes/middleware.dart | 14 ++++++++------ pubspec.lock | 7 ------- 5 files changed, 21 insertions(+), 23 deletions(-) diff --git a/lib/controllers/base_controller.dart b/lib/controllers/base_controller.dart index 74db7850..a9d27e96 100644 --- a/lib/controllers/base_controller.dart +++ b/lib/controllers/base_controller.dart @@ -9,15 +9,11 @@ import 'package:team/vaahextendflutter/services/api.dart'; class BaseController extends GetxController { Future init() async { String environment = const String.fromEnvironment('environment', defaultValue: 'default'); - final EnvController envController = Get.put( - EnvController( - environment, - ), - ); + final EnvController envController = Get.put(EnvController(environment)); Console.info('Env Type: ${envController.config.envType}'); Console.info('Version: ${envController.config.version}+${envController.config.build}'); + Get.put(UserController()); // RouteController is depended on UserController thus, init it first. Get.put(RouteController()); - Get.put(UserController()); await Api.initApi(); AppTheme.init(); } diff --git a/lib/controllers/user_controller.dart b/lib/controllers/user_controller.dart index 3741423d..5ae7e2e9 100644 --- a/lib/controllers/user_controller.dart +++ b/lib/controllers/user_controller.dart @@ -2,6 +2,7 @@ import 'package:get/get.dart'; import 'package:team/models/user/permission/permission.dart'; import 'package:team/models/user/permission/route/route.dart'; import 'package:team/models/user/user.dart'; +import 'package:team/vaahextendflutter/helpers/console.dart'; import 'package:team/vaahextendflutter/helpers/helpers.dart'; import 'package:team/view/pages/details.dart'; import 'package:team/view/pages/more_details.dart'; @@ -16,6 +17,11 @@ class UserController extends GetxController { update(); } + UserController() { + // Check if user exists locally? + Console.danger('Check if user exists locally?'); + } + Future login(String username, String password) async { // Use user api services user = const User( @@ -33,10 +39,6 @@ class UserController extends GetxController { Future forgotPassword(String username) async {} - Future userLocallyExists() async { - // check and initialize - } - Future logout() async { user = null; Helpers.showSuccessToast(content: 'Successful'); diff --git a/lib/routes/controller.dart b/lib/routes/controller.dart index cd9f0d14..425ae7f7 100644 --- a/lib/routes/controller.dart +++ b/lib/routes/controller.dart @@ -1,8 +1,13 @@ import 'package:get/get.dart'; import 'package:team/controllers/user_controller.dart'; +import 'package:team/vaahextendflutter/helpers/console.dart'; class RouteController extends GetxController { bool checkRoutePermission(String path) { + if(Get.isRegistered()){ + Console.danger("UserController is not initialized!"); + return false; + } UserController userController = Get.find(); if (userController.user == null) { return false; diff --git a/lib/routes/middleware.dart b/lib/routes/middleware.dart index 9200e608..f72c5ebf 100644 --- a/lib/routes/middleware.dart +++ b/lib/routes/middleware.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:team/routes/controller.dart'; import 'package:team/routes/routes.dart'; +import 'package:team/vaahextendflutter/helpers/console.dart'; import 'package:team/view/pages/page_not_found.dart'; import 'package:team/view/pages/permission_denied.dart'; @@ -10,17 +11,18 @@ Route? routeMiddleware(RouteSettings route) { if (!routes.containsKey(route.name)) { return PageNotFound.route(); } - if (defaultPermissions.contains(route.name)) { - return routes[route.name]!(); - } final bool userHasPermission = _checkRoutePermission(route.name as String); - if (userHasPermission) { - return routes[route.name]!(); + if (!defaultPermissions.contains(route.name) && !userHasPermission) { + return PermissionDenied.route(); } - return PermissionDenied.route(); + return routes[route.name]!(); } bool _checkRoutePermission(String route) { + if (!Get.isRegistered()) { + Console.danger('RouteController is not initialized!'); + return false; + } RouteController routeController = Get.find(); return routeController.checkRoutePermission(route); } diff --git a/pubspec.lock b/pubspec.lock index 1957b767..eeffffae 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -141,13 +141,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.1.1" - copy_with_extension: - dependency: "direct main" - description: - name: copy_with_extension - url: "https://pub.dartlang.org" - source: hosted - version: "4.0.4" crypto: dependency: transitive description: From a8d3e931aa3649e9aa67e5e1d5c7c79fc603b23e Mon Sep 17 00:00:00 2001 From: Prajapati Chintan Date: Wed, 9 Nov 2022 16:54:40 +0530 Subject: [PATCH 05/11] Removed: unwanted files and packages --- lib/controllers/user_controller.dart | 12 +-------- .../permission/modify_log/modify_log.dart | 25 ------------------- .../permission/modify_log/modify_log.g.dart | 19 -------------- lib/models/user/permission/permission.dart | 24 ------------------ lib/models/user/permission/permission.g.dart | 22 ---------------- lib/models/user/permission/route/route.dart | 25 ------------------- lib/models/user/permission/route/route.g.dart | 20 --------------- lib/models/user/user.dart | 15 +---------- lib/models/user/user.g.dart | 20 --------------- lib/routes/controller.dart | 6 ++--- pubspec.yaml | 3 --- 11 files changed, 5 insertions(+), 186 deletions(-) delete mode 100644 lib/models/user/permission/modify_log/modify_log.dart delete mode 100644 lib/models/user/permission/modify_log/modify_log.g.dart delete mode 100644 lib/models/user/permission/permission.dart delete mode 100644 lib/models/user/permission/permission.g.dart delete mode 100644 lib/models/user/permission/route/route.dart delete mode 100644 lib/models/user/permission/route/route.g.dart delete mode 100644 lib/models/user/user.g.dart diff --git a/lib/controllers/user_controller.dart b/lib/controllers/user_controller.dart index 5ae7e2e9..b3e9d5a8 100644 --- a/lib/controllers/user_controller.dart +++ b/lib/controllers/user_controller.dart @@ -1,11 +1,7 @@ import 'package:get/get.dart'; -import 'package:team/models/user/permission/permission.dart'; -import 'package:team/models/user/permission/route/route.dart'; import 'package:team/models/user/user.dart'; import 'package:team/vaahextendflutter/helpers/console.dart'; import 'package:team/vaahextendflutter/helpers/helpers.dart'; -import 'package:team/view/pages/details.dart'; -import 'package:team/view/pages/more_details.dart'; class UserController extends GetxController { User? _user; @@ -26,13 +22,7 @@ class UserController extends GetxController { // Use user api services user = const User( firstName: "test", - permissions: Permission( - modifyLog: [], - routes: [ - RouteModel(path: DetailsPage.routeName), - RouteModel(path: MoreDetailsPage.routeName), - ], - ), + permissions: [], ); Helpers.showSuccessToast(content: 'Successful'); } diff --git a/lib/models/user/permission/modify_log/modify_log.dart b/lib/models/user/permission/modify_log/modify_log.dart deleted file mode 100644 index bc323c8c..00000000 --- a/lib/models/user/permission/modify_log/modify_log.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'modify_log.g.dart'; - -@immutable -@JsonSerializable() -class ModifyLog { - @JsonKey(name: 'modified_by') - final String modifiedBy; - @JsonKey(name: 'post') - final String post; - @JsonKey(name: 'date_and_time') - final DateTime dateAndTime; - - const ModifyLog({ - required this.modifiedBy, - required this.post, - required this.dateAndTime, - }); - - factory ModifyLog.fromJson(Map json) => _$ModifyLogFromJson(json); - - Map toJson() => _$ModifyLogToJson(this); -} diff --git a/lib/models/user/permission/modify_log/modify_log.g.dart b/lib/models/user/permission/modify_log/modify_log.g.dart deleted file mode 100644 index 754221f8..00000000 --- a/lib/models/user/permission/modify_log/modify_log.g.dart +++ /dev/null @@ -1,19 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'modify_log.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -ModifyLog _$ModifyLogFromJson(Map json) => ModifyLog( - modifiedBy: json['modified_by'] as String, - post: json['post'] as String, - dateAndTime: DateTime.parse(json['date_and_time'] as String), - ); - -Map _$ModifyLogToJson(ModifyLog instance) => { - 'modified_by': instance.modifiedBy, - 'post': instance.post, - 'date_and_time': instance.dateAndTime.toIso8601String(), - }; diff --git a/lib/models/user/permission/permission.dart b/lib/models/user/permission/permission.dart deleted file mode 100644 index a6ad6d8f..00000000 --- a/lib/models/user/permission/permission.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:json_annotation/json_annotation.dart'; -import 'package:team/models/user/permission/modify_log/modify_log.dart'; -import 'package:team/models/user/permission/route/route.dart'; - -part 'permission.g.dart'; - -@immutable -@JsonSerializable() -class Permission { - @JsonKey(name: 'modify_log') - final List modifyLog; - @JsonKey(name: 'permissions') - final List routes; - - const Permission({ - required this.modifyLog, - required this.routes, - }); - - factory Permission.fromJson(Map json) => _$PermissionFromJson(json); - - Map toJson() => _$PermissionToJson(this); -} diff --git a/lib/models/user/permission/permission.g.dart b/lib/models/user/permission/permission.g.dart deleted file mode 100644 index b6a1baca..00000000 --- a/lib/models/user/permission/permission.g.dart +++ /dev/null @@ -1,22 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'permission.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -Permission _$PermissionFromJson(Map json) => Permission( - modifyLog: (json['modify_log'] as List) - .map((e) => ModifyLog.fromJson(e as Map)) - .toList(), - routes: (json['permissions'] as List) - .map((e) => RouteModel.fromJson(e as Map)) - .toList(), - ); - -Map _$PermissionToJson(Permission instance) => - { - 'modify_log': instance.modifyLog, - 'permissions': instance.routes, - }; diff --git a/lib/models/user/permission/route/route.dart b/lib/models/user/permission/route/route.dart deleted file mode 100644 index 80d46465..00000000 --- a/lib/models/user/permission/route/route.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:json_annotation/json_annotation.dart'; - -part 'route.g.dart'; - -@immutable -@JsonSerializable() -class RouteModel { - @JsonKey(name: 'name') - final String? name; - @JsonKey(name: 'path') - final String path; - @JsonKey(name: 'description') - final String? description; - - const RouteModel({ - this.name, - required this.path, - this.description, - }); - - factory RouteModel.fromJson(Map json) => _$RouteModelFromJson(json); - - Map toJson() => _$RouteModelToJson(this); -} diff --git a/lib/models/user/permission/route/route.g.dart b/lib/models/user/permission/route/route.g.dart deleted file mode 100644 index 0ae8faee..00000000 --- a/lib/models/user/permission/route/route.g.dart +++ /dev/null @@ -1,20 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'route.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -RouteModel _$RouteModelFromJson(Map json) => RouteModel( - name: json['name'] as String?, - path: json['path'] as String, - description: json['description'] as String?, - ); - -Map _$RouteModelToJson(RouteModel instance) => - { - 'name': instance.name, - 'path': instance.path, - 'description': instance.description, - }; diff --git a/lib/models/user/user.dart b/lib/models/user/user.dart index 5c1cc52c..8cc8f308 100644 --- a/lib/models/user/user.dart +++ b/lib/models/user/user.dart @@ -1,26 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:json_annotation/json_annotation.dart'; -import 'package:team/models/user/permission/permission.dart'; -part 'user.g.dart'; - -@immutable -@JsonSerializable() class User { - @JsonKey(name: 'first_name') final String firstName; - @JsonKey(name: 'last_name') final String? lastName; - @JsonKey(name: 'permissions') - final Permission permissions; + final List permissions; const User({ required this.firstName, this.lastName, required this.permissions, }); - - factory User.fromJson(Map json) => _$UserFromJson(json); - - Map toJson() => _$UserToJson(this); } diff --git a/lib/models/user/user.g.dart b/lib/models/user/user.g.dart deleted file mode 100644 index 38638c8f..00000000 --- a/lib/models/user/user.g.dart +++ /dev/null @@ -1,20 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'user.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -User _$UserFromJson(Map json) => User( - firstName: json['first_name'] as String, - lastName: json['last_name'] as String?, - permissions: - Permission.fromJson(json['permissions'] as Map), - ); - -Map _$UserToJson(User instance) => { - 'first_name': instance.firstName, - 'last_name': instance.lastName, - 'permissions': instance.permissions, - }; diff --git a/lib/routes/controller.dart b/lib/routes/controller.dart index 425ae7f7..231c54c0 100644 --- a/lib/routes/controller.dart +++ b/lib/routes/controller.dart @@ -3,6 +3,7 @@ import 'package:team/controllers/user_controller.dart'; import 'package:team/vaahextendflutter/helpers/console.dart'; class RouteController extends GetxController { + bool checkRoutePermission(String path) { if(Get.isRegistered()){ Console.danger("UserController is not initialized!"); @@ -12,8 +13,7 @@ class RouteController extends GetxController { if (userController.user == null) { return false; } - return userController.user!.permissions.routes - .where((element) => element.path == path) - .isNotEmpty; + return userController.user!.permissions.contains(path); } + } diff --git a/pubspec.yaml b/pubspec.yaml index 04ebbba8..814c6eb8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,14 +18,11 @@ dependencies: flutter_screenutil: ^5.5.4 dio: ^4.0.6 fluttertoast: ^8.1.1 - json_annotation: ^4.7.0 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 - build_runner: ^2.3.2 - json_serializable: ^6.5.4 flutter: From d8c5de76469c4d339816fb946dd96d54197c8614 Mon Sep 17 00:00:00 2001 From: Prajapati Chintan Date: Sat, 12 Nov 2022 14:42:27 +0530 Subject: [PATCH 06/11] Updated: Individual pages will check the permission now --- lib/app_config.dart | 2 - lib/controllers/base_controller.dart | 18 +++-- lib/controllers/root_assets_controller.dart | 12 +++ lib/controllers/user_controller.dart | 36 --------- lib/models/user.dart | 86 +++++++++++++++++++++ lib/models/user/user.dart | 13 ---- lib/routes/controller.dart | 19 ----- lib/routes/middleware.dart | 17 ---- lib/routes/observer.dart | 41 ---------- lib/routes/routes.dart | 7 +- lib/vaahextendflutter/services/api.dart | 59 +++++++------- lib/view/pages/details.dart | 11 +-- lib/view/pages/home.dart | 15 +--- lib/view/pages/more_details.dart | 11 +-- lib/view/pages/page_not_found.dart | 6 +- lib/view/pages/permission_denied.dart | 6 +- 16 files changed, 156 insertions(+), 203 deletions(-) create mode 100644 lib/controllers/root_assets_controller.dart delete mode 100644 lib/controllers/user_controller.dart create mode 100644 lib/models/user.dart delete mode 100644 lib/models/user/user.dart delete mode 100644 lib/routes/controller.dart delete mode 100644 lib/routes/observer.dart diff --git a/lib/app_config.dart b/lib/app_config.dart index 00aef34d..bf862866 100644 --- a/lib/app_config.dart +++ b/lib/app_config.dart @@ -3,7 +3,6 @@ import 'package:get/get.dart'; import 'package:team/app_theme.dart'; import 'package:team/env.dart'; import 'package:team/routes/middleware.dart'; -import 'package:team/routes/observer.dart'; import 'package:team/vaahextendflutter/tag/tag_panel.dart'; final _navigatorKey = GlobalKey(); @@ -19,7 +18,6 @@ class AppConfig extends StatelessWidget { theme: ThemeData( primarySwatch: AppTheme.colors['primary'], ), - navigatorObservers: >>[routeObserver], onGenerateRoute: routeMiddleware, builder: (BuildContext context, Widget? child) { return TagPanelHost( diff --git a/lib/controllers/base_controller.dart b/lib/controllers/base_controller.dart index a9d27e96..c39275bc 100644 --- a/lib/controllers/base_controller.dart +++ b/lib/controllers/base_controller.dart @@ -1,20 +1,22 @@ import 'package:get/get.dart'; import 'package:team/app_theme.dart'; -import 'package:team/controllers/user_controller.dart'; +import 'package:team/controllers/root_assets_controller.dart'; import 'package:team/env.dart'; -import 'package:team/routes/controller.dart'; import 'package:team/vaahextendflutter/helpers/console.dart'; import 'package:team/vaahextendflutter/services/api.dart'; class BaseController extends GetxController { Future init() async { - String environment = const String.fromEnvironment('environment', defaultValue: 'default'); - final EnvController envController = Get.put(EnvController(environment)); - Console.info('Env Type: ${envController.config.envType}'); - Console.info('Version: ${envController.config.version}+${envController.config.build}'); - Get.put(UserController()); // RouteController is depended on UserController thus, init it first. - Get.put(RouteController()); + Get.put(RootAssetsController()); + initEnvController(); await Api.initApi(); AppTheme.init(); } } + +void initEnvController() { + String environment = const String.fromEnvironment('environment', defaultValue: 'default'); + final EnvController envController = Get.put(EnvController(environment)); + Console.info('Env Type: ${envController.config.envType}'); + Console.info('Version: ${envController.config.version}+${envController.config.build}'); +} diff --git a/lib/controllers/root_assets_controller.dart b/lib/controllers/root_assets_controller.dart new file mode 100644 index 00000000..6fc5df06 --- /dev/null +++ b/lib/controllers/root_assets_controller.dart @@ -0,0 +1,12 @@ +import 'package:get/get.dart'; + +class RootAssetsController extends GetxController { + Map? _user; + + Map? get user => _user; + + set user(Map? user) { + _user = user; + update(); + } +} diff --git a/lib/controllers/user_controller.dart b/lib/controllers/user_controller.dart deleted file mode 100644 index b3e9d5a8..00000000 --- a/lib/controllers/user_controller.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:get/get.dart'; -import 'package:team/models/user/user.dart'; -import 'package:team/vaahextendflutter/helpers/console.dart'; -import 'package:team/vaahextendflutter/helpers/helpers.dart'; - -class UserController extends GetxController { - User? _user; - - User? get user => _user; - - set user(User? user) { - _user = user; - update(); - } - - UserController() { - // Check if user exists locally? - Console.danger('Check if user exists locally?'); - } - - Future login(String username, String password) async { - // Use user api services - user = const User( - firstName: "test", - permissions: [], - ); - Helpers.showSuccessToast(content: 'Successful'); - } - - Future forgotPassword(String username) async {} - - Future logout() async { - user = null; - Helpers.showSuccessToast(content: 'Successful'); - } -} diff --git a/lib/models/user.dart b/lib/models/user.dart new file mode 100644 index 00000000..2635ebbd --- /dev/null +++ b/lib/models/user.dart @@ -0,0 +1,86 @@ +import 'package:get/get.dart'; +import 'package:team/controllers/root_assets_controller.dart'; +import 'package:team/vaahextendflutter/services/api.dart'; + +class User { + static final RootAssetsController rootAssetsController = Get.find(); + static const String apiEndPoint = 'user'; + + // final String firstName; + // final String? lastName; + // final List permissions; + // + // const User({ + // required this.firstName, + // this.lastName, + // required this.permissions, + // }); + + static Future signin(String username, String password) async { + rootAssetsController.user = { + "name": "name", + "permissions": ["can-access-details", 'can-access-more-details'] + }; + // await Api.ajax( + // url: apiEndPoint, // TODO: change end point + // method: 'post', + // params: {"username": username, "password": password}, + // ); + return; + } + + static Future forgotPassword(String username) async { + await Api.ajax( + url: '$apiEndPoint/forgot-password', // TODO: change end point + method: 'post', + params: {"username": username}, + ); + return; + } + + static Future signout(String username) async { + await Api.ajax( + url: '$apiEndPoint/signout', // TODO: change end point + method: 'post', + params: {"username": username}, + ); + rootAssetsController.user = null; + return; + } + + static bool hasPermission(String value) { + if (rootAssetsController.user?['permissions'] == null) { + return false; + } + return (rootAssetsController.user?['permissions'] as List).contains(value); + } + + static Future createItem(Map item) async { + return await Api.ajax( + url: apiEndPoint, // TODO: change end point + method: 'post', + params: {'data': item}, + ); + } + + static Future?> getList(String orderBy, int page, int itemsPerPage) async { + Map query = { + "orderBy": orderBy, + "page": page, + "itemsPerPage": itemsPerPage, + }; // TODO: change the query + return await Api.ajax( + url: apiEndPoint, // TODO: change end point + method: 'get', + query: query, + ); + } + + static Future?> updateList(List items) async { + return await Api.ajax( + url: apiEndPoint, // TODO: change end point + method: 'post', + params: {'data': items}, + ); + } +} diff --git a/lib/models/user/user.dart b/lib/models/user/user.dart deleted file mode 100644 index 8cc8f308..00000000 --- a/lib/models/user/user.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter/material.dart'; - -class User { - final String firstName; - final String? lastName; - final List permissions; - - const User({ - required this.firstName, - this.lastName, - required this.permissions, - }); -} diff --git a/lib/routes/controller.dart b/lib/routes/controller.dart deleted file mode 100644 index 231c54c0..00000000 --- a/lib/routes/controller.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:get/get.dart'; -import 'package:team/controllers/user_controller.dart'; -import 'package:team/vaahextendflutter/helpers/console.dart'; - -class RouteController extends GetxController { - - bool checkRoutePermission(String path) { - if(Get.isRegistered()){ - Console.danger("UserController is not initialized!"); - return false; - } - UserController userController = Get.find(); - if (userController.user == null) { - return false; - } - return userController.user!.permissions.contains(path); - } - -} diff --git a/lib/routes/middleware.dart b/lib/routes/middleware.dart index f72c5ebf..c7c0f3fa 100644 --- a/lib/routes/middleware.dart +++ b/lib/routes/middleware.dart @@ -1,28 +1,11 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:team/routes/controller.dart'; import 'package:team/routes/routes.dart'; -import 'package:team/vaahextendflutter/helpers/console.dart'; import 'package:team/view/pages/page_not_found.dart'; -import 'package:team/view/pages/permission_denied.dart'; Route? routeMiddleware(RouteSettings route) { if (!routes.containsKey(route.name)) { return PageNotFound.route(); } - final bool userHasPermission = _checkRoutePermission(route.name as String); - if (!defaultPermissions.contains(route.name) && !userHasPermission) { - return PermissionDenied.route(); - } return routes[route.name]!(); } - -bool _checkRoutePermission(String route) { - if (!Get.isRegistered()) { - Console.danger('RouteController is not initialized!'); - return false; - } - RouteController routeController = Get.find(); - return routeController.checkRoutePermission(route); -} diff --git a/lib/routes/observer.dart b/lib/routes/observer.dart deleted file mode 100644 index 4f962f06..00000000 --- a/lib/routes/observer.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:team/vaahextendflutter/helpers/console.dart'; - -final RouteObserver> routeObserver = RouteObserver>(); - -class RouteAwareWidget extends StatefulWidget { - final String name; - final Widget child; - - const RouteAwareWidget({super.key, required this.name, required this.child}); - - @override - State createState() => RouteAwareWidgetState(); -} - -class RouteAwareWidgetState extends State with RouteAware { - @override - void didChangeDependencies() { - super.didChangeDependencies(); - routeObserver.subscribe(this, ModalRoute.of(context)!); - } - - @override - void dispose() { - routeObserver.unsubscribe(this); - super.dispose(); - } - - @override - void didPush() { - Console.info('didPush ${widget.name}'); - } - - @override - void didPopNext() { - Console.info('didPopNext ${widget.name}'); - } - - @override - Widget build(BuildContext context) => widget.child; -} diff --git a/lib/routes/routes.dart b/lib/routes/routes.dart index 461a620b..f0ab8a65 100644 --- a/lib/routes/routes.dart +++ b/lib/routes/routes.dart @@ -12,9 +12,4 @@ final Map Function()> routes = { PermissionDenied.routeName: PermissionDenied.route, DetailsPage.routeName: DetailsPage.route, MoreDetailsPage.routeName: MoreDetailsPage.route, -}; - -const List defaultPermissions = [ - '/', - TeamHomePage.routeName, -]; +}; \ No newline at end of file diff --git a/lib/vaahextendflutter/services/api.dart b/lib/vaahextendflutter/services/api.dart index 50b99e21..015d9c32 100644 --- a/lib/vaahextendflutter/services/api.dart +++ b/lib/vaahextendflutter/services/api.dart @@ -24,8 +24,7 @@ class Api { static final Dio _dio = Dio(); // Get request header options - static Future _getOptions( - {String contentType = Headers.jsonContentType}) async { + static Future _getOptions({String contentType = Headers.jsonContentType}) async { final Map header = {}; header.addAll({'Accept': 'application/json'}); header.addAll({'X-Requested-With': 'XMLHttpRequest'}); @@ -81,18 +80,16 @@ class Api { // return type of ajax is ApiResponseType? so if there is error // then null will be returned otherwise ApiResponseType object - static Future ajax({ + static Future ajax({ required String url, Future Function(dynamic data, Response? res)? callback, String method = 'get', Map? params, // eg: { 'name': 'abc' }. params is data passed in post, put, etc. requests. Map? query, // eg: { 'name': 'abc' } - List>? - headers, // eg: [{'title': 'content'}, {'key', 'value'}] + List>? headers, // eg: [{'title': 'content'}, {'key', 'value'}] int? customTimeoutLimit, - bool showAlert = - true, // if set false then on success or error, nothing will be shown + bool showAlert = true, // if set false then on success or error, nothing will be shown String alertType = 'toast', // 'toast' and 'dialog' are valid values Future Function()? onStart, Future Function()? onCompleted, @@ -137,7 +134,7 @@ class Api { ); } - return; + return {'data': parseResponse(responseData), 'response': response}; } catch (error) { // On completed, use for hide loading if (onCompleted != null) { @@ -168,7 +165,13 @@ class Api { if (callback != null) { await callback(null, null); } - return; + return { + 'data': null, + 'response': { + 'success': false, + 'errors': [error] + } + }; } // Here response error means server sends error response. eg 401: unauthorised @@ -181,7 +184,13 @@ class Api { if (callback != null) { await callback(null, null); } - return; + return { + 'data': null, + 'response': { + 'success': false, + 'errors': [error] + } + }; } if (callback != null) { @@ -226,10 +235,8 @@ class Api { }) async { Response? response; final Options options = await _getOptions(); - options.sendTimeout = - customTimeoutLimit ?? _envController.config.timeoutLimit; - options.receiveTimeout = - customTimeoutLimit ?? _envController.config.timeoutLimit; + options.sendTimeout = customTimeoutLimit ?? _envController.config.timeoutLimit; + options.receiveTimeout = customTimeoutLimit ?? _envController.config.timeoutLimit; if (headers != null && headers.isNotEmpty) { if (options.headers != null) { for (Map element in headers) { @@ -302,8 +309,7 @@ class Api { await Helpers.showErrorDialog( title: 'Error', content: ['Invalid request type!'], - hint: - "get, post, put, patch, delete request types are allowed.", + hint: "get, post, put, patch, delete request types are allowed.", ); break; } @@ -337,8 +343,7 @@ class Api { ) async { if (response != null && response.data != null) { try { - final Map formatedResponse = - response.data as Map; + final Map formatedResponse = response.data as Map; dynamic responseData = formatedResponse['data']; if (responseData == null) { Console.warning('response doesn\'t contain data key.'); @@ -347,9 +352,8 @@ class Api { if (formatedResponse['messages'] == null) { Console.warning('response doesn\'t contain messages key.'); } else { - responseMessages = (formatedResponse['messages'] as List) - .map((e) => e.toString()) - .toList(); + responseMessages = + (formatedResponse['messages'] as List).map((e) => e.toString()).toList(); } String? responseHint = formatedResponse['hint'] as String?; if (responseHint == null) { @@ -474,13 +478,10 @@ class Api { if (error.response?.data != null) { try { Console.danger('${error.response}'); - final Map response = - error.response?.data as Map; + final Map response = error.response?.data as Map; Console.danger('$response'); if (response['errors'] != null) { - errors = (response['errors'] as List) - .map((e) => e.toString()) - .toList(); + errors = (response['errors'] as List).map((e) => e.toString()).toList(); } if (errors.isEmpty) { Console.warning('response doesn\'t contain errors key.'); @@ -520,8 +521,7 @@ class Api { // ignore: unnecessary_null_comparison if (Helpers.showErrorToast != null) { await Helpers.showErrorToast( - content: - errors.isEmpty ? 'Error' : 'ERR: ${errors.join('\n')}', + content: errors.isEmpty ? 'Error' : 'ERR: ${errors.join('\n')}', ); return; } @@ -569,8 +569,7 @@ class Api { child: Column( mainAxisSize: MainAxisSize.min, children: [ - if (content != null && content.isNotEmpty) - Text(content.join('\n')), + if (content != null && content.isNotEmpty) Text(content.join('\n')), if (content != null && content.isNotEmpty) verticalMargin12, if (hint != null && hint.trim().isNotEmpty) Text(hint), ], diff --git a/lib/view/pages/details.dart b/lib/view/pages/details.dart index f80eaeb5..1676f0c0 100644 --- a/lib/view/pages/details.dart +++ b/lib/view/pages/details.dart @@ -1,18 +1,19 @@ import 'package:flutter/material.dart'; -import 'package:team/routes/observer.dart'; +import 'package:team/models/user.dart'; import 'package:team/vaahextendflutter/base/base_stateful.dart'; import 'package:team/view/pages/more_details.dart'; +import 'package:team/view/pages/permission_denied.dart'; class DetailsPage extends StatefulWidget { static const String routeName = '/details'; static Route route() { + if (!User.hasPermission('can-access-details')) { + return PermissionDenied.route(); + } return MaterialPageRoute( settings: const RouteSettings(name: '/details'), - builder: (_) => const RouteAwareWidget( - name: '/details', - child: DetailsPage(), - ), + builder: (_) => const DetailsPage(), ); } diff --git a/lib/view/pages/home.dart b/lib/view/pages/home.dart index cf95178c..f485cdbc 100644 --- a/lib/view/pages/home.dart +++ b/lib/view/pages/home.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:team/controllers/user_controller.dart'; -import 'package:team/routes/observer.dart'; +import 'package:team/models/user.dart'; import 'package:team/vaahextendflutter/base/base_stateful.dart'; import 'package:team/vaahextendflutter/helpers/constants.dart'; import 'package:team/view/pages/details.dart'; @@ -12,10 +10,7 @@ class TeamHomePage extends StatefulWidget { static Route route() { return MaterialPageRoute( settings: const RouteSettings(name: '/home'), - builder: (_) => const RouteAwareWidget( - name: '/home', - child: TeamHomePage(), - ), + builder: (_) => const TeamHomePage(), ); } @@ -44,8 +39,7 @@ class _TeamHomePageState extends BaseStateful { horizontalMargin12, ElevatedButton( onPressed: () { - UserController userController = Get.find(); - userController.login('NA', 'NA'); + User.signin('NA', 'NA'); }, child: const Text( 'Login', @@ -54,8 +48,7 @@ class _TeamHomePageState extends BaseStateful { horizontalMargin12, ElevatedButton( onPressed: () { - UserController userController = Get.find(); - userController.logout(); + User.signout('NA'); }, child: const Text( 'Logout', diff --git a/lib/view/pages/more_details.dart b/lib/view/pages/more_details.dart index 46379430..381f4b90 100644 --- a/lib/view/pages/more_details.dart +++ b/lib/view/pages/more_details.dart @@ -1,17 +1,18 @@ import 'package:flutter/material.dart'; -import 'package:team/routes/observer.dart'; +import 'package:team/models/user.dart'; import 'package:team/vaahextendflutter/base/base_stateful.dart'; +import 'package:team/view/pages/permission_denied.dart'; class MoreDetailsPage extends StatefulWidget { static const String routeName = '/more-details'; static Route route() { + if (!User.hasPermission('can-access-more-details')) { + return PermissionDenied.route(); + } return MaterialPageRoute( settings: const RouteSettings(name: '/more-details'), - builder: (_) => const RouteAwareWidget( - name: '/more-details', - child: MoreDetailsPage(), - ), + builder: (_) => const MoreDetailsPage(), ); } diff --git a/lib/view/pages/page_not_found.dart b/lib/view/pages/page_not_found.dart index 6bee4fba..257d32a3 100644 --- a/lib/view/pages/page_not_found.dart +++ b/lib/view/pages/page_not_found.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:team/routes/observer.dart'; import 'package:team/vaahextendflutter/base/base_stateless.dart'; class PageNotFound extends BaseStateless { @@ -8,10 +7,7 @@ class PageNotFound extends BaseStateless { static Route route() { return MaterialPageRoute( settings: const RouteSettings(name: '/page-not-found'), - builder: (_) => const RouteAwareWidget( - name: '/page-not-found', - child: PageNotFound(), - ), + builder: (_) => const PageNotFound(), ); } diff --git a/lib/view/pages/permission_denied.dart b/lib/view/pages/permission_denied.dart index e744d9cb..cac28682 100644 --- a/lib/view/pages/permission_denied.dart +++ b/lib/view/pages/permission_denied.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:team/routes/observer.dart'; import 'package:team/vaahextendflutter/base/base_stateless.dart'; class PermissionDenied extends BaseStateless { @@ -8,10 +7,7 @@ class PermissionDenied extends BaseStateless { static Route route() { return MaterialPageRoute( settings: const RouteSettings(name: '/permission-denied'), - builder: (_) => const RouteAwareWidget( - name: '/permission-denied', - child: PermissionDenied(), - ), + builder: (_) => const PermissionDenied(), ); } From 0b672f10a2b294d0da0abd09184b38bf5d8be858 Mon Sep 17 00:00:00 2001 From: Prajapati Chintan Date: Sat, 12 Nov 2022 20:18:57 +0530 Subject: [PATCH 07/11] Fixed: user methods --- lib/controllers/base_controller.dart | 6 +- lib/controllers/root_assets_controller.dart | 22 +++- lib/models/user.dart | 115 ++++++++++++-------- lib/routes/routes.dart | 4 - lib/vaahextendflutter/services/api.dart | 2 +- lib/view/pages/details.dart | 42 ------- lib/view/pages/home.dart | 4 +- lib/view/pages/more_details.dart | 41 ------- 8 files changed, 98 insertions(+), 138 deletions(-) delete mode 100644 lib/view/pages/details.dart delete mode 100644 lib/view/pages/more_details.dart diff --git a/lib/controllers/base_controller.dart b/lib/controllers/base_controller.dart index c39275bc..50e5eeae 100644 --- a/lib/controllers/base_controller.dart +++ b/lib/controllers/base_controller.dart @@ -1,4 +1,5 @@ import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; import 'package:team/app_theme.dart'; import 'package:team/controllers/root_assets_controller.dart'; import 'package:team/env.dart'; @@ -7,10 +8,11 @@ import 'package:team/vaahextendflutter/services/api.dart'; class BaseController extends GetxController { Future init() async { - Get.put(RootAssetsController()); + await GetStorage.init(); initEnvController(); - await Api.initApi(); AppTheme.init(); + await Api.init(); + Get.put(RootAssetsController()); } } diff --git a/lib/controllers/root_assets_controller.dart b/lib/controllers/root_assets_controller.dart index 6fc5df06..f2de6c94 100644 --- a/lib/controllers/root_assets_controller.dart +++ b/lib/controllers/root_assets_controller.dart @@ -1,12 +1,30 @@ import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; class RootAssetsController extends GetxController { - Map? _user; - Map? get user => _user; + RootAssetsController() { + if(box.read('apiToken') != null){ + // get user by token User.byToken(); USE WEBHOOKS and SOCKETS + } + } + final box = GetStorage(); + + Map? _user; + Map? get user => _user; set user(Map? user) { _user = user; update(); } + + String? _apiToken; + String? get apiToken => _apiToken; + set apiToken(String? apiToken) { + box.write('apiToken', apiToken); + _apiToken = apiToken; + update(); + } + + // TODO: Need to use api token in Api.ajax } diff --git a/lib/models/user.dart b/lib/models/user.dart index 2635ebbd..036e9978 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -4,71 +4,50 @@ import 'package:team/vaahextendflutter/services/api.dart'; class User { static final RootAssetsController rootAssetsController = Get.find(); - static const String apiEndPoint = 'user'; + static const String apiEndPoint = '/user'; // TODO: change end point - // final String firstName; - // final String? lastName; - // final List permissions; - // - // const User({ - // required this.firstName, - // this.lastName, - // required this.permissions, - // }); - - static Future signin(String username, String password) async { - rootAssetsController.user = { - "name": "name", - "permissions": ["can-access-details", 'can-access-more-details'] - }; - // await Api.ajax( - // url: apiEndPoint, // TODO: change end point - // method: 'post', - // params: {"username": username, "password": password}, - // ); - return; + static bool hasPermission(String value) { + if (rootAssetsController.user == null || rootAssetsController.user?['permissions'] == null) { + return false; + } + return (rootAssetsController.user?['permissions'] as List).contains(value); } - static Future forgotPassword(String username) async { - await Api.ajax( - url: '$apiEndPoint/forgot-password', // TODO: change end point + static Future signin(String identifier, String password) async { + Map user = await Api.ajax( + url: apiEndPoint, method: 'post', - params: {"username": username}, + params: {"identifier": identifier, "password": password}, ); + rootAssetsController.user = user; + rootAssetsController.apiToken = user['token']; return; } - static Future signout(String username) async { + static Future forgotPassword(String identifier) async { await Api.ajax( - url: '$apiEndPoint/signout', // TODO: change end point + url: apiEndPoint, // TODO: change end point method: 'post', - params: {"username": username}, + params: {"identifier": identifier}, ); - rootAssetsController.user = null; + // TODO: On the same page of the call Show enter otp, reset pass return; } - static bool hasPermission(String value) { - if (rootAssetsController.user?['permissions'] == null) { - return false; - } - return (rootAssetsController.user?['permissions'] as List).contains(value); + static Future signout() async { + rootAssetsController.user = null; + return; } static Future createItem(Map item) async { return await Api.ajax( url: apiEndPoint, // TODO: change end point method: 'post', - params: {'data': item}, + params: item, ); } - static Future?> getList(String orderBy, int page, int itemsPerPage) async { - Map query = { - "orderBy": orderBy, - "page": page, - "itemsPerPage": itemsPerPage, - }; // TODO: change the query + static Future?> getList(Map query) async { return await Api.ajax( url: apiEndPoint, // TODO: change end point method: 'get', @@ -76,11 +55,59 @@ class User { ); } - static Future?> updateList(List items) async { + static Future?> updateList(String type, List items) async { + return await Api.ajax( + url: apiEndPoint, // TODO: change end point + method: 'post', + params: {'type': type, 'data': items}, + ); + } + + static Future?> deleteList(String type, List items) async { + return await Api.ajax( + url: apiEndPoint, // TODO: change end point + method: 'delete', + params: {'type': type, 'data': items}, + ); + } + + static Future?> listAction(String type, List items) async { + return await Api.ajax( + url: apiEndPoint, // TODO: change end point + method: 'patch', + params: {'type': type, 'data': items}, + ); + } + + static Future getItem(String id) async { + return await Api.ajax( + url: apiEndPoint, // TODO: change end point + method: 'get', + query: {"id": id}, + ); + } + + static Future updateItem(String id, Map item) async { + return await Api.ajax( + url: apiEndPoint, // TODO: change end point + method: 'patch', + params: {'id': id, 'item': item}, + ); + } + + static Future deleteItem(String id) async { + return await Api.ajax( + url: apiEndPoint, // TODO: change end point + method: 'delete', + params: {"id": id}, + ); + } + + static Future itemAction(String id, String type) async { return await Api.ajax( url: apiEndPoint, // TODO: change end point method: 'post', - params: {'data': items}, + params: {'id': id, 'type': type}, ); } } diff --git a/lib/routes/routes.dart b/lib/routes/routes.dart index f0ab8a65..43a7e887 100644 --- a/lib/routes/routes.dart +++ b/lib/routes/routes.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:team/view/pages/details.dart'; import 'package:team/view/pages/home.dart'; -import 'package:team/view/pages/more_details.dart'; import 'package:team/view/pages/page_not_found.dart'; import 'package:team/view/pages/permission_denied.dart'; @@ -10,6 +8,4 @@ final Map Function()> routes = { TeamHomePage.routeName: TeamHomePage.route, PageNotFound.routeName: PageNotFound.route, PermissionDenied.routeName: PermissionDenied.route, - DetailsPage.routeName: DetailsPage.route, - MoreDetailsPage.routeName: MoreDetailsPage.route, }; \ No newline at end of file diff --git a/lib/vaahextendflutter/services/api.dart b/lib/vaahextendflutter/services/api.dart index 015d9c32..4c8df09d 100644 --- a/lib/vaahextendflutter/services/api.dart +++ b/lib/vaahextendflutter/services/api.dart @@ -205,7 +205,7 @@ class Api { } } - static Future initApi() async { + static Future init() async { bool envControllerExists = getx.Get.isRegistered(); if (!envControllerExists) { throw Exception('envController does not exist in app'); diff --git a/lib/view/pages/details.dart b/lib/view/pages/details.dart deleted file mode 100644 index 1676f0c0..00000000 --- a/lib/view/pages/details.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:team/models/user.dart'; -import 'package:team/vaahextendflutter/base/base_stateful.dart'; -import 'package:team/view/pages/more_details.dart'; -import 'package:team/view/pages/permission_denied.dart'; - -class DetailsPage extends StatefulWidget { - static const String routeName = '/details'; - - static Route route() { - if (!User.hasPermission('can-access-details')) { - return PermissionDenied.route(); - } - return MaterialPageRoute( - settings: const RouteSettings(name: '/details'), - builder: (_) => const DetailsPage(), - ); - } - - const DetailsPage({super.key}); - - @override - State createState() => _DetailsPageState(); -} - -class _DetailsPageState extends BaseStateful { - @override - Widget build(BuildContext context) { - super.build(context); - return Scaffold( - appBar: AppBar(), - body: Center( - child: ElevatedButton( - onPressed: () => Navigator.pushNamed(context, MoreDetailsPage.routeName), - child: const Text( - 'More Details', - ), - ), - ), - ); - } -} diff --git a/lib/view/pages/home.dart b/lib/view/pages/home.dart index f485cdbc..ca0f608a 100644 --- a/lib/view/pages/home.dart +++ b/lib/view/pages/home.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:team/models/user.dart'; import 'package:team/vaahextendflutter/base/base_stateful.dart'; import 'package:team/vaahextendflutter/helpers/constants.dart'; -import 'package:team/view/pages/details.dart'; +import 'package:team/view/layouts/forgot_password.dart'; class TeamHomePage extends StatefulWidget { static const String routeName = '/home'; @@ -48,7 +48,7 @@ class _TeamHomePageState extends BaseStateful { horizontalMargin12, ElevatedButton( onPressed: () { - User.signout('NA'); + User.signout(); }, child: const Text( 'Logout', diff --git a/lib/view/pages/more_details.dart b/lib/view/pages/more_details.dart deleted file mode 100644 index 381f4b90..00000000 --- a/lib/view/pages/more_details.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:team/models/user.dart'; -import 'package:team/vaahextendflutter/base/base_stateful.dart'; -import 'package:team/view/pages/permission_denied.dart'; - -class MoreDetailsPage extends StatefulWidget { - static const String routeName = '/more-details'; - - static Route route() { - if (!User.hasPermission('can-access-more-details')) { - return PermissionDenied.route(); - } - return MaterialPageRoute( - settings: const RouteSettings(name: '/more-details'), - builder: (_) => const MoreDetailsPage(), - ); - } - - const MoreDetailsPage({super.key}); - - @override - State createState() => _MoreDetailsPageState(); -} - -class _MoreDetailsPageState extends BaseStateful { - @override - Widget build(BuildContext context) { - super.build(context); - return Scaffold( - appBar: AppBar(), - body: Center( - child: ElevatedButton( - onPressed: () => Navigator.pop(context), - child: const Text( - 'Back', - ), - ), - ), - ); - } -} From b0ce2daec5d939e4850780e34ba55782870a1fb4 Mon Sep 17 00:00:00 2001 From: Prajapati Chintan Date: Sat, 19 Nov 2022 11:33:26 +0530 Subject: [PATCH 08/11] Fixed: parsing in return of ajax api. --- lib/vaahextendflutter/services/api.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/vaahextendflutter/services/api.dart b/lib/vaahextendflutter/services/api.dart index 4c8df09d..6cfeda81 100644 --- a/lib/vaahextendflutter/services/api.dart +++ b/lib/vaahextendflutter/services/api.dart @@ -134,7 +134,10 @@ class Api { ); } - return {'data': parseResponse(responseData), 'response': response}; + return { + 'data': _parseKeys(data: responseData, changeKeys: _snakeCasetoLowerCamelCase), + 'response': response + }; } catch (error) { // On completed, use for hide loading if (onCompleted != null) { From 6f8169b252660cc97ed6fd542244fc58e4a17746 Mon Sep 17 00:00:00 2001 From: Prajapati Chintan Date: Sat, 19 Nov 2022 13:41:54 +0530 Subject: [PATCH 09/11] Added: get_storage fixed: home --- lib/view/pages/home.dart | 35 +---- pubspec.lock | 289 ++++++++------------------------------- pubspec.yaml | 1 + 3 files changed, 59 insertions(+), 266 deletions(-) diff --git a/lib/view/pages/home.dart b/lib/view/pages/home.dart index ca0f608a..85b17f70 100644 --- a/lib/view/pages/home.dart +++ b/lib/view/pages/home.dart @@ -1,8 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:team/models/user.dart'; import 'package:team/vaahextendflutter/base/base_stateful.dart'; -import 'package:team/vaahextendflutter/helpers/constants.dart'; -import 'package:team/view/layouts/forgot_password.dart'; class TeamHomePage extends StatefulWidget { static const String routeName = '/home'; @@ -26,37 +23,7 @@ class _TeamHomePageState extends BaseStateful { super.build(context); return Scaffold( appBar: AppBar(), - body: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ElevatedButton( - onPressed: () => Navigator.pushNamed(context, DetailsPage.routeName), - child: const Text( - 'Route Details', - ), - ), - horizontalMargin12, - ElevatedButton( - onPressed: () { - User.signin('NA', 'NA'); - }, - child: const Text( - 'Login', - ), - ), - horizontalMargin12, - ElevatedButton( - onPressed: () { - User.signout(); - }, - child: const Text( - 'Logout', - ), - ), - ], - ), - ), + body: const Center(child: Text('WebReinvent')), ); } } diff --git a/pubspec.lock b/pubspec.lock index eeffffae..8d2a0a03 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,27 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - url: "https://pub.dartlang.org" - source: hosted - version: "50.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - url: "https://pub.dartlang.org" - source: hosted - version: "5.2.0" - args: - dependency: transitive - description: - name: args - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.1" async: dependency: transitive description: @@ -36,62 +15,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" - build: - dependency: transitive - description: - name: build - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.1" - build_config: - dependency: transitive - description: - name: build_config - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.1" - build_daemon: - dependency: transitive - description: - name: build_daemon - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - build_runner: - dependency: "direct dev" - description: - name: build_runner - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.2" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - url: "https://pub.dartlang.org" - source: hosted - version: "7.2.7" - built_collection: - dependency: transitive - description: - name: built_collection - url: "https://pub.dartlang.org" - source: hosted - version: "5.1.1" - built_value: - dependency: transitive - description: - name: built_value - url: "https://pub.dartlang.org" - source: hosted - version: "8.4.2" characters: dependency: transitive description: @@ -99,13 +22,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" clock: dependency: transitive description: @@ -113,13 +29,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.1" - code_builder: - dependency: transitive - description: - name: code_builder - url: "https://pub.dartlang.org" - source: hosted - version: "4.3.0" collection: dependency: transitive description: @@ -134,20 +43,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.0" - convert: - dependency: transitive - description: - name: convert - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.1" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -155,13 +50,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.5" - dart_style: - dependency: transitive - description: - name: dart_style - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.4" dio: dependency: "direct main" description: @@ -176,20 +64,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" - file: + ffi: dependency: transitive description: - name: file + name: ffi url: "https://pub.dartlang.org" source: hosted - version: "6.1.4" - fixnum: + version: "2.0.1" + file: dependency: transitive description: - name: fixnum + name: file url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "6.1.4" flutter: dependency: "direct main" description: flutter @@ -226,13 +114,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.1.1" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.0" get: dependency: "direct main" description: @@ -240,27 +121,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.6.5" - glob: - dependency: transitive - description: - name: glob - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - graphs: - dependency: transitive - description: - name: graphs - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - http_multi_server: - dependency: transitive + get_storage: + dependency: "direct main" description: - name: http_multi_server + name: get_storage url: "https://pub.dartlang.org" source: hosted - version: "3.2.1" + version: "2.0.3" http_parser: dependency: transitive description: @@ -268,13 +135,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.2" - io: - dependency: transitive - description: - name: io - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.3" js: dependency: transitive description: @@ -282,20 +142,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.4" - json_annotation: - dependency: "direct main" - description: - name: json_annotation - url: "https://pub.dartlang.org" - source: hosted - version: "4.7.0" - json_serializable: - dependency: "direct dev" - description: - name: json_serializable - url: "https://pub.dartlang.org" - source: hosted - version: "6.5.4" lints: dependency: transitive description: @@ -303,13 +149,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" - logging: - dependency: transitive - description: - name: logging - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" matcher: dependency: transitive description: @@ -331,81 +170,88 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" - mime: + path: dependency: transitive description: - name: mime + name: path url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" - package_config: + version: "1.8.2" + path_provider: dependency: transitive description: - name: package_config + name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" - path: + version: "2.0.11" + path_provider_android: dependency: transitive description: - name: path + name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "1.8.2" - pool: + version: "2.0.21" + path_provider_ios: dependency: transitive description: - name: pool + name: path_provider_ios url: "https://pub.dartlang.org" source: hosted - version: "1.5.1" - pub_semver: + version: "2.0.11" + path_provider_linux: dependency: transitive description: - name: pub_semver + name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.2" - pubspec_parse: + version: "2.1.7" + path_provider_macos: dependency: transitive description: - name: pubspec_parse + name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "1.2.1" - shelf: + version: "2.0.6" + path_provider_platform_interface: dependency: transitive description: - name: shelf + name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.4.0" - shelf_web_socket: + version: "2.0.5" + path_provider_windows: dependency: transitive description: - name: shelf_web_socket + name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" - sky_engine: + version: "2.1.3" + platform: dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_gen: + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + plugin_platform_interface: dependency: transitive description: - name: source_gen + name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.2.6" - source_helper: + version: "2.1.3" + process: dependency: transitive description: - name: source_helper + name: process url: "https://pub.dartlang.org" source: hosted - version: "1.3.3" + version: "4.2.4" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" source_span: dependency: transitive description: @@ -427,13 +273,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" - stream_transform: - dependency: transitive - description: - name: stream_transform - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" string_scanner: dependency: transitive description: @@ -455,13 +294,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.12" - timing: - dependency: transitive - description: - name: timing - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" typed_data: dependency: transitive description: @@ -476,27 +308,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" - watcher: + win32: dependency: transitive description: - name: watcher + name: win32 url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.0" - yaml: + version: "3.1.1" + xdg_directories: dependency: transitive description: - name: yaml + name: xdg_directories url: "https://pub.dartlang.org" source: hosted - version: "3.1.1" + version: "0.2.0+2" sdks: dart: ">=2.18.2 <3.0.0" flutter: ">=3.3.4" diff --git a/pubspec.yaml b/pubspec.yaml index 814c6eb8..6e8622bc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,6 +18,7 @@ dependencies: flutter_screenutil: ^5.5.4 dio: ^4.0.6 fluttertoast: ^8.1.1 + get_storage: ^2.0.3 dev_dependencies: flutter_test: From fa2398624ae7b90341467ae62e6e053fa66092b2 Mon Sep 17 00:00:00 2001 From: Prajapati Chintan Date: Sat, 19 Nov 2022 13:56:39 +0530 Subject: [PATCH 10/11] Updated: route middleware to remove un-used import --- lib/routes/middleware.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/routes/middleware.dart b/lib/routes/middleware.dart index c7c0f3fa..84ad0e90 100644 --- a/lib/routes/middleware.dart +++ b/lib/routes/middleware.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:team/routes/routes.dart'; import 'package:team/view/pages/page_not_found.dart'; From cafe7f229a8226dfc680ec4dec416fa8e6e1ceb5 Mon Sep 17 00:00:00 2001 From: Prajapati Chintan Date: Sat, 19 Nov 2022 15:19:06 +0530 Subject: [PATCH 11/11] Updated: refactored the code --- lib/app_config.dart | 4 ++-- lib/controllers/root_assets_controller.dart | 6 +++--- lib/models/user.dart | 2 +- lib/routes/middleware.dart | 4 ++-- lib/routes/routes.dart | 10 +++++----- .../{tag/tag_panel.dart => widgets/debug.dart} | 12 ++++++------ lib/view/pages/home.dart | 14 +++++++------- .../pages/{page_not_found.dart => not_found.dart} | 10 +++++----- lib/view/pages/permission_denied.dart | 10 +++++----- 9 files changed, 36 insertions(+), 36 deletions(-) rename lib/vaahextendflutter/{tag/tag_panel.dart => widgets/debug.dart} (97%) rename lib/view/pages/{page_not_found.dart => not_found.dart} (62%) diff --git a/lib/app_config.dart b/lib/app_config.dart index bf862866..e9c788aa 100644 --- a/lib/app_config.dart +++ b/lib/app_config.dart @@ -3,7 +3,7 @@ import 'package:get/get.dart'; import 'package:team/app_theme.dart'; import 'package:team/env.dart'; import 'package:team/routes/middleware.dart'; -import 'package:team/vaahextendflutter/tag/tag_panel.dart'; +import 'package:team/vaahextendflutter/widgets/debug.dart'; final _navigatorKey = GlobalKey(); @@ -20,7 +20,7 @@ class AppConfig extends StatelessWidget { ), onGenerateRoute: routeMiddleware, builder: (BuildContext context, Widget? child) { - return TagPanelHost( + return DebugWidget( navigatorKey: _navigatorKey, child: child!, ); diff --git a/lib/controllers/root_assets_controller.dart b/lib/controllers/root_assets_controller.dart index f2de6c94..77334a9f 100644 --- a/lib/controllers/root_assets_controller.dart +++ b/lib/controllers/root_assets_controller.dart @@ -4,12 +4,12 @@ import 'package:get_storage/get_storage.dart'; class RootAssetsController extends GetxController { RootAssetsController() { - if(box.read('apiToken') != null){ + if(storage.read('apiToken') != null){ // get user by token User.byToken(); USE WEBHOOKS and SOCKETS } } - final box = GetStorage(); + final storage = GetStorage(); Map? _user; Map? get user => _user; @@ -21,7 +21,7 @@ class RootAssetsController extends GetxController { String? _apiToken; String? get apiToken => _apiToken; set apiToken(String? apiToken) { - box.write('apiToken', apiToken); + storage.write('apiToken', apiToken); _apiToken = apiToken; update(); } diff --git a/lib/models/user.dart b/lib/models/user.dart index 036e9978..5a596b57 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -3,8 +3,8 @@ import 'package:team/controllers/root_assets_controller.dart'; import 'package:team/vaahextendflutter/services/api.dart'; class User { + static const String apiEndPoint = '/users'; // TODO: change end point static final RootAssetsController rootAssetsController = Get.find(); - static const String apiEndPoint = '/user'; // TODO: change end point static bool hasPermission(String value) { if (rootAssetsController.user == null || rootAssetsController.user?['permissions'] == null) { diff --git a/lib/routes/middleware.dart b/lib/routes/middleware.dart index 84ad0e90..b5f62f2f 100644 --- a/lib/routes/middleware.dart +++ b/lib/routes/middleware.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:team/routes/routes.dart'; -import 'package:team/view/pages/page_not_found.dart'; +import 'package:team/view/pages/not_found.dart'; Route? routeMiddleware(RouteSettings route) { if (!routes.containsKey(route.name)) { - return PageNotFound.route(); + return NotFoundPage.route(); } return routes[route.name]!(); } diff --git a/lib/routes/routes.dart b/lib/routes/routes.dart index 43a7e887..918bf80f 100644 --- a/lib/routes/routes.dart +++ b/lib/routes/routes.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:team/view/pages/home.dart'; -import 'package:team/view/pages/page_not_found.dart'; +import 'package:team/view/pages/not_found.dart'; import 'package:team/view/pages/permission_denied.dart'; final Map Function()> routes = { - '/': TeamHomePage.route, - TeamHomePage.routeName: TeamHomePage.route, - PageNotFound.routeName: PageNotFound.route, - PermissionDenied.routeName: PermissionDenied.route, + '/': HomePage.route, + HomePage.routePath: HomePage.route, + NotFoundPage.routePath: NotFoundPage.route, + PermissionDeniedPage.routePath: PermissionDeniedPage.route, }; \ No newline at end of file diff --git a/lib/vaahextendflutter/tag/tag_panel.dart b/lib/vaahextendflutter/widgets/debug.dart similarity index 97% rename from lib/vaahextendflutter/tag/tag_panel.dart rename to lib/vaahextendflutter/widgets/debug.dart index cdcbe1c2..c2f2e2ea 100644 --- a/lib/vaahextendflutter/tag/tag_panel.dart +++ b/lib/vaahextendflutter/widgets/debug.dart @@ -18,8 +18,8 @@ const double constHandleWidth = 180.0; // tag handle width const double constHandleHeight = 28.0; // tag handle height @immutable -class TagPanelHost extends StatefulWidget { - const TagPanelHost({ +class DebugWidget extends StatefulWidget { + const DebugWidget({ Key? key, required this.navigatorKey, required this.child, @@ -29,14 +29,14 @@ class TagPanelHost extends StatefulWidget { final Widget child; @override - TagPanelHostState createState() => TagPanelHostState(); + DebugWidgetState createState() => DebugWidgetState(); - static TagPanelHostState of(BuildContext context) { - return context.findAncestorStateOfType()!; + static DebugWidgetState of(BuildContext context) { + return context.findAncestorStateOfType()!; } } -class TagPanelHostState extends State +class DebugWidgetState extends State with SingleTickerProviderStateMixin { final _drawerKey = GlobalKey(); final _focusScopeNode = FocusScopeNode(); diff --git a/lib/view/pages/home.dart b/lib/view/pages/home.dart index 85b17f70..d5d561d5 100644 --- a/lib/view/pages/home.dart +++ b/lib/view/pages/home.dart @@ -1,23 +1,23 @@ import 'package:flutter/material.dart'; import 'package:team/vaahextendflutter/base/base_stateful.dart'; -class TeamHomePage extends StatefulWidget { - static const String routeName = '/home'; +class HomePage extends StatefulWidget { + static const String routePath = '/home'; static Route route() { return MaterialPageRoute( - settings: const RouteSettings(name: '/home'), - builder: (_) => const TeamHomePage(), + settings: const RouteSettings(name: routePath), + builder: (_) => const HomePage(), ); } - const TeamHomePage({super.key}); + const HomePage({super.key}); @override - State createState() => _TeamHomePageState(); + State createState() => _HomePageState(); } -class _TeamHomePageState extends BaseStateful { +class _HomePageState extends BaseStateful { @override Widget build(BuildContext context) { super.build(context); diff --git a/lib/view/pages/page_not_found.dart b/lib/view/pages/not_found.dart similarity index 62% rename from lib/view/pages/page_not_found.dart rename to lib/view/pages/not_found.dart index 257d32a3..04581edb 100644 --- a/lib/view/pages/page_not_found.dart +++ b/lib/view/pages/not_found.dart @@ -1,17 +1,17 @@ import 'package:flutter/material.dart'; import 'package:team/vaahextendflutter/base/base_stateless.dart'; -class PageNotFound extends BaseStateless { - static const String routeName = '/page-not-found'; +class NotFoundPage extends BaseStateless { + static const String routePath = '/page-not-found'; static Route route() { return MaterialPageRoute( - settings: const RouteSettings(name: '/page-not-found'), - builder: (_) => const PageNotFound(), + settings: const RouteSettings(name: routePath), + builder: (_) => const NotFoundPage(), ); } - const PageNotFound({super.key}); + const NotFoundPage({super.key}); @override Widget build(BuildContext context) { diff --git a/lib/view/pages/permission_denied.dart b/lib/view/pages/permission_denied.dart index cac28682..58374b3c 100644 --- a/lib/view/pages/permission_denied.dart +++ b/lib/view/pages/permission_denied.dart @@ -1,17 +1,17 @@ import 'package:flutter/material.dart'; import 'package:team/vaahextendflutter/base/base_stateless.dart'; -class PermissionDenied extends BaseStateless { - static const String routeName = '/permission-denied'; +class PermissionDeniedPage extends BaseStateless { + static const String routePath = '/permission-denied'; static Route route() { return MaterialPageRoute( - settings: const RouteSettings(name: '/permission-denied'), - builder: (_) => const PermissionDenied(), + settings: const RouteSettings(name: routePath), + builder: (_) => const PermissionDeniedPage(), ); } - const PermissionDenied({super.key}); + const PermissionDeniedPage({super.key}); @override Widget build(BuildContext context) {