diff --git a/desktop/src/preload.js b/desktop/src/preload.js --- a/desktop/src/preload.js +++ b/desktop/src/preload.js @@ -22,6 +22,7 @@ ipcRenderer.removeListener('on-new-version-available', withEvent); }, updateToNewVersion: () => ipcRenderer.send('update-to-new-version'), + platform: { win32: 'windows', darwin: 'macos' }[process.platform], }; contextBridge.exposeInMainWorld('electronContextBridge', bridge); diff --git a/keyserver/src/responders/website-responders.js b/keyserver/src/responders/website-responders.js --- a/keyserver/src/responders/website-responders.js +++ b/keyserver/src/responders/website-responders.js @@ -384,7 +384,7 @@ windowDimensions: { width: 0, height: 0 }, baseHref, connection: { - ...defaultConnectionInfo('web', viewer.timeZone), + ...defaultConnectionInfo(viewer.platform ?? 'web', viewer.timeZone), actualizedCalendarQuery: calendarQuery, }, watchedThreadIDs: [], diff --git a/keyserver/src/socket/socket.js b/keyserver/src/socket/socket.js --- a/keyserver/src/socket/socket.js +++ b/keyserver/src/socket/socket.js @@ -17,6 +17,7 @@ import { endpointIsSocketSafe } from 'lib/types/endpoints.js'; import { defaultNumberPerThread } from 'lib/types/message-types.js'; import { redisMessageTypes, type RedisMessage } from 'lib/types/redis-types.js'; +import { serverRequestTypes } from 'lib/types/request-types.js'; import { cookieSources, sessionCheckFrequency, @@ -455,6 +456,16 @@ ), }; + if ( + viewer.userAgent?.includes('Electron') && + viewer.platform === 'web' && + !serverRequests.find( + request => request.type === serverRequestTypes.PLATFORM_DETAILS, + ) + ) { + serverRequests.push({ type: serverRequestTypes.PLATFORM_DETAILS }); + } + if (!sessionInitializationResult.sessionContinued) { const [threadsResult, entriesResult, currentUserInfo, knownUserInfos] = await Promise.all([ diff --git a/lib/types/device-types.js b/lib/types/device-types.js --- a/lib/types/device-types.js +++ b/lib/types/device-types.js @@ -3,7 +3,7 @@ import invariant from 'invariant'; export type DeviceType = 'ios' | 'android'; -export type Platform = DeviceType | 'web'; +export type Platform = DeviceType | 'web' | 'windows' | 'macos'; export function isDeviceType(platform: ?string): boolean { return platform === 'ios' || platform === 'android'; @@ -18,7 +18,7 @@ } export function isWebPlatform(platform: ?string): boolean { - return platform === 'web'; + return platform === 'web' || platform === 'windows' || platform === 'macos'; } export type DeviceTokenUpdateRequest = { diff --git a/lib/types/electron-types.js b/lib/types/electron-types.js --- a/lib/types/electron-types.js +++ b/lib/types/electron-types.js @@ -17,4 +17,5 @@ // Returns a callback that you can call to remove the listener +onNewVersionAvailable?: OnNewVersionAvailableListener => () => void, +updateToNewVersion?: () => void, + +platform?: 'windows' | 'macos', }; diff --git a/lib/utils/validation-utils.js b/lib/utils/validation-utils.js --- a/lib/utils/validation-utils.js +++ b/lib/utils/validation-utils.js @@ -50,7 +50,13 @@ const tDate: TRegex = tRegex(/^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$/); const tColor: TRegex = tRegex(validHexColorRegex); // we don't include # char -const tPlatform: TEnums = t.enums.of(['ios', 'android', 'web']); +const tPlatform: TEnums = t.enums.of([ + 'ios', + 'android', + 'web', + 'windows', + 'macos', +]); const tDeviceType: TEnums = t.enums.of(['ios', 'android']); const tPlatformDetails: TInterface = tShape({ platform: tPlatform, diff --git a/web/app.react.js b/web/app.react.js --- a/web/app.react.js +++ b/web/app.react.js @@ -77,7 +77,7 @@ setSessionIDOnRequest: true, // Never reset the calendar range calendarRangeInactivityLimit: null, - platformDetails: { platform: 'web' }, + platformDetails: { platform: electron?.platform ?? 'web' }, }); type BaseProps = {