Skip to content

Commit 6946719

Browse files
make disconnect transition explicit
1 parent 56fa89d commit 6946719

File tree

3 files changed

+18
-38
lines changed

3 files changed

+18
-38
lines changed

components/app/session-view.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client';
22

3-
import React, { useCallback, useEffect, useRef, useState } from 'react';
3+
import React, { useEffect, useRef, useState } from 'react';
44
import { motion } from 'motion/react';
55
import { useSessionContext, useSessionMessages } from '@livekit/components-react';
66
import type { AppConfig } from '@/app-config';
@@ -68,7 +68,7 @@ export const SessionView = ({
6868
const session = useSessionContext();
6969
const { messages } = useSessionMessages(session);
7070
const [chatOpen, setChatOpen] = useState(false);
71-
const { isConnectionActive, disconnect } = useConnection();
71+
const { isConnectionActive, startDisconnectTransition } = useConnection();
7272
const scrollAreaRef = useRef<HTMLDivElement>(null);
7373

7474
const controls: ControlBarControls = {
@@ -88,10 +88,6 @@ export const SessionView = ({
8888
}
8989
}, [messages]);
9090

91-
const handleDisconnect = useCallback(() => {
92-
disconnect(false);
93-
}, [disconnect]);
94-
9591
return (
9692
<section className="bg-background relative z-10 h-full w-full overflow-hidden" {...props}>
9793
{/* Chat Transcript */}
@@ -127,7 +123,7 @@ export const SessionView = ({
127123
<AgentControlBar
128124
controls={controls}
129125
isConnectionActive={isConnectionActive}
130-
onDisconnect={handleDisconnect}
126+
onDisconnect={startDisconnectTransition}
131127
onChatOpenChange={setChatOpen}
132128
/>
133129
</div>

components/app/view-controller.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
import { useCallback } from 'react';
44
import { AnimatePresence, type AnimationDefinition, motion } from 'motion/react';
5-
import { useSessionContext } from '@livekit/components-react';
6-
import { AppConfig } from '@/app-config';
5+
import type { AppConfig } from '@/app-config';
76
import { SessionView } from '@/components/app/session-view';
87
import { WelcomeView } from '@/components/app/welcome-view';
98
import { useAgentErrors } from '@/hooks/useAgentErrors';
@@ -38,8 +37,7 @@ interface ViewControllerProps {
3837
}
3938

4039
export function ViewController({ appConfig }: ViewControllerProps) {
41-
const session = useSessionContext();
42-
const { isConnectionActive, connect } = useConnection();
40+
const { isConnectionActive, connect, onDisconnectTransitionComplete } = useConnection();
4341

4442
useDebugMode({ enabled: IN_DEVELOPMENT });
4543
useAgentErrors();
@@ -48,10 +46,10 @@ export function ViewController({ appConfig }: ViewControllerProps) {
4846
(definition: AnimationDefinition) => {
4947
// manually end the session when the exit animation completes
5048
if (definition === 'hidden') {
51-
session.end();
49+
onDisconnectTransitionComplete();
5250
}
5351
},
54-
[session]
52+
[onDisconnectTransitionComplete]
5553
);
5654

5755
return (

hooks/useConnection.tsx

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@
22

33
import { createContext, useContext, useMemo, useState } from 'react';
44
import { TokenSource } from 'livekit-client';
5-
import { SessionProvider, type UseSessionReturn, useSession } from '@livekit/components-react';
5+
import { SessionProvider, useSession } from '@livekit/components-react';
66
import type { AppConfig } from '@/app-config';
77

88
interface ConnectionContextType {
9-
session?: UseSessionReturn;
109
isConnectionActive: boolean;
1110
connect: (startSession?: boolean) => void;
12-
disconnect: (endSession?: boolean) => void;
11+
startDisconnectTransition: () => void;
12+
onDisconnectTransitionComplete: () => void;
1313
}
1414

1515
const ConnectionContext = createContext<ConnectionContextType>({
16-
session: undefined,
1716
isConnectionActive: false,
1817
connect: () => {},
19-
disconnect: () => {},
18+
startDisconnectTransition: () => {},
19+
onDisconnectTransitionComplete: () => {},
2020
});
2121

2222
export function useConnection() {
@@ -76,29 +76,15 @@ export function ConnectionProvider({ appConfig, children }: ConnectionProviderPr
7676
const value = useMemo(
7777
() => ({
7878
isConnectionActive,
79-
/**
80-
* Start the application session and optionally start the agent session.
81-
*
82-
* @param startSession - Whether to start the agent session automatically. Default is true.
83-
* If startSession is passed in asfalse, you are opting to manually start the session.
84-
*/
85-
connect: (startSession = true) => {
79+
connect: () => {
8680
setIsConnectionActive(true);
87-
if (startSession) {
88-
session.start();
89-
}
81+
session.start();
9082
},
91-
/**
92-
* End the application session and optionally end the agent session.
93-
*
94-
* @param endSession - Whether to end the agent session automatically. Default is true.
95-
* If endSession is passed in as false, you are opting to manually end the session.
96-
*/
97-
disconnect: (endSession = true) => {
83+
startDisconnectTransition: () => {
9884
setIsConnectionActive(false);
99-
if (endSession) {
100-
session.end();
101-
}
85+
},
86+
onDisconnectTransitionComplete: () => {
87+
session.end();
10288
},
10389
}),
10490
// session object is not a stable reference

0 commit comments

Comments
 (0)