diff --git a/apps/meteor/client/hooks/useStartup.ts b/apps/meteor/client/hooks/useStartup.ts new file mode 100644 index 0000000000000..48906462f0c09 --- /dev/null +++ b/apps/meteor/client/hooks/useStartup.ts @@ -0,0 +1,66 @@ +import type { UserStatus } from '@rocket.chat/core-typings'; +import { useUserId } from '@rocket.chat/ui-contexts'; +import { Meteor } from 'meteor/meteor'; +import { UserPresence } from 'meteor/rocketchat:user-presence'; +import { Session } from 'meteor/session'; +import moment from 'moment'; +import { useState, useEffect } from 'react'; + +import { getUserPreference } from '../../app/utils/client'; +import { sdk } from '../../app/utils/client/lib/SDKClient'; +import { synchronizeUserData, removeLocalUserData } from '../lib/userData'; +import { fireGlobalEvent } from '../lib/utils/fireGlobalEvent'; + +export const useStartup = () => { + const [status, setStatus] = useState(undefined); + const uid = useUserId(); + + useEffect(() => { + if (!uid) { + removeLocalUserData(); + return; + } + + if (!Meteor.status().connected) { + return; + } + + if (Meteor.loggingIn()) { + return; + } + + const getUser = async () => { + const utcOffset = moment().utcOffset() / 60; + const user = await synchronizeUserData(uid); + if (!user) { + return; + } + if (user.utcOffset !== utcOffset) { + sdk.call('userSetUtcOffset', utcOffset); + } + + if (getUserPreference(user, 'enableAutoAway')) { + const idleTimeLimit = (getUserPreference(user, 'idleTimeLimit') as number | null | undefined) || 300; + UserPresence.awayTime = idleTimeLimit * 1000; + } else { + delete UserPresence.awayTime; + UserPresence.stopTimer(); + } + + setStatus(user.status); + UserPresence.start(); + }; + getUser(); + }, [uid]); + + useEffect(() => { + fireGlobalEvent('startup', true); + Session.setDefault('AvatarRandom', 0); + }, []); + + useEffect(() => { + if (status) { + fireGlobalEvent('status-changed', status); + } + }, [status]); +}; diff --git a/apps/meteor/client/startup/index.ts b/apps/meteor/client/startup/index.ts index dc217a109b80c..1576c0898f1f4 100644 --- a/apps/meteor/client/startup/index.ts +++ b/apps/meteor/client/startup/index.ts @@ -15,6 +15,5 @@ import './roles'; import './rootUrlChange'; import './routes'; import './slashCommands'; -import './startup'; import './streamMessage'; import './unread'; diff --git a/apps/meteor/client/startup/startup.ts b/apps/meteor/client/startup/startup.ts deleted file mode 100644 index e75afdabc7a74..0000000000000 --- a/apps/meteor/client/startup/startup.ts +++ /dev/null @@ -1,63 +0,0 @@ -import type { UserStatus } from '@rocket.chat/core-typings'; -import { Meteor } from 'meteor/meteor'; -import { UserPresence } from 'meteor/rocketchat:user-presence'; -import { Session } from 'meteor/session'; -import { Tracker } from 'meteor/tracker'; -import moment from 'moment'; - -import { getUserPreference } from '../../app/utils/client'; -import 'hljs9/styles/github.css'; -import { sdk } from '../../app/utils/client/lib/SDKClient'; -import { synchronizeUserData, removeLocalUserData } from '../lib/userData'; -import { fireGlobalEvent } from '../lib/utils/fireGlobalEvent'; - -Meteor.startup(() => { - fireGlobalEvent('startup', true); - - Session.setDefault('AvatarRandom', 0); - - window.lastMessageWindow = {}; - window.lastMessageWindowHistory = {}; - - let status: UserStatus | undefined = undefined; - Tracker.autorun(async () => { - const uid = Meteor.userId(); - if (!uid) { - removeLocalUserData(); - return; - } - - if (!Meteor.status().connected) { - return; - } - - if (Meteor.loggingIn()) { - return; - } - - const user = await synchronizeUserData(uid); - if (!user) { - return; - } - - const utcOffset = moment().utcOffset() / 60; - if (user.utcOffset !== utcOffset) { - sdk.call('userSetUtcOffset', utcOffset); - } - - if (getUserPreference(user, 'enableAutoAway')) { - const idleTimeLimit = (getUserPreference(user, 'idleTimeLimit') as number | null | undefined) || 300; - UserPresence.awayTime = idleTimeLimit * 1000; - } else { - delete UserPresence.awayTime; - UserPresence.stopTimer(); - } - - UserPresence.start(); - - if (user.status !== status) { - status = user.status; - fireGlobalEvent('status-changed', status); - } - }); -}); diff --git a/apps/meteor/client/views/root/AppLayout.tsx b/apps/meteor/client/views/root/AppLayout.tsx index e7afa4be398da..80f5216501453 100644 --- a/apps/meteor/client/views/root/AppLayout.tsx +++ b/apps/meteor/client/views/root/AppLayout.tsx @@ -24,6 +24,7 @@ import { useAnalytics } from '../../hooks/useAnalytics'; import { useAnalyticsEventTracking } from '../../hooks/useAnalyticsEventTracking'; import { useAutoupdate } from '../../hooks/useAutoupdate'; import { useLoadRoomForAllowedAnonymousRead } from '../../hooks/useLoadRoomForAllowedAnonymousRead'; +import { useStartup } from '../../hooks/useStartup'; import { appLayout } from '../../lib/appLayout'; import { useCustomOAuth } from '../../sidebar/hooks/useCustomOAuth'; import { useRedirectToSetupWizard } from '../../startup/useRedirectToSetupWizard'; @@ -61,6 +62,7 @@ const AppLayout = () => { useCodeHighlight(); useLoginViaQuery(); useLoadMissedMessages(); + useStartup(); const layout = useSyncExternalStore(appLayout.subscribe, appLayout.getSnapshot);