diff --git a/src/cloud/useCloud.tsx b/src/cloud/useCloud.tsx index 4353372..1d994fb 100644 --- a/src/cloud/useCloud.tsx +++ b/src/cloud/useCloud.tsx @@ -1,3 +1,12 @@ export function CloudProvider({ children }: { children: React.ReactNode }) { return <>{children}; +} + +export function useCloud() { + const generateToken: () => Promise = async () => { + throw new Error("Not implemented"); + }; + const wsUrl = ""; + + return { generateToken, wsUrl }; } \ No newline at end of file diff --git a/src/hooks/useConnection.tsx b/src/hooks/useConnection.tsx new file mode 100644 index 0000000..85c4715 --- /dev/null +++ b/src/hooks/useConnection.tsx @@ -0,0 +1,79 @@ +"use client" + +import { CLOUD_ENABLED } from "@/cloud/CloudConnect"; +import { useCloud } from "@/cloud/useCloud"; +import React, { createContext, useState } from "react"; +import { useCallback } from "react"; +import { useConfig } from "./useConfig"; + +type TokenGeneratorData = { + shouldConnect: boolean; + wsUrl: string; + token: string; + disconnect: () => Promise; + connect: () => Promise; +}; + +const ConnectionContext = createContext(undefined); + +export const ConnectionProvider = ({ + children, +}: { + children: React.ReactNode; +}) => { + const { generateToken, wsUrl: cloudWSUrl } = useCloud(); + const { config } = useConfig(); + const [connectionDetails, setConnectionDetails] = useState<{ + wsUrl: string; + token: string; + shouldConnect: boolean; + }>({ wsUrl: "", token: "", shouldConnect: false }); + + const connect = useCallback(async () => { + let token = ""; + let url = ""; + if (CLOUD_ENABLED) { + token = await generateToken(); + url = cloudWSUrl; + } else if (process.env.NEXT_PUBLIC_LIVEKIT_URL) { + url = process.env.NEXT_PUBLIC_LIVEKIT_URL; + const {accessToken} = await fetch("/api/token").then((res) => res.json()); + token = accessToken; + } else { + token = config.settings.token; + url = config.settings.ws_url; + } + setConnectionDetails({ wsUrl: url, token, shouldConnect: true }); + }, [ + cloudWSUrl, + config.settings.token, + config.settings.ws_url, + generateToken, + ]); + + const disconnect = useCallback(async () => { + setConnectionDetails((prev) => ({ ...prev, shouldConnect: false })); + }, []); + + return ( + + {children} + + ); +}; + +export const useConnection = () => { + const context = React.useContext(ConnectionContext); + if (context === undefined) { + throw new Error("useConnection must be used within a ConnectionProvider"); + } + return context; +} \ No newline at end of file diff --git a/src/hooks/useTokenGenerator.tsx b/src/hooks/useTokenGenerator.tsx deleted file mode 100644 index 1172a21..0000000 --- a/src/hooks/useTokenGenerator.tsx +++ /dev/null @@ -1,90 +0,0 @@ -"use client" - -import React, { createContext, useState } from "react"; -import { useConfig } from "./useConfig"; -import { useCallback } from "react"; - -// Note: cloud mode is only used in our private, hosted version -export type Mode = "cloud" | "env" | "manual"; - -type TokenGeneratorData = { - shouldConnect: boolean; - wsUrl: string; - token: string; - disconnect: () => Promise; - connect: (mode: Mode) => Promise; -}; - -const TokenGeneratorContext = createContext(undefined); - -export const TokenGeneratorProvider = ({ - children, - generateConnectionDetails, -}: { - children: React.ReactNode; - // generateConnectionDetails is only required in cloud mode - generateConnectionDetails?: () => Promise<{ wsUrl: string; token: string }>; -}) => { - const { config } = useConfig(); - const [token, setToken] = useState(""); - const [wsUrl, setWsUrl] = useState(""); - const [shouldConnect, setShouldConnect] = useState(false); - const connect = useCallback( - async (mode: Mode) => { - console.log("connecting", mode); - if (mode === "cloud") { - if (!generateConnectionDetails) { - throw new Error( - "generateConnectionDetails must be provided in cloud mode" - ); - } - const { wsUrl, token } = await generateConnectionDetails(); - setWsUrl(wsUrl); - setToken(token); - } else if (mode === "env") { - const url = process.env.NEXT_PUBLIC_LIVEKIT_URL; - if (!url) { - throw new Error("NEXT_PUBLIC_LIVEKIT_URL must be set in env mode"); - } - const res = await fetch("/api/token"); - const { accessToken } = await res.json(); - setWsUrl(url); - setToken(accessToken); - } else if (mode === "manual") { - setWsUrl(config.settings.ws_url); - setToken(config.settings.token); - } - setShouldConnect(true); - }, - [ - config.settings.token, - config.settings.ws_url, - generateConnectionDetails, - ] - ); - const disconnect = useCallback(async () => { - setShouldConnect(false); - }, []); - - return ( - - {children} - - ); -}; - -export const useTokenGenerator = () => { - const context = React.useContext(TokenGeneratorContext); - if (context === undefined) { - throw new Error("useTokenGenerator must be used within a TokenGeneratorProvider"); - } - return context; -} \ No newline at end of file diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 1933e4a..6e40c9d 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -9,12 +9,13 @@ import Head from "next/head"; import { useCallback, useState } from "react"; import { PlaygroundConnect } from "@/components/PlaygroundConnect"; -import Playground, { PlaygroundMeta } from "@/components/playground/Playground"; +import Playground from "@/components/playground/Playground"; import { PlaygroundToast, ToastType } from "@/components/toast/PlaygroundToast"; import { ConfigProvider, useConfig } from "@/hooks/useConfig"; -import { Mode, TokenGeneratorProvider, useTokenGenerator } from "@/hooks/useTokenGenerator"; -import { useRef } from "react"; +import { ConnectionProvider, useConnection } from "@/hooks/useConnection"; import { useMemo } from "react"; +import { CLOUD_ENABLED } from "@/cloud/CloudConnect"; +import { useCloud } from "@/cloud/useCloud"; const themeColors = [ "cyan", @@ -32,9 +33,9 @@ const inter = Inter({ subsets: ["latin"] }); export default function Home() { return ( - + - + ); } @@ -45,13 +46,13 @@ export function HomeInner() { type: ToastType; } | null>(null); const { shouldConnect, wsUrl, token, connect, disconnect } = - useTokenGenerator(); + useConnection(); const {config} = useConfig(); const handleConnect = useCallback( - (c: boolean, mode: Mode) => { - c ? connect(mode) : disconnect(); + async (c: boolean) => { + c ? connect() : disconnect(); }, [connect, disconnect] ); @@ -118,10 +119,7 @@ export function HomeInner() { { - const mode = process.env.NEXT_PUBLIC_LIVEKIT_URL - ? "env" - : "manual"; - handleConnect(c, mode); + handleConnect(c); }} /> @@ -131,8 +129,7 @@ export function HomeInner() { { - const mode = process.env.NEXT_PUBLIC_LIVEKIT_URL ? "env" : "manual"; - handleConnect(true, mode); + handleConnect(true); }} /> )}