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}
}
+
)}
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 && (