diff --git a/app/src/components/channels/DiscordConfig.tsx b/app/src/components/channels/DiscordConfig.tsx index 9e16d4925..06b74fbae 100644 --- a/app/src/components/channels/DiscordConfig.tsx +++ b/app/src/components/channels/DiscordConfig.tsx @@ -46,6 +46,9 @@ const DiscordConfig = ({ definition }: DiscordConfigProps) => { const [busyKeys, setBusyKeys] = useState>({}); const [fieldValues, setFieldValues] = useState>>({}); + const [clearMemoryOnDisconnect, setClearMemoryOnDisconnect] = useState>( + {} + ); const [error, setError] = useState(null); /** Pending link tokens, keyed by compositeKey (discord:managed_dm). Only present while polling. */ const [linkToken, setLinkToken] = useState(null); @@ -259,15 +262,19 @@ const DiscordConfig = ({ definition }: DiscordConfigProps) => { const handleDisconnect = useCallback( (authMode: ChannelAuthMode) => { + const key = `discord:${authMode}`; void runBusy(`discord:${authMode}`, async () => { log('disconnecting discord via %s', authMode); pollAbort.current?.abort(); setLinkToken(null); - await channelConnectionsApi.disconnectChannel('discord', authMode); + await channelConnectionsApi.disconnectChannel('discord', authMode, { + clearMemory: Boolean(clearMemoryOnDisconnect[key]), + }); + setClearMemoryOnDisconnect(prev => ({ ...prev, [key]: false })); dispatch(disconnectChannelConnection({ channel: 'discord', authMode })); }); }, - [dispatch, runBusy] + [clearMemoryOnDisconnect, dispatch, runBusy] ); const copyToken = useCallback(() => { @@ -366,38 +373,86 @@ const DiscordConfig = ({ definition }: DiscordConfigProps) => { {/* Connected state for managed_dm — show only Disconnect */} {spec.mode === 'managed_dm' && status === 'connected' ? ( -
-

- {t('channels.discord.accountLinked')} -

- -
- ) : /* Connect / Disconnect buttons for all other modes and states */ - spec.mode !== 'managed_dm' || status !== 'connecting' ? ( -
- {status !== 'connected' && ( + <> + +
+

+ {t('channels.discord.accountLinked')} +

+
+ + ) : /* Connect / Disconnect buttons for all other modes and states */ + spec.mode !== 'managed_dm' || status !== 'connecting' ? ( + <> + {status === 'connected' && ( + )} - -
+
+ {status !== 'connected' && ( + + )} + +
+ ) : null} {/* Server + Channel picker — shown after successful bot_token connection */} diff --git a/app/src/components/channels/TelegramConfig.tsx b/app/src/components/channels/TelegramConfig.tsx index 10de76184..c022ab14d 100644 --- a/app/src/components/channels/TelegramConfig.tsx +++ b/app/src/components/channels/TelegramConfig.tsx @@ -46,6 +46,9 @@ const TelegramConfig = ({ definition }: TelegramConfigProps) => { const [busyKeys, setBusyKeys] = useState>({}); const [fieldValues, setFieldValues] = useState>>({}); + const [clearMemoryOnDisconnect, setClearMemoryOnDisconnect] = useState>( + {} + ); const [error, setError] = useState(null); const managedDmPollControllers = useRef>({}); @@ -323,11 +326,14 @@ const TelegramConfig = ({ definition }: TelegramConfigProps) => { void runBusy(key, async () => { log('disconnecting telegram via %s', authMode); stopManagedDmPolling(`telegram:${authMode}`); - await channelConnectionsApi.disconnectChannel('telegram', authMode); + await channelConnectionsApi.disconnectChannel('telegram', authMode, { + clearMemory: Boolean(clearMemoryOnDisconnect[key]), + }); + setClearMemoryOnDisconnect(prev => ({ ...prev, [key]: false })); dispatch(disconnectChannelConnection({ channel: 'telegram', authMode })); }); }, - [dispatch, runBusy, stopManagedDmPolling] + [clearMemoryOnDisconnect, dispatch, runBusy, stopManagedDmPolling] ); return ( @@ -397,6 +403,30 @@ const TelegramConfig = ({ definition }: TelegramConfigProps) => { )} + {status === 'connected' && ( + + )} +