tooot/src/utils/slices/instances/push/register.ts

130 lines
3.9 KiB
TypeScript
Raw Normal View History

2021-02-27 16:33:54 +01:00
import apiInstance from '@api/instance'
2021-12-06 21:25:09 +01:00
import apiTooot, { TOOOT_API_DOMAIN } from '@api/tooot'
2021-03-02 01:17:06 +01:00
import i18n from '@root/i18n/i18n'
2021-02-27 16:33:54 +01:00
import { RootState } from '@root/store'
2021-06-21 11:59:29 +02:00
import { getInstance, Instance } from '@utils/slices/instancesSlice'
2021-12-15 22:48:59 +01:00
import Constants from 'expo-constants'
2021-02-27 16:33:54 +01:00
import * as Notifications from 'expo-notifications'
2021-12-06 21:25:09 +01:00
import * as Random from 'expo-random'
2021-02-27 16:33:54 +01:00
import { Platform } from 'react-native'
2021-12-06 21:25:09 +01:00
import base64 from 'react-native-base64'
2021-03-02 01:17:06 +01:00
import androidDefaults from './androidDefaults'
2021-02-27 16:33:54 +01:00
2021-12-06 21:25:09 +01:00
const subscribe = async ({
2021-02-27 16:33:54 +01:00
expoToken,
instanceUrl,
accountId,
2021-12-06 21:25:09 +01:00
accountFull,
2021-02-27 16:33:54 +01:00
serverKey,
2021-12-06 21:25:09 +01:00
auth
2021-02-27 16:33:54 +01:00
}: {
expoToken: string
instanceUrl: string
accountId: Mastodon.Account['id']
2021-12-06 21:25:09 +01:00
accountFull: string
serverKey: string
auth: string | null
2021-02-27 16:33:54 +01:00
}) => {
2021-06-21 11:59:29 +02:00
return apiTooot({
2021-02-27 16:33:54 +01:00
method: 'post',
2021-12-06 21:25:09 +01:00
url: `/push/subscribe/${expoToken}/${instanceUrl}/${accountId}`,
2022-01-04 09:09:45 +01:00
body: { accountFull, serverKey, auth }
2021-02-27 16:33:54 +01:00
})
}
const pushRegister = async (
state: RootState,
expoToken: string
2021-12-06 21:25:09 +01:00
): Promise<Instance['push']['keys']['auth']> => {
2021-02-27 16:33:54 +01:00
const instance = getInstance(state)
const instanceUrl = instance?.url
const instanceUri = instance?.uri
const instanceAccount = instance?.account
const instancePush = instance?.push
if (!instanceUrl || !instanceUri || !instanceAccount || !instancePush) {
return Promise.reject()
}
const accountId = instanceAccount.id
const accountFull = `@${instanceAccount.acct}@${instanceUri}`
2021-12-06 21:25:09 +01:00
const endpoint = `https://${TOOOT_API_DOMAIN}/push/send/${expoToken}/${instanceUrl}/${accountId}`
const auth = base64.encodeFromByteArray(Random.getRandomBytes(16))
2021-02-27 16:33:54 +01:00
const alerts = instancePush.alerts
const formData = new FormData()
2021-12-06 21:25:09 +01:00
formData.append('subscription[endpoint]', endpoint)
formData.append(
'subscription[keys][p256dh]',
2021-12-15 22:48:59 +01:00
Constants.manifest?.extra?.toootPushKeyPublic
2021-12-06 21:25:09 +01:00
)
formData.append('subscription[keys][auth]', auth)
2021-02-27 16:33:54 +01:00
Object.keys(alerts).map(key =>
// @ts-ignore
formData.append(`data[alerts][${key}]`, alerts[key].value.toString())
)
const res = await apiInstance<Mastodon.PushSubscription>({
method: 'post',
url: 'push/subscription',
body: formData
})
2021-12-06 21:25:09 +01:00
await subscribe({
2021-02-27 16:33:54 +01:00
expoToken,
instanceUrl,
accountId,
2021-12-06 21:25:09 +01:00
accountFull,
serverKey: res.body.server_key,
2021-12-12 22:09:18 +01:00
auth: instancePush.decode.value === false ? null : auth
2021-02-27 16:33:54 +01:00
})
2021-03-01 01:27:26 +01:00
if (Platform.OS === 'android') {
2021-03-02 01:17:06 +01:00
Notifications.setNotificationChannelGroupAsync(accountFull, {
name: accountFull,
...androidDefaults
}).then(group => {
if (group) {
if (instancePush.decode.value === false) {
Notifications.setNotificationChannelAsync(`${group.id}_default`, {
groupId: group.id,
name: i18n.t('meSettingsPush:content.default.heading'),
...androidDefaults
})
} else {
Notifications.setNotificationChannelAsync(`${group.id}_follow`, {
groupId: group.id,
name: i18n.t('meSettingsPush:content.follow.heading'),
...androidDefaults
})
Notifications.setNotificationChannelAsync(`${group.id}_favourite`, {
groupId: group.id,
name: i18n.t('meSettingsPush:content.favourite.heading'),
...androidDefaults
})
Notifications.setNotificationChannelAsync(`${group.id}_reblog`, {
groupId: group.id,
name: i18n.t('meSettingsPush:content.reblog.heading'),
...androidDefaults
})
Notifications.setNotificationChannelAsync(`${group.id}_mention`, {
groupId: group.id,
name: i18n.t('meSettingsPush:content.mention.heading'),
...androidDefaults
})
Notifications.setNotificationChannelAsync(`${group.id}_poll`, {
groupId: group.id,
name: i18n.t('meSettingsPush:content.poll.heading'),
...androidDefaults
})
}
}
2021-03-01 01:27:26 +01:00
})
}
2021-02-27 16:33:54 +01:00
2021-12-06 21:25:09 +01:00
return Promise.resolve(auth)
2021-02-27 16:33:54 +01:00
}
export default pushRegister