Merge branch 'develop' into feat/fd-905
This commit is contained in:
commit
b87b26fced
|
@ -16,6 +16,7 @@
|
|||
<uses-permission android:name="android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE" />
|
||||
|
||||
<application
|
||||
android:networkSecurityConfig="@xml/network_security_config"
|
||||
android:label="FRE ACCESS HUB"
|
||||
tools:replace="android:label"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<network-security-config>
|
||||
<domain-config cleartextTrafficPermitted="true">
|
||||
<domain includeSubdomains="true">freaccess.com.br</domain>
|
||||
</domain-config>
|
||||
</network-security-config>
|
|
@ -10,4 +10,9 @@
|
|||
<meta-data
|
||||
android:name="com.google.firebase.messaging.default_notification_channel_id"
|
||||
android:value="@string/default_notification_channel_id" />
|
||||
<application
|
||||
android:networkSecurityConfig="@xml/network_security_config"
|
||||
android:label="FRE ACCESS HUB"
|
||||
android:icon="@mipmap/ic_launcher">
|
||||
</application>
|
||||
</manifest>
|
|
@ -217,8 +217,6 @@ PODS:
|
|||
- GTMSessionFetcher/Core (3.5.0)
|
||||
- image_picker_ios (0.0.1):
|
||||
- Flutter
|
||||
- integration_test (0.0.1):
|
||||
- Flutter
|
||||
- IosAwnCore (0.10.0)
|
||||
- local_auth_darwin (0.0.1):
|
||||
- Flutter
|
||||
|
@ -292,7 +290,6 @@ DEPENDENCIES:
|
|||
- google_mlkit_commons (from `.symlinks/plugins/google_mlkit_commons/ios`)
|
||||
- google_mlkit_face_detection (from `.symlinks/plugins/google_mlkit_face_detection/ios`)
|
||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||
- integration_test (from `.symlinks/plugins/integration_test/ios`)
|
||||
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
||||
|
@ -372,8 +369,6 @@ EXTERNAL SOURCES:
|
|||
:path: ".symlinks/plugins/google_mlkit_face_detection/ios"
|
||||
image_picker_ios:
|
||||
:path: ".symlinks/plugins/image_picker_ios/ios"
|
||||
integration_test:
|
||||
:path: ".symlinks/plugins/integration_test/ios"
|
||||
local_auth_darwin:
|
||||
:path: ".symlinks/plugins/local_auth_darwin/darwin"
|
||||
path_provider_foundation:
|
||||
|
@ -396,7 +391,7 @@ SPEC CHECKSUMS:
|
|||
app_tracking_transparency: e169b653478da7bb15a6c61209015378ca73e375
|
||||
awesome_notifications: dd5518ff1c80be03d4f1c40f04da9d9cc2a37af5
|
||||
camera_avfoundation: dd002b0330f4981e1bbcb46ae9b62829237459a4
|
||||
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
|
||||
connectivity_plus: 4c41c08fc6d7c91f63bc7aec70ffe3730b04f563
|
||||
device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d
|
||||
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
|
||||
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
|
||||
|
@ -428,7 +423,6 @@ SPEC CHECKSUMS:
|
|||
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
|
||||
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
|
||||
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
|
||||
integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
|
||||
IosAwnCore: 653786a911089012092ce831f2945cd339855a89
|
||||
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
|
||||
MLImage: 0ad1c5f50edd027672d8b26b0fee78a8b4a0fc56
|
||||
|
@ -444,7 +438,7 @@ SPEC CHECKSUMS:
|
|||
SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
|
||||
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
|
||||
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
||||
sqflite_darwin: a553b1fd6fe66f53bbb0fe5b4f5bab93f08d7a13
|
||||
sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d
|
||||
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
|
||||
Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e
|
||||
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>FlutterDeepLinkingEnabled</key>
|
||||
<true/>
|
||||
<false/>
|
||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||
<true/>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
|
|
|
@ -240,8 +240,10 @@ class _ForgotPasswordTemplateComponentWidgetState extends State<ForgotPasswordTe
|
|||
onPressed: (_model.emailAddressTextController.text == '' ||
|
||||
!ValidatorUtil.isValidEmail(_model.emailAddressTextController.text))
|
||||
? null
|
||||
: () async =>
|
||||
AuthenticationService.forgotPassword(context, _model.emailAddressTextController.text),
|
||||
: () async => await AuthenticationService.forgotPassword(
|
||||
context,
|
||||
_model.emailAddressTextController.text,
|
||||
).then((v) => v == true ? context.pop() : null),
|
||||
text: FFLocalizations.of(context).getText(
|
||||
'74rnd5bu' /* Enviar */,
|
||||
),
|
||||
|
|
|
@ -41,7 +41,7 @@ abstract class FlutterFlowTheme {
|
|||
static void saveThemeMode(ThemeMode mode) =>
|
||||
mode == ThemeMode.system ? _prefs?.remove(kThemeModeKey) : _prefs?.setBool(kThemeModeKey, mode == ThemeMode.dark);
|
||||
static FlutterFlowTheme of(BuildContext context) {
|
||||
deviceSize = getDeviceSize(context);
|
||||
// deviceSize = getDeviceSize(context);
|
||||
return Theme.of(context).brightness == Brightness.dark ? DarkModeTheme() : LightModeTheme();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import 'dart:async';
|
||||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/backend/schema/util/schema_util.dart';
|
||||
|
@ -39,6 +40,8 @@ export 'serialization_util.dart';
|
|||
|
||||
const kTransitionInfoKey = '__transition_info__';
|
||||
|
||||
final GlobalKey<NavigatorState> key = GlobalKey<NavigatorState>();
|
||||
|
||||
class AppStateNotifier extends ChangeNotifier {
|
||||
AppStateNotifier._();
|
||||
|
||||
|
@ -55,8 +58,17 @@ class AppStateNotifier extends ChangeNotifier {
|
|||
|
||||
GoRouter createRouter(AppStateNotifier appStateNotifier) {
|
||||
return GoRouter(
|
||||
navigatorKey: key,
|
||||
initialLocation: '/',
|
||||
debugLogDiagnostics: true,
|
||||
redirect: (context, state) {
|
||||
if (Platform.isIOS) {
|
||||
if (state.uri.toString().contains("freaccess://changepass/")) {
|
||||
throw Exception('Redirecting to forgotPassword');
|
||||
}
|
||||
}
|
||||
return null;
|
||||
},
|
||||
refreshListenable: appStateNotifier,
|
||||
// errorBuilder: (context, state) => appStateNotifier.showSplashImage
|
||||
// ? Builder( builder: (context) => Container(color: FlutterFlowTheme.of(context).primary, child: Image.asset( 'assets/images/logo.svg', fit: BoxFit.cover)))
|
||||
|
@ -72,14 +84,25 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
|
|||
builder: (context, _) {
|
||||
return FutureBuilder<Widget>(
|
||||
future: () async {
|
||||
final bool isLogged = await StorageHelper().g(SecureStorageKey.isLogged.value) == 'true';
|
||||
final bool haveLocal = await StorageHelper().g(SecureStorageKey.haveLocal.value) == 'true';
|
||||
final bool isLogged =
|
||||
await StorageHelper().g(SecureStorageKey.isLogged.value) ==
|
||||
'true';
|
||||
final bool haveLocal =
|
||||
await StorageHelper().g(SecureStorageKey.haveLocal.value) ==
|
||||
'true';
|
||||
final bool haveUserUUID =
|
||||
(await StorageHelper().g(KeychainStorageKey.userUUID.value))?.isNotEmpty ?? false;
|
||||
final bool haveDevUUID = (await StorageHelper().g(KeychainStorageKey.devUUID.value))?.isNotEmpty ?? false;
|
||||
(await StorageHelper().g(KeychainStorageKey.userUUID.value))
|
||||
?.isNotEmpty ??
|
||||
false;
|
||||
final bool haveDevUUID =
|
||||
(await StorageHelper().g(KeychainStorageKey.devUUID.value))
|
||||
?.isNotEmpty ??
|
||||
false;
|
||||
|
||||
if (isLogged && haveDevUUID && haveUserUUID) {
|
||||
return haveLocal ? const HomePageWidget() : const ReceptionPageWidget();
|
||||
return haveLocal
|
||||
? const HomePageWidget()
|
||||
: const ReceptionPageWidget();
|
||||
} else {
|
||||
return const WelcomePageWidget();
|
||||
}
|
||||
|
@ -100,24 +123,40 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
|
|||
FFRoute(
|
||||
name: 'forgotPassword',
|
||||
path: '/forgotPassword',
|
||||
builder: (context, params) => ForgotPasswordScreen(
|
||||
builder: (context, params) {
|
||||
late final String email =
|
||||
params.getParam('email', ParamType.String);
|
||||
late final String token =
|
||||
params.getParam('token', ParamType.String);
|
||||
|
||||
return ForgotPasswordScreen(
|
||||
key: UniqueKey(),
|
||||
email: params.getParam('email', ParamType.String),
|
||||
token: params.getParam('token', ParamType.String))),
|
||||
FFRoute(name: 'homePage', path: '/homePage', builder: (context, params) => HomePageWidget(key: UniqueKey())),
|
||||
email: email,
|
||||
token: token,
|
||||
);
|
||||
}),
|
||||
FFRoute(
|
||||
name: 'homePage',
|
||||
path: '/homePage',
|
||||
builder: (context, params) => HomePageWidget(key: UniqueKey())),
|
||||
FFRoute(
|
||||
name: 'petsOnThePropertyPage',
|
||||
path: '/petsOnThePropertyPage',
|
||||
builder: (context, params) => Scaffold(body: const PetsHistoryScreen(isApp: true))),
|
||||
builder: (context, params) =>
|
||||
Scaffold(body: const PetsHistoryScreen(isApp: true))),
|
||||
FFRoute(
|
||||
name: 'vehiclesOnThePropertyPage',
|
||||
path: '/vehiclesOnThePropertyPage',
|
||||
builder: (context, params) => const VehicleOnTheProperty()),
|
||||
FFRoute(
|
||||
name: 'visitsOnThePropertyPage',
|
||||
path: '/visitsOnThePropertyPage',
|
||||
builder: (context, params) => const VisitsOnTheProperty()),
|
||||
FFRoute(name: 'receptionPage', path: '/receptionPage', builder: (context, params) => const ReceptionPageWidget()),
|
||||
name: 'homePage',
|
||||
path: '/homePage',
|
||||
builder: (context, params) => HomePageWidget(key: UniqueKey()),
|
||||
),
|
||||
FFRoute(
|
||||
name: 'receptionPage',
|
||||
path: '/receptionPage',
|
||||
builder: (context, params) => const ReceptionPageWidget()),
|
||||
FFRoute(
|
||||
name: 'messageHistoryPage',
|
||||
path: '/messageHistoryPage',
|
||||
|
@ -129,20 +168,28 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
|
|||
FFRoute(
|
||||
name: 'scheduleCompleteVisitPage',
|
||||
path: '/scheduleCompleteVisitPage',
|
||||
builder: (context, params) => const ScheduleCompleteVisitPageWidget()),
|
||||
builder: (context, params) =>
|
||||
const ScheduleCompleteVisitPageWidget()),
|
||||
FFRoute(
|
||||
name: 'deliverySchedule', path: '/deliverySchedule', builder: (context, params) => const DeliverySchedule()),
|
||||
name: 'deliverySchedule',
|
||||
path: '/deliverySchedule',
|
||||
builder: (context, params) => const DeliverySchedule()),
|
||||
FFRoute(
|
||||
name: 'provisionalSchedule',
|
||||
path: '/provisionalSchedule',
|
||||
builder: (context, params) => const ProvisionalSchedule()),
|
||||
FFRoute(
|
||||
name: 'fastPassPage', path: '/fastPassPage', builder: (context, params) => /*const*/ FastPassPageWidget()),
|
||||
name: 'fastPassPage',
|
||||
path: '/fastPassPage',
|
||||
builder: (context, params) => /*const*/ FastPassPageWidget()),
|
||||
FFRoute(
|
||||
name: 'preferencesSettings',
|
||||
path: '/preferencesSettings',
|
||||
builder: (context, params) => PreferencesPageWidget()),
|
||||
FFRoute(name: 'aboutProperty', path: '/aboutProperty', builder: (context, params) => AboutPropertyPage()),
|
||||
FFRoute(
|
||||
name: 'aboutProperty',
|
||||
path: '/aboutProperty',
|
||||
builder: (context, params) => AboutPropertyPage()),
|
||||
FFRoute(
|
||||
name: 'peopleOnThePropertyPage',
|
||||
path: '/peopleOnThePropertyPage',
|
||||
|
@ -150,19 +197,43 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
|
|||
FFRoute(
|
||||
name: 'acessHistoryPage',
|
||||
path: '/acessHistoryPage',
|
||||
builder: (context, params) =>
|
||||
AccessHistoryScreen(opt: const {'personType': '.*', 'accessType': '.*', 'search': '.*'})),
|
||||
builder: (context, params) => AccessHistoryScreen(opt: const {
|
||||
'personType': '.*',
|
||||
'accessType': '.*',
|
||||
'search': '.*'
|
||||
})),
|
||||
FFRoute(
|
||||
name: 'liberationHistory',
|
||||
path: '/liberationHistory',
|
||||
builder: (context, params) => const LiberationHistoryWidget()),
|
||||
FFRoute(name: 'signInPage', path: '/signInPage', builder: (context, params) => const SignInPageWidget()),
|
||||
FFRoute(name: 'signUpPage', path: '/signUpPage', builder: (context, params) => const SignUpPageWidget()),
|
||||
FFRoute(name: 'welcomePage', path: '/welcomePage', builder: (context, params) => const WelcomePageWidget()),
|
||||
FFRoute(name: 'qrCodePage', path: '/qrCodePage', builder: (context, params) => const QrCodePageWidget()),
|
||||
FFRoute(name: 'preferencesPage', path: '/preferencesPage', builder: (context, params) => PreferencesPageWidget()),
|
||||
FFRoute(name: 'packageOrder', path: '/packageOrder', builder: (context, params) => const PackageOrderPage()),
|
||||
FFRoute(name: 'reservation', path: '/reservation', builder: (context, params) => ReservationPageWidget()),
|
||||
FFRoute(
|
||||
name: 'signInPage',
|
||||
path: '/signInPage',
|
||||
builder: (context, params) => const SignInPageWidget()),
|
||||
FFRoute(
|
||||
name: 'signUpPage',
|
||||
path: '/signUpPage',
|
||||
builder: (context, params) => const SignUpPageWidget()),
|
||||
FFRoute(
|
||||
name: 'welcomePage',
|
||||
path: '/welcomePage',
|
||||
builder: (context, params) => const WelcomePageWidget()),
|
||||
FFRoute(
|
||||
name: 'qrCodePage',
|
||||
path: '/qrCodePage',
|
||||
builder: (context, params) => const QrCodePageWidget()),
|
||||
FFRoute(
|
||||
name: 'preferencesPage',
|
||||
path: '/preferencesPage',
|
||||
builder: (context, params) => PreferencesPageWidget()),
|
||||
FFRoute(
|
||||
name: 'packageOrder',
|
||||
path: '/packageOrder',
|
||||
builder: (context, params) => const PackageOrderPage()),
|
||||
FFRoute(
|
||||
name: 'reservation',
|
||||
path: '/reservation',
|
||||
builder: (context, params) => ReservationPageWidget()),
|
||||
FFRoute(
|
||||
name: 'petsPage',
|
||||
path: '/petsPage',
|
||||
|
@ -178,7 +249,9 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) {
|
|||
|
||||
extension NavParamExtensions on Map<String, String?> {
|
||||
Map<String, String> get withoutNulls => Map.fromEntries(
|
||||
entries.where((e) => e.value != null).map((e) => MapEntry(e.key, e.value!)),
|
||||
entries
|
||||
.where((e) => e.value != null)
|
||||
.map((e) => MapEntry(e.key, e.value!)),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -192,7 +265,8 @@ extension NavigationExtensions on BuildContext {
|
|||
}
|
||||
|
||||
extension _GoRouterStateExtensions on GoRouterState {
|
||||
Map<String, dynamic> get extraMap => extra != null ? extra as Map<String, dynamic> : {};
|
||||
Map<String, dynamic> get extraMap =>
|
||||
extra != null ? extra as Map<String, dynamic> : {};
|
||||
Map<String, dynamic> get allParams => <String, dynamic>{}
|
||||
..addAll(pathParameters)
|
||||
..addAll(uri.queryParameters)
|
||||
|
@ -205,8 +279,9 @@ extension _GoRouterStateExtensions on GoRouterState {
|
|||
extension GoRouterLocationExtension on GoRouter {
|
||||
String getCurrentLocation() {
|
||||
final RouteMatch lastMatch = routerDelegate.currentConfiguration.last;
|
||||
final RouteMatchList matchList =
|
||||
lastMatch is ImperativeRouteMatch ? lastMatch.matches : routerDelegate.currentConfiguration;
|
||||
final RouteMatchList matchList = lastMatch is ImperativeRouteMatch
|
||||
? lastMatch.matches
|
||||
: routerDelegate.currentConfiguration;
|
||||
return matchList.uri.toString();
|
||||
}
|
||||
}
|
||||
|
@ -219,13 +294,17 @@ class FFParameters {
|
|||
Map<String, dynamic> futureParamValues = {};
|
||||
|
||||
bool get isEmpty =>
|
||||
state.allParams.isEmpty || (state.allParams.length == 1 && state.extraMap.containsKey(kTransitionInfoKey));
|
||||
bool isAsyncParam(MapEntry<String, dynamic> param) => asyncParams.containsKey(param.key) && param.value is String;
|
||||
state.allParams.isEmpty ||
|
||||
(state.allParams.length == 1 &&
|
||||
state.extraMap.containsKey(kTransitionInfoKey));
|
||||
bool isAsyncParam(MapEntry<String, dynamic> param) =>
|
||||
asyncParams.containsKey(param.key) && param.value is String;
|
||||
bool get hasFutures => state.allParams.entries.any(isAsyncParam);
|
||||
Future<bool> completeFutures() => Future.wait(
|
||||
state.allParams.entries.where(isAsyncParam).map(
|
||||
(param) async {
|
||||
final doc = await asyncParams[param.key]!(param.value).onError((_, __) => null);
|
||||
final doc = await asyncParams[param.key]!(param.value)
|
||||
.onError((_, __) => null);
|
||||
if (doc != null) {
|
||||
futureParamValues[param.key] = doc;
|
||||
return true;
|
||||
|
@ -235,12 +314,15 @@ class FFParameters {
|
|||
),
|
||||
).onError((_, __) => [false]).then((v) => v.every((e) => e));
|
||||
|
||||
dynamic getParam<T>(String paramName, ParamType type, {bool isList = false, StructBuilder<T>? structBuilder}) {
|
||||
if (futureParamValues.containsKey(paramName)) return futureParamValues[paramName];
|
||||
dynamic getParam<T>(String paramName, ParamType type,
|
||||
{bool isList = false, StructBuilder<T>? structBuilder}) {
|
||||
if (futureParamValues.containsKey(paramName))
|
||||
return futureParamValues[paramName];
|
||||
if (!state.allParams.containsKey(paramName)) return null;
|
||||
final param = state.allParams[paramName];
|
||||
if (param is! String) return param;
|
||||
return deserializeParam<T>(param, type, isList, structBuilder: structBuilder);
|
||||
return deserializeParam<T>(param, type, isList,
|
||||
structBuilder: structBuilder);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -280,13 +362,16 @@ class FFRoute {
|
|||
key: state.pageKey,
|
||||
child: child,
|
||||
transitionDuration: transitionInfo.duration,
|
||||
transitionsBuilder: (context, animation, secondaryAnimation, child) => PageTransition(
|
||||
transitionsBuilder:
|
||||
(context, animation, secondaryAnimation, child) =>
|
||||
PageTransition(
|
||||
type: transitionInfo.transitionType,
|
||||
duration: transitionInfo.duration,
|
||||
reverseDuration: transitionInfo.duration,
|
||||
alignment: transitionInfo.alignment,
|
||||
child: child,
|
||||
).buildTransitions(context, animation, secondaryAnimation, child),
|
||||
).buildTransitions(
|
||||
context, animation, secondaryAnimation, child),
|
||||
)
|
||||
: MaterialPage(key: state.pageKey, child: child);
|
||||
},
|
||||
|
@ -307,7 +392,8 @@ class TransitionInfo {
|
|||
final Duration duration;
|
||||
final Alignment? alignment;
|
||||
|
||||
static TransitionInfo appDefault() => const TransitionInfo(hasTransition: false);
|
||||
static TransitionInfo appDefault() =>
|
||||
const TransitionInfo(hasTransition: false);
|
||||
}
|
||||
|
||||
class RootPageContext {
|
||||
|
@ -319,7 +405,9 @@ class RootPageContext {
|
|||
final rootPageContext = context.read<RootPageContext?>();
|
||||
final isRootPage = rootPageContext?.isRootPage ?? false;
|
||||
final location = GoRouterState.of(context).uri.toString();
|
||||
return isRootPage && location != '/' && location != rootPageContext?.errorRoute;
|
||||
return isRootPage &&
|
||||
location != '/' &&
|
||||
location != rootPageContext?.errorRoute;
|
||||
}
|
||||
|
||||
static Widget wrap(Widget child, {String? errorRoute}) =>
|
||||
|
|
|
@ -2,7 +2,6 @@ import 'dart:async';
|
|||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:app_links/app_links.dart';
|
||||
import 'package:app_tracking_transparency/app_tracking_transparency.dart';
|
||||
import 'package:firebase_core/firebase_core.dart';
|
||||
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
||||
|
@ -17,9 +16,9 @@ import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
|||
import 'package:hub/flutter_flow/flutter_flow_util.dart';
|
||||
import 'package:hub/flutter_flow/internationalization.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/pages/forgot_password_page/forgot_password_screen.dart';
|
||||
import 'package:hub/shared/helpers/storage/base_storage.dart';
|
||||
import 'package:hub/shared/helpers/storage/storage_helper.dart';
|
||||
import 'package:hub/shared/services/deeplink/deep_link_service.dart';
|
||||
import 'package:hub/shared/services/localization/localization_service.dart';
|
||||
import 'package:responsive_framework/responsive_framework.dart';
|
||||
|
||||
|
@ -107,7 +106,8 @@ class App extends StatefulWidget {
|
|||
@override
|
||||
State<App> createState() => _AppState();
|
||||
|
||||
static _AppState of(BuildContext context) => context.findAncestorStateOfType<_AppState>()!;
|
||||
static _AppState of(BuildContext context) =>
|
||||
context.findAncestorStateOfType<_AppState>()!;
|
||||
}
|
||||
|
||||
class _AppState extends State<App> with WidgetsBindingObserver {
|
||||
|
@ -116,8 +116,6 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
|||
late AppStateNotifier _appStateNotifier;
|
||||
late GoRouter _router;
|
||||
bool displaySplashImage = true;
|
||||
late AppLinks _appLinks;
|
||||
StreamSubscription<Uri>? _linkSubscription;
|
||||
|
||||
final ThemeData _darkTheme = ThemeData(
|
||||
brightness: Brightness.dark,
|
||||
|
@ -151,7 +149,8 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
|||
}),
|
||||
),
|
||||
);
|
||||
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates = const [
|
||||
final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates =
|
||||
const [
|
||||
FFLocalizationsDelegate(),
|
||||
GlobalMaterialLocalizations.delegate,
|
||||
GlobalWidgetsLocalizations.delegate,
|
||||
|
@ -179,41 +178,6 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
|||
);
|
||||
};
|
||||
|
||||
Future<void> initDeepLinks() async {
|
||||
_appLinks = AppLinks();
|
||||
_linkSubscription = _appLinks.uriLinkStream.listen((uri) {
|
||||
final bool isRecovered = StorageHelper().isRecovered;
|
||||
if (!isRecovered) openAppLink(uri);
|
||||
});
|
||||
}
|
||||
|
||||
void openAppLink(Uri uri) {
|
||||
final bool isRecovered = StorageHelper().isRecovered;
|
||||
log('isRecovered: $isRecovered');
|
||||
if (isRecovered) return;
|
||||
StorageHelper().isRecovered = true;
|
||||
final String email = uri.queryParameters['email'] ?? '';
|
||||
final String token = uri.queryParameters['token'] ?? '';
|
||||
final bool isNotEmpty = email.isNotEmpty && token.isNotEmpty;
|
||||
if (isNotEmpty) {
|
||||
final BuildContext context = StorageHelper().context!;
|
||||
final FlutterFlowTheme theme = FlutterFlowTheme.of(context);
|
||||
final Widget screen = ForgotPasswordScreen(email: email, token: token);
|
||||
builder(context) => screen;
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
builder: (context) => Padding(padding: MediaQuery.viewInsetsOf(context), child: builder(context)),
|
||||
isScrollControlled: true,
|
||||
// barrierColor: theme.primaryBackground.withOpacity(0.2),
|
||||
backgroundColor: theme.primaryBackground,
|
||||
showDragHandle: true,
|
||||
useSafeArea: true,
|
||||
enableDrag: true,
|
||||
// isDismissible: true,
|
||||
).whenComplete(() => StorageHelper().isRecovered = false);
|
||||
}
|
||||
}
|
||||
|
||||
void _setupFirebaseMessaging() async {
|
||||
FirebaseMessaging messaging = FirebaseMessaging.instance;
|
||||
RemoteMessage? initialMessage = await messaging.getInitialMessage();
|
||||
|
@ -228,7 +192,8 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
|||
await StorageHelper().s(SecureStorageKey.haveLocal.value, true);
|
||||
log('onMessageOpenedApp');
|
||||
} else {
|
||||
onMessageReceived(message.data, message.notification!.body, message.data['click_action']);
|
||||
onMessageReceived(message.data, message.notification!.body,
|
||||
message.data['click_action']);
|
||||
}
|
||||
});
|
||||
FirebaseMessaging.instance.getInitialMessage().then((message) async {
|
||||
|
@ -262,16 +227,17 @@ class _AppState extends State<App> with WidgetsBindingObserver {
|
|||
_appStateNotifier = AppStateNotifier.instance;
|
||||
_router = createRouter(_appStateNotifier);
|
||||
Future.delayed(
|
||||
const Duration(milliseconds: 1000), () => setState(() => _appStateNotifier.stopShowingSplashImage()));
|
||||
const Duration(milliseconds: 1000),
|
||||
() => setState(() => _appStateNotifier.stopShowingSplashImage()),
|
||||
);
|
||||
|
||||
_setupFirebaseMessaging();
|
||||
WidgetsBinding.instance.addPersistentFrameCallback((_) => initDeepLinks());
|
||||
DeepLinkService().ensureInitialization();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
WidgetsBinding.instance.removeObserver(this);
|
||||
_linkSubscription?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
|
|
@ -232,7 +232,11 @@ class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> with Ticker
|
|||
? null
|
||||
: () async {
|
||||
await AuthenticationService.changePassword(
|
||||
context, widget.email, _model.passwordConfirmFormTextController!.text, widget.token);
|
||||
context,
|
||||
widget.email,
|
||||
_model.passwordConfirmFormTextController!.text,
|
||||
widget.token,
|
||||
).then((v) => v == true ? context.pop() : null);
|
||||
setState(() {});
|
||||
},
|
||||
text: FFLocalizations.of(context).getVariableText(
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:hub/shared/helpers/storage/storage_helper.dart';
|
||||
import 'package:hub/shared/mixins/switcher_mixin.dart';
|
||||
import 'package:hub/shared/services/deeplink/deep_link_service.dart';
|
||||
|
||||
import '/components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart';
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
|
@ -29,7 +30,6 @@ class _SignInPageWidgetState extends State<SignInPageWidget> {
|
|||
@override
|
||||
void dispose() {
|
||||
_model.dispose();
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/shared/helpers/storage/storage_helper.dart';
|
||||
import 'package:hub/shared/mixins/switcher_mixin.dart';
|
||||
import 'package:hub/shared/services/deeplink/deep_link_service.dart';
|
||||
|
||||
import '/components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart';
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
|
|
|
@ -3,6 +3,7 @@ import 'package:flutter/scheduler.dart';
|
|||
import 'package:hub/shared/helpers/storage/base_storage.dart';
|
||||
import 'package:hub/shared/helpers/storage/storage_helper.dart';
|
||||
import 'package:hub/shared/mixins/switcher_mixin.dart';
|
||||
import 'package:hub/shared/services/deeplink/deep_link_service.dart';
|
||||
|
||||
import '/components/templates_components/welcome_template_component/welcome_template_component_widget.dart';
|
||||
import '/flutter_flow/flutter_flow_theme.dart';
|
||||
|
@ -46,7 +47,6 @@ class _WelcomePageWidgetState extends State<WelcomePageWidget> {
|
|||
@override
|
||||
void dispose() {
|
||||
_model.dispose();
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
|
|
@ -143,7 +143,7 @@ class AuthenticationService {
|
|||
context.go('/welcomePage', extra: extra);
|
||||
}
|
||||
|
||||
static Future<void> forgotPassword(BuildContext context, String email) async {
|
||||
static Future<bool> forgotPassword(BuildContext context, String email) async {
|
||||
try {
|
||||
final ApiCallResponse? response;
|
||||
final ForgotPasswordCall callback = PhpGroup.forgotPasswordCall;
|
||||
|
@ -154,16 +154,19 @@ class AuthenticationService {
|
|||
|
||||
if (response.jsonBody['error'] == false) {
|
||||
await DialogUtil.success(context, message);
|
||||
return true;
|
||||
} else {
|
||||
await DialogUtil.error(context, response.jsonBody['error_msg']);
|
||||
return false;
|
||||
}
|
||||
} catch (e, s) {
|
||||
await DialogUtil.errorDefault(context);
|
||||
LogUtil.requestAPIFailed('forgotPassword.php', email, "Forgot Password", e, s);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static Future<void> changePassword(BuildContext context, String email, String password, String token) async {
|
||||
static Future<bool> changePassword(BuildContext context, String email, String password, String token) async {
|
||||
try {
|
||||
final ApiCallResponse response =
|
||||
await PhpGroup.changePasswordCall.call(email: email, psswd: password, token: token);
|
||||
|
@ -174,13 +177,16 @@ class AuthenticationService {
|
|||
ptText: "Senha alterada com sucesso!",
|
||||
);
|
||||
await DialogUtil.success(context, message).then((_) => context.pop);
|
||||
return true;
|
||||
} else {
|
||||
final String message = response.jsonBody['error_msg'];
|
||||
await DialogUtil.error(context, message);
|
||||
return false;
|
||||
}
|
||||
} catch (e, s) {
|
||||
await DialogUtil.errorDefault(context);
|
||||
LogUtil.requestAPIFailed('changePassword.php', email, "Change Password", e, s);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
import 'dart:async';
|
||||
import 'dart:developer';
|
||||
import 'package:app_links/app_links.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hub/flutter_flow/flutter_flow_theme.dart';
|
||||
import 'package:hub/flutter_flow/nav/nav.dart';
|
||||
import 'package:hub/pages/forgot_password_page/forgot_password_screen.dart';
|
||||
import 'package:hub/shared/helpers/storage_helper.dart';
|
||||
|
||||
class DeepLinkService {
|
||||
static final DeepLinkService _instance = DeepLinkService._internal();
|
||||
|
||||
factory DeepLinkService() => _instance;
|
||||
|
||||
DeepLinkService._internal();
|
||||
|
||||
late final AppLinks _appLinks;
|
||||
StreamSubscription<Uri>? _linkSubscription;
|
||||
bool _isInitialized = false;
|
||||
|
||||
void ensureInitialization() async {
|
||||
if (_isInitialized) return;
|
||||
try {
|
||||
_appLinks = AppLinks();
|
||||
print('initDeepLinks');
|
||||
_linkSubscription = _appLinks.uriLinkStream.listen((uri) async {
|
||||
if (!StorageHelper().isRecovered) {
|
||||
await _handleDeepLink(uri);
|
||||
}
|
||||
});
|
||||
_isInitialized = true;
|
||||
} catch (e) {
|
||||
print('Error initializing deep links: $e');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _handleDeepLink(Uri uri) async {
|
||||
try {
|
||||
print('Handling deep link: $uri');
|
||||
if (StorageHelper().isRecovered) return;
|
||||
|
||||
StorageHelper().isRecovered = true;
|
||||
final email = uri.queryParameters['email'] ?? '';
|
||||
final token = uri.queryParameters['token'] ?? '';
|
||||
print('email: $email, token: $token');
|
||||
|
||||
if (email.isNotEmpty && token.isNotEmpty) {
|
||||
await _showForgotPasswordScreen(email, token);
|
||||
}
|
||||
} catch (e, s) {
|
||||
print('Error handling deep link: $e, $s');
|
||||
log('Error handling', error: e, stackTrace: s);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _showForgotPasswordScreen(String email, String token) async {
|
||||
try {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
await showModalBottomSheet(
|
||||
context: key.currentContext!,
|
||||
builder: (context) => Padding(
|
||||
padding: MediaQuery.viewInsetsOf(context),
|
||||
child: ForgotPasswordScreen(email: email, token: token),
|
||||
),
|
||||
isScrollControlled: true,
|
||||
backgroundColor:
|
||||
FlutterFlowTheme.of(key.currentContext!).primaryBackground,
|
||||
showDragHandle: true,
|
||||
useSafeArea: true,
|
||||
enableDrag: true,
|
||||
).whenComplete(() {
|
||||
StorageHelper().isRecovered = false;
|
||||
print('showModalBottomSheet completed');
|
||||
});
|
||||
});
|
||||
} catch (e, s) {
|
||||
print('Error showing forgot password screen: $e, $s');
|
||||
log('Error handling', error: e, stackTrace: s);
|
||||
}
|
||||
}
|
||||
|
||||
void dispose() {
|
||||
_linkSubscription?.cancel();
|
||||
}
|
||||
}
|
|
@ -1,3 +1,4 @@
|
|||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:device_info_plus/device_info_plus.dart';
|
||||
|
@ -13,7 +14,7 @@ class DeviceUtil {
|
|||
|
||||
return androidId;
|
||||
} on PlatformException catch (e) {
|
||||
print("Failed to get Android ID: '${e.message}'.");
|
||||
log("Failed to get Android ID: '${e.message}'.");
|
||||
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -5,13 +5,14 @@ import 'package:hub/backend/api_requests/api_calls.dart';
|
|||
|
||||
class LogUtil {
|
||||
static void requestAPIFailed(String url, String body, String reason, dynamic error, StackTrace stack) async {
|
||||
log("URL: ${PhpGroup.getBaseUrl()}/$url");
|
||||
final fullUrl = "${PhpGroup.getBaseUrl()}/$url";
|
||||
log("URL: $fullUrl");
|
||||
log("Body: $body");
|
||||
log("Motivo: $reason");
|
||||
log("Reason: $reason");
|
||||
log("Error: ${error.toString()}");
|
||||
log("Stack: ${stack.toString()}");
|
||||
|
||||
FirebaseCrashlytics.instance.setCustomKey('URL', "${PhpGroup.getBaseUrl()}/$url");
|
||||
FirebaseCrashlytics.instance.setCustomKey('URL', fullUrl);
|
||||
FirebaseCrashlytics.instance.setCustomKey('Body', body);
|
||||
|
||||
await FirebaseCrashlytics.instance.recordError(error, stack, reason: reason);
|
||||
|
|
183
pubspec.lock
183
pubspec.lock
|
@ -165,10 +165,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: camera_avfoundation
|
||||
sha256: "0d04cec8715b59fb6dc60eefb47e69024f51233c570e475b886dc9290568bca7"
|
||||
sha256: "2e4c568f70e406ccb87376bc06b53d2f5bebaab71e2fbcc1a950e31449381bcf"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.17+4"
|
||||
version: "0.9.17+5"
|
||||
camera_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -205,10 +205,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: cli_util
|
||||
sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19
|
||||
sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.4.1"
|
||||
version: "0.4.2"
|
||||
clock:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -229,10 +229,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: connectivity_plus
|
||||
sha256: "2056db5241f96cdc0126bd94459fc4cdc13876753768fc7a31c425e50a7177d0"
|
||||
sha256: "876849631b0c7dc20f8b471a2a03142841b482438e3b707955464f5ffca3e4c3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.5"
|
||||
version: "6.1.0"
|
||||
connectivity_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -261,10 +261,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: crypto
|
||||
sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27
|
||||
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.5"
|
||||
version: "3.0.6"
|
||||
csv:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -341,10 +341,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: equatable
|
||||
sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
|
||||
sha256: b35578f687b79243d39008c44d638474d93e9091e578c970efef41ce0c3fa000
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.5"
|
||||
version: "2.0.6"
|
||||
fake_async:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -365,10 +365,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: file
|
||||
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
|
||||
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.0"
|
||||
version: "7.0.1"
|
||||
file_picker:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -381,10 +381,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_linux
|
||||
sha256: "712ce7fab537ba532c8febdb1a8f167b32441e74acd68c3ccb2e36dcb52c4ab2"
|
||||
sha256: b2b91daf8a68ecfa4a01b778a6f52edef9b14ecd506e771488ea0f2e0784198b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.3"
|
||||
version: "0.9.3+1"
|
||||
file_selector_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -501,10 +501,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: fixnum
|
||||
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
|
||||
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
version: "1.1.1"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
|
@ -534,11 +534,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.4.1"
|
||||
flutter_driver:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_expandable_fab:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -636,10 +631,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_riverpod
|
||||
sha256: "711d916456563f715bde1e139d7cfdca009f8264befab3ac9f8ded8b6ec26405"
|
||||
sha256: "9532ee6db4a943a1ed8383072a2e3eeda041db5657cdf6d2acecf3c21ecbe7e1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.3"
|
||||
version: "2.6.1"
|
||||
flutter_secure_storage:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -716,10 +711,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_svg
|
||||
sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2"
|
||||
sha256: "936d9c1c010d3e234d1672574636f3352b4941ca3decaddd3cafaeb9ad49c471"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.10+1"
|
||||
version: "2.0.15"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
|
@ -742,10 +737,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: font_awesome_flutter
|
||||
sha256: "275ff26905134bcb59417cf60ad979136f1f8257f2f449914b2c3e05bbb4cd6f"
|
||||
sha256: d3a89184101baec7f4600d58840a764d2ef760fe1c5a20ef9e6b0e9b24a07a3a
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.7.0"
|
||||
version: "10.8.0"
|
||||
from_css_color:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -754,19 +749,14 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
fuchsia_remote_debug_protocol:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
go_router:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: go_router
|
||||
sha256: "6f1b756f6e863259a99135ff3c95026c3cdca17d10ebef2bba2261a25ddc8bbc"
|
||||
sha256: "8ae664a70174163b9f65ea68dd8673e29db8f9095de7b5cd00e167c621f4fef5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.3.0"
|
||||
version: "14.6.0"
|
||||
google_fonts:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -819,10 +809,10 @@ packages:
|
|||
dependency: "direct dev"
|
||||
description:
|
||||
name: image
|
||||
sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8"
|
||||
sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.2.0"
|
||||
version: "4.3.0"
|
||||
image_picker:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -835,18 +825,18 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: image_picker_android
|
||||
sha256: d34e0d9e024e81321b2aeed7b202ec6181cc282e6a1c0c0b4e6ad07ef1065d82
|
||||
sha256: "8faba09ba361d4b246dc0a17cb4289b3324c2b9f6db7b3d457ee69106a86bd32"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.12+16"
|
||||
version: "0.8.12+17"
|
||||
image_picker_for_web:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: image_picker_for_web
|
||||
sha256: "65d94623e15372c5c51bebbcb820848d7bcb323836e12dfdba60b5d3a8b39e50"
|
||||
sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.5"
|
||||
version: "3.0.6"
|
||||
image_picker_ios:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -887,11 +877,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.1+1"
|
||||
integration_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
intl:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1008,10 +993,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: logging
|
||||
sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
|
||||
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
version: "1.3.0"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1032,10 +1017,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: material_symbols_icons
|
||||
sha256: fa19f3a99f280c81fe23d7f7ef1c4000511fa40ee52df43e0a3a4c91184ddb15
|
||||
sha256: "1dea2aef1c83434f832f14341a5ffa1254e76b68e4d90333f95f8a2643bf1024"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.2788.0"
|
||||
version: "4.2799.0"
|
||||
maybe_just_nothing:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1112,18 +1097,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: path_parsing
|
||||
sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf
|
||||
sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
version: "1.1.0"
|
||||
path_provider:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: path_provider
|
||||
sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
|
||||
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
version: "2.1.5"
|
||||
path_provider_android:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1184,10 +1169,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_android
|
||||
sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa"
|
||||
sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "12.0.12"
|
||||
version: "12.0.13"
|
||||
permission_handler_apple:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1200,10 +1185,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_html
|
||||
sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851
|
||||
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.3+2"
|
||||
version: "0.1.3+5"
|
||||
permission_handler_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1240,10 +1225,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: platform
|
||||
sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
|
||||
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.5"
|
||||
version: "3.1.6"
|
||||
plugin_platform_interface:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1252,14 +1237,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.8"
|
||||
process:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: process
|
||||
sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.2"
|
||||
provider:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1304,10 +1281,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: riverpod
|
||||
sha256: c86fedfb45dd1da98ee6493dd9374325cdf494e7d523ebfb0c387eecc5f7b5c9
|
||||
sha256: "59062512288d3056b2321804332a13ffdd1bf16df70dcc8e506e411280a72959"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.3"
|
||||
version: "2.6.1"
|
||||
rxdart:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1336,10 +1313,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: shared_preferences
|
||||
sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051"
|
||||
sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
version: "2.3.3"
|
||||
shared_preferences_android:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1413,10 +1390,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: sqflite
|
||||
sha256: "79a297dc3cc137e758c6a4baf83342b039e5a6d2436fcdf3f96a00adaaf2ad62"
|
||||
sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
version: "2.4.1"
|
||||
sqflite_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1429,18 +1406,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: sqflite_common
|
||||
sha256: "4468b24876d673418a7b7147e5a08a715b4998a7ae69227acafaab762e0e5490"
|
||||
sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.4+5"
|
||||
version: "2.5.4+6"
|
||||
sqflite_darwin:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sqflite_darwin
|
||||
sha256: "769733dddf94622d5541c73e4ddc6aa7b252d865285914b6fcd54a63c4b4f027"
|
||||
sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.1-1"
|
||||
version: "2.4.1"
|
||||
sqflite_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1489,14 +1466,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
sync_http:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sync_http
|
||||
sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.3.1"
|
||||
synchronized:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1533,10 +1502,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
|
||||
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.2"
|
||||
version: "1.4.0"
|
||||
url_launcher:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1549,10 +1518,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: url_launcher_android
|
||||
sha256: "8fc3bae0b68c02c47c5c86fa8bfa74471d42687b0eded01b78de87872db745e2"
|
||||
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.12"
|
||||
version: "6.3.14"
|
||||
url_launcher_ios:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1565,10 +1534,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_linux
|
||||
sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af
|
||||
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.0"
|
||||
version: "3.2.1"
|
||||
url_launcher_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1597,10 +1566,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_windows
|
||||
sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185"
|
||||
sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.2"
|
||||
version: "3.1.3"
|
||||
uuid:
|
||||
dependency: "direct overridden"
|
||||
description:
|
||||
|
@ -1613,26 +1582,26 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics
|
||||
sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3"
|
||||
sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.11+1"
|
||||
version: "1.1.15"
|
||||
vector_graphics_codec:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics_codec
|
||||
sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da
|
||||
sha256: "2430b973a4ca3c4dbc9999b62b8c719a160100dcbae5c819bae0cacce32c9cdb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.11+1"
|
||||
version: "1.1.12"
|
||||
vector_graphics_compiler:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics_compiler
|
||||
sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81"
|
||||
sha256: ab9ff38fc771e9ee1139320adbe3d18a60327370c218c60752068ebee4b49ab1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.11+1"
|
||||
version: "1.1.15"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1657,14 +1626,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.5.1"
|
||||
webdriver:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: webdriver
|
||||
sha256: "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
webview_flutter:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1677,10 +1638,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: webview_flutter_android
|
||||
sha256: "74693a212d990b32e0b7055d27db973a18abf31c53942063948cdfaaef9787ba"
|
||||
sha256: "285cedfd9441267f6cca8843458620b5fda1af75b04f5818d0441acda5d7df19"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
version: "4.1.0"
|
||||
webview_flutter_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1693,10 +1654,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: webview_flutter_wkwebview
|
||||
sha256: d4034901d96357beb1b6717ebf7d583c88e40cfc6eb85fe76dd1bf0979a9f251
|
||||
sha256: "3be297aa4ca78205abdd284cf55f168c35246c75b3079990ad8ba9d257681a30"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.16.0"
|
||||
version: "3.16.2"
|
||||
win32:
|
||||
dependency: "direct overridden"
|
||||
description:
|
||||
|
|
20
pubspec.yaml
20
pubspec.yaml
|
@ -3,7 +3,7 @@ description: A new Flutter project.
|
|||
|
||||
publish_to: "none"
|
||||
|
||||
version: 1.2.0+14
|
||||
version: 1.2.1+17
|
||||
|
||||
environment:
|
||||
sdk: ">=3.0.0 <4.0.0"
|
||||
|
@ -28,7 +28,7 @@ dependencies:
|
|||
firebase_messaging: ^15.1.0
|
||||
dropdown_button2: 2.3.9
|
||||
easy_debounce: 2.0.3
|
||||
equatable: 2.0.5
|
||||
equatable: ^2.0.6
|
||||
file_picker: ^8.0.7
|
||||
flutter_expandable_fab: ^2.1.0
|
||||
firebase_analytics: ^11.3.0
|
||||
|
@ -45,8 +45,8 @@ dependencies:
|
|||
flutter_secure_storage_windows: 3.1.2
|
||||
flutter_spinkit: 5.2.1
|
||||
flutter_staggered_grid_view: 0.7.0
|
||||
flutter_svg: 2.0.10+1
|
||||
font_awesome_flutter: 10.7.0
|
||||
flutter_svg: ^2.0.15
|
||||
font_awesome_flutter: ^10.8.0
|
||||
from_css_color: 2.0.0
|
||||
go_router: ^14.3.0
|
||||
google_fonts: 6.2.1
|
||||
|
@ -110,18 +110,16 @@ dependency_overrides:
|
|||
dev_dependencies:
|
||||
flutter_launcher_icons: ^0.14.1
|
||||
flutter_lints: ^5.0.0
|
||||
image: 4.2.0
|
||||
image: ^4.3.0
|
||||
lints: ^5.0.0
|
||||
# build_runner: ^2.4.13
|
||||
# mockito: ^5.4.4
|
||||
integration_test:
|
||||
sdk: flutter
|
||||
# integration_test:
|
||||
# sdk: flutter
|
||||
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
|
||||
|
||||
|
||||
|
||||
flutter_launcher_icons:
|
||||
android: "launcher_icon"
|
||||
ios: true
|
||||
|
@ -131,8 +129,6 @@ flutter_launcher_icons:
|
|||
adaptive_icon_background: "assets/images/adaptive_background_icon.svg"
|
||||
adaptive_icon_foreground: "assets/images/adaptive_foreground_icon.svg"
|
||||
|
||||
|
||||
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
|
|
Loading…
Reference in New Issue