mirror of https://github.com/tooot-app/app
113 lines
3.3 KiB
TypeScript
113 lines
3.3 KiB
TypeScript
import apiGeneral from '@api/general'
|
|
import apiTooot from '@api/tooot'
|
|
import { displayMessage } from '@components/Message'
|
|
import navigationRef from '@helpers/navigationRef'
|
|
import { useAppDispatch } from '@root/store'
|
|
import * as Sentry from '@sentry/react-native'
|
|
import { getExpoToken, retrieveExpoToken } from '@utils/slices/appSlice'
|
|
import { disableAllPushes, getInstances } from '@utils/slices/instancesSlice'
|
|
import { useTheme } from '@utils/styles/ThemeManager'
|
|
import * as Notifications from 'expo-notifications'
|
|
import { useEffect } from 'react'
|
|
import { useTranslation } from 'react-i18next'
|
|
import { AppState } from 'react-native'
|
|
import { useSelector } from 'react-redux'
|
|
|
|
const pushUseConnect = () => {
|
|
const { t } = useTranslation('screen')
|
|
const { theme } = useTheme()
|
|
|
|
const dispatch = useAppDispatch()
|
|
useEffect(() => {
|
|
dispatch(retrieveExpoToken())
|
|
}, [])
|
|
|
|
const expoToken = useSelector(getExpoToken)
|
|
const instances = useSelector(getInstances, (prev, next) => prev.length === next.length)
|
|
const pushEnabled = instances.filter(instance => instance.push.global.value)
|
|
|
|
const connect = () => {
|
|
apiTooot({
|
|
method: 'get',
|
|
url: `/push/connect/${expoToken}`
|
|
})
|
|
.then(() => Notifications.setBadgeCountAsync(0))
|
|
.catch(error => {
|
|
Sentry.setExtras({
|
|
API: 'tooot',
|
|
expoToken,
|
|
...(error?.response && { response: error.response })
|
|
})
|
|
Sentry.captureMessage('Push connect error', {
|
|
contexts: { errorObject: error }
|
|
})
|
|
Notifications.setBadgeCountAsync(0)
|
|
if (error?.status == 404) {
|
|
displayMessage({
|
|
theme,
|
|
type: 'error',
|
|
duration: 'long',
|
|
message: t('pushError.message'),
|
|
description: t('pushError.description'),
|
|
onPress: () => {
|
|
navigationRef.navigate('Screen-Tabs', {
|
|
screen: 'Tab-Me',
|
|
params: {
|
|
screen: 'Tab-Me-Root'
|
|
}
|
|
})
|
|
navigationRef.navigate('Screen-Tabs', {
|
|
screen: 'Tab-Me',
|
|
params: {
|
|
screen: 'Tab-Me-Settings'
|
|
}
|
|
})
|
|
}
|
|
})
|
|
|
|
dispatch(disableAllPushes())
|
|
|
|
instances.forEach(instance => {
|
|
if (instance.push.global.value) {
|
|
apiGeneral<{}>({
|
|
method: 'delete',
|
|
domain: instance.url,
|
|
url: 'api/v1/push/subscription',
|
|
headers: {
|
|
Authorization: `Bearer ${instance.token}`
|
|
}
|
|
}).catch(() => console.log('error!!!'))
|
|
}
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
useEffect(() => {
|
|
Sentry.setExtras({
|
|
expoToken,
|
|
pushEnabledCount: pushEnabled
|
|
})
|
|
|
|
if (expoToken && pushEnabled.length) {
|
|
connect()
|
|
}
|
|
|
|
const appStateListener = AppState.addEventListener('change', state => {
|
|
if (expoToken && pushEnabled.length && state === 'active') {
|
|
Notifications.getBadgeCountAsync().then(count => {
|
|
if (count > 0) {
|
|
connect()
|
|
}
|
|
})
|
|
}
|
|
})
|
|
|
|
return () => {
|
|
appStateListener.remove()
|
|
}
|
|
}, [expoToken, pushEnabled.length])
|
|
}
|
|
|
|
export default pushUseConnect
|