Rumahjo-Android-APP/lib/utils/Notification/awsomeNotification.dart

214 lines
7.3 KiB
Dart
Raw Normal View History

2024-09-07 00:58:50 +00:00
// ignore_for_file: file_names
import 'dart:async';
import 'dart:math';
import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:ebroker/Ui/screens/chat/chat_screen.dart';
import 'package:ebroker/app/routes.dart';
import 'package:ebroker/data/Repositories/property_repository.dart';
import 'package:ebroker/data/cubits/chatCubits/delete_message_cubit.dart';
import 'package:ebroker/data/model/data_output.dart';
import 'package:ebroker/data/model/property_model.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../data/cubits/chatCubits/load_chat_messages.dart';
import '../constant.dart';
import '../helper_utils.dart';
class LocalAwsomeNotification {
AwesomeNotifications notification = AwesomeNotifications();
void init(BuildContext context) {
requestPermission();
notification.initialize(
null,
[
NotificationChannel(
channelKey: Constant.notificationChannel,
channelName: 'Basic notifications',
channelDescription: 'Notification channel',
importance: NotificationImportance.Max,
ledColor: Colors.grey),
NotificationChannel(
channelKey: "Chat Notification",
channelName: 'Chat Notifications',
channelDescription: 'Chat Notifications',
importance: NotificationImportance.Max,
ledColor: Colors.grey)
],
channelGroups: [],
);
listenTap(context);
}
void listenTap(BuildContext context) {
AwesomeNotifications().setListeners(
onNotificationCreatedMethod:
NotificationController.onNotificationCreatedMethod,
onDismissActionReceivedMethod:
NotificationController.onDismissActionReceivedMethod,
onNotificationDisplayedMethod:
NotificationController.onNotificationDisplayedMethod,
onActionReceivedMethod: NotificationController.onActionReceivedMethod,
);
}
createNotification(
{required RemoteMessage notificationData, required bool isLocked}) async {
try {
bool isChat = notificationData.data["type"] == "chat";
int chatId = int.parse(notificationData.data['sender_id']) +
int.parse(notificationData.data['property_id']);
await notification.createNotification(
content: NotificationContent(
id: isChat ? chatId : Random().nextInt(5000),
title: notificationData.data["title"],
// icon: AppIcons.aboutUs,
hideLargeIconOnExpand: true,
summary: notificationData.data["type"] == "chat"
? "${notificationData.data['username']}"
: null,
locked: isLocked,
payload: Map.from(notificationData.data),
autoDismissible: true,
body: notificationData.data["body"],
wakeUpScreen: true,
notificationLayout: notificationData.data["type"] == "chat"
? NotificationLayout.MessagingGroup
: NotificationLayout.Default,
groupKey: notificationData.data["id"],
channelKey: notificationData.data["type"] == "chat"
? "Chat Notification"
: Constant.notificationChannel,
),
);
} catch (e) {
rethrow;
}
}
Future<void> requestPermission() async {
NotificationSettings notificationSettings =
await FirebaseMessaging.instance.getNotificationSettings();
if (notificationSettings.authorizationStatus ==
AuthorizationStatus.notDetermined) {
await notification.requestPermissionToSendNotifications(
channelKey: Constant.notificationChannel,
permissions: [
NotificationPermission.Alert,
NotificationPermission.Sound,
NotificationPermission.Badge,
NotificationPermission.Vibration,
NotificationPermission.Light
],
);
await notification.requestPermissionToSendNotifications(
channelKey: "Chat Notification",
permissions: [
NotificationPermission.Alert,
NotificationPermission.Sound,
NotificationPermission.Badge,
NotificationPermission.Vibration,
NotificationPermission.Light
],
);
if (notificationSettings.authorizationStatus ==
AuthorizationStatus.authorized ||
notificationSettings.authorizationStatus ==
AuthorizationStatus.provisional) {}
} else if (notificationSettings.authorizationStatus ==
AuthorizationStatus.denied) {
return;
}
}
}
class NotificationController {
/// Use this method to detect when a new notification or a schedule is created
@pragma("vm:entry-point")
static Future<void> onNotificationCreatedMethod(
ReceivedNotification receivedNotification) async {}
/// Use this method to detect every time that a new notification is displayed
@pragma("vm:entry-point")
static Future<void> onNotificationDisplayedMethod(
ReceivedNotification receivedNotification) async {}
/// Use this method to detect if the user dismissed a notification
@pragma("vm:entry-point")
static Future<void> onDismissActionReceivedMethod(
ReceivedAction receivedAction) async {}
/// Use this method to detect when the user taps on a notification or action button
@pragma("vm:entry-point")
static Future<void> onActionReceivedMethod(
ReceivedAction receivedAction) async {
Map<String, String?>? payload = receivedAction.payload;
if (payload?['type'] == "chat") {
var username = payload?['username'];
var propertyTitleImage = payload?['property_title_image'];
var propertyTitle = payload?['title'];
var userProfile = payload?['user_profile'];
var senderId = payload?['sender_id'];
var propertyId = payload?['property_id'];
Future.delayed(
Duration.zero,
() {
Navigator.push(Constant.navigatorKey.currentContext!,
MaterialPageRoute(
builder: (context) {
return MultiBlocProvider(
providers: [
BlocProvider(
create: (context) => LoadChatMessagesCubit(),
),
BlocProvider(
create: (context) => DeleteMessageCubit(),
),
],
child: Builder(builder: (context) {
return ChatScreen(
profilePicture: userProfile!,
userName: username ?? "",
propertyImage: propertyTitleImage ?? "",
proeprtyTitle: propertyTitle ?? "",
userId: senderId ?? "",
propertyId: propertyId ?? "");
}),
);
},
));
},
);
} else {
String id = receivedAction.payload?["id"] ?? "";
DataOutput<PropertyModel> property =
await PropertyRepository().fetchPropertyFromPropertyId(id);
Future.delayed(
Duration.zero,
() {
HelperUtils.goToNextPage(Routes.propertyDetails,
Constant.navigatorKey.currentContext!, false,
args: {
'propertyData': property.modelList[0],
'propertiesList': property.modelList,
'fromMyProperty': false,
});
},
);
}
}
}