Skip to content

Commit d5265c0

Browse files
remove useConnection
1 parent 336e88a commit d5265c0

File tree

6 files changed

+63
-137
lines changed

6 files changed

+63
-137
lines changed

components/app/app.tsx

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
'use client';
22

3-
import { RoomAudioRenderer, StartAudio } from '@livekit/components-react';
3+
import { useMemo } from 'react';
4+
import { TokenSource } from 'livekit-client';
5+
import {
6+
RoomAudioRenderer,
7+
SessionProvider,
8+
StartAudio,
9+
useSession,
10+
} from '@livekit/components-react';
411
import type { AppConfig } from '@/app-config';
512
import { ViewController } from '@/components/app/view-controller';
613
import { Toaster } from '@/components/livekit/toaster';
714
import { useAgentErrors } from '@/hooks/useAgentErrors';
8-
import { ConnectionProvider } from '@/hooks/useConnection';
915
import { useDebugMode } from '@/hooks/useDebug';
1016

1117
const IN_DEVELOPMENT = process.env.NODE_ENV !== 'production';
@@ -22,15 +28,51 @@ interface AppProps {
2228
}
2329

2430
export function App({ appConfig }: AppProps) {
31+
const tokenSource = useMemo(() => {
32+
if (typeof process.env.NEXT_PUBLIC_CONN_DETAILS_ENDPOINT === 'string') {
33+
return TokenSource.custom(async () => {
34+
const url = new URL(process.env.NEXT_PUBLIC_CONN_DETAILS_ENDPOINT!, window.location.origin);
35+
36+
try {
37+
const res = await fetch(url.toString(), {
38+
method: 'POST',
39+
headers: {
40+
'Content-Type': 'application/json',
41+
'X-Sandbox-Id': appConfig.sandboxId ?? '',
42+
},
43+
body: JSON.stringify({
44+
room_config: appConfig.agentName
45+
? {
46+
agents: [{ agent_name: appConfig.agentName }],
47+
}
48+
: undefined,
49+
}),
50+
});
51+
return await res.json();
52+
} catch (error) {
53+
console.error('Error fetching connection details:', error);
54+
throw new Error('Error fetching connection details!');
55+
}
56+
});
57+
}
58+
59+
return TokenSource.endpoint('/api/connection-details');
60+
}, [appConfig]);
61+
62+
const session = useSession(
63+
tokenSource,
64+
appConfig.agentName ? { agentName: appConfig.agentName } : undefined
65+
);
66+
2567
return (
26-
<ConnectionProvider appConfig={appConfig}>
68+
<SessionProvider session={session}>
2769
<AppSetup />
2870
<main className="grid h-svh grid-cols-1 place-content-center">
2971
<ViewController appConfig={appConfig} />
3072
</main>
3173
<StartAudio label="Start Audio" />
3274
<RoomAudioRenderer />
3375
<Toaster />
34-
</ConnectionProvider>
76+
</SessionProvider>
3577
);
3678
}

components/app/session-view.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
AgentControlBar,
1212
type ControlBarControls,
1313
} from '@/components/livekit/agent-control-bar/agent-control-bar';
14-
import { useConnection } from '@/hooks/useConnection';
1514
import { cn } from '@/lib/utils';
1615
import { ScrollArea } from '../livekit/scroll-area/scroll-area';
1716

