From 006b421a9eed932707b21f3e3a538dafeec2d2e3 Mon Sep 17 00:00:00 2001 From: amirrezaghabeli Date: Wed, 1 Oct 2025 14:11:53 +0330 Subject: [PATCH] fixed TM-171 jira task --- lib/core/routes/app_routes.dart | 20 +++++++++++++++- .../pages/t_forget_password_create_page.dart | 5 ++-- .../pages/d_forget_password_otp_page.dart | 0 .../pages/forgot_password_otp_screen.dart | 8 ++++--- .../pages/m_forget_password_otp_page.dart | 0 .../pages/t_forget_password_otp_page.dart | 4 ++-- .../strings/forgot_password_otp_strings.dart | 0 .../pages/forgot_password_screen.dart | 2 ++ .../pages/t_forgot_password_page.dart | 6 ++--- lib/views/login/pages/login_tablet_page.dart | 12 +++++----- web/firebase-messaging-sw.js | 24 +++++++++++++++++++ web/icons/notification.svg | 5 ++++ 12 files changed, 69 insertions(+), 17 deletions(-) rename lib/views/{forget_password_otp.dart => forget_password_otp}/pages/d_forget_password_otp_page.dart (100%) rename lib/views/{forget_password_otp.dart => forget_password_otp}/pages/forgot_password_otp_screen.dart (55%) rename lib/views/{forget_password_otp.dart => forget_password_otp}/pages/m_forget_password_otp_page.dart (100%) rename lib/views/{forget_password_otp.dart => forget_password_otp}/pages/t_forget_password_otp_page.dart (98%) rename lib/views/{forget_password_otp.dart => forget_password_otp}/strings/forgot_password_otp_strings.dart (100%) create mode 100644 web/icons/notification.svg diff --git a/lib/core/routes/app_routes.dart b/lib/core/routes/app_routes.dart index f76ef51..6c65b05 100644 --- a/lib/core/routes/app_routes.dart +++ b/lib/core/routes/app_routes.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:tm_app/views/completion_of_documents/pages/m_completion_of_documents_page.dart'; import 'package:tm_app/views/detail/pages/detail_screen.dart'; import 'package:tm_app/views/forget_password_create/pages/forgot_password_create_screen.dart'; -import 'package:tm_app/views/forget_password_otp.dart/pages/forgot_password_otp_screen.dart'; +import 'package:tm_app/views/forget_password_otp/pages/forgot_password_otp_screen.dart'; import 'package:tm_app/views/home/pages/home_screen.dart'; import 'package:tm_app/views/liked_tenders/pages/liked_tenders_screen.dart'; import 'package:tm_app/views/login/pages/login_screen.dart'; @@ -34,6 +36,22 @@ final GoRouter appRouter = GoRouter( routes: $appRoutes, initialLocation: '/splash', navigatorKey: rootNavigatorKey, + redirect: (context, state) { + final prefs = context.read(); + final hasToken = prefs.getString('bearer') != null; + final path = state.uri.path; + final location = state.matchedLocation; + final isSplash = path == '/splash' || location == '/splash'; + final isLogin = path == '/login' || location == '/login'; + final isForgotFlow = + path.startsWith('/forgot-password') || + location.startsWith('/forgot-password'); + final isPublic = isSplash || isLogin || isForgotFlow; + if (!hasToken && !isPublic) { + return '/splash'; + } + return null; + }, ); // Login route - outside the shell diff --git a/lib/views/forget_password_create/pages/t_forget_password_create_page.dart b/lib/views/forget_password_create/pages/t_forget_password_create_page.dart index 5c8f285..a23b02c 100644 --- a/lib/views/forget_password_create/pages/t_forget_password_create_page.dart +++ b/lib/views/forget_password_create/pages/t_forget_password_create_page.dart @@ -101,7 +101,7 @@ class _TabletForgotPasswordCreatePageState onToggleVisibility: viewModel.toggleForgotPasswordVisibility, ), - SizedBox(height: 16.0.h()), + SizedBox(height: 24.0.h()), Container( alignment: Alignment.centerLeft, padding: EdgeInsets.only(left: 16.0.w()), @@ -149,7 +149,7 @@ class _TabletForgotPasswordCreatePageState ), ), ), - SizedBox(height: 80.0.h()), + SizedBox(height: 70.0.h()), viewModel.isResetPasswordLoading ? BaseButton( isEnabled: viewModel.isNewPasswordValid, @@ -169,6 +169,7 @@ class _TabletForgotPasswordCreatePageState : null, ), + SizedBox(height: 32.0.h()), TextButton( onPressed: () { context.pop(); diff --git a/lib/views/forget_password_otp.dart/pages/d_forget_password_otp_page.dart b/lib/views/forget_password_otp/pages/d_forget_password_otp_page.dart similarity index 100% rename from lib/views/forget_password_otp.dart/pages/d_forget_password_otp_page.dart rename to lib/views/forget_password_otp/pages/d_forget_password_otp_page.dart diff --git a/lib/views/forget_password_otp.dart/pages/forgot_password_otp_screen.dart b/lib/views/forget_password_otp/pages/forgot_password_otp_screen.dart similarity index 55% rename from lib/views/forget_password_otp.dart/pages/forgot_password_otp_screen.dart rename to lib/views/forget_password_otp/pages/forgot_password_otp_screen.dart index f796204..7b31369 100644 --- a/lib/views/forget_password_otp.dart/pages/forgot_password_otp_screen.dart +++ b/lib/views/forget_password_otp/pages/forgot_password_otp_screen.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:tm_app/views/forget_password_otp.dart/pages/d_forget_password_otp_page.dart'; -import 'package:tm_app/views/forget_password_otp.dart/pages/m_forget_password_otp_page.dart'; -import 'package:tm_app/views/forget_password_otp.dart/pages/t_forget_password_otp_page.dart'; +import 'package:tm_app/core/utils/size_config.dart'; +import 'package:tm_app/views/forget_password_otp/pages/d_forget_password_otp_page.dart'; +import 'package:tm_app/views/forget_password_otp/pages/m_forget_password_otp_page.dart'; +import 'package:tm_app/views/forget_password_otp/pages/t_forget_password_otp_page.dart'; import '../../shared/responsive_builder.dart'; @@ -10,6 +11,7 @@ class ForgotPasswordOtpScreen extends StatelessWidget { @override Widget build(BuildContext context) { + SizeConfig.init(context); return const ResponsiveBuilder( mobile: MobileForgotPasswordOtpPage(), tablet: TabletForgotPasswordOtpPage(), diff --git a/lib/views/forget_password_otp.dart/pages/m_forget_password_otp_page.dart b/lib/views/forget_password_otp/pages/m_forget_password_otp_page.dart similarity index 100% rename from lib/views/forget_password_otp.dart/pages/m_forget_password_otp_page.dart rename to lib/views/forget_password_otp/pages/m_forget_password_otp_page.dart diff --git a/lib/views/forget_password_otp.dart/pages/t_forget_password_otp_page.dart b/lib/views/forget_password_otp/pages/t_forget_password_otp_page.dart similarity index 98% rename from lib/views/forget_password_otp.dart/pages/t_forget_password_otp_page.dart rename to lib/views/forget_password_otp/pages/t_forget_password_otp_page.dart index 22bddd8..30ffab4 100644 --- a/lib/views/forget_password_otp.dart/pages/t_forget_password_otp_page.dart +++ b/lib/views/forget_password_otp/pages/t_forget_password_otp_page.dart @@ -113,7 +113,7 @@ class _TabletForgotPasswordOtpPageState ), ), ), - SizedBox(height: 24.0.h()), + SizedBox(height: 70.0.h()), viewModel.isLoadingOtp ? BaseButton( isEnabled: viewModel.isOtpValid, @@ -131,7 +131,7 @@ class _TabletForgotPasswordOtpPageState } : null, ), - const SizedBox(height: 12.0), + SizedBox(height: 32.0.h()), TextButton( onPressed: () { context.pop(); diff --git a/lib/views/forget_password_otp.dart/strings/forgot_password_otp_strings.dart b/lib/views/forget_password_otp/strings/forgot_password_otp_strings.dart similarity index 100% rename from lib/views/forget_password_otp.dart/strings/forgot_password_otp_strings.dart rename to lib/views/forget_password_otp/strings/forgot_password_otp_strings.dart diff --git a/lib/views/forgot_password/pages/forgot_password_screen.dart b/lib/views/forgot_password/pages/forgot_password_screen.dart index ca421cd..63294c5 100644 --- a/lib/views/forgot_password/pages/forgot_password_screen.dart +++ b/lib/views/forgot_password/pages/forgot_password_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:tm_app/core/utils/size_config.dart'; import '../../shared/responsive_builder.dart'; import 'd_forgot_apssword_page.dart'; @@ -10,6 +11,7 @@ class ForgotPasswordScreen extends StatelessWidget { @override Widget build(BuildContext context) { + SizeConfig.init(context); return const ResponsiveBuilder( mobile: MobileForgotPasswordPage(), tablet: TabletForgotPasswordPage(), diff --git a/lib/views/forgot_password/pages/t_forgot_password_page.dart b/lib/views/forgot_password/pages/t_forgot_password_page.dart index cbae08e..f60c456 100644 --- a/lib/views/forgot_password/pages/t_forgot_password_page.dart +++ b/lib/views/forgot_password/pages/t_forgot_password_page.dart @@ -59,7 +59,7 @@ class _TabletForgotPasswordPageState extends State { builder: (context, viewModel, _) { return Center( child: SizedBox( - width: 364, + width: 364.0.w(), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -97,7 +97,7 @@ class _TabletForgotPasswordPageState extends State { label: ForgotPasswordStrings.emailHint, isPassword: false, ), - SizedBox(height: 24.0.h()), + SizedBox(height: 70.0.h()), viewModel.isLoadingForgot ? const BaseButton( isEnabled: false, @@ -115,7 +115,7 @@ class _TabletForgotPasswordPageState extends State { } : null, ), - const SizedBox(height: 12), + SizedBox(height: 32.0.h()), TextButton( onPressed: () { Navigator.pop(context); diff --git a/lib/views/login/pages/login_tablet_page.dart b/lib/views/login/pages/login_tablet_page.dart index 5b6d700..82f824f 100644 --- a/lib/views/login/pages/login_tablet_page.dart +++ b/lib/views/login/pages/login_tablet_page.dart @@ -51,7 +51,7 @@ class _LoginTabletPageState extends State { child: SingleChildScrollView( padding: EdgeInsets.symmetric(horizontal: 24.0.w()), child: SizedBox( - width: 526, + width: 364.0.w(), child: Consumer( builder: (context, viewModel, _) { return Column( @@ -65,9 +65,9 @@ class _LoginTabletPageState extends State { height: 50.0.h(), ), ), - SizedBox(height: 32.0.h()), + SizedBox(height: 72.0.h()), const LoginTitle(), - SizedBox(height: 32.0.h()), + SizedBox(height: 40.0.h()), LoginTextField( controller: viewModel.usernameController, focusNode: viewModel.usernameFocus, @@ -77,7 +77,7 @@ class _LoginTabletPageState extends State { borderRedus: 12, prefixIconPadding: 4.0.w(), ), - SizedBox(height: 16.0.h()), + SizedBox(height: 24.0.h()), LoginTextField( controller: viewModel.passwordController, focusNode: viewModel.passwordFocus, @@ -90,7 +90,7 @@ class _LoginTabletPageState extends State { onToggleVisibility: viewModel.togglePasswordVisibility, borderRedus: 12, ), - SizedBox(height: 32.0.h()), + SizedBox(height: 70.0.h()), if (viewModel.isLoading) const BaseButton( isEnabled: false, @@ -107,7 +107,7 @@ class _LoginTabletPageState extends State { } : null, ), - const SizedBox(height: 32.0), + SizedBox(height: 30.0.h()), TextButton( onPressed: () { const ForgotPasswordRouteData().push(context); diff --git a/web/firebase-messaging-sw.js b/web/firebase-messaging-sw.js index 730ae3d..8f56201 100644 --- a/web/firebase-messaging-sw.js +++ b/web/firebase-messaging-sw.js @@ -12,3 +12,27 @@ firebase.initializeApp({ }); const messaging = firebase.messaging(); + +// Handle background messages +messaging.onBackgroundMessage(async (payload) => { + + const notificationTitle = payload.notification.title; + const notificationOptions = { + body: payload.notification.body, + badge: '/icons/Icon-192.svg', + icon: '/icons/notification.svg', + data: payload.data, + click_action: payload.notification.click_action, + }; + + self.registration.showNotification(notificationTitle, notificationOptions); +}); + +// Open or focus the app when a notification is clicked +self.addEventListener('notificationclick', (event) => { + event.notification.close(); + const targetUrl = 'https://app.opplens.com/notification'; + event.waitUntil( + self.clients.openWindow(targetUrl) + ); +}); \ No newline at end of file diff --git a/web/icons/notification.svg b/web/icons/notification.svg new file mode 100644 index 0000000..c02502d --- /dev/null +++ b/web/icons/notification.svg @@ -0,0 +1,5 @@ + + + + +