From 077a170f6f2a06b99b823c892a7da108e90160d5 Mon Sep 17 00:00:00 2001 From: Rojan Rajbhandari Date: Tue, 9 Dec 2025 14:54:56 +0545 Subject: [PATCH 1/2] fix(OUT-2775): force react to store a fresh copy of app bridge callbacks --- src/features/settings/hooks/useAppMenu.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/features/settings/hooks/useAppMenu.ts b/src/features/settings/hooks/useAppMenu.ts index ba282ed..e701498 100644 --- a/src/features/settings/hooks/useAppMenu.ts +++ b/src/features/settings/hooks/useAppMenu.ts @@ -11,7 +11,7 @@ export const useAppBridge = ({ token }: { token: string }) => { const { connectionStatus } = useAuthContext() const { isSyncEnabled, updateSettings, initialSettings } = useSettingsContext() - const disconnectAppAction = async () => { + const _disconnectAppAction = async () => { await disconnectApp(token) updateSettings({ isSyncEnabled: false, @@ -32,10 +32,12 @@ export const useAppBridge = ({ token }: { token: string }) => { // Quickfix for now (it will probably stay like this for the end of time) const [downloadCsvAction, setDownloadCsvAction] = useState(() => _downloadCsvAction) + const [disconnectAppAction, setDisconnectAppAction] = useState(() => _disconnectAppAction) setTimeout(() => { setDownloadCsvAction(() => _downloadCsvAction) - }, 1000) + setDisconnectAppAction(() => _disconnectAppAction) + }, 0) let actions: { label: string; icon?: Icons; onClick: () => Promise }[] = [] if (connectionStatus) { From b525dcb079eba3a03805644f0be988e434f53b17 Mon Sep 17 00:00:00 2001 From: Rojan Rajbhandari Date: Tue, 9 Dec 2025 14:56:54 +0545 Subject: [PATCH 2/2] fix(OUT-2775): see if callback solves this issue --- src/features/settings/hooks/useAppMenu.ts | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/features/settings/hooks/useAppMenu.ts b/src/features/settings/hooks/useAppMenu.ts index e701498..0003d96 100644 --- a/src/features/settings/hooks/useAppMenu.ts +++ b/src/features/settings/hooks/useAppMenu.ts @@ -3,7 +3,7 @@ import { useAuthContext } from '@auth/hooks/useAuth' import { disconnectApp } from '@settings/actions/disconnectApp' import { useSettingsContext } from '@settings/hooks/useSettings' -import { useState } from 'react' +import { useCallback } from 'react' import { useActionsMenu } from '@/lib/copilot/hooks/app-bridge' import { Icons } from '@/lib/copilot/hooks/app-bridge/types' @@ -11,16 +11,16 @@ export const useAppBridge = ({ token }: { token: string }) => { const { connectionStatus } = useAuthContext() const { isSyncEnabled, updateSettings, initialSettings } = useSettingsContext() - const _disconnectAppAction = async () => { + const disconnectAppAction = useCallback(async () => { await disconnectApp(token) updateSettings({ isSyncEnabled: false, initialSettings: { ...initialSettings, isSyncEnabled: false }, }) - } + }, [token, updateSettings, initialSettings]) // biome-ignore lint/suspicious/useAwait: there is no async action being done here but the type signature requires it - const _downloadCsvAction = async () => { + const downloadCsvAction = useCallback(async () => { const url = `/api/sync-logs?token=${token}` const link = document.createElement('a') link.href = url @@ -28,16 +28,7 @@ export const useAppBridge = ({ token }: { token: string }) => { document.body.appendChild(link) link.click() link.remove() - } - - // Quickfix for now (it will probably stay like this for the end of time) - const [downloadCsvAction, setDownloadCsvAction] = useState(() => _downloadCsvAction) - const [disconnectAppAction, setDisconnectAppAction] = useState(() => _disconnectAppAction) - - setTimeout(() => { - setDownloadCsvAction(() => _downloadCsvAction) - setDisconnectAppAction(() => _disconnectAppAction) - }, 0) + }, [token]) let actions: { label: string; icon?: Icons; onClick: () => Promise }[] = [] if (connectionStatus) {