@@ -68,7 +67,6 @@ export const SessionView = ({
6867
const session = useSessionContext();
6968
const { messages } = useSessionMessages(session);
7069
const [chatOpen, setChatOpen] = useState(false);
71-
const { isConnectionActive, startDisconnectTransition } = useConnection();
7270
const scrollAreaRef = useRef<HTMLDivElement>(null);
7371

7472
const controls: ControlBarControls = {
@@ -122,8 +120,8 @@ export const SessionView = ({
122120
<Fade bottom className="absolute inset-x-0 top-0 h-4 -translate-y-full" />
123121
<AgentControlBar
124122
controls={controls}
125-
isConnectionActive={isConnectionActive}
126-
onDisconnect={startDisconnectTransition}
123+
isConnected={session.isConnected}
124+
onDisconnect={session.end}
127125
onChatOpenChange={setChatOpen}
128126
/>
129127
</div>

components/app/view-controller.tsx

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

3-
import { useCallback } from 'react';
4-
import { AnimatePresence, type AnimationDefinition, motion } from 'motion/react';
3+
import { AnimatePresence, motion } from 'motion/react';
4+
import { useSessionContext } from '@livekit/components-react';
55
import type { AppConfig } from '@/app-config';
66
import { SessionView } from '@/components/app/session-view';
77
import { WelcomeView } from '@/components/app/welcome-view';
8-
import { useConnection } from '@/hooks/useConnection';
98

109
const MotionWelcomeView = motion.create(WelcomeView);
1110
const MotionSessionView = motion.create(SessionView);
@@ -33,37 +32,22 @@ interface ViewControllerProps {
3332
}
3433

3534
export function ViewController({ appConfig }: ViewControllerProps) {
36-
const { isConnectionActive, connect, onDisconnectTransitionComplete } = useConnection();
37-
38-
const handleAnimationComplete = useCallback(
39-
(definition: AnimationDefinition) => {
40-
// manually end the session when the exit animation completes
41-
if (definition === 'hidden') {
42-
onDisconnectTransitionComplete();
43-
}
44-
},
45-
[onDisconnectTransitionComplete]
46-
);
35+
const { isConnected, start } = useSessionContext();
4736

4837
return (
4938
<AnimatePresence mode="wait">
5039
{/* Welcome view */}
51-
{!isConnectionActive && (
40+
{!isConnected && (
5241
<MotionWelcomeView
5342
key="welcome"
5443
{...VIEW_MOTION_PROPS}
5544
startButtonText={appConfig.startButtonText}
56-
onStartCall={connect}
45+
onStartCall={start}
5746
/>
5847
)}
5948
{/* Session view */}
60-
{isConnectionActive && (
61-
<MotionSessionView
62-
key="session-view"
63-
{...VIEW_MOTION_PROPS}
64-
appConfig={appConfig}
65-
onAnimationComplete={handleAnimationComplete}
66-
/>
49+
{isConnected && (
50+
<MotionSessionView key="session-view" {...VIEW_MOTION_PROPS} appConfig={appConfig} />
6751
)}
6852
</AnimatePresence>
6953
);

components/livekit/agent-control-bar/agent-control-bar.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ export interface ControlBarControls {
2222
}
2323

2424
export interface AgentControlBarProps extends UseInputControlsProps {
25-
isConnectionActive?: boolean;
2625
controls?: ControlBarControls;
26+
isConnected?: boolean;
2727
onChatOpenChange?: (open: boolean) => void;
2828
onDeviceError?: (error: { source: Track.Source; error: Error }) => void;
2929
}
@@ -35,7 +35,7 @@ export function AgentControlBar({
3535
controls,
3636
saveUserChoices = true,
3737
className,
38-
isConnectionActive = false,
38+
isConnected = false,
3939
onDisconnect,
4040
onDeviceError,
4141
onChatOpenChange,
@@ -158,7 +158,7 @@ export function AgentControlBar({
158158
<Button
159159
variant="destructive"
160160
onClick={onDisconnect}
161-
disabled={!isConnectionActive}
161+
disabled={!isConnected}
162162
className="font-mono"
163163
>
164164
<PhoneDisconnectIcon weight="bold" />

hooks/useAgentErrors.tsx

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import { useEffect } from 'react';
2-
import { useAgent } from '@livekit/components-react';
2+
import { useAgent, useSessionContext } from '@livekit/components-react';
33
import { toastAlert } from '@/components/livekit/alert-toast';
4-
import { useConnection } from './useConnection';
54

65
export function useAgentErrors() {
76
const agent = useAgent();
8-
const { isConnectionActive, startDisconnectTransition } = useConnection();
7+
const { isConnected, end } = useSessionContext();
98

109
useEffect(() => {
11-
if (isConnectionActive && agent.state === 'failed') {
10+
if (isConnected && agent.state === 'failed') {
1211
const reasons = agent.failureReasons;
1312

1413
toastAlert({
@@ -38,7 +37,7 @@ export function useAgentErrors() {
3837
),
3938
});
4039

41-
startDisconnectTransition();
40+
end();
4241
}
43-
}, [agent, isConnectionActive, startDisconnectTransition]);
42+
}, [agent, isConnected, end]);
4443
}

hooks/useConnection.tsx

Lines changed: 0 additions & 97 deletions
This file was deleted.

0 commit comments

Comments
 (0)