add tool for getLocation and changeColorTheme
This commit is contained in:
parent
9ee64fc7d1
commit
137dd28877
@ -26,7 +26,7 @@ import {
|
|||||||
useRoomContext,
|
useRoomContext,
|
||||||
useParticipantAttributes,
|
useParticipantAttributes,
|
||||||
} from "@livekit/components-react";
|
} from "@livekit/components-react";
|
||||||
import { ConnectionState, LocalParticipant, Track } from "livekit-client";
|
import { ConnectionState, LocalParticipant, Track, RpcError, RpcInvocationData } from "livekit-client";
|
||||||
import { QRCodeSVG } from "qrcode.react";
|
import { QRCodeSVG } from "qrcode.react";
|
||||||
import { ReactNode, useCallback, useEffect, useMemo, useState } from "react";
|
import { ReactNode, useCallback, useEffect, useMemo, useState } from "react";
|
||||||
import tailwindTheme from "../../lib/tailwindTheme.preval";
|
import tailwindTheme from "../../lib/tailwindTheme.preval";
|
||||||
@ -74,6 +74,66 @@ export default function Playground({
|
|||||||
}
|
}
|
||||||
}, [config, localParticipant, roomState]);
|
}, [config, localParticipant, roomState]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!localParticipant || roomState !== ConnectionState.Connected) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
localParticipant.registerRpcMethod(
|
||||||
|
'getUserLocation',
|
||||||
|
async (data: RpcInvocationData) => {
|
||||||
|
try {
|
||||||
|
let params = JSON.parse(data.payload);
|
||||||
|
const position: GeolocationPosition = await new Promise((resolve, reject) => {
|
||||||
|
navigator.geolocation.getCurrentPosition(resolve, reject, {
|
||||||
|
enableHighAccuracy: params.highAccuracy ?? false,
|
||||||
|
timeout: data.responseTimeout,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
latitude: position.coords.latitude,
|
||||||
|
longitude: position.coords.longitude,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
throw new RpcError(1, "Could not retrieve user location");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}, [localParticipant, roomState]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!localParticipant || roomState !== ConnectionState.Connected) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
localParticipant.registerRpcMethod(
|
||||||
|
'setThemeColor',
|
||||||
|
async (data: RpcInvocationData) => {
|
||||||
|
try {
|
||||||
|
const params = JSON.parse(data.payload);
|
||||||
|
const color = params.color;
|
||||||
|
|
||||||
|
// 验证颜色是否在允许的列表中
|
||||||
|
if (!themeColors.includes(color)) {
|
||||||
|
throw new RpcError(2, `Invalid color. Must be one of: ${themeColors.join(', ')}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新主题颜色
|
||||||
|
const userSettings = { ...config.settings };
|
||||||
|
userSettings.theme_color = color;
|
||||||
|
setUserSettings(userSettings);
|
||||||
|
|
||||||
|
return JSON.stringify({ success: true, color });
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof RpcError) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
throw new RpcError(1, `Could not set theme color: ${error instanceof Error ? error.message : String(error)}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}, [localParticipant, roomState, config.settings, themeColors, setUserSettings]);
|
||||||
|
|
||||||
const agentVideoTrack = tracks.find(
|
const agentVideoTrack = tracks.find(
|
||||||
(trackRef) =>
|
(trackRef) =>
|
||||||
trackRef.publication.kind === Track.Kind.Video &&
|
trackRef.publication.kind === Track.Kind.Video &&
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user