mirror of
https://github.com/tooot-app/app
synced 2025-06-05 22:19:13 +02:00
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.
98 lines
3.3 KiB
TypeScript
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)
|
|
}
|
|
}
|
|
}
|