import React, { useEffect, useState } from 'react'; import { Modal, View, StyleSheet, Dimensions, TouchableOpacity } from 'react-native'; import { useTheme } from 'styled-components/native' import moment from 'moment' import Icon from 'react-native-vector-icons/Feather' import SoundPlayer from 'react-native-sound-player' import { NewOrderNotification as NewOrderNotificationController, useApi, useEvent, useLanguage, useSession, useToast, ToastType } from 'ordering-components/native' import { OIcon, OText } from '../shared' import { NotificationContainer } from './styles' import { useLocation } from '../../hooks/useLocation' const DELAY_SOUND = 2500 // 2 sec const windowWidth = Dimensions.get('screen').width const SoundPlayerComponent = (props: any) => { const { evtList, currentEvent, handleCloseEvents } = props const theme = useTheme() const URL_SOUND = 'https://d33aymufw4jvwf.cloudfront.net/notification.mp3' useEffect(() => { if (!currentEvent?.orderId) return const playSound = () => { try { SoundPlayer.playUrl(URL_SOUND) } catch (e) { console.log('Sound Error - ', err.message) } } const interval = setInterval(() => { playSound() }, DELAY_SOUND) return () => clearInterval(interval) }, [currentEvent?.orderId]) return ( handleCloseEvents()} > {evtList(currentEvent)[currentEvent?.evt]?.message} {evtList(currentEvent)[currentEvent?.evt]?.message2} ) } const NewOrderNotificationUI = (props: any) => { const { isBusinessApp, evtList, orderStatus } = props const [, t] = useLanguage() const [events] = useEvent() const [{ user, token }] = useSession() const [ordering] = useApi() const [, { showToast }] = useToast() const { getCurrentLocation } = useLocation() const [currentEvent, setCurrentEvent] = useState(null) const handleEventNotification = async (evtType: number, value: any, orderStatus?: any) => { if (value?.driver) { try { const location: any = await getCurrentLocation() if (!location?.latitude || !location?.longitude) { showToast(t('ERROR_UPDATING_COORDS', 'Error updating coords'), ToastType.Error) return } await fetch(`${ordering.root}/users/${user.id}/locations`, { method: 'POST', body: JSON.stringify({ location: JSON.stringify({ location: `{ lat: ${location.latitude}, lng: ${location.longitude}, mock: ${location.mocked} }` }) }), headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) } catch { } const duration = moment.duration(moment().diff(moment.utc(value?.last_driver_assigned_at))) const assignedSecondsDiff = duration.asSeconds() if (assignedSecondsDiff < 5 && !isBusinessApp && !value?.logistic_status) { setCurrentEvent(() => ({ evt: 2, orderId: value?.id ?? value?.order_id })) } } if ((!orderStatus.includes(value.status) && evtType !== 1 && isBusinessApp && orderStatus?.length > 0) || value?.author_id === user.id) return setCurrentEvent(() => ({ evt: evtType, orderId: value?.driver ? value?.order_id ?? value?.id : evtList(currentEvent)[evtType].event === 'messages' ? value?.order?.id : value?.order_id ?? value?.id })) } useEffect(() => { const handleEventTypeOne = (o: any) => { handleEventNotification(1, o, orderStatus) } const handleEventTypeTwo = (o: any) => { handleEventNotification(2, o, orderStatus) } const handleEventTypeThree = (o: any) => { handleEventNotification(3, o, orderStatus) } events.on('message_added_notification', handleEventTypeOne) events.on('order_added_notification', handleEventTypeTwo) events.on('order_updated_notification', handleEventTypeThree) events.on('request_register_notification', handleEventTypeTwo) events.on('request_update_notification', handleEventTypeThree) return () => { events.off('message_added_notification', handleEventTypeOne) events.off('order_added_notification', handleEventTypeTwo) events.off('order_updated_notification', handleEventTypeThree) events.off('request_register_notification', handleEventTypeTwo) events.off('request_update_notification', handleEventTypeThree) } }, [orderStatus, events]) useEffect(() => { return () => setCurrentEvent(null) }, []) return ( <> {!!currentEvent && ( setCurrentEvent(null)} /> )} ) }; const styles = StyleSheet.create({ modalView: { backgroundColor: '#FFF', alignItems: 'center', borderRadius: 8, paddingHorizontal: 20, paddingTop: 65, paddingBottom: 20, maxWidth: windowWidth - 60, }, wrapperIcon: { position: 'absolute', right: 20, top: 20 } }) export const NewOrderNotification = (props: any) => { const [, t] = useLanguage() const newOrderNotificationProps = { ...props, UIComponent: NewOrderNotificationUI, evtList: (currentEvent: any) => ({ 1: { event: 'messages', message: t('NEW_MESSAGES_RECEIVED', 'New messages have been received!'), message2: t('ORDER_N_UNREAD_MESSAGES', 'Order #_order_id_ has unread messages.').replace('_order_id_', currentEvent?.orderId), }, 2: { event: 'order_added', message: t('NEW_ORDERS_RECEIVED', 'New orders have been received!'), message2: t('ORDER_N_ORDERED', 'Order #_order_id_ has been ordered.').replace('_order_id_', currentEvent?.orderId), }, 3: { event: 'order_updated', message: t('NEW_ORDERS_UPDATED', 'New orders have been updated!'), message2: t('ORDER_N_UPDATED', 'Order #_order_id_ has been updated.').replace('_order_id_', currentEvent?.orderId), }, }) }; return ; };