diff --git a/src/components/login/LoginForm.tsx b/src/components/login/LoginForm.tsx index 0eed559..32fc332 100644 --- a/src/components/login/LoginForm.tsx +++ b/src/components/login/LoginForm.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from "react"; -import { Analytics } from "@vercel/analytics/react"; import { track } from "@vercel/analytics"; import { isValidEmail } from "@/lib/util"; +import { useConfig } from "@/hooks/useConfig"; export default function Login({ onAuthenticated, @@ -12,6 +12,7 @@ export default function Login({ const [password, setPassword] = useState(""); const [error, setError] = useState(""); const [loading, setLoading] = useState(true); + const { config } = useConfig(); useEffect(() => { // Attempt to verify the session by making a request to the server @@ -82,16 +83,15 @@ export default function Login({
- {loading ? (
Loading...
) : ( -
+

Login To SaunaBuddy

@@ -116,6 +116,16 @@ export default function Login({ Login {error &&

{error}

} +
+ + Request access to the SaunaBuddy beta + +
)}
diff --git a/src/components/playground/Playground.tsx b/src/components/playground/Playground.tsx index 5b44149..94d93a5 100644 --- a/src/components/playground/Playground.tsx +++ b/src/components/playground/Playground.tsx @@ -25,11 +25,18 @@ import { Track, } from "livekit-client"; import { ReactNode, useEffect, useMemo, useState, useRef } from "react"; +import ServerSelect from "@/components/playground/ServerSelection"; export interface PlaygroundProps { logo?: ReactNode; themeColors: string[]; - onConnect: (connect: boolean, opts?: { token?: string; url?: string; language?: string }) => void; + onConnect: ( + connect: boolean, + opts?: { token?: string; url?: string; language?: string } + ) => void; + serverInfo: { name: string; description: string; url: string }[]; + selectedServerInfo: { name: string; description: string; url: string }; + handleServerChange: (e: React.ChangeEvent) => void; } const headerHeight = 56; @@ -38,11 +45,14 @@ export default function Playground({ logo, themeColors, onConnect, + serverInfo, + selectedServerInfo, + handleServerChange, }: PlaygroundProps) { const { config, setUserSettings } = useConfig(); const { name } = useRoomInfo(); const [selectedLanguage, setSelectedLanguage] = useState(() => { - const browserLanguage = navigator.language.split('-')[0]; + const browserLanguage = navigator.language.split("-")[0]; return config.settings.language || browserLanguage; }); const { localParticipant } = useLocalParticipant(); @@ -87,23 +97,35 @@ export default function Playground({ useEffect(() => { if (transcriptionRef.current) { - transcriptionRef.current.scrollTop = transcriptionRef.current.scrollHeight; + transcriptionRef.current.scrollTop = + transcriptionRef.current.scrollHeight; } }, [agentAudioTrack]); + const backgroundStyle = { + backgroundImage: `url('${config.bg_image_url || "/saunabuddy.png"}')`, + maxWidth: "1024px", + }; + const audioTileContent = useMemo(() => { const disconnectedContent = (
{(() => { - const priorityLanguages = ['en', 'fi', 'sv', 'de']; - const browserLanguages = (navigator.languages || [navigator.language]).map(lang => lang.split('-')[0]); - const uniqueLanguages = Array.from(new Set([ - ...browserLanguages.filter(lang => priorityLanguages.includes(lang)), - ...priorityLanguages - ])); + const priorityLanguages = ["en", "fi", "sv", "de"]; + const browserLanguages = ( + navigator.languages || [navigator.language] + ).map((lang) => lang.split("-")[0]); + const uniqueLanguages = Array.from( + new Set([ + ...browserLanguages.filter((lang) => + priorityLanguages.includes(lang) + ), + ...priorityLanguages, + ]) + ); return ( @@ -138,7 +160,7 @@ export default function Playground({ const waitingContent = (
@@ -150,7 +172,7 @@ export default function Playground({ const visualizerContent = (
@@ -173,15 +195,19 @@ export default function Playground({ />
-
+
{agentAudioTrack && ( -
+
{ setUserSettings({ ...config.settings, - language: selectedLanguage + language: selectedLanguage, }); }, [selectedLanguage, setUserSettings, config.settings]); return ( <> + - onConnect(roomState === ConnectionState.Disconnected, { language: selectedLanguage }) + onConnect(roomState === ConnectionState.Disconnected, { + language: selectedLanguage, + }) } />
{ const { config } = useConfig(); + + const logSessionDuration = () => { + const sessionDuration = getSessionPeriod(); + if (sessionDuration) + track("Session duration", { + name: typeof title === "string" ? title : "", + sessionDuration, + }); + }; + return (
- - + +
{connectionState === ConnectionState.Connected && (