tooot/src/screens/Tabs/Me/Push.tsx

259 lines
8.7 KiB
TypeScript
Raw Normal View History

2021-05-12 22:45:51 +02:00
import Button from '@components/Button'
2021-12-15 23:08:51 +01:00
import Icon from '@components/Icon'
2021-05-12 22:45:51 +02:00
import { MenuContainer, MenuRow } from '@components/Menu'
import CustomText from '@components/Text'
2022-12-04 00:35:13 +01:00
import browserPackage from '@helpers/browserPackage'
2022-04-30 23:47:52 +02:00
import { useAppDispatch } from '@root/store'
import { isDevelopment } from '@utils/checkEnvironment'
2022-12-10 01:59:26 +01:00
import { useAppsQuery } from '@utils/queryHooks/apps'
2022-12-09 21:09:00 +01:00
import { useProfileQuery } from '@utils/queryHooks/profile'
import { getExpoToken, retrieveExpoToken } from '@utils/slices/appSlice'
import {
checkPushAdminPermission,
PUSH_ADMIN,
PUSH_DEFAULT,
setChannels
} from '@utils/slices/instances/push/utils'
2021-05-12 22:45:51 +02:00
import { updateInstancePush } from '@utils/slices/instances/updatePush'
import { updateInstancePushAlert } from '@utils/slices/instances/updatePushAlert'
import { updateInstancePushDecode } from '@utils/slices/instances/updatePushDecode'
import { getInstance, getInstancePush } from '@utils/slices/instancesSlice'
2021-05-12 22:45:51 +02:00
import { StyleConstants } from '@utils/styles/constants'
import layoutAnimation from '@utils/styles/layoutAnimation'
2021-12-15 23:08:51 +01:00
import { useTheme } from '@utils/styles/ThemeManager'
2021-05-12 22:45:51 +02:00
import * as Notifications from 'expo-notifications'
import * as WebBrowser from 'expo-web-browser'
2022-12-09 21:09:00 +01:00
import React, { useState, useEffect } from 'react'
2021-05-11 21:38:48 +02:00
import { useTranslation } from 'react-i18next'
import { AppState, Linking, Platform, ScrollView, View } from 'react-native'
2022-04-30 23:47:52 +02:00
import { useSelector } from 'react-redux'
2021-05-11 21:38:48 +02:00
2021-05-12 22:45:51 +02:00
const TabMePush: React.FC = () => {
2022-02-12 14:51:01 +01:00
const { colors } = useTheme()
2021-03-28 23:31:10 +02:00
const { t } = useTranslation('screenTabs')
2022-12-10 01:59:26 +01:00
const instance = useSelector(getInstance)
2022-12-10 01:59:26 +01:00
const expoToken = useSelector(getExpoToken)
const [serverKeyAvailable, setServerKeyAvailable] = useState<boolean>()
useAppsQuery({
options: {
onSuccess: data => setServerKeyAvailable(!!data.vapid_key)
}
})
2021-05-12 22:45:51 +02:00
2022-04-30 23:47:52 +02:00
const dispatch = useAppDispatch()
2021-05-12 22:45:51 +02:00
const instancePush = useSelector(getInstancePush)
const [pushAvailable, setPushAvailable] = useState<boolean>()
2021-05-12 22:45:51 +02:00
const [pushEnabled, setPushEnabled] = useState<boolean>()
const [pushCanAskAgain, setPushCanAskAgain] = useState<boolean>()
2022-12-10 01:59:26 +01:00
2021-05-12 22:45:51 +02:00
useEffect(() => {
2022-12-10 01:59:26 +01:00
const checkPush = async () => {
switch (Platform.OS) {
case 'ios':
const settings = await Notifications.getPermissionsAsync()
layoutAnimation()
setPushEnabled(settings.granted)
setPushCanAskAgain(settings.canAskAgain)
break
case 'android':
await setChannels(instance)
layoutAnimation()
dispatch(retrieveExpoToken())
break
}
}
if (serverKeyAvailable) {
checkPush()
2022-12-10 01:59:26 +01:00
if (isDevelopment) {
setPushAvailable(true)
} else {
setPushAvailable(!!expoToken)
}
2022-01-02 22:28:33 +01:00
}
2021-12-15 23:08:51 +01:00
const subscription = AppState.addEventListener('change', checkPush)
2021-05-12 22:45:51 +02:00
return () => {
2021-12-15 23:08:51 +01:00
subscription.remove()
2021-05-12 22:45:51 +02:00
}
2022-12-10 01:59:26 +01:00
}, [serverKeyAvailable])
2021-05-12 22:45:51 +02:00
2022-12-09 21:09:00 +01:00
const alerts = () =>
instancePush?.alerts
? PUSH_DEFAULT.map(alert => (
2021-05-12 22:45:51 +02:00
<MenuRow
key={alert}
title={t(`me.push.${alert}.heading`)}
2022-12-09 21:09:00 +01:00
switchDisabled={!pushEnabled || !instancePush.global}
switchValue={instancePush?.alerts[alert]}
2022-11-29 23:44:11 +01:00
switchOnValueChange={() =>
2021-05-12 22:45:51 +02:00
dispatch(
updateInstancePushAlert({
changed: alert,
alerts: {
...instancePush?.alerts,
2022-12-09 21:09:00 +01:00
[alert]: instancePush?.alerts[alert]
2021-05-12 22:45:51 +02:00
}
})
)
2022-11-29 23:44:11 +01:00
}
2021-05-12 22:45:51 +02:00
/>
))
: null
2022-12-09 21:09:00 +01:00
const profileQuery = useProfileQuery()
const adminAlerts = () =>
profileQuery.data?.role?.permissions
? PUSH_ADMIN.map(({ type, permission }) =>
checkPushAdminPermission(permission, profileQuery.data.role?.permissions) ? (
<MenuRow
key={type}
title={t(`me.push.${type}.heading`)}
switchDisabled={!pushEnabled || !instancePush.global}
switchValue={instancePush?.alerts[type]}
switchOnValueChange={() =>
dispatch(
updateInstancePushAlert({
changed: type,
alerts: {
...instancePush?.alerts,
[type]: instancePush?.alerts[type]
}
})
)
}
/>
) : null
)
: null
2021-02-27 16:33:54 +01:00
return (
2021-05-12 22:45:51 +02:00
<ScrollView>
2022-12-10 01:59:26 +01:00
{!!serverKeyAvailable ? (
2021-12-15 23:08:51 +01:00
<>
2022-12-10 01:59:26 +01:00
{!!pushAvailable ? (
<>
{pushEnabled === false ? (
<MenuContainer>
<Button
type='text'
content={
pushCanAskAgain ? t('me.push.enable.direct') : t('me.push.enable.settings')
}
style={{
marginTop: StyleConstants.Spacing.Global.PagePadding,
marginHorizontal: StyleConstants.Spacing.Global.PagePadding * 2
}}
onPress={async () => {
if (pushCanAskAgain) {
const result = await Notifications.requestPermissionsAsync()
setPushEnabled(result.granted)
setPushCanAskAgain(result.canAskAgain)
} else {
Linking.openSettings()
}
}}
/>
</MenuContainer>
) : null}
<MenuContainer>
<MenuRow
title={t('me.push.global.heading', {
acct: `@${instance.account.acct}@${instance.uri}`
})}
description={t('me.push.global.description')}
switchDisabled={!pushEnabled}
switchValue={pushEnabled === false ? false : instancePush?.global}
switchOnValueChange={() => dispatch(updateInstancePush(!instancePush?.global))}
/>
</MenuContainer>
<MenuContainer>
<MenuRow
title={t('me.push.decode.heading')}
description={t('me.push.decode.description')}
loading={instancePush?.decode}
switchDisabled={!pushEnabled || !instancePush?.global}
switchValue={instancePush?.decode}
switchOnValueChange={() =>
dispatch(updateInstancePushDecode(!instancePush?.decode))
}
/>
<MenuRow
title={t('me.push.howitworks')}
iconBack='ExternalLink'
onPress={async () =>
WebBrowser.openBrowserAsync('https://tooot.app/how-push-works', {
browserPackage: await browserPackage()
})
2021-12-15 23:08:51 +01:00
}
2022-12-10 01:59:26 +01:00
/>
</MenuContainer>
<MenuContainer children={alerts()} />
<MenuContainer children={adminAlerts()} />
</>
) : (
<View
style={{
flex: 1,
minHeight: '100%',
justifyContent: 'center',
alignItems: 'center',
paddingHorizontal: StyleConstants.Spacing.Global.PagePadding
}}
>
<Icon name='Frown' size={StyleConstants.Font.Size.L} color={colors.primaryDefault} />
<CustomText
fontStyle='M'
style={{
color: colors.primaryDefault,
textAlign: 'center',
marginTop: StyleConstants.Spacing.S
2021-12-15 23:08:51 +01:00
}}
2022-12-10 01:59:26 +01:00
>
{t('me.push.notAvailable')}
</CustomText>
</View>
)}
2021-12-15 23:08:51 +01:00
</>
) : (
<View
style={{
flex: 1,
minHeight: '100%',
justifyContent: 'center',
2022-12-09 21:09:00 +01:00
alignItems: 'center',
paddingHorizontal: StyleConstants.Spacing.Global.PagePadding
2021-05-23 22:40:42 +02:00
}}
2021-12-15 23:08:51 +01:00
>
2022-11-29 23:44:11 +01:00
<Icon name='Frown' size={StyleConstants.Font.Size.L} color={colors.primaryDefault} />
2022-12-09 21:09:00 +01:00
<CustomText
fontStyle='M'
style={{
color: colors.primaryDefault,
textAlign: 'center',
marginTop: StyleConstants.Spacing.S
}}
>
2022-12-10 01:59:26 +01:00
{t('me.push.missingServerKey.message')}
</CustomText>
<CustomText
fontStyle='S'
style={{
color: colors.primaryDefault,
textAlign: 'center'
}}
>
{t('me.push.missingServerKey.description')}
</CustomText>
2021-12-15 23:08:51 +01:00
</View>
)}
2021-05-12 22:45:51 +02:00
</ScrollView>
2021-02-27 16:33:54 +01:00
)
}
2021-05-09 21:59:03 +02:00
export default TabMePush