1
0
mirror of https://github.com/tooot-app/app synced 2025-06-05 22:19:13 +02:00
This commit is contained in:
xmflsct
2022-12-15 19:31:20 +01:00
parent 2f3e398d70
commit 0e348dcef1
9 changed files with 122 additions and 103 deletions

View File

@ -156,6 +156,7 @@ const instancesMigration = {
mention: instance.push.alerts.mention.value,
poll: instance.push.alerts.poll.value,
status: instance.push.alerts.status.value,
update: false,
'admin.sign_up': false,
'admin.report': false
}

View File

@ -102,6 +102,7 @@ const addInstance = createAsyncThunk(
mention: true,
poll: true,
status: true,
update: true,
'admin.sign_up': false,
'admin.report': false
},

View File

@ -1,3 +1,4 @@
import features from '@helpers/features'
import {
checkPermission,
PERMISSION_MANAGE_REPORTS,
@ -7,22 +8,59 @@ import queryClient from '@helpers/queryClient'
import i18n from '@root/i18n/i18n'
import { InstanceLatest } from '@utils/migrations/instances/migration'
import { queryFunctionProfile, QueryKeyProfile } from '@utils/queryHooks/profile'
import { checkInstanceFeature } from '@utils/slices/instancesSlice'
import * as Notifications from 'expo-notifications'
import { useSelector } from 'react-redux'
export const PUSH_DEFAULT: [
'follow',
'follow_request',
'favourite',
'reblog',
'mention',
'poll',
'status'
] = ['follow', 'follow_request', 'favourite', 'reblog', 'mention', 'poll', 'status']
export const usePushFeatures = () => {
const hasTypeStatus = useSelector(checkInstanceFeature('notification_type_status'))
const hasTypeUpdate = useSelector(checkInstanceFeature('notification_type_update'))
const hasTypeAdminSignup = useSelector(checkInstanceFeature('notification_type_admin_signup'))
const hasTypeAdminReport = useSelector(checkInstanceFeature('notification_type_admin_report'))
return { hasTypeStatus, hasTypeUpdate, hasTypeAdminSignup, hasTypeAdminReport }
}
export const PUSH_ADMIN: { type: 'admin.sign_up' | 'admin.report'; permission: number }[] = [
{ type: 'admin.sign_up', permission: PERMISSION_MANAGE_USERS },
{ type: 'admin.report', permission: PERMISSION_MANAGE_REPORTS }
]
export const PUSH_DEFAULT = ({
hasTypeUpdate,
hasTypeStatus
}: {
hasTypeUpdate: boolean
hasTypeStatus: boolean
}) =>
['follow', 'follow_request', 'favourite', 'reblog', 'mention', 'poll', 'update', 'status'].filter(
type => {
switch (type) {
case 'status':
return hasTypeStatus
case 'update':
return hasTypeUpdate
default:
return true
}
}
) as ['follow', 'follow_request', 'favourite', 'reblog', 'mention', 'poll', 'update', 'status']
export const PUSH_ADMIN = (
{
hasTypeAdminSignup,
hasTypeAdminReport
}: {
hasTypeAdminSignup: boolean
hasTypeAdminReport: boolean
},
permissions?: string | number | undefined
) =>
[
{ type: 'admin.sign_up', permission: PERMISSION_MANAGE_USERS },
{ type: 'admin.report', permission: PERMISSION_MANAGE_REPORTS }
].filter(({ type, permission }) => {
switch (type) {
case 'admin.sign_up':
return hasTypeAdminSignup && checkPermission(permission, permissions)
case 'admin.report':
return hasTypeAdminReport && checkPermission(permission, permissions)
}
}) as { type: 'admin.sign_up' | 'admin.report'; permission: number }[]
export const setChannels = async (instance: InstanceLatest) => {
const account = `@${instance.account.acct}@${instance.uri}`
@ -48,23 +86,32 @@ export const setChannels = async (instance: InstanceLatest) => {
await Notifications.setNotificationChannelGroupAsync(account, { name: account })
}
const checkFeature = (feature: string) =>
features
.filter(f => f.feature === feature)
.filter(f => parseFloat(instance.version) >= f.version)?.length > 0
const checkFeatures = {
hasTypeStatus: checkFeature('notification_type_status'),
hasTypeUpdate: checkFeature('notification_type_update'),
hasTypeAdminSignup: checkFeature('notification_type_admin_signup'),
hasTypeAdminReport: checkFeature('notification_type_admin_report')
}
if (!instance.push.decode) {
await setChannel('default')
for (const push of PUSH_DEFAULT) {
for (const push of PUSH_DEFAULT(checkFeatures)) {
await deleteChannel(push)
}
for (const { type } of PUSH_ADMIN) {
for (const { type } of PUSH_ADMIN(checkFeatures, profileQuery.role?.permissions)) {
await deleteChannel(type)
}
} else {
await deleteChannel('default')
for (const push of PUSH_DEFAULT) {
for (const push of PUSH_DEFAULT(checkFeatures)) {
await setChannel(push)
}
for (const { type, permission } of PUSH_ADMIN) {
if (checkPermission(permission, profileQuery.role?.permissions)) {
await setChannel(type)
}
for (const { type } of PUSH_ADMIN(checkFeatures, profileQuery.role?.permissions)) {
await setChannel(type)
}
}
}