import firebase from "firebase/app"; import "firebase/firestore"; import "firebase/auth"; import "firebase/database"; //import "firebase/analytics"; import "firebase/messaging"; import { store } from "../redux/store"; const config = JSON.parse(process.env.REACT_APP_FIREBASE_CONFIG); firebase.initializeApp(config); export const auth = firebase.auth(); export const firestore = firebase.firestore(); //export const analytics = firebase.analytics(); export default firebase; export const getCurrentUser = () => { return new Promise((resolve, reject) => { const unsubscribe = auth.onAuthStateChanged((userAuth) => { unsubscribe(); resolve(userAuth); }, reject); }); }; export const updateCurrentUser = (userDetails) => { return new Promise((resolve, reject) => { const unsubscribe = auth.onAuthStateChanged((userAuth) => { userAuth.updateProfile(userDetails).then((r) => { unsubscribe(); resolve(userAuth); }); }, reject); }); }; let messaging; try { messaging = firebase.messaging(); // Project Settings => Cloud Messaging => Web Push certificates messaging.usePublicVapidKey(process.env.REACT_APP_FIREBASE_PUBLIC_VAPID_KEY); console.log("[FCM UTIL] FCM initialized successfully."); } catch { console.log("[FCM UTIL] Firebase Messaging is likely unsupported."); } export { messaging }; export const logImEXEvent = (eventName, additionalParams, stateProp = null) => { const state = stateProp || store.getState(); const eventParams = { shop: (state.user && state.user.bodyshop && state.user.bodyshop.shopname) || null, user: (state.user && state.user.currentUser && state.user.currentUser.email) || null, ...additionalParams, }; analytics.logEvent(eventName, eventParams); }; if (messaging) { messaging.onMessage(async (payload) => { console.log("[FCM] UTILS Message received. ", payload); navigator.serviceWorker.getRegistration().then((registration) => { return registration.showNotification( "[UTIL]" + payload.notification.title, payload.notification ); }); // if (!payload.clientId) return; // // Get the client. // const client = await clients.get(payload.clientId); // // Exit early if we don't get the client. // // Eg, if it closed. // if (!client) return; // // Send a message to the client. // console.log("Posting to client."); // client.postMessage({ // msg: "Hey I just got a fetch from you!", // url: payload.request.url, // }); // [START_EXCLUDE] // Update the UI to include the received message. //appendMessage(payload); // [END_EXCLUDE] }); messaging.onTokenRefresh(() => { messaging .getToken() .then((refreshedToken) => { console.log("[FCM] Token refreshed."); // Indicate that the new Instance ID token has not yet been sent to the // app server. // setTokenSentToServer(false); // // Send Instance ID token to app server. // sendTokenToServer(refreshedToken); // // [START_EXCLUDE] // // Display new Instance ID token and clear UI of all previous messages. // resetUI(); // [END_EXCLUDE] }) .catch((err) => { console.log("[FCM] Unable to retrieve refreshed token ", err); // showToken("Unable to retrieve refreshed token ", err); }); }); }