Refactor loading and error handling in DesktopHomePage; improve notification click handling in service worker

This commit is contained in:
amirrezaghabeli
2025-10-05 10:23:29 +03:30
parent f74f20a4f8
commit d050aab728
3 changed files with 117 additions and 58 deletions
+14 -9
View File
@@ -21,26 +21,32 @@ class DesktopHomePage extends StatelessWidget {
const DesktopNavigationWidget( const DesktopNavigationWidget(
currentIndex: 0, // Home index currentIndex: 0, // Home index
), ),
Expanded( Consumer<HomeViewModel>(
child: Consumer<HomeViewModel>(
builder: (context, homeViewModel, child) { builder: (context, homeViewModel, child) {
if (homeViewModel.isLoading) { if (homeViewModel.isLoading) {
return const Center( return const Expanded(
child: Center(
child: CircularProgressIndicator( child: CircularProgressIndicator(
color: AppColors.secondary50, color: AppColors.secondary50,
), ),
),
); );
} }
if (homeViewModel.errorMessage != null) { if (homeViewModel.errorMessage != null) {
return Center(child: Text(homeViewModel.errorMessage!)); return Expanded(
child: Center(child: Text(homeViewModel.errorMessage!)),
);
} }
if (homeViewModel.tenderApprovalsStateResponse != null && if (homeViewModel.tenderApprovalsStateResponse != null &&
homeViewModel.data != null && homeViewModel.data != null &&
homeViewModel.feedbackStats != null) { homeViewModel.feedbackStats != null) {
return SafeArea( return Expanded(
child: SingleChildScrollView( child: SingleChildScrollView(
child: SizedBox(
width: double.infinity,
child: Center(
child: SizedBox( child: SizedBox(
width: 780, width: 780,
child: Column( child: Column(
@@ -68,16 +74,15 @@ class DesktopHomePage extends StatelessWidget {
), ),
), ),
), ),
),
),
); );
} }
return const Center( return const Center(
child: CircularProgressIndicator( child: CircularProgressIndicator(color: AppColors.secondary50),
color: AppColors.secondary50,
),
); );
}, },
), ),
),
], ],
), ),
); );
@@ -97,6 +97,36 @@ class _MobileNotificationPageState extends State<MobileNotificationPage>
], ],
), ),
SizedBox(height: 12.0.h()), SizedBox(height: 12.0.h()),
Padding(
padding: EdgeInsetsDirectional.only(end: 24.0.w()),
child: Align(
alignment: Alignment.centerRight,
child: InkWell(
onTap: () {
viewModel.markAllAsRead(context);
},
borderRadius: BorderRadius.circular(99),
child: Container(
width: 132.0.w(),
height: 32.0.h(),
decoration: BoxDecoration(
color: AppColors.primary20,
borderRadius: BorderRadius.circular(99),
),
child: Center(
child: Text(
NotificationStrings.markAllAsReadButton,
style: TextStyle(
fontSize: 14.0.sp(),
fontWeight: FontWeight.w500,
color: AppColors.mainBlue,
),
),
),
),
),
),
),
Expanded( Expanded(
child: TabBarView( child: TabBarView(
controller: controller, controller: controller,
+37 -13
View File
@@ -14,25 +14,49 @@ firebase.initializeApp({
const messaging = firebase.messaging(); const messaging = firebase.messaging();
// Handle background messages // Handle background messages
messaging.onBackgroundMessage(async (payload) => { // messaging.onBackgroundMessage(async (payload) => {
const notificationTitle = payload.notification.title; // const notificationTitle = payload.notification.title;
const notificationOptions = { // const notificationOptions = {
body: payload.notification.body, // body: payload.notification.body,
badge: '/icons/Icon-192.svg', // badge: '/icons/Icon-192.svg',
icon: '/icons/notification.svg', // icon: '/icons/notification.svg',
data: payload.data, // data: payload.data,
click_action: payload.notification.click_action, // click_action: payload.notification.click_action,
}; // };
self.registration.showNotification(notificationTitle, notificationOptions); // self.registration.showNotification(notificationTitle, notificationOptions);
}); // });
// Open or focus the app when a notification is clicked // Open or focus the app when a notification is clicked
self.addEventListener('notificationclick', (event) => { self.addEventListener('notificationclick', (event) => {
event.notification.close(); event.notification.close();
const targetUrl = 'https://app.opplens.com/notification';
// Get the URL from the data payload, defaulting to the notification page
const urlToOpen = event.notification.data?.url || '/notification';
const baseUrl = 'https://app.opplens.com';
const targetUrl = urlToOpen.startsWith('http') ? urlToOpen : `${baseUrl}${urlToOpen}`;
console.log('Opening URL:', targetUrl);
event.waitUntil( event.waitUntil(
self.clients.openWindow(targetUrl) clients.matchAll({
type: 'window',
includeUncontrolled: true,
}).then((clientList) => {
// Find an open client (any tab/window belonging to your site)
const focusedClient = clientList.find(client => {
return new URL(client.url).origin === location.origin;
});
if (focusedClient) {
// If a client is open, navigate it to the new URL and focus it
focusedClient.navigate(urlToOpen);
return focusedClient.focus();
} else {
// Otherwise, open a new window
return clients.openWindow(targetUrl);
}
})
); );
}); });