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

218 lines
7.5 KiB
Dart
Raw Permalink Normal View History

2024-09-07 00:58:50 +00:00
// ignore_for_file: file_names
import 'dart:async';
import 'dart:developer';
import 'package:ebroker/Ui/screens/ChatNew/MessageTypes/registerar.dart';
import 'package:ebroker/data/model/chat/chated_user_model.dart';
import 'package:ebroker/utils/Notification/chat_message_handler.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../Ui/screens/ChatNew/model.dart';
import '../../Ui/screens/chat/chat_screen.dart';
import '../../app/routes.dart';
import '../../data/Repositories/property_repository.dart';
import '../../data/cubits/chatCubits/get_chat_users.dart';
import '../../data/cubits/chatCubits/load_chat_messages.dart';
import '../../data/model/data_output.dart';
import '../../data/model/property_model.dart';
import '../constant.dart';
import '../helper_utils.dart';
import 'awsomeNotification.dart';
String currentlyChatingWith = "";
String currentlyChatPropertyId = "";
class NotificationService {
static FirebaseMessaging messagingInstance = FirebaseMessaging.instance;
static LocalAwsomeNotification localNotification = LocalAwsomeNotification();
static late StreamSubscription<RemoteMessage> foregroundStream;
static late StreamSubscription<RemoteMessage> onMessageOpen;
static requestPermission() async {}
void updateFCM() async {
await FirebaseMessaging.instance.getToken();
// await Api.post(
// // url: Api.updateFCMId,
// parameter: {Api.fcmId: token},
// useAuthToken: true);
}
static handleNotification(RemoteMessage? message, [BuildContext? context]) {
var notificationType = message?.data['type'] ?? "";
log("@notificaiton data is ${message?.data}");
if (notificationType == "chat") {
var senderId = message?.data['sender_id'] ?? "";
var chatMessage = message?.data['message'] ?? "";
var attachment = message?.data['file'] ?? "";
var audioMessage = message?.data['audio'] ?? "";
var time = message?.data['date'] ?? "";
var username = message!.data['username'];
var propertyTitleImage = message.data['property_title_image'];
var propertyTitle = message.data['title'];
var userProfile = message.data['user_profile'];
var propertyId = message.data['property_id'];
(context as BuildContext).read<GetChatListCubit>().addNewChat(ChatedUser(
fcmId: "",
firebaseId: "",
name: username,
profile: userProfile,
propertyId:
(propertyId is int) ? propertyId : int.parse(propertyId),
title: propertyTitle,
userId: (senderId is int) ? senderId : int.parse(senderId),
titleImage: propertyTitleImage,
));
///Checking if this is user we are chatiing with
if (senderId == currentlyChatingWith &&
propertyId == currentlyChatPropertyId) {
ChatMessageModel chatMessageModel =
ChatMessageModel.fromJson(message.data);
chatMessageModel.setIsSentByMe(false);
chatMessageModel.setIsSentNow(false);
ChatMessageHandler.add(chatMessageModel);
// ChatMessageHandlerOLD.add(
// Builder(builder: (context) {
// return ChatMessage(
// key: ValueKey(DateTime.now().toString().toString()),
// message: chatMessage,
// isSentByMe: false,
// propertyId: "",
// reciverId: "",
// isChatAudio: audioMessage != null && audioMessage != "",
// audioFile: audioMessage,
// attachment: attachment,
// hasAttachment: attachment != "" && attachment != null,
// senderId: senderId,
// time: time,
// );
// }),
// );
totalMessageCount++;
} else {
localNotification.createNotification(
isLocked: false,
notificationData: message,
);
}
} else if (notificationType == "delete_message") {
ChatMessageHandlerOLD.removeMessage(
int.parse(message!.data['message_id']));
} else {
localNotification.createNotification(
isLocked: false, notificationData: message!);
}
}
static void init(context) {
requestPermission();
registerListeners(context);
}
static Future<void> onBackgroundMessageHandler(RemoteMessage message) async {
if (message.notification == null) {
handleNotification(
message,
);
}
}
static forgroundNotificationHandler(BuildContext context) async {
foregroundStream =
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
handleNotification(message, context);
});
}
static terminatedStateNotificationHandler(BuildContext context) {
FirebaseMessaging.instance.getInitialMessage().then(
(RemoteMessage? message) {
if (message == null) {
return;
}
if (message.notification == null) {
handleNotification(message, context);
}
},
);
}
static void onTapNotificationHandler(context) {
onMessageOpen = FirebaseMessaging.onMessageOpenedApp
.listen((RemoteMessage message) async {
if (message.data['type'] == "chat") {
var username = message.data['title'];
var propertyTitleImage = message.data['property_title_image'];
var propertyTitle = message.data['property_title'];
var userProfile = message.data['user_profile'];
var senderId = message.data['sender_id'];
var propertyId = message.data['property_id'];
Future.delayed(
Duration.zero,
() {
Navigator.push(Constant.navigatorKey.currentContext!,
MaterialPageRoute(
builder: (context) {
return BlocProvider(
create: (context) {
return LoadChatMessagesCubit();
},
child: Builder(builder: (context) {
return ChatScreen(
profilePicture: userProfile ?? "",
userName: username ?? "",
propertyImage: propertyTitleImage ?? "",
proeprtyTitle: propertyTitle ?? "",
userId: senderId ?? "",
propertyId: propertyId ?? "",
);
}),
);
},
));
},
);
} else {
String id = message.data["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,
});
});
}
}
// if (message.data["screen"] == "profile") {
// Navigator.pushNamed(context, profileRoute);
// }
);
}
static Future<void> registerListeners(context) async {
FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
alert: true, badge: true, sound: true);
await forgroundNotificationHandler(context);
await terminatedStateNotificationHandler(context);
onTapNotificationHandler(context);
}
static void disposeListeners() {
onMessageOpen.cancel();
foregroundStream.cancel();
}
}