diff --git a/app/actions/remote/entry/app.ts b/app/actions/remote/entry/app.ts index 021a2994bd..a430d2455a 100644 --- a/app/actions/remote/entry/app.ts +++ b/app/actions/remote/entry/app.ts @@ -12,15 +12,20 @@ import {getCurrentUser} from '@queries/servers/user'; import {deleteV1Data} from '@utils/file'; import {isTablet} from '@utils/helpers'; -import {AppEntryData, AppEntryError, deferredAppEntryActions, fetchAppEntryData, syncOtherServers, teamsToRemove} from './common'; +import {AppEntryData, AppEntryError, deferredAppEntryActions, fetchAppEntryData, registerDeviceToken, syncOtherServers, teamsToRemove} from './common'; export async function appEntry(serverUrl: string, since = 0) { const operator = DatabaseManager.serverDatabases[serverUrl]?.operator; if (!operator) { return {error: `${serverUrl} database not found`}; } + const {database} = operator; + if (!since) { + registerDeviceToken(serverUrl); + } + // clear lastUnreadChannelId const removeLastUnreadChannelId = await prepareCommonSystemValues(operator, {lastUnreadChannelId: ''}); if (removeLastUnreadChannelId) { diff --git a/app/actions/remote/entry/common.ts b/app/actions/remote/entry/common.ts index e74d57895f..a450d09963 100644 --- a/app/actions/remote/entry/common.ts +++ b/app/actions/remote/entry/common.ts @@ -13,6 +13,7 @@ import {getPreferenceValue, getTeammateNameDisplaySetting} from '@helpers/api/pr import {selectDefaultTeam} from '@helpers/api/team'; import {DEFAULT_LOCALE} from '@i18n'; import NetworkManager from '@managers/network_manager'; +import {getDeviceToken} from '@queries/app/global'; import {queryAllServers} from '@queries/app/servers'; import {queryAllChannelsForTeam} from '@queries/servers/channel'; import {getConfig} from '@queries/servers/system'; @@ -231,12 +232,32 @@ export async function deferredAppEntryActions( updateAllUsersSince(serverUrl, since); } +export const registerDeviceToken = async (serverUrl: string) => { + let client; + try { + client = NetworkManager.getClient(serverUrl); + } catch (error) { + return {error}; + } + + const appDatabase = DatabaseManager.appDatabase?.database; + if (appDatabase) { + const deviceToken = await getDeviceToken(appDatabase); + if (deviceToken) { + client.attachDevice(deviceToken); + } + } + + return {error: undefined}; +}; + export const syncOtherServers = async (serverUrl: string) => { const database = DatabaseManager.appDatabase?.database; if (database) { const servers = await queryAllServers(database); for (const server of servers) { if (server.url !== serverUrl && server.lastActiveAt > 0) { + registerDeviceToken(server.url); syncAllChannelMembers(server.url); } } diff --git a/app/actions/remote/session.ts b/app/actions/remote/session.ts index 7ae70b6641..f0f1cf5046 100644 --- a/app/actions/remote/session.ts +++ b/app/actions/remote/session.ts @@ -10,7 +10,7 @@ import DatabaseManager from '@database/manager'; import {getServerCredentials} from '@init/credentials'; import NetworkManager from '@managers/network_manager'; import WebsocketManager from '@managers/websocket_manager'; -import {queryDeviceToken} from '@queries/app/global'; +import {getDeviceToken} from '@queries/app/global'; import {getCurrentUserId, getCommonSystemValues} from '@queries/servers/system'; import {getCSRFFromCookie} from '@utils/security'; @@ -113,7 +113,7 @@ export const login = async (serverUrl: string, {ldapOnly = false, loginId, mfaTo } try { - deviceToken = await queryDeviceToken(appDatabase); + deviceToken = await getDeviceToken(appDatabase); user = await client.login( loginId, password, @@ -218,7 +218,7 @@ export const ssoLogin = async (serverUrl: string, serverDisplayName: string, ser displayName: serverDisplayName, }, }); - deviceToken = await queryDeviceToken(database); + deviceToken = await getDeviceToken(database); user = await client.getMe(); await server?.operator.handleUsers({users: [user], prepareRecordsOnly: false}); await server?.operator.handleSystem({ diff --git a/app/queries/app/global.ts b/app/queries/app/global.ts index eb0e468b1e..cb514e890b 100644 --- a/app/queries/app/global.ts +++ b/app/queries/app/global.ts @@ -9,7 +9,7 @@ import type Global from '@typings/database/models/app/global'; const {APP: {GLOBAL}} = MM_TABLES; -export const queryDeviceToken = async (appDatabase: Database) => { +export const getDeviceToken = async (appDatabase: Database) => { try { const tokens = await appDatabase.get(GLOBAL).find(GLOBAL_IDENTIFIERS.DEVICE_TOKEN) as Global; return tokens?.value || '';