Refactor loading and error handling in DesktopHomePage; improve notification click handling in service worker
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
})
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
Reference in New Issue
Block a user