1
0
mirror of https://github.com/tooot-app/app synced 2025-06-05 22:19:13 +02:00
Files
tooot/src/utils/push/constants.ts
xmflsct 215534d0c8 Fix #605
Turns out to be much more complicated than expected. Finally got the app running through Browser Stack (thanks for their sponsoring!), realised the issue was related to an early attempt to create a build for F-Droid #50 which removed the Google Service. However for Android push, Google service is still required.
2023-01-09 00:55:29 +01:00

98 lines
3.3 KiB
TypeScript

import i18n from '@i18n/index'
import { featureCheck } from '@utils/helpers/featureCheck'
import {
checkPermission,
PERMISSION_MANAGE_REPORTS,
PERMISSION_MANAGE_USERS
} from '@utils/helpers/permissions'
import { queryClient } from '@utils/queryHooks'
import { QueryKeyProfile } from '@utils/queryHooks/profile'
import { getAccountDetails, getGlobalStorage } from '@utils/storage/actions'
import * as Notifications from 'expo-notifications'
export const PUSH_DEFAULT = () =>
['follow', 'follow_request', 'favourite', 'reblog', 'mention', 'poll', 'update', 'status'].filter(
type => {
switch (type) {
case 'status':
return featureCheck('notification_type_status')
case 'update':
return featureCheck('notification_type_update')
default:
return true
}
}
) as ['follow', 'follow_request', 'favourite', 'reblog', 'mention', 'poll', 'update', 'status']
export const PUSH_ADMIN = () =>
[
{ type: 'admin.sign_up', permission: PERMISSION_MANAGE_USERS },
{ type: 'admin.report', permission: PERMISSION_MANAGE_REPORTS }
].filter(({ type, permission }) => {
const queryKeyProfile: QueryKeyProfile = ['Profile']
const permissions =
queryClient.getQueryData<Mastodon.Account>(queryKeyProfile)?.role?.permissions
switch (type) {
case 'admin.sign_up':
return (
featureCheck('notification_type_admin_signup') && checkPermission(permission, permissions)
)
case 'admin.report':
return (
featureCheck('notification_type_admin_report') && checkPermission(permission, permissions)
)
}
}) as { type: 'admin.sign_up' | 'admin.report'; permission: number }[]
export const setChannels = async (reset: boolean | undefined = false, specificAccount?: string) => {
const account = specificAccount || getGlobalStorage.string('account.active')
const accountDetails = getAccountDetails([
'version',
'push',
'auth.account.acct',
'auth.account.domain'
])
if (!account || !accountDetails) return null
const readableAccount = `@${accountDetails['auth.account.acct']}@${accountDetails['auth.account.domain']}`
const deleteChannel = async (type: string) =>
Notifications.deleteNotificationChannelAsync(`${readableAccount}_${type}`)
const setChannel = async (type: string) =>
Notifications.setNotificationChannelAsync(`${readableAccount}_${type}`, {
groupId: readableAccount,
name: i18n.t(`screenTabs:me.push.${type}.heading` as any),
importance: Notifications.AndroidImportance.DEFAULT,
bypassDnd: false,
showBadge: true,
enableLights: true,
enableVibrate: true
})
const channelGroup = await Notifications.getNotificationChannelGroupAsync(readableAccount)
if (channelGroup && !reset) {
return
}
if (!channelGroup) {
await Notifications.setNotificationChannelGroupAsync(readableAccount, { name: readableAccount })
}
if (!accountDetails.push.decode) {
await setChannel('default')
for (const push of PUSH_DEFAULT()) {
await deleteChannel(push)
}
for (const { type } of PUSH_ADMIN()) {
await deleteChannel(type)
}
} else {
await deleteChannel('default')
for (const push of PUSH_DEFAULT()) {
await setChannel(push)
}
for (const { type } of PUSH_ADMIN()) {
await setChannel(type)
}
}
}