@appsocom/react 0.0.0-stage → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +32 -2
- package/dist/components.d.ts +157 -0
- package/dist/components.js +521 -0
- package/dist/components.js.map +1 -0
- package/dist/hooks.d.ts +196 -0
- package/dist/hooks.js +286 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/package.json +62 -4
- package/styles.css +360 -0
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Ready-made web UI for sfukit: video grid, participant tiles, control bar,
|
|
4
|
+
* device pickers, prejoin screen and an all-in-one <VideoConference>.
|
|
5
|
+
* Styles: import "@appsocom/react/styles.css" (theme with CSS variables), or
|
|
6
|
+
* style the `sfk-*` classes yourself.
|
|
7
|
+
*/
|
|
8
|
+
import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
|
|
9
|
+
import { applyAudioEffect, applyVideoEffect, attachTrack, isBackgroundEffectSupported, isNoiseSuppressionSupported, joinRoom, } from "@appsocom/client";
|
|
10
|
+
import { RoomProvider, initials, useActiveSpeakers, useAudioFallback, useChat, useConnectionQuality, useConnectionState, useDataSaver, useDataUsage, useEffects, useIsSpeaking, useJoin, useLocalParticipant, useLocalTrack, useMaybeRoom, useMediaConnectionState, useParticipants, useRaisedHands, useRoom, useRoomState, useTrack, } from "./hooks.js";
|
|
11
|
+
const cx = (...c) => c.filter(Boolean).join(" ");
|
|
12
|
+
// ---------------------------------------------------------------- icons
|
|
13
|
+
const paths = {
|
|
14
|
+
mic: "M12 14a3 3 0 0 0 3-3V5a3 3 0 1 0-6 0v6a3 3 0 0 0 3 3Zm5-3a5 5 0 0 1-10 0H5a7 7 0 0 0 6 6.92V21h2v-3.08A7 7 0 0 0 19 11h-2Z",
|
|
15
|
+
micOff: "M19 11h-2a5 5 0 0 1-.6 2.4l1.5 1.5A7 7 0 0 0 19 11ZM15 11V5a3 3 0 0 0-5.9-.8L15 10.1V11ZM4.3 3 3 4.3l6 6V11a3 3 0 0 0 4.5 2.6l1.6 1.6A5 5 0 0 1 7 11H5a7 7 0 0 0 6 6.9V21h2v-3.1a7 7 0 0 0 3.6-1.5l3.1 3.1 1.3-1.3L4.3 3Z",
|
|
16
|
+
cam: "M17 10.5V7a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-3.5l4 4v-11l-4 4Z",
|
|
17
|
+
camOff: "M21 6.5l-4 4V7a1 1 0 0 0-1-1H9.8L21 17.2V6.5ZM3.3 2 2 3.3 4.7 6H4a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h12c.2 0 .4-.1.5-.2l3.2 3.2 1.3-1.3L3.3 2Z",
|
|
18
|
+
screen: "M20 18a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2H0v2h24v-2h-4ZM4 6h16v10H4V6Z",
|
|
19
|
+
leave: "M12 9c-1.6 0-3.1.3-4.6.7v3.1c0 .4-.2.7-.6.9-1 .5-1.9 1.1-2.7 1.8-.2.2-.4.3-.7.3s-.5-.1-.7-.3L.3 13.1A1 1 0 0 1 0 12.4c0-.3.1-.5.3-.7A16.9 16.9 0 0 1 12 7c4.5 0 8.6 1.8 11.7 4.7.2.2.3.4.3.7 0 .3-.1.5-.3.7l-2.5 2.4c-.2.2-.4.3-.7.3s-.5-.1-.7-.3c-.8-.7-1.7-1.3-2.7-1.8-.3-.2-.6-.5-.6-.9V9.7C15.1 9.3 13.6 9 12 9Z",
|
|
20
|
+
blur: "M6 13a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm0 4a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm0-8a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm-3 .5a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1ZM6 5a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm15 5.5a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1ZM14 7a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm0-3.5a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1ZM3 13.5a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Zm7 7a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Zm0-17a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1ZM10 7a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm0 5.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Zm8 .5a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm0 4a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm0-8a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm0-4a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm3 8.5a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1ZM14 17a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm0 3.5a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Zm-4-12a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Zm0 8.5a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm4-4.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Zm0-4a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z",
|
|
21
|
+
noise: "M7 18h2V6H7v12Zm4 4h2V2h-2v20Zm-8-8h2v-4H3v4Zm12 4h2V6h-2v12Zm4-8v4h2v-4h-2Z",
|
|
22
|
+
hand: "M21 7a2 2 0 0 0-3 0V4a2 2 0 0 0-3.5-1.3A2 2 0 0 0 11 3v.3A2 2 0 0 0 8 5v8.6l-1.4-1.4a2 2 0 0 0-2.8 2.8l4.5 4.5A8 8 0 0 0 22 13V7a2 2 0 0 0-1-0Z",
|
|
23
|
+
settings: "M19.4 13a7.6 7.6 0 0 0 0-2l2.1-1.6-2-3.5-2.5 1a7.4 7.4 0 0 0-1.7-1L15 3h-4l-.4 2.7a7.4 7.4 0 0 0-1.7 1l-2.5-1-2 3.5L6.6 11a7.6 7.6 0 0 0 0 2l-2.1 1.6 2 3.5 2.5-1c.5.4 1.1.7 1.7 1L11 21h4l.4-2.7c.6-.3 1.2-.6 1.7-1l2.5 1 2-3.5-2.2-1.8ZM13 15.5a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7Z",
|
|
24
|
+
chat: "M20 2H4a2 2 0 0 0-2 2v18l4-4h14a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2Z",
|
|
25
|
+
};
|
|
26
|
+
export function Icon({ name, size = 20 }) {
|
|
27
|
+
return (_jsx("svg", { className: "sfk-icon", width: size, height: size, viewBox: "0 0 24 24", "aria-hidden": "true", fill: "currentColor", children: _jsx("path", { d: paths[name] ?? "" }) }));
|
|
28
|
+
}
|
|
29
|
+
// ---------------------------------------------------------------- media
|
|
30
|
+
/** A <video> showing one track. Muted by default (audio is played by the room). */
|
|
31
|
+
export function VideoTrack({ track, mirror = false, fit = "cover", className, style, }) {
|
|
32
|
+
const ref = useRef(null);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (ref.current)
|
|
35
|
+
attachTrack(ref.current, track ?? null);
|
|
36
|
+
}, [track]);
|
|
37
|
+
return (_jsx("video", { ref: ref, className: cx("sfk-video", mirror && "sfk-mirror", className), style: { objectFit: fit, ...style }, muted: true, autoPlay: true, playsInline: true }));
|
|
38
|
+
}
|
|
39
|
+
/** Live audio level of a track, 0..1 (for mic meters). */
|
|
40
|
+
export function useAudioLevel(track) {
|
|
41
|
+
const [level, setLevel] = useState(0);
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (!track || typeof AudioContext === "undefined")
|
|
44
|
+
return;
|
|
45
|
+
const ctx = new AudioContext();
|
|
46
|
+
const src = ctx.createMediaStreamSource(new MediaStream([track]));
|
|
47
|
+
const an = ctx.createAnalyser();
|
|
48
|
+
an.fftSize = 512;
|
|
49
|
+
src.connect(an);
|
|
50
|
+
const buf = new Float32Array(an.fftSize);
|
|
51
|
+
const timer = setInterval(() => {
|
|
52
|
+
an.getFloatTimeDomainData(buf);
|
|
53
|
+
let sum = 0;
|
|
54
|
+
for (const v of buf)
|
|
55
|
+
sum += v * v;
|
|
56
|
+
setLevel(Math.min(1, Math.sqrt(sum / buf.length) * 4));
|
|
57
|
+
}, 100);
|
|
58
|
+
return () => {
|
|
59
|
+
clearInterval(timer);
|
|
60
|
+
src.disconnect();
|
|
61
|
+
void ctx.close().catch(() => { });
|
|
62
|
+
};
|
|
63
|
+
}, [track]);
|
|
64
|
+
return level;
|
|
65
|
+
}
|
|
66
|
+
/** Cameras, mics or speakers, kept up to date as devices are plugged in. */
|
|
67
|
+
export function useMediaDevices(kind) {
|
|
68
|
+
const [devices, setDevices] = useState([]);
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
const md = typeof navigator !== "undefined" ? navigator.mediaDevices : undefined;
|
|
71
|
+
if (!md?.enumerateDevices)
|
|
72
|
+
return;
|
|
73
|
+
let alive = true;
|
|
74
|
+
const load = () => md.enumerateDevices().then((all) => alive && setDevices(all.filter((d) => d.kind === kind && d.deviceId)));
|
|
75
|
+
void load();
|
|
76
|
+
md.addEventListener?.("devicechange", load);
|
|
77
|
+
return () => {
|
|
78
|
+
alive = false;
|
|
79
|
+
md.removeEventListener?.("devicechange", load);
|
|
80
|
+
};
|
|
81
|
+
}, [kind]);
|
|
82
|
+
return devices;
|
|
83
|
+
}
|
|
84
|
+
// ---------------------------------------------------------------- tiles
|
|
85
|
+
function QualityBars({ quality }) {
|
|
86
|
+
if (!quality)
|
|
87
|
+
return null;
|
|
88
|
+
const n = { excellent: 3, good: 2, poor: 1, lost: 0 }[quality];
|
|
89
|
+
return (_jsx("span", { className: cx("sfk-quality", `sfk-quality-${quality}`), title: `Connection: ${quality}`, "data-quality": quality, children: [1, 2, 3].map((i) => (_jsx("i", { className: i <= n ? "on" : "" }, i))) }));
|
|
90
|
+
}
|
|
91
|
+
/** One participant: video (or initials), name, mic state, speaking ring, quality, role, hand. */
|
|
92
|
+
export function ParticipantTile({ participant, local = !participant, source = "camera", moderation = true, subscribeWhenVisible = true, className, children, }) {
|
|
93
|
+
const room = useRoom();
|
|
94
|
+
const me = useLocalParticipant();
|
|
95
|
+
const p = local ? me.self : participant;
|
|
96
|
+
const id = p?.id;
|
|
97
|
+
const remoteTrack = useTrack(local ? undefined : id, source === "screen" ? "screenVideo" : "video");
|
|
98
|
+
const localTrack = useLocalTrack(source === "screen" ? "screenVideo" : "video");
|
|
99
|
+
const track = local ? localTrack : remoteTrack;
|
|
100
|
+
const state = local ? me.state : p?.state;
|
|
101
|
+
const audioOnly = source === "camera" && !!state?.audioOnly;
|
|
102
|
+
const videoOn = source === "screen" ? !!track : !!state?.cameraOn && !state?.videoPaused && !audioOnly;
|
|
103
|
+
const speaking = useIsSpeaking(id);
|
|
104
|
+
const quality = useConnectionQuality(id);
|
|
105
|
+
const hands = useRaisedHands();
|
|
106
|
+
const handUp = !!p && hands.some((h) => h.userId === p.userId);
|
|
107
|
+
const ref = useRef(null);
|
|
108
|
+
// Adaptive video: match the received size to the tile, and stop video for off-screen tiles.
|
|
109
|
+
useEffect(() => {
|
|
110
|
+
if (local || !id || !ref.current || source !== "camera")
|
|
111
|
+
return;
|
|
112
|
+
const offs = [];
|
|
113
|
+
if (room.fitVideoQuality)
|
|
114
|
+
offs.push(room.fitVideoQuality(id, ref.current));
|
|
115
|
+
if (subscribeWhenVisible && room.observeVisibility)
|
|
116
|
+
offs.push(room.observeVisibility(ref.current, id));
|
|
117
|
+
return () => offs.forEach((f) => f());
|
|
118
|
+
}, [room, id, local, source, subscribeWhenVisible]);
|
|
119
|
+
if (!p)
|
|
120
|
+
return null;
|
|
121
|
+
const name = local ? `${p.name || "You"} (you)` : p.name || p.userId;
|
|
122
|
+
const agentState = p.agent?.state;
|
|
123
|
+
return (_jsxs("div", { ref: ref, className: cx("sfk-tile", speaking && "sfk-speaking", source === "screen" && "sfk-tile-screen", className), "data-participant-id": p.id, "data-user-id": p.userId, "data-source": source, "data-local": local ? "true" : undefined, "data-speaking": speaking ? "true" : undefined, children: [videoOn && track ? (_jsx(VideoTrack, { track: track, mirror: local && source === "camera", fit: source === "screen" ? "contain" : "cover" })) : (_jsx("div", { className: "sfk-avatar", "aria-hidden": "true", children: _jsx("span", { children: initials(p.name || p.userId) }) })), _jsxs("div", { className: "sfk-tile-bar", children: [source === "camera" && !state?.micOn && (_jsx("span", { className: "sfk-muted", title: "Muted", "data-muted": "true", children: _jsx(Icon, { name: "micOff", size: 14 }) })), handUp && _jsx("span", { className: "sfk-hand", title: "Hand raised", children: "\u270B" }), _jsx("span", { className: "sfk-name", children: source === "screen" ? `${name}: screen` : name }), p.role && !["participant", "viewer"].includes(p.role) && _jsx("span", { className: "sfk-role", children: p.role }), agentState && _jsx("span", { className: "sfk-role", children: agentState }), audioOnly && (_jsx("span", { className: "sfk-role", "data-audio-only": state?.audioFallback ? "fallback" : "chosen", title: state?.audioFallback ? "Weak connection: audio only for now" : "Audio only", children: state?.audioFallback ? "weak network" : "audio only" })), _jsx(QualityBars, { quality: quality })] }), !local && moderation && source === "camera" && _jsx(ModerationMenu, { participant: p }), children] }));
|
|
124
|
+
}
|
|
125
|
+
function ModerationMenu({ participant }) {
|
|
126
|
+
const room = useRoom();
|
|
127
|
+
const { permissions } = useLocalParticipant();
|
|
128
|
+
const [open, setOpen] = useState(false);
|
|
129
|
+
if (!permissions.moderate)
|
|
130
|
+
return null;
|
|
131
|
+
const act = (fn) => () => {
|
|
132
|
+
try {
|
|
133
|
+
fn();
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
setOpen(false);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
const p = participant;
|
|
140
|
+
return (_jsxs("div", { className: "sfk-mod", children: [_jsx("button", { className: "sfk-mod-btn", "aria-label": `Manage ${p.name}`, onClick: () => setOpen((o) => !o), children: "\u22EF" }), open && (_jsxs("div", { className: "sfk-menu", role: "menu", children: [room.mute && p.state.micOn && (_jsx("button", { role: "menuitem", onClick: act(() => room.mute(p.userId, ["mic"])), children: "Mute" })), room.mute && p.state.cameraOn && (_jsx("button", { role: "menuitem", onClick: act(() => room.mute(p.userId, ["camera"])), children: "Stop camera" })), room.setPermissions && (_jsx("button", { role: "menuitem", onClick: act(() => room.setPermissions(p.userId, { screen: !p.permissions.screen })), children: p.permissions.screen ? "Stop presenting rights" : "Let present" })), room.lowerHand && (_jsx("button", { role: "menuitem", onClick: act(() => room.lowerHand(p.userId)), children: "Lower hand" })), room.remove && (_jsx("button", { role: "menuitem", className: "sfk-danger", onClick: act(() => room.remove(p.userId)), children: "Remove" }))] }))] }));
|
|
141
|
+
}
|
|
142
|
+
/** Everyone's video, laid out to fit. Screen shares and spotlighted people get the big spot. */
|
|
143
|
+
export function VideoGrid({ layout = "auto", includeLocal = true, subscribeWhenVisible = true, className }) {
|
|
144
|
+
const room = useRoom();
|
|
145
|
+
const participants = useParticipants();
|
|
146
|
+
const { self, state } = useLocalParticipant();
|
|
147
|
+
const speakers = useActiveSpeakers();
|
|
148
|
+
const roomState = useRoomState();
|
|
149
|
+
const spotlight = roomState?.spotlight ?? [];
|
|
150
|
+
const cameras = [
|
|
151
|
+
...(includeLocal && self ? [{ key: "local", local: true, source: "camera" }] : []),
|
|
152
|
+
...participants
|
|
153
|
+
.filter((p) => p.kind !== "bot")
|
|
154
|
+
.map((p) => ({ key: p.id, p, local: false, source: "camera" })),
|
|
155
|
+
];
|
|
156
|
+
const screens = [
|
|
157
|
+
...(state.screenOn ? [{ key: "local-screen", local: true, source: "screen" }] : []),
|
|
158
|
+
...participants.filter((p) => p.state.screenOn).map((p) => ({ key: `${p.id}-screen`, p, local: false, source: "screen" })),
|
|
159
|
+
];
|
|
160
|
+
let main = [];
|
|
161
|
+
if (layout !== "grid") {
|
|
162
|
+
if (screens.length)
|
|
163
|
+
main = screens.slice(0, 1);
|
|
164
|
+
else if (spotlight.length) {
|
|
165
|
+
main = cameras.filter((c) => spotlight.includes(c.local ? room.userId : c.p.userId));
|
|
166
|
+
}
|
|
167
|
+
else if (layout === "speaker" && cameras.length > 1) {
|
|
168
|
+
const top = speakers.find((id) => id !== self?.id) ?? cameras.find((c) => !c.local)?.p?.id;
|
|
169
|
+
main = cameras.filter((c) => !c.local && c.p?.id === top);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const mainKeys = new Set(main.map((m) => m.key));
|
|
173
|
+
const rest = [...cameras, ...screens].filter((c) => !mainKeys.has(c.key));
|
|
174
|
+
const tile = (it) => (_jsx(ParticipantTile, { participant: it.p, local: it.local, source: it.source, subscribeWhenVisible: subscribeWhenVisible }, it.key));
|
|
175
|
+
if (!main.length) {
|
|
176
|
+
const cols = Math.ceil(Math.sqrt(rest.length || 1));
|
|
177
|
+
return (_jsx("div", { className: cx("sfk-grid", className), style: { "--sfk-cols": cols }, "data-layout": "grid", children: rest.map(tile) }));
|
|
178
|
+
}
|
|
179
|
+
return (_jsxs("div", { className: cx("sfk-grid sfk-grid-focus", className), "data-layout": "focus", children: [_jsx("div", { className: "sfk-focus", style: { "--sfk-cols": Math.ceil(Math.sqrt(main.length)) }, children: main.map(tile) }), rest.length > 0 && _jsx("div", { className: "sfk-strip", children: rest.map(tile) })] }));
|
|
180
|
+
}
|
|
181
|
+
// ---------------------------------------------------------------- devices
|
|
182
|
+
/**
|
|
183
|
+
* A <select> of cameras, mics or speakers. Inside a room, picking one switches
|
|
184
|
+
* the room's device; outside (prejoin), pass value/onChange.
|
|
185
|
+
*/
|
|
186
|
+
export function DeviceSelect({ kind, value, onChange, label, className, }) {
|
|
187
|
+
const room = useMaybeRoom();
|
|
188
|
+
const devices = useMediaDevices(kind);
|
|
189
|
+
const [selected, setSelected] = useState(value ?? "");
|
|
190
|
+
useEffect(() => {
|
|
191
|
+
if (value !== undefined)
|
|
192
|
+
setSelected(value);
|
|
193
|
+
}, [value]);
|
|
194
|
+
if (kind === "audiooutput" && typeof HTMLMediaElement !== "undefined" && !("setSinkId" in HTMLMediaElement.prototype)) {
|
|
195
|
+
return null; // can't choose speakers in this browser
|
|
196
|
+
}
|
|
197
|
+
const text = label ?? { audioinput: "Microphone", videoinput: "Camera", audiooutput: "Speaker" }[kind];
|
|
198
|
+
return (_jsxs("label", { className: cx("sfk-device", className), children: [_jsx("span", { children: text }), _jsxs("select", { value: selected, "data-kind": kind, onChange: (e) => {
|
|
199
|
+
const id = e.target.value;
|
|
200
|
+
const device = devices.find((d) => d.deviceId === id);
|
|
201
|
+
setSelected(id);
|
|
202
|
+
if (onChange)
|
|
203
|
+
onChange(id, device);
|
|
204
|
+
else if (room && device) {
|
|
205
|
+
if (kind === "audioinput")
|
|
206
|
+
room.setMicDevice?.(device);
|
|
207
|
+
else if (kind === "videoinput")
|
|
208
|
+
room.setCameraDevice?.(device);
|
|
209
|
+
else
|
|
210
|
+
room.setAudioOutputDevice?.(id);
|
|
211
|
+
}
|
|
212
|
+
}, children: [!selected && _jsx("option", { value: "", children: "Default" }), devices.map((d, i) => (_jsx("option", { value: d.deviceId, children: d.label || `${text} ${i + 1}` }, d.deviceId)))] })] }));
|
|
213
|
+
}
|
|
214
|
+
/** Mic, camera, screen share, blur, noise suppression, devices, raise hand, leave. */
|
|
215
|
+
export function ControlBar({ controls = {}, onLeave, onToggleChat, className, children }) {
|
|
216
|
+
const room = useRoom();
|
|
217
|
+
const { state, permissions, self } = useLocalParticipant();
|
|
218
|
+
const fx = useEffects();
|
|
219
|
+
const hands = useRaisedHands();
|
|
220
|
+
const [devicesOpen, setDevicesOpen] = useState(false);
|
|
221
|
+
const show = (k) => controls[k] !== false;
|
|
222
|
+
const handUp = !!self && hands.some((h) => h.userId === self.userId);
|
|
223
|
+
const canBlur = fx.supported && isBackgroundEffectSupported();
|
|
224
|
+
const canNs = fx.supported && isNoiseSuppressionSupported();
|
|
225
|
+
return (_jsxs("div", { className: cx("sfk-controls", className), role: "toolbar", "aria-label": "Call controls", children: [show("mic") && permissions.mic && (_jsx("button", { className: cx("sfk-btn", !state.micOn && "sfk-off"), "aria-pressed": state.micOn, "aria-label": state.micOn ? "Mute microphone" : "Unmute microphone", "data-control": "mic", onClick: () => room.toggleMic(), children: _jsx(Icon, { name: state.micOn ? "mic" : "micOff" }) })), show("camera") && permissions.camera && (_jsx("button", { className: cx("sfk-btn", !state.cameraOn && "sfk-off"), "aria-pressed": state.cameraOn, "aria-label": state.cameraOn ? "Turn camera off" : "Turn camera on", "data-control": "camera", onClick: () => room.toggleCamera(), children: _jsx(Icon, { name: state.cameraOn ? "cam" : "camOff" }) })), show("screen") && permissions.screen && room.toggleScreenShare && typeof navigator !== "undefined" && !!navigator.mediaDevices?.getDisplayMedia && (_jsx("button", { className: cx("sfk-btn", state.screenOn && "sfk-active"), "aria-pressed": state.screenOn, "aria-label": state.screenOn ? "Stop sharing screen" : "Share screen", "data-control": "screen", onClick: () => room.toggleScreenShare(), children: _jsx(Icon, { name: "screen" }) })), show("blur") && permissions.camera && canBlur && (_jsx("button", { className: cx("sfk-btn", fx.backgroundBlur && "sfk-active"), "aria-pressed": fx.backgroundBlur, "aria-label": fx.backgroundBlur ? "Turn background blur off" : "Blur background", "data-control": "blur", onClick: () => fx.setBackgroundBlur(!fx.backgroundBlur), children: _jsx(Icon, { name: "blur" }) })), show("noise") && permissions.mic && canNs && (_jsx("button", { className: cx("sfk-btn", fx.noiseSuppression && "sfk-active"), "aria-pressed": fx.noiseSuppression, "aria-label": fx.noiseSuppression ? "Turn noise suppression off" : "Suppress background noise", "data-control": "noise", onClick: () => fx.setNoiseSuppression(!fx.noiseSuppression), children: _jsx(Icon, { name: "noise" }) })), show("hand") && room.raiseHand && !permissions.moderate && (_jsx("button", { className: cx("sfk-btn", handUp && "sfk-active"), "aria-pressed": handUp, "aria-label": handUp ? "Lower hand" : "Raise hand", "data-control": "hand", onClick: () => (handUp ? room.lowerHand?.() : room.raiseHand?.()), children: _jsx(Icon, { name: "hand" }) })), show("chat") && onToggleChat && (_jsx("button", { className: "sfk-btn", "aria-label": "Chat", "data-control": "chat", onClick: onToggleChat, children: _jsx(Icon, { name: "chat" }) })), show("devices") && (_jsxs("div", { className: "sfk-devices-wrap", children: [_jsx("button", { className: cx("sfk-btn", devicesOpen && "sfk-active"), "aria-expanded": devicesOpen, "aria-label": "Devices", "data-control": "devices", onClick: () => setDevicesOpen((o) => !o), children: _jsx(Icon, { name: "settings" }) }), devicesOpen && (_jsxs("div", { className: "sfk-popover", children: [permissions.mic && _jsx(DeviceSelect, { kind: "audioinput" }), permissions.camera && _jsx(DeviceSelect, { kind: "videoinput" }), _jsx(DeviceSelect, { kind: "audiooutput" }), _jsx(DataSaverSelect, {})] }))] })), children, show("leave") && (_jsx("button", { className: "sfk-btn sfk-leave", "aria-label": "Leave call", "data-control": "leave", onClick: () => {
|
|
226
|
+
room.leave("left");
|
|
227
|
+
onLeave?.();
|
|
228
|
+
}, children: _jsx(Icon, { name: "leave" }) }))] }));
|
|
229
|
+
}
|
|
230
|
+
const DATA_SAVER_LABELS = {
|
|
231
|
+
off: "Off (best quality)",
|
|
232
|
+
low: "Low: 360p, speaker video only",
|
|
233
|
+
minimal: "Minimal: 180p, speaker video only",
|
|
234
|
+
audio: "Audio only",
|
|
235
|
+
};
|
|
236
|
+
/** Data-saver picker (rendered inside the ControlBar's devices popover too). */
|
|
237
|
+
export function DataSaverSelect({ label = "Data saver", className }) {
|
|
238
|
+
const { supported, mode, setDataSaver } = useDataSaver();
|
|
239
|
+
if (!supported)
|
|
240
|
+
return null;
|
|
241
|
+
return (_jsxs("label", { className: cx("sfk-device", className), children: [_jsx("span", { children: label }), _jsx("select", { value: mode === "custom" ? "low" : mode, "data-control": "data-saver", onChange: (e) => setDataSaver(e.target.value), children: Object.keys(DATA_SAVER_LABELS).map((m) => (_jsx("option", { value: m, children: DATA_SAVER_LABELS[m] }, m))) })] }));
|
|
242
|
+
}
|
|
243
|
+
/** "12.4 MB used · about 85 MB per hour". Renders nothing until there's a reading. */
|
|
244
|
+
export function DataUsageMeter({ className }) {
|
|
245
|
+
const usage = useDataUsage();
|
|
246
|
+
if (!usage || !usage.totalBytes)
|
|
247
|
+
return null;
|
|
248
|
+
const mb = usage.totalBytes / 1e6;
|
|
249
|
+
return (_jsxs("span", { className: cx("sfk-data-usage", className), "data-total-bytes": usage.totalBytes, title: `Up ${(usage.sentBytes / 1e6).toFixed(1)} MB, down ${(usage.receivedBytes / 1e6).toFixed(1)} MB`, children: [mb < 10 ? mb.toFixed(1) : Math.round(mb), " MB used", usage.mbPerHour ? ` · about ${Math.round(usage.mbPerHour)} MB per hour` : ""] }));
|
|
250
|
+
}
|
|
251
|
+
/** "Reconnecting…" banner while the room or media connection is down, or a note while on audio fallback. */
|
|
252
|
+
export function ConnectionBanner() {
|
|
253
|
+
const state = useConnectionState();
|
|
254
|
+
const media = useMediaConnectionState();
|
|
255
|
+
const fallback = useAudioFallback();
|
|
256
|
+
const msg = state === "reconnecting"
|
|
257
|
+
? "Reconnecting…"
|
|
258
|
+
: media === "disconnected" || media === "failed"
|
|
259
|
+
? "Media connection lost, reconnecting…"
|
|
260
|
+
: fallback
|
|
261
|
+
? "Weak connection: switched to audio only. Video comes back when it improves."
|
|
262
|
+
: null;
|
|
263
|
+
if (!msg)
|
|
264
|
+
return null;
|
|
265
|
+
return (_jsx("div", { className: "sfk-banner", role: "status", "data-state": state, children: msg }));
|
|
266
|
+
}
|
|
267
|
+
/** Simple chat panel (room.chat / room.sendChat). */
|
|
268
|
+
export function ChatPanel({ className }) {
|
|
269
|
+
const { messages, send, enabled } = useChat();
|
|
270
|
+
const { permissions } = useLocalParticipant();
|
|
271
|
+
const [text, setText] = useState("");
|
|
272
|
+
const listRef = useRef(null);
|
|
273
|
+
useEffect(() => {
|
|
274
|
+
listRef.current?.scrollTo({ top: listRef.current.scrollHeight });
|
|
275
|
+
}, [messages.length]);
|
|
276
|
+
const canSend = enabled || permissions.moderate;
|
|
277
|
+
return (_jsxs("div", { className: cx("sfk-chat", className), children: [_jsx("div", { className: "sfk-chat-list", ref: listRef, children: messages.map((m) => (_jsxs("div", { className: "sfk-chat-msg", children: [_jsx("b", { children: m.fromName }), " ", m.to && _jsx("em", { children: "(private)" }), " ", _jsx("span", { children: m.text })] }, m.id))) }), _jsx("form", { className: "sfk-chat-form", onSubmit: (e) => {
|
|
278
|
+
e.preventDefault();
|
|
279
|
+
if (!text.trim())
|
|
280
|
+
return;
|
|
281
|
+
send(text.trim());
|
|
282
|
+
setText("");
|
|
283
|
+
}, children: _jsx("input", { value: text, disabled: !canSend, placeholder: canSend ? "Message everyone" : "Chat is turned off", onChange: (e) => setText(e.target.value) }) })] }));
|
|
284
|
+
}
|
|
285
|
+
/** Camera preview, mic level, device pickers and on/off toggles before joining. */
|
|
286
|
+
export function PreJoin({ onSubmit, askName = false, defaults = {}, joinLabel = "Join", showEffects = true, className }) {
|
|
287
|
+
const [c, setC] = useState({
|
|
288
|
+
name: "",
|
|
289
|
+
audio: true,
|
|
290
|
+
video: true,
|
|
291
|
+
backgroundBlur: false,
|
|
292
|
+
noiseSuppression: false,
|
|
293
|
+
...defaults,
|
|
294
|
+
});
|
|
295
|
+
const set = (k, v) => setC((prev) => ({ ...prev, [k]: v }));
|
|
296
|
+
const [camTrack, setCamTrack] = useState(null);
|
|
297
|
+
const [preview, setPreview] = useState(null);
|
|
298
|
+
const [micTrack, setMicTrack] = useState(null);
|
|
299
|
+
const [error, setError] = useState(null);
|
|
300
|
+
const level = useAudioLevel(c.audio ? micTrack : null);
|
|
301
|
+
// Camera preview.
|
|
302
|
+
useEffect(() => {
|
|
303
|
+
if (!c.video)
|
|
304
|
+
return setCamTrack(null);
|
|
305
|
+
let t = null;
|
|
306
|
+
let alive = true;
|
|
307
|
+
navigator.mediaDevices
|
|
308
|
+
.getUserMedia({ video: c.videoDeviceId ? { deviceId: { exact: c.videoDeviceId } } : true })
|
|
309
|
+
.then((s) => {
|
|
310
|
+
t = s.getVideoTracks()[0] ?? null;
|
|
311
|
+
if (!alive)
|
|
312
|
+
return t?.stop();
|
|
313
|
+
setCamTrack(t);
|
|
314
|
+
setError(null);
|
|
315
|
+
})
|
|
316
|
+
.catch((e) => alive && setError(`Camera: ${e.message || e.name}`));
|
|
317
|
+
return () => {
|
|
318
|
+
alive = false;
|
|
319
|
+
t?.stop();
|
|
320
|
+
};
|
|
321
|
+
}, [c.video, c.videoDeviceId]);
|
|
322
|
+
// Blur preview on top of the camera.
|
|
323
|
+
useEffect(() => {
|
|
324
|
+
if (!camTrack || !c.backgroundBlur)
|
|
325
|
+
return setPreview(camTrack);
|
|
326
|
+
let stop = null;
|
|
327
|
+
let alive = true;
|
|
328
|
+
applyVideoEffect(camTrack, {}).then((r) => (alive ? (setPreview(r.track), (stop = r.stop)) : r.stop()), () => alive && setPreview(camTrack));
|
|
329
|
+
return () => {
|
|
330
|
+
alive = false;
|
|
331
|
+
stop?.();
|
|
332
|
+
};
|
|
333
|
+
}, [camTrack, c.backgroundBlur]);
|
|
334
|
+
// Mic (for the level meter).
|
|
335
|
+
useEffect(() => {
|
|
336
|
+
if (!c.audio)
|
|
337
|
+
return setMicTrack(null);
|
|
338
|
+
let t = null;
|
|
339
|
+
let alive = true;
|
|
340
|
+
let stopNs = null;
|
|
341
|
+
navigator.mediaDevices
|
|
342
|
+
.getUserMedia({ audio: c.audioDeviceId ? { deviceId: { exact: c.audioDeviceId } } : true })
|
|
343
|
+
.then(async (s) => {
|
|
344
|
+
t = s.getAudioTracks()[0] ?? null;
|
|
345
|
+
if (!alive || !t)
|
|
346
|
+
return t?.stop();
|
|
347
|
+
if (c.noiseSuppression) {
|
|
348
|
+
const r = await applyAudioEffect(t).catch(() => null);
|
|
349
|
+
if (r && alive) {
|
|
350
|
+
stopNs = r.stop;
|
|
351
|
+
return setMicTrack(r.track);
|
|
352
|
+
}
|
|
353
|
+
r?.stop();
|
|
354
|
+
}
|
|
355
|
+
setMicTrack(t);
|
|
356
|
+
})
|
|
357
|
+
.catch((e) => alive && setError(`Microphone: ${e.message || e.name}`));
|
|
358
|
+
return () => {
|
|
359
|
+
alive = false;
|
|
360
|
+
stopNs?.();
|
|
361
|
+
t?.stop();
|
|
362
|
+
};
|
|
363
|
+
}, [c.audio, c.audioDeviceId, c.noiseSuppression]);
|
|
364
|
+
return (_jsxs("form", { className: cx("sfk-prejoin", className), onSubmit: (e) => {
|
|
365
|
+
e.preventDefault();
|
|
366
|
+
onSubmit(c);
|
|
367
|
+
}, children: [_jsxs("div", { className: "sfk-prejoin-preview", children: [c.video && preview ? (_jsx(VideoTrack, { track: preview, mirror: true })) : (_jsx("div", { className: "sfk-avatar", children: _jsx("span", { children: c.video ? "…" : "Camera off" }) })), _jsxs("div", { className: "sfk-prejoin-toggles", children: [_jsx("button", { type: "button", className: cx("sfk-btn", !c.audio && "sfk-off"), "aria-pressed": c.audio, "aria-label": c.audio ? "Mute microphone" : "Unmute microphone", "data-control": "mic", onClick: () => set("audio", !c.audio), children: _jsx(Icon, { name: c.audio ? "mic" : "micOff" }) }), _jsx("button", { type: "button", className: cx("sfk-btn", !c.video && "sfk-off"), "aria-pressed": c.video, "aria-label": c.video ? "Turn camera off" : "Turn camera on", "data-control": "camera", onClick: () => set("video", !c.video), children: _jsx(Icon, { name: c.video ? "cam" : "camOff" }) })] }), _jsx("div", { className: "sfk-level", "aria-label": "Microphone level", children: _jsx("i", { style: { width: `${Math.round(level * 100)}%` } }) })] }), error && _jsx("p", { className: "sfk-error", children: error }), askName && (_jsxs("label", { className: "sfk-device", children: [_jsx("span", { children: "Your name" }), _jsx("input", { required: true, value: c.name, onChange: (e) => set("name", e.target.value) })] })), _jsx(DeviceSelect, { kind: "audioinput", value: c.audioDeviceId, onChange: (id) => set("audioDeviceId", id) }), _jsx(DeviceSelect, { kind: "videoinput", value: c.videoDeviceId, onChange: (id) => set("videoDeviceId", id) }), showEffects && isBackgroundEffectSupported() && (_jsxs("label", { className: "sfk-check", children: [_jsx("input", { type: "checkbox", checked: c.backgroundBlur, onChange: (e) => set("backgroundBlur", e.target.checked) }), " Blur my background"] })), showEffects && isNoiseSuppressionSupported() && (_jsxs("label", { className: "sfk-check", children: [_jsx("input", { type: "checkbox", checked: c.noiseSuppression, onChange: (e) => set("noiseSuppression", e.target.checked) }), " ", "Suppress background noise"] })), _jsx("button", { type: "submit", className: "sfk-join", "data-control": "join", children: joinLabel })] }));
|
|
368
|
+
}
|
|
369
|
+
/** Joins a room while mounted and provides it to the hooks/components inside. */
|
|
370
|
+
export function SfuRoom(props) {
|
|
371
|
+
const { url, token, audioDeviceId, videoDeviceId, audioOutputDeviceId, connecting, renderError, onJoined, onLeft, onError, children, ...options } = props;
|
|
372
|
+
const { room, status, error } = useJoin(joinRoom, { url, token, ...options }, { key: `${url}|${token}` });
|
|
373
|
+
const cb = useRef({ onJoined, onLeft, onError });
|
|
374
|
+
cb.current = { onJoined, onLeft, onError };
|
|
375
|
+
useEffect(() => {
|
|
376
|
+
if (!room)
|
|
377
|
+
return;
|
|
378
|
+
const offs = [
|
|
379
|
+
room.on("left", (reason) => cb.current.onLeft?.(reason)),
|
|
380
|
+
room.on("error", (e) => cb.current.onError?.(e)),
|
|
381
|
+
];
|
|
382
|
+
cb.current.onJoined?.(room);
|
|
383
|
+
void applyDevices(room, audioDeviceId, videoDeviceId, audioOutputDeviceId);
|
|
384
|
+
return () => offs.forEach((off) => off());
|
|
385
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
386
|
+
}, [room]);
|
|
387
|
+
useEffect(() => {
|
|
388
|
+
if (error)
|
|
389
|
+
cb.current.onError?.(error);
|
|
390
|
+
}, [error]);
|
|
391
|
+
if (status === "error" && error)
|
|
392
|
+
return _jsx(_Fragment, { children: renderError ? renderError(error) : _jsx("p", { className: "sfk-error", children: error.message }) });
|
|
393
|
+
if (!room)
|
|
394
|
+
return _jsx(_Fragment, { children: connecting ?? _jsx("div", { className: "sfk-connecting", children: "Connecting\u2026" }) });
|
|
395
|
+
return _jsx(RoomProvider, { room: room, children: children });
|
|
396
|
+
}
|
|
397
|
+
async function applyDevices(room, mic, cam, out) {
|
|
398
|
+
if (out)
|
|
399
|
+
room.setAudioOutputDevice(out);
|
|
400
|
+
if (!mic && !cam)
|
|
401
|
+
return;
|
|
402
|
+
const all = await navigator.mediaDevices.enumerateDevices().catch(() => []);
|
|
403
|
+
const m = mic && all.find((d) => d.kind === "audioinput" && d.deviceId === mic);
|
|
404
|
+
const c = cam && all.find((d) => d.kind === "videoinput" && d.deviceId === cam);
|
|
405
|
+
if (m)
|
|
406
|
+
room.setMicDevice(m);
|
|
407
|
+
if (c)
|
|
408
|
+
room.setCameraDevice(c);
|
|
409
|
+
}
|
|
410
|
+
/** The whole call UI in one component: prejoin → grid + controls + chat. */
|
|
411
|
+
export function VideoConference({ prejoin = true, chat = true, layout, className, ...roomProps }) {
|
|
412
|
+
const [choices, setChoices] = useState(prejoin ? null : {});
|
|
413
|
+
const [left, setLeft] = useState(null);
|
|
414
|
+
const [chatOpen, setChatOpen] = useState(false);
|
|
415
|
+
const onLeft = useCallback((reason) => {
|
|
416
|
+
setLeft(reason);
|
|
417
|
+
roomProps.onLeft?.(reason);
|
|
418
|
+
},
|
|
419
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
420
|
+
[roomProps.onLeft]);
|
|
421
|
+
const joinProps = useMemo(() => choices && prejoin
|
|
422
|
+
? {
|
|
423
|
+
audio: choices.audio,
|
|
424
|
+
video: choices.video,
|
|
425
|
+
audioDeviceId: choices.audioDeviceId,
|
|
426
|
+
videoDeviceId: choices.videoDeviceId,
|
|
427
|
+
backgroundEffect: choices.backgroundBlur || undefined,
|
|
428
|
+
noiseSuppression: choices.noiseSuppression || undefined,
|
|
429
|
+
}
|
|
430
|
+
: {}, [choices, prejoin]);
|
|
431
|
+
if (left) {
|
|
432
|
+
return (_jsxs("div", { className: cx("sfk-conference sfk-ended", className), children: [_jsx("p", { children: left === "left" ? "You left the call." : `The call ended (${left}).` }), _jsx("button", { className: "sfk-join", onClick: () => {
|
|
433
|
+
setLeft(null);
|
|
434
|
+
setChoices(prejoin ? null : {});
|
|
435
|
+
}, children: "Rejoin" })] }));
|
|
436
|
+
}
|
|
437
|
+
if (!choices) {
|
|
438
|
+
return (_jsx("div", { className: cx("sfk-conference", className), children: _jsx(PreJoin, { onSubmit: setChoices }) }));
|
|
439
|
+
}
|
|
440
|
+
return (_jsx("div", { className: cx("sfk-conference", className), children: _jsxs(SfuRoom, { ...roomProps, ...joinProps, onLeft: onLeft, children: [_jsx(ConnectionBanner, {}), _jsxs("div", { className: "sfk-stage", children: [_jsx(VideoGrid, { layout: layout }), chat && chatOpen && _jsx(ChatPanel, {})] }), _jsx(ControlBar, { onToggleChat: chat ? () => setChatOpen((o) => !o) : undefined })] }) }));
|
|
441
|
+
}
|
|
442
|
+
// ---------- AI lessons ----------
|
|
443
|
+
const BOARD_W = 1600;
|
|
444
|
+
const BOARD_H = 1000;
|
|
445
|
+
const BOARD_COLORS = { black: "#1f2328", blue: "#2563eb", red: "#dc2626", green: "#16a34a", orange: "#ea580c" };
|
|
446
|
+
const FONT_PX = { s: 35, m: 50, l: 75 };
|
|
447
|
+
/** A readable version of simple TeX for the board (x^2 → x², \\frac{a}{b} → a⁄b). */
|
|
448
|
+
export function texToText(tex) {
|
|
449
|
+
let s = tex;
|
|
450
|
+
for (let i = 0; i < 4; i++)
|
|
451
|
+
s = s.replace(/\\frac\{([^{}]*)\}\{([^{}]*)\}/g, "$1⁄$2");
|
|
452
|
+
return s
|
|
453
|
+
.replace(/\\sqrt\{([^{}]*)\}/g, "√($1)")
|
|
454
|
+
.replace(/\^2|\^\{2\}/g, "²")
|
|
455
|
+
.replace(/\^3|\^\{3\}/g, "³")
|
|
456
|
+
.replace(/\\times/g, "×")
|
|
457
|
+
.replace(/\\div/g, "÷")
|
|
458
|
+
.replace(/\\cdot/g, "·")
|
|
459
|
+
.replace(/\\pi/g, "π")
|
|
460
|
+
.replace(/\\(le|leq)/g, "≤")
|
|
461
|
+
.replace(/\\(ge|geq)/g, "≥")
|
|
462
|
+
.replace(/\\(left|right)/g, "")
|
|
463
|
+
.replace(/[{}]/g, "")
|
|
464
|
+
.replace(/\\[a-zA-Z]+/g, "")
|
|
465
|
+
.trim();
|
|
466
|
+
}
|
|
467
|
+
function boardItem(item, highlighted) {
|
|
468
|
+
const color = ("color" in item && item.color && BOARD_COLORS[item.color]) || "var(--sfk-board-ink, #1f2328)";
|
|
469
|
+
const x = item.kind === "highlight" ? 0 : item.x * BOARD_W;
|
|
470
|
+
const y = item.kind === "highlight" ? 0 : item.y * BOARD_H;
|
|
471
|
+
const glow = highlighted ? { filter: "drop-shadow(0 0 10px #facc15)" } : undefined;
|
|
472
|
+
switch (item.kind) {
|
|
473
|
+
case "text":
|
|
474
|
+
case "math": {
|
|
475
|
+
const size = FONT_PX[item.size ?? "m"];
|
|
476
|
+
return (_jsx("text", { x: x, y: y + size, fontSize: size, fill: color, style: glow, fontFamily: item.kind === "math" ? "Cambria Math, STIX Two Math, serif" : "inherit", children: item.kind === "math" ? texToText(item.tex) : item.text }, item.id));
|
|
477
|
+
}
|
|
478
|
+
case "list":
|
|
479
|
+
return (_jsx("g", { style: glow, children: item.items.map((line, i) => (_jsxs("text", { x: x, y: y + FONT_PX.s * (i + 1) * 1.6, fontSize: FONT_PX.s, fill: color, children: [item.ordered ? `${i + 1}. ` : "• ", line] }, i))) }, item.id));
|
|
480
|
+
case "shape": {
|
|
481
|
+
const w = item.w * BOARD_W;
|
|
482
|
+
const h = item.h * BOARD_H;
|
|
483
|
+
const common = { stroke: color, strokeWidth: 5, fill: "none", style: glow };
|
|
484
|
+
return (_jsxs("g", { children: [item.shape === "rect" && _jsx("rect", { x: Math.min(x, x + w), y: Math.min(y, y + h), width: Math.abs(w), height: Math.abs(h), ...common }), item.shape === "circle" && _jsx("ellipse", { cx: x + w / 2, cy: y + h / 2, rx: Math.abs(w / 2), ry: Math.abs(h / 2), ...common }), (item.shape === "line" || item.shape === "arrow") && (_jsx("line", { x1: x, y1: y, x2: x + w, y2: y + h, ...common, markerEnd: item.shape === "arrow" ? "url(#sfk-arrow)" : undefined })), item.label && (_jsx("text", { x: x + 10, y: y + h + 45, fontSize: FONT_PX.s, fill: color, children: item.label }))] }, item.id));
|
|
485
|
+
}
|
|
486
|
+
case "image":
|
|
487
|
+
return _jsx("image", { href: item.url, x: x, y: y, width: item.w * BOARD_W, height: item.h * BOARD_H }, item.id);
|
|
488
|
+
default:
|
|
489
|
+
return null;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
/** The AI teacher's whiteboard (16:10, scales to its width). */
|
|
493
|
+
export function LessonWhiteboard({ lesson, className }) {
|
|
494
|
+
const highlight = lesson.board.find((b) => b.kind === "highlight");
|
|
495
|
+
const target = highlight && highlight.kind === "highlight" ? highlight.target : null;
|
|
496
|
+
return (_jsxs("svg", { className: `sfk-lesson-board ${className ?? ""}`, viewBox: `0 0 ${BOARD_W} ${BOARD_H}`, role: "img", "aria-label": "Whiteboard", style: { width: "100%", aspectRatio: "16 / 10", background: "var(--sfk-board-bg, #fff)", borderRadius: 12 }, children: [_jsx("defs", { children: _jsx("marker", { id: "sfk-arrow", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: _jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: "context-stroke" }) }) }), lesson.board.map((b) => boardItem(b, b.id === target))] }));
|
|
497
|
+
}
|
|
498
|
+
/** The current slide of an AI lesson (nothing when none is shown). */
|
|
499
|
+
export function LessonSlideView({ lesson, className }) {
|
|
500
|
+
const slide = lesson.slide;
|
|
501
|
+
if (!slide)
|
|
502
|
+
return null;
|
|
503
|
+
return (_jsxs("section", { className: `sfk-lesson-slide ${className ?? ""}`, "aria-label": "Slide", children: [_jsx("h2", { children: slide.title }), slide.bullets?.length ? (_jsx("ul", { children: slide.bullets.map((b, i) => (_jsx("li", { children: b }, i))) })) : null, slide.imageUrl && _jsx("img", { src: slide.imageUrl, alt: "", style: { maxWidth: "100%" } })] }));
|
|
504
|
+
}
|
|
505
|
+
/** A one-line status for an AI lesson: section, who's speaking, timer. */
|
|
506
|
+
export function LessonStatusBar({ lesson, names }) {
|
|
507
|
+
const [now, setNow] = useState(Date.now());
|
|
508
|
+
useEffect(() => {
|
|
509
|
+
if (!lesson.timer && !lesson.quiz?.closesAt)
|
|
510
|
+
return;
|
|
511
|
+
const t = setInterval(() => setNow(Date.now()), 500);
|
|
512
|
+
return () => clearInterval(t);
|
|
513
|
+
}, [lesson.timer, lesson.quiz?.closesAt]);
|
|
514
|
+
const left = (end) => {
|
|
515
|
+
const s = Math.max(0, Math.round((end - now) / 1000));
|
|
516
|
+
return `${Math.floor(s / 60)}:${String(s % 60).padStart(2, "0")}`;
|
|
517
|
+
};
|
|
518
|
+
const section = lesson.sections[lesson.section];
|
|
519
|
+
return (_jsxs("div", { className: "sfk-lesson-status", role: "status", children: [_jsx("strong", { children: lesson.title }), section && _jsxs("span", { children: [" \u00B7 ", lesson.section + 1, "/", lesson.sections.length, " ", section.title] }), lesson.status === "paused" && _jsx("span", { children: " \u00B7 paused" }), lesson.status === "teacher" && _jsx("span", { children: " \u00B7 teacher speaking" }), lesson.floor && _jsxs("span", { children: [" \u00B7 ", names ? names(lesson.floor) : lesson.floor, " is speaking"] }), lesson.timer && _jsxs("span", { children: [" \u00B7 ", lesson.timer.label, " ", left(lesson.timer.endsAt)] }), lesson.quiz && !lesson.quiz.closed && lesson.quiz.closesAt && _jsxs("span", { children: [" \u00B7 quiz ", left(lesson.quiz.closesAt)] })] }));
|
|
520
|
+
}
|
|
521
|
+
//# sourceMappingURL=components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.tsx"],"names":[],"mappings":"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"}
|