# FCM Notification Module Implementation Guide This document contains all the changes made to implement Firebase Cloud Messaging (FCM) notifications in the T4B_Chat React Native app. Use this guide to replicate the implementation in your production project. ## ๐Ÿ“ฆ Package Dependencies Added ### package.json Dependencies ```json { "dependencies": { "@react-native-firebase/app": "^23.4.0", "@react-native-firebase/messaging": "^23.4.0", "@react-native-cookies/cookies": "^6.2.0", "react-native-device-info": "^10.11.0", "react-native-permissions": "^5.2.4", "react-native-push-notification": "^8.1.1" } } ``` ### Installation Commands ```bash npm install @react-native-firebase/app @react-native-firebase/messaging npm install @react-native-cookies/cookies npm install react-native-device-info npm install react-native-permissions npm install react-native-push-notification ``` ## ๐Ÿ”ง Android Configuration ### 1. Root build.gradle (android/build.gradle) ```gradle buildscript { ext { buildToolsVersion = "35.0.0" minSdkVersion = 24 compileSdkVersion = 35 targetSdkVersion = 35 ndkVersion = "27.1.12297006" kotlinVersion = "2.0.21" } repositories { google() mavenCentral() } dependencies { classpath("com.android.tools.build:gradle") classpath("com.facebook.react:react-native-gradle-plugin") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") classpath("com.google.gms:google-services:4.3.15") // โ† ADD THIS } } ``` ### 2. App build.gradle (android/app/build.gradle) ```gradle apply plugin: "com.android.application" apply plugin: "org.jetbrains.kotlin.android" apply plugin: "com.facebook.react" apply plugin: 'com.google.gms.google-services' // โ† ADD THIS android { // ... existing config ... // Fix for react-native-push-notification duplicate classes configurations.all { exclude group: 'com.android.support', module: 'support-compat' exclude group: 'com.android.support', module: 'support-annotations' } defaultConfig { applicationId "com.t4b_chat" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0" } } dependencies { implementation("com.facebook.react:react-android") // AndroidX dependencies for react-native-push-notification compatibility implementation 'androidx.core:core:1.16.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.11.0' // ... rest of dependencies ... } ``` ### 3. AndroidManifest.xml (android/app/src/main/AndroidManifest.xml) ```xml ``` ### 4. Google Services Configuration - Add `google-services.json` file to `android/app/` directory - This file comes from your Firebase project console ## ๐Ÿ“ฑ iOS Configuration ### 1. Podfile (ios/Podfile) ```ruby # Resolve react_native_pods.rb with node to allow for hoisting require Pod::Executable.execute_command('node', ['-p', 'require.resolve( "react-native/scripts/react_native_pods.rb", {paths: [process.argv[1]]}, )', __dir__]).strip platform :ios, min_ios_version_supported prepare_react_native_project! linkage = ENV['USE_FRAMEWORKS'] if linkage != nil Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green use_frameworks! :linkage => linkage.to_sym end target 'T4B_Chat' do config = use_native_modules! use_react_native!( :path => config[:reactNativePath], :app_path => "#{Pod::Config.instance.installation_root}/.." ) post_install do |installer| react_native_post_install( installer, config[:reactNativePath], :mac_catalyst_enabled => false, ) end end ``` ### 2. iOS Google Services Configuration - Add `GoogleService-Info.plist` to your iOS project - This file comes from your Firebase project console ## ๐Ÿ“ New Utility Files Created ### 1. utilities/permissionUtils.ts Complete permission management utility for handling notification permissions across platforms. Key functions: - `needsNotificationPermission()` - Check if device needs explicit permission - `requestNotificationPermission()` - Request notification permission - `checkNotificationPermission()` - Check current permission status - `showPermissionExplanation()` - Show user-friendly explanation dialog - `showSettingsDialog()` - Direct user to app settings ### 2. utilities/notificationUtils.ts Complete notification management utility for handling local notifications. Key functions: - `createNotificationChannel()` - Create Android notification channel - `configureNotificationSettings()` - Configure push notification settings - `showLocalNotification()` - Display local notifications - `shouldShowCustomNotification()` - Determine when to show notifications - `testNotification()` - Test notification function - `cancelAllNotifications()` - Cancel all pending notifications ## ๐Ÿ”„ App.tsx Changes ### Key Imports Added ```typescript import messaging, { FirebaseMessagingTypes, AuthorizationStatus } from '@react-native-firebase/messaging'; import { getApp } from '@react-native-firebase/app'; import { requestNotificationPermission, checkNotificationPermission, needsNotificationPermission, showPermissionExplanation, showSettingsDialog, PermissionResult } from './utilities/permissionUtils'; import { RESULTS } from 'react-native-permissions'; import { showLocalNotification, createNotificationChannel, configureNotificationSettings, shouldShowCustomNotification, testNotification } from './utilities/notificationUtils'; import PushNotification from 'react-native-push-notification'; ``` ### Key Features Implemented 1. **App State Tracking** - Tracks app state changes to avoid duplicate notifications - Uses `AppState.addEventListener` for state monitoring 2. **FCM Message Handling** - `onMessage` listener for foreground messages - `getInitialNotification` for app launch from notification - `onNotificationOpenedApp` for background notification taps 3. **Permission Management** - Comprehensive permission checking and requesting - Platform-specific permission handling (Android 13+ vs older versions) - User-friendly permission explanation dialogs 4. **Token Management** - FCM token retrieval and refresh handling - Token sending to backend (commented out - needs implementation) 5. **Notification Display** - Custom notification display when app is active - Fallback to system notifications when app is backgrounded - Test notification functionality for debugging 6. **Firebase Warning Suppression** - Temporary suppression of Firebase deprecation warnings ## ๐Ÿš€ Setup Instructions for Production ### 1. Install Dependencies ```bash npm install @react-native-firebase/app @react-native-firebase/messaging npm install react-native-permissions npm install react-native-push-notification ``` ### 2. Firebase Project Setup 1. Create Firebase project at https://console.firebase.google.com 2. Add Android app with package name matching your `applicationId` 3. Add iOS app with bundle identifier 4. Download configuration files: - `google-services.json` for Android - `GoogleService-Info.plist` for iOS ### 3. Android Setup 1. Add Google Services plugin to build.gradle files 2. Add permissions to AndroidManifest.xml 3. Add FCM service to AndroidManifest.xml 4. Add AndroidX dependencies for compatibility ### 4. iOS Setup 1. Add GoogleService-Info.plist to Xcode project 2. Run `cd ios && pod install` 3. Enable Push Notifications capability in Xcode ### 5. Code Integration 1. Copy both utility files to your project 2. Integrate App.tsx changes 3. Update package.json dependencies 4. Test notification functionality ## ๐Ÿงช Testing ### Test Notification Function The implementation includes a test notification function accessible via: - URL navigation to `test-notification` endpoint - Global function `global.testNotification()` in development - Console logging for debugging ### Debug Features - Comprehensive console logging throughout the notification flow - Permission status logging - FCM token logging - App state change logging ## ๐Ÿ”— Backend Integration ### FCM Token Registration The app automatically sends FCM tokens to your Odoo backend using the following endpoint: **Endpoint**: `POST https://your-odoo.com/fcm/register` **Headers**: ```json { "Content-Type": "application/json", "Cookie": "session_id=YOUR_SESSION_COOKIE" } ``` **Request Body**: ```json { "token": "FCM_TOKEN_STRING", "device_name": "iPhone 12", "device_type": "ios", "app_version": "1.0.0", "os_version": "15.0" } ``` ### Device Information Collection The implementation automatically collects device information using `react-native-device-info`: - `device_name`: Device model name (e.g., "iPhone 12", "Samsung Galaxy S21") - `device_type`: Platform ("ios" or "android") - `app_version`: App version from package.json - `os_version`: Operating system version ### Session Management **Native Cookie Extraction**: The implementation uses `@react-native-cookies/cookies` to automatically extract session cookies from the native cookie store. The `getWebViewCookies()` function: 1. **Accesses native cookie store** using `@react-native-cookies/cookies` library 2. **Retrieves all cookies** for the Odoo domain 3. **Filters and extracts session_id** from available cookies 4. **Updates automatically** every 30 seconds to keep cookies fresh 5. **Validates cookies** before sending FCM token registration The system automatically handles session management without manual intervention and is much more reliable than JavaScript injection methods. ### Token Refresh Handling The app automatically handles FCM token refresh and sends updated tokens to the backend whenever they change. ## โš ๏ธ Important Notes 1. **Backend Integration**: The `sendTokenToBackend()` function is implemented and automatically sends FCM tokens to your Odoo backend at `/fcm/register` endpoint. 2. **Session Management**: The implementation automatically extracts session cookies from the WebView, so no manual session management is required. 3. **Device Information**: The implementation uses `react-native-device-info` to automatically collect device information (device name, type, app version, OS version). 4. **Firebase Warnings**: Temporary warning suppression is in place until Firebase v22+ is stable. 5. **Permission Handling**: The implementation handles Android 13+ permission requirements automatically. 6. **Production Considerations**: - Update signing configuration for release builds - Test on both Android and iOS devices - Verify notification delivery in all app states - Ensure WebView loads and user can log in to extract session cookies ## ๐Ÿ“‹ Checklist for Production Migration - [ ] Install all required npm packages - [ ] Add Google Services configuration files - [ ] Update Android build.gradle files - [ ] Update AndroidManifest.xml with permissions and FCM service - [ ] Copy utility files (permissionUtils.ts, notificationUtils.ts) - [ ] Integrate App.tsx changes - [ ] Test on Android device (API 33+ for permission testing) - [ ] Test on iOS device - [ ] Implement backend token registration - [ ] Test notification delivery in all app states - [ ] Remove debug/test code before production release This implementation provides a complete FCM notification system with proper permission handling, platform-specific optimizations, and comprehensive error handling.