@ai-matrx/meet 0.10.0 → 0.10.1
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/CHANGELOG.md +6 -0
- package/dist/{collab-C2R-kQnV.d.cts → collab-BBQxcyRQ.d.cts} +47 -1
- package/dist/{collab-C2R-kQnV.d.ts → collab-BBQxcyRQ.d.ts} +47 -1
- package/dist/{components-CMtSekZS.d.ts → components-1XBHgMYK.d.ts} +6 -2
- package/dist/{components-DKHfkEVB.d.cts → components-CK0EyqGL.d.cts} +6 -2
- package/dist/core.cjs +506 -455
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +24 -4
- package/dist/core.d.ts +24 -4
- package/dist/core.js +506 -455
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +506 -455
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +506 -455
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +2988 -2856
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +67 -5
- package/dist/react.d.ts +67 -5
- package/dist/react.js +2650 -2518
- package/dist/react.js.map +1 -1
- package/dist/skins/meet.cjs +974 -909
- package/dist/skins/meet.cjs.map +1 -1
- package/dist/skins/meet.d.cts +2 -2
- package/dist/skins/meet.d.ts +2 -2
- package/dist/skins/meet.js +618 -553
- package/dist/skins/meet.js.map +1 -1
- package/package.json +5 -5
package/dist/skins/meet.cjs
CHANGED
|
@@ -107,10 +107,10 @@ __export(meet_exports, {
|
|
|
107
107
|
module.exports = __toCommonJS(meet_exports);
|
|
108
108
|
|
|
109
109
|
// src/skins/meet/components.tsx
|
|
110
|
-
var
|
|
110
|
+
var import_react10 = require("react");
|
|
111
111
|
|
|
112
112
|
// src/react/facade.ts
|
|
113
|
-
var
|
|
113
|
+
var import_react8 = require("react");
|
|
114
114
|
|
|
115
115
|
// src/react/root.tsx
|
|
116
116
|
var import_react3 = require("react");
|
|
@@ -360,6 +360,20 @@ function isLinkFollower(standing) {
|
|
|
360
360
|
function isHostRole(role) {
|
|
361
361
|
return role === "host" || role === "cohost";
|
|
362
362
|
}
|
|
363
|
+
function isObserverRole(role) {
|
|
364
|
+
return role === "viewer";
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// src/core/app-panel.ts
|
|
368
|
+
function appPanelOf(meeting) {
|
|
369
|
+
const raw = meeting?.metadata?.["app_panel"];
|
|
370
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
|
|
371
|
+
const key = raw["key"];
|
|
372
|
+
const recordId = raw["record_id"];
|
|
373
|
+
if (typeof key !== "string" || key.length === 0) return null;
|
|
374
|
+
if (typeof recordId !== "string" || recordId.length === 0) return null;
|
|
375
|
+
return { key, recordId };
|
|
376
|
+
}
|
|
363
377
|
|
|
364
378
|
// src/core/collab.ts
|
|
365
379
|
function assignedRoom(plan, identity) {
|
|
@@ -797,7 +811,10 @@ function orderParticipants(participants, activeSpeakers) {
|
|
|
797
811
|
}
|
|
798
812
|
function computeStage(args) {
|
|
799
813
|
const pageSize = Math.max(1, args.pageSize ?? DEFAULT_PAGE_SIZE);
|
|
800
|
-
const ordered = orderParticipants(
|
|
814
|
+
const ordered = orderParticipants(
|
|
815
|
+
args.participants.filter((participant) => !isObserverRole(participant.role)),
|
|
816
|
+
args.activeSpeakers
|
|
817
|
+
);
|
|
801
818
|
const sharer = ordered.find((participant) => participant.screenSharing) ?? null;
|
|
802
819
|
const pinnedParticipant = args.pinned === null ? null : ordered.find((participant) => participant.identity === args.pinned) ?? null;
|
|
803
820
|
const spotlit = args.spotlight == null ? null : ordered.find((participant) => participant.identity === args.spotlight) ?? null;
|
|
@@ -823,9 +840,97 @@ function gridColumns(count) {
|
|
|
823
840
|
return 5;
|
|
824
841
|
}
|
|
825
842
|
|
|
826
|
-
// src/react/
|
|
843
|
+
// src/react/app-panel.tsx
|
|
827
844
|
var import_react4 = require("react");
|
|
828
|
-
|
|
845
|
+
|
|
846
|
+
// src/core/collab-state.ts
|
|
847
|
+
function availableActivities(collab, isHost) {
|
|
848
|
+
const settings = collab?.settings ?? null;
|
|
849
|
+
if (settings === null) return [];
|
|
850
|
+
const out = [];
|
|
851
|
+
if (settings.whiteboardEnabled) out.push("whiteboard");
|
|
852
|
+
if (settings.pollsEnabled && (isHost || (collab?.polls.length ?? 0) > 0)) out.push("polls");
|
|
853
|
+
if (settings.qaEnabled) out.push("qa");
|
|
854
|
+
if (settings.breakoutsEnabled && (isHost || collab?.breakout?.state === "open")) out.push("breakouts");
|
|
855
|
+
return out;
|
|
856
|
+
}
|
|
857
|
+
function activityAttention(collab, isHost) {
|
|
858
|
+
if (collab === null) return false;
|
|
859
|
+
if (collab.polls.some((poll) => poll.state === "live" && poll.myVote.length === 0 && !isHost)) return true;
|
|
860
|
+
if (isHost && collab.questions.some((q) => q.state === "open")) return true;
|
|
861
|
+
return false;
|
|
862
|
+
}
|
|
863
|
+
async function performCollab(runtime, request) {
|
|
864
|
+
if (runtime === null) return { ok: false, message: "This meeting is not connected." };
|
|
865
|
+
try {
|
|
866
|
+
const result = await runtime.inRoom.collab(request);
|
|
867
|
+
return { ok: true, message: result.message, itemId: result.itemId };
|
|
868
|
+
} catch (error) {
|
|
869
|
+
return { ok: false, message: error.message ?? "That did not work." };
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
async function moveToRoom(runtime, roomId) {
|
|
873
|
+
if (runtime === null) return { ok: false, message: "This meeting is not connected." };
|
|
874
|
+
try {
|
|
875
|
+
await runtime.engine.moveToBreakout(roomId);
|
|
876
|
+
return { ok: true, message: roomId === null ? "Back in the main room." : "Joined the breakout room." };
|
|
877
|
+
} catch (error) {
|
|
878
|
+
return { ok: false, message: error.message ?? "That room could not be joined." };
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
function untranslatedLines(lines, translations) {
|
|
882
|
+
return lines.filter((line) => line.final && translations[line.id] === void 0).map(({ id, text }) => ({ id, text }));
|
|
883
|
+
}
|
|
884
|
+
function nextTranslationBatch(pending, language, asked) {
|
|
885
|
+
const batch = pending.filter((line) => !asked.has(`${language}:${line.id}`)).slice(-20);
|
|
886
|
+
for (const line of batch) asked.add(`${language}:${line.id}`);
|
|
887
|
+
return batch;
|
|
888
|
+
}
|
|
889
|
+
function setCaptionLanguage(store, next) {
|
|
890
|
+
store.patch({
|
|
891
|
+
collab: {
|
|
892
|
+
...store.snapshot().collab,
|
|
893
|
+
captionLanguage: next,
|
|
894
|
+
captionTranslations: {},
|
|
895
|
+
captionTranslationError: null
|
|
896
|
+
}
|
|
897
|
+
});
|
|
898
|
+
}
|
|
899
|
+
function takePanelRequest(store) {
|
|
900
|
+
const request = store.snapshot().collab.panelRequest;
|
|
901
|
+
if (request === null) return null;
|
|
902
|
+
store.patch({ collab: { ...store.snapshot().collab, panelRequest: null } });
|
|
903
|
+
return request.panel;
|
|
904
|
+
}
|
|
905
|
+
function takeMoveRequest(store) {
|
|
906
|
+
const request = store.snapshot().collab.moveRequest;
|
|
907
|
+
if (request === null) return null;
|
|
908
|
+
store.patch({ collab: { ...store.snapshot().collab, moveRequest: null } });
|
|
909
|
+
return { roomId: request.roomId };
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
// src/react/app-panel.tsx
|
|
913
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
914
|
+
var RegistryContext = (0, import_react4.createContext)({});
|
|
915
|
+
function useMeetAppPanelRegistry() {
|
|
916
|
+
return (0, import_react4.useContext)(RegistryContext);
|
|
917
|
+
}
|
|
918
|
+
function useMeetAppPanel(meeting) {
|
|
919
|
+
const snapshot = useMeetSnapshot();
|
|
920
|
+
const registry = useMeetAppPanelRegistry();
|
|
921
|
+
const record = meeting ?? snapshot?.meeting ?? null;
|
|
922
|
+
return (0, import_react4.useMemo)(() => {
|
|
923
|
+
const panel = appPanelOf(record);
|
|
924
|
+
if (panel === null || record === null) return null;
|
|
925
|
+
const entry = registry[panel.key];
|
|
926
|
+
if (entry === void 0) return null;
|
|
927
|
+
return { ...entry, panel, organizationId: record.organizationId };
|
|
928
|
+
}, [record, registry]);
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
// src/react/hooks.ts
|
|
932
|
+
var import_react5 = require("react");
|
|
933
|
+
var import_react6 = require("@ai-matrx/realtime/react");
|
|
829
934
|
|
|
830
935
|
// src/core/record.ts
|
|
831
936
|
var import_format = require("@ai-matrx/kit/format");
|
|
@@ -950,51 +1055,51 @@ function useRoom() {
|
|
|
950
1055
|
failure: snapshot?.failure ?? null,
|
|
951
1056
|
local,
|
|
952
1057
|
canShareScreen: engine?.supportsScreenShare() ?? true,
|
|
953
|
-
join: (0,
|
|
1058
|
+
join: (0, import_react5.useCallback)(
|
|
954
1059
|
async (request) => requireEngine(engine, "join").join(request),
|
|
955
1060
|
[engine]
|
|
956
1061
|
),
|
|
957
|
-
leave: (0,
|
|
958
|
-
toggleMicrophone: (0,
|
|
1062
|
+
leave: (0, import_react5.useCallback)(async () => requireEngine(engine, "leave").leave(), [engine]),
|
|
1063
|
+
toggleMicrophone: (0, import_react5.useCallback)(
|
|
959
1064
|
async () => requireEngine(engine, "toggleMicrophone").setMicrophoneEnabled(
|
|
960
1065
|
!(local?.micEnabled ?? false)
|
|
961
1066
|
),
|
|
962
1067
|
[engine, local]
|
|
963
1068
|
),
|
|
964
|
-
toggleCamera: (0,
|
|
1069
|
+
toggleCamera: (0, import_react5.useCallback)(
|
|
965
1070
|
async () => requireEngine(engine, "toggleCamera").setCameraEnabled(!(local?.cameraEnabled ?? false)),
|
|
966
1071
|
[engine, local]
|
|
967
1072
|
),
|
|
968
|
-
toggleScreenShare: (0,
|
|
1073
|
+
toggleScreenShare: (0, import_react5.useCallback)(
|
|
969
1074
|
async () => requireEngine(engine, "toggleScreenShare").setScreenShareEnabled(
|
|
970
1075
|
!(local?.screenSharing ?? false)
|
|
971
1076
|
),
|
|
972
1077
|
[engine, local]
|
|
973
1078
|
),
|
|
974
|
-
toggleHand: (0,
|
|
1079
|
+
toggleHand: (0, import_react5.useCallback)(
|
|
975
1080
|
async () => requireEngine(engine, "toggleHand").raiseHand(!(local?.handRaised ?? false)),
|
|
976
1081
|
[engine, local]
|
|
977
1082
|
),
|
|
978
|
-
react: (0,
|
|
1083
|
+
react: (0, import_react5.useCallback)(
|
|
979
1084
|
async (emoji) => requireEngine(engine, "react").react(emoji),
|
|
980
1085
|
[engine]
|
|
981
1086
|
),
|
|
982
|
-
sendChat: (0,
|
|
1087
|
+
sendChat: (0, import_react5.useCallback)(
|
|
983
1088
|
async (text) => {
|
|
984
1089
|
if (host === null) throw noRuntime("sendChat");
|
|
985
1090
|
await host.inRoom.sendChat(text);
|
|
986
1091
|
},
|
|
987
1092
|
[host]
|
|
988
1093
|
),
|
|
989
|
-
sendPrivateChat: (0,
|
|
1094
|
+
sendPrivateChat: (0, import_react5.useCallback)(
|
|
990
1095
|
async (to, text) => requireEngine(engine, "sendPrivateChat").sendPrivateChat(to, text),
|
|
991
1096
|
[engine]
|
|
992
1097
|
),
|
|
993
|
-
pin: (0,
|
|
1098
|
+
pin: (0, import_react5.useCallback)(
|
|
994
1099
|
(identity) => requireEngine(engine, "pin").pin(identity),
|
|
995
1100
|
[engine]
|
|
996
1101
|
),
|
|
997
|
-
setLayout: (0,
|
|
1102
|
+
setLayout: (0, import_react5.useCallback)(
|
|
998
1103
|
(layout) => requireEngine(engine, "setLayout").setLayout(layout),
|
|
999
1104
|
[engine]
|
|
1000
1105
|
)
|
|
@@ -1002,8 +1107,8 @@ function useRoom() {
|
|
|
1002
1107
|
}
|
|
1003
1108
|
function useStage(pageSize = DEFAULT_PAGE_SIZE) {
|
|
1004
1109
|
const snapshot = useMeetSnapshot();
|
|
1005
|
-
const [page, setPage] = (0,
|
|
1006
|
-
const stage = (0,
|
|
1110
|
+
const [page, setPage] = (0, import_react5.useState)(0);
|
|
1111
|
+
const stage = (0, import_react5.useMemo)(
|
|
1007
1112
|
() => computeStage({
|
|
1008
1113
|
participants: snapshot?.participants ?? [],
|
|
1009
1114
|
layout: snapshot?.layout ?? "grid",
|
|
@@ -1015,15 +1120,15 @@ function useStage(pageSize = DEFAULT_PAGE_SIZE) {
|
|
|
1015
1120
|
}),
|
|
1016
1121
|
[snapshot, pageSize, page]
|
|
1017
1122
|
);
|
|
1018
|
-
(0,
|
|
1123
|
+
(0, import_react5.useEffect)(() => {
|
|
1019
1124
|
if (page > stage.pageCount - 1) setPage(Math.max(0, stage.pageCount - 1));
|
|
1020
1125
|
}, [page, stage.pageCount]);
|
|
1021
1126
|
return stage;
|
|
1022
1127
|
}
|
|
1023
1128
|
function useTrack(identity, kind) {
|
|
1024
1129
|
const host = useMeetHost();
|
|
1025
|
-
const detachRef = (0,
|
|
1026
|
-
return (0,
|
|
1130
|
+
const detachRef = (0, import_react5.useRef)(null);
|
|
1131
|
+
return (0, import_react5.useCallback)(
|
|
1027
1132
|
(element) => {
|
|
1028
1133
|
detachRef.current?.();
|
|
1029
1134
|
detachRef.current = null;
|
|
@@ -1043,19 +1148,19 @@ function useLobby() {
|
|
|
1043
1148
|
// No runtime means no host powers — `<LobbyPanel>` renders nothing rather
|
|
1044
1149
|
// than an admit button that would throw.
|
|
1045
1150
|
canAdmit: session !== null && isHost,
|
|
1046
|
-
admit: (0,
|
|
1151
|
+
admit: (0, import_react5.useCallback)(
|
|
1047
1152
|
async (entry) => requireSession(session, "admit").admit(entry, true),
|
|
1048
1153
|
[session]
|
|
1049
1154
|
),
|
|
1050
|
-
deny: (0,
|
|
1155
|
+
deny: (0, import_react5.useCallback)(
|
|
1051
1156
|
async (entry) => requireSession(session, "deny").admit(entry, false),
|
|
1052
1157
|
[session]
|
|
1053
1158
|
),
|
|
1054
|
-
admitAll: (0,
|
|
1159
|
+
admitAll: (0, import_react5.useCallback)(
|
|
1055
1160
|
async () => requireSession(session, "admitAll").admitAll(),
|
|
1056
1161
|
[session]
|
|
1057
1162
|
),
|
|
1058
|
-
undeny: (0,
|
|
1163
|
+
undeny: (0, import_react5.useCallback)(
|
|
1059
1164
|
async (entry) => requireSession(session, "undeny").undeny(entry),
|
|
1060
1165
|
[session]
|
|
1061
1166
|
)
|
|
@@ -1067,8 +1172,8 @@ function useWaiting() {
|
|
|
1067
1172
|
const session = host?.meetings ?? null;
|
|
1068
1173
|
return {
|
|
1069
1174
|
waiting: snapshot?.waiting ?? null,
|
|
1070
|
-
withdraw: (0,
|
|
1071
|
-
askAgain: (0,
|
|
1175
|
+
withdraw: (0, import_react5.useCallback)(async () => requireSession(session, "withdraw").withdraw(), [session]),
|
|
1176
|
+
askAgain: (0, import_react5.useCallback)(async () => requireSession(session, "askAgain").askAgain(), [session])
|
|
1072
1177
|
};
|
|
1073
1178
|
}
|
|
1074
1179
|
function useRecording() {
|
|
@@ -1085,7 +1190,7 @@ function useRecording() {
|
|
|
1085
1190
|
// `stopping` is already stopping; the other in-flight states can be.
|
|
1086
1191
|
canStop: host !== null && canRecord && (state === "recording" || state === "starting"),
|
|
1087
1192
|
consentNotice: host?.recording.consentNotice(meeting) ?? null,
|
|
1088
|
-
start: (0,
|
|
1193
|
+
start: (0, import_react5.useCallback)(async () => {
|
|
1089
1194
|
const live = requireHost(host, "startRecording");
|
|
1090
1195
|
if (meeting === null || live.identity.userId === null) return;
|
|
1091
1196
|
await live.recording.start({
|
|
@@ -1094,7 +1199,7 @@ function useRecording() {
|
|
|
1094
1199
|
by: live.identity.userId
|
|
1095
1200
|
});
|
|
1096
1201
|
}, [host, meeting]),
|
|
1097
|
-
stop: (0,
|
|
1202
|
+
stop: (0, import_react5.useCallback)(async () => {
|
|
1098
1203
|
const live = requireHost(host, "stopRecording");
|
|
1099
1204
|
if (meeting === null || live.identity.userId === null) return;
|
|
1100
1205
|
await live.recording.stop({ meetingId: meeting.id, by: live.identity.userId });
|
|
@@ -1105,17 +1210,17 @@ function useMeetAi() {
|
|
|
1105
1210
|
const host = useMeetHost();
|
|
1106
1211
|
const snapshot = useMeetSnapshot();
|
|
1107
1212
|
const isHost = useIsHost();
|
|
1108
|
-
const [asking, setAsking] = (0,
|
|
1109
|
-
const [answer, setAnswer] = (0,
|
|
1110
|
-
const [coverage, setCoverage] = (0,
|
|
1111
|
-
const [phase, setPhase] = (0,
|
|
1112
|
-
const [error, setError] = (0,
|
|
1213
|
+
const [asking, setAsking] = (0, import_react5.useState)(false);
|
|
1214
|
+
const [answer, setAnswer] = (0, import_react5.useState)(null);
|
|
1215
|
+
const [coverage, setCoverage] = (0, import_react5.useState)(null);
|
|
1216
|
+
const [phase, setPhase] = (0, import_react5.useState)(null);
|
|
1217
|
+
const [error, setError] = (0, import_react5.useState)(null);
|
|
1113
1218
|
const ai = host?.ai ?? null;
|
|
1114
1219
|
const meeting = snapshot?.meeting ?? null;
|
|
1115
1220
|
const participants = snapshot?.participants ?? [];
|
|
1116
1221
|
const notes = snapshot?.notes ?? [];
|
|
1117
1222
|
const wrapUp = snapshot?.wrapUp ?? null;
|
|
1118
|
-
const status = (0,
|
|
1223
|
+
const status = (0, import_react5.useMemo)(
|
|
1119
1224
|
() => noteTakerStatus({
|
|
1120
1225
|
meeting,
|
|
1121
1226
|
participants,
|
|
@@ -1124,7 +1229,7 @@ function useMeetAi() {
|
|
|
1124
1229
|
[meeting, participants, snapshot?.noteTakerRefusal]
|
|
1125
1230
|
);
|
|
1126
1231
|
const names = snapshot?.names ?? EMPTY_NAMES;
|
|
1127
|
-
const transcript = (0,
|
|
1232
|
+
const transcript = (0, import_react5.useMemo)(
|
|
1128
1233
|
() => readableTranscript(snapshot?.transcript ?? []).map((line) => ({
|
|
1129
1234
|
id: line.id,
|
|
1130
1235
|
identity: line.identity,
|
|
@@ -1140,7 +1245,7 @@ function useMeetAi() {
|
|
|
1140
1245
|
})),
|
|
1141
1246
|
[snapshot?.transcript, names]
|
|
1142
1247
|
);
|
|
1143
|
-
const dispatchNoteTaker = (0,
|
|
1248
|
+
const dispatchNoteTaker = (0, import_react5.useCallback)(
|
|
1144
1249
|
async (run) => {
|
|
1145
1250
|
setError(null);
|
|
1146
1251
|
try {
|
|
@@ -1176,7 +1281,7 @@ function useMeetAi() {
|
|
|
1176
1281
|
coverage,
|
|
1177
1282
|
phase,
|
|
1178
1283
|
error,
|
|
1179
|
-
ask: (0,
|
|
1284
|
+
ask: (0, import_react5.useCallback)(
|
|
1180
1285
|
async (question) => {
|
|
1181
1286
|
if (ai === null || meeting === null) return;
|
|
1182
1287
|
setAsking(true);
|
|
@@ -1207,13 +1312,13 @@ function useMeetAi() {
|
|
|
1207
1312
|
},
|
|
1208
1313
|
[ai, meeting]
|
|
1209
1314
|
),
|
|
1210
|
-
startNoteTaker: (0,
|
|
1315
|
+
startNoteTaker: (0, import_react5.useCallback)(async () => {
|
|
1211
1316
|
if (ai === null || meeting === null) return;
|
|
1212
1317
|
await dispatchNoteTaker(
|
|
1213
1318
|
() => ai.startNoteTaker({ meetingId: meeting.id, roomName: meeting.roomName })
|
|
1214
1319
|
);
|
|
1215
1320
|
}, [ai, meeting, dispatchNoteTaker]),
|
|
1216
|
-
stopNoteTaker: (0,
|
|
1321
|
+
stopNoteTaker: (0, import_react5.useCallback)(async () => {
|
|
1217
1322
|
if (ai === null || meeting === null) return;
|
|
1218
1323
|
await dispatchNoteTaker(() => ai.stopNoteTaker({ meetingId: meeting.id }));
|
|
1219
1324
|
}, [ai, meeting, dispatchNoteTaker])
|
|
@@ -1223,8 +1328,8 @@ function useEndMeeting() {
|
|
|
1223
1328
|
const host = useMeetHost();
|
|
1224
1329
|
const snapshot = useMeetSnapshot();
|
|
1225
1330
|
const isHost = useIsHost();
|
|
1226
|
-
const [ending, setEnding] = (0,
|
|
1227
|
-
const [notice, setNotice] = (0,
|
|
1331
|
+
const [ending, setEnding] = (0, import_react5.useState)(false);
|
|
1332
|
+
const [notice, setNotice] = (0, import_react5.useState)(null);
|
|
1228
1333
|
const meeting = snapshot?.meeting ?? null;
|
|
1229
1334
|
const session = host?.meetings ?? null;
|
|
1230
1335
|
return {
|
|
@@ -1232,7 +1337,7 @@ function useEndMeeting() {
|
|
|
1232
1337
|
ending,
|
|
1233
1338
|
ended: meeting?.endedAt !== null && meeting?.endedAt !== void 0,
|
|
1234
1339
|
notice,
|
|
1235
|
-
end: (0,
|
|
1340
|
+
end: (0, import_react5.useCallback)(async () => {
|
|
1236
1341
|
const live = requireSession(session, "endForEveryone");
|
|
1237
1342
|
setEnding(true);
|
|
1238
1343
|
setNotice(null);
|
|
@@ -1266,7 +1371,7 @@ function useReactions() {
|
|
|
1266
1371
|
const host = useMeetHost();
|
|
1267
1372
|
const snapshot = useMeetSnapshot();
|
|
1268
1373
|
const store = host?.store ?? null;
|
|
1269
|
-
(0,
|
|
1374
|
+
(0, import_react5.useEffect)(() => {
|
|
1270
1375
|
if (store === null) return void 0;
|
|
1271
1376
|
const timer = setInterval(() => store.expireReactions(Date.now()), REACTION_TTL_MS / 2);
|
|
1272
1377
|
return () => clearInterval(timer);
|
|
@@ -1274,8 +1379,8 @@ function useReactions() {
|
|
|
1274
1379
|
return snapshot?.reactions ?? [];
|
|
1275
1380
|
}
|
|
1276
1381
|
function useElapsed(startedAt) {
|
|
1277
|
-
const [now, setNow] = (0,
|
|
1278
|
-
(0,
|
|
1382
|
+
const [now, setNow] = (0, import_react5.useState)(() => Date.now());
|
|
1383
|
+
(0, import_react5.useEffect)(() => {
|
|
1279
1384
|
if (startedAt === null) return void 0;
|
|
1280
1385
|
const timer = setInterval(() => setNow(Date.now()), 1e3);
|
|
1281
1386
|
return () => clearInterval(timer);
|
|
@@ -1291,15 +1396,15 @@ function useHostControls() {
|
|
|
1291
1396
|
(participant) => participant.identity === snapshot.localIdentity
|
|
1292
1397
|
);
|
|
1293
1398
|
const actor = me === void 0 ? void 0 : { ...me, role };
|
|
1294
|
-
const [busy, setBusy] = (0,
|
|
1399
|
+
const [busy, setBusy] = (0, import_react5.useState)(false);
|
|
1295
1400
|
const inRoom = host?.inRoom ?? null;
|
|
1296
1401
|
const store = host?.store ?? null;
|
|
1297
1402
|
const notice = snapshot?.actionNotice ?? null;
|
|
1298
|
-
const setNotice = (0,
|
|
1403
|
+
const setNotice = (0, import_react5.useCallback)(
|
|
1299
1404
|
(next) => store?.patch({ actionNotice: next === null ? null : { ...next, at: Date.now() } }),
|
|
1300
1405
|
[store]
|
|
1301
1406
|
);
|
|
1302
|
-
const run = (0,
|
|
1407
|
+
const run = (0, import_react5.useCallback)(
|
|
1303
1408
|
async (request) => {
|
|
1304
1409
|
if (inRoom === null) throw noRuntime(`moderate(${request.action})`);
|
|
1305
1410
|
setBusy(true);
|
|
@@ -1325,19 +1430,19 @@ function useHostControls() {
|
|
|
1325
1430
|
isOwner: role === "host",
|
|
1326
1431
|
notice,
|
|
1327
1432
|
busy,
|
|
1328
|
-
clearNotice: (0,
|
|
1329
|
-
canModerate: (0,
|
|
1433
|
+
clearNotice: (0, import_react5.useCallback)(() => setNotice(null), [setNotice]),
|
|
1434
|
+
canModerate: (0, import_react5.useCallback)(
|
|
1330
1435
|
(target) => canModerateParticipant(actor, target),
|
|
1331
1436
|
[actor]
|
|
1332
1437
|
),
|
|
1333
1438
|
run,
|
|
1334
|
-
mute: (0,
|
|
1439
|
+
mute: (0, import_react5.useCallback)(
|
|
1335
1440
|
async (target) => {
|
|
1336
1441
|
await run({ action: "mute", identity: target.identity });
|
|
1337
1442
|
},
|
|
1338
1443
|
[run]
|
|
1339
1444
|
),
|
|
1340
|
-
remove: (0,
|
|
1445
|
+
remove: (0, import_react5.useCallback)(
|
|
1341
1446
|
async (target) => {
|
|
1342
1447
|
await run({ action: "remove", identity: target.identity });
|
|
1343
1448
|
},
|
|
@@ -1347,7 +1452,7 @@ function useHostControls() {
|
|
|
1347
1452
|
}
|
|
1348
1453
|
function useHandQueue() {
|
|
1349
1454
|
const snapshot = useMeetSnapshot();
|
|
1350
|
-
return (0,
|
|
1455
|
+
return (0, import_react5.useMemo)(
|
|
1351
1456
|
() => (snapshot?.participants ?? []).filter((participant) => participant.handRaised).sort((a, b) => (a.handRaisedAt ?? 0) - (b.handRaisedAt ?? 0)),
|
|
1352
1457
|
[snapshot?.participants]
|
|
1353
1458
|
);
|
|
@@ -1359,7 +1464,7 @@ function useMediaEffects() {
|
|
|
1359
1464
|
return {
|
|
1360
1465
|
effects: snapshot?.effects ?? DEFAULT_EFFECTS,
|
|
1361
1466
|
backgroundsSupported: engine?.supportsVideoEffects() ?? false,
|
|
1362
|
-
set: (0,
|
|
1467
|
+
set: (0, import_react5.useCallback)(
|
|
1363
1468
|
async (next) => requireEngine(engine, "setEffects").setEffects(next),
|
|
1364
1469
|
[engine]
|
|
1365
1470
|
)
|
|
@@ -1370,12 +1475,12 @@ function useModerationNotice() {
|
|
|
1370
1475
|
const snapshot = useMeetSnapshot();
|
|
1371
1476
|
return {
|
|
1372
1477
|
notice: snapshot?.moderationNotice ?? null,
|
|
1373
|
-
dismiss: (0,
|
|
1478
|
+
dismiss: (0, import_react5.useCallback)(() => host?.store.patch({ moderationNotice: null }), [host])
|
|
1374
1479
|
};
|
|
1375
1480
|
}
|
|
1376
1481
|
function useAudioLevel(stream) {
|
|
1377
|
-
const [level, setLevel] = (0,
|
|
1378
|
-
(0,
|
|
1482
|
+
const [level, setLevel] = (0, import_react5.useState)(0);
|
|
1483
|
+
(0, import_react5.useEffect)(() => {
|
|
1379
1484
|
if (stream === null || stream.getAudioTracks().length === 0) {
|
|
1380
1485
|
setLevel(0);
|
|
1381
1486
|
return void 0;
|
|
@@ -1414,9 +1519,9 @@ var MEET_SHORTCUTS = [
|
|
|
1414
1519
|
{ id: "help", keys: "Shift + ?", label: "Show keyboard shortcuts" }
|
|
1415
1520
|
];
|
|
1416
1521
|
function useMeetShortcuts(handlers) {
|
|
1417
|
-
const ref = (0,
|
|
1522
|
+
const ref = (0, import_react5.useRef)(handlers);
|
|
1418
1523
|
ref.current = handlers;
|
|
1419
|
-
(0,
|
|
1524
|
+
(0, import_react5.useEffect)(() => {
|
|
1420
1525
|
const target = globalThis.window;
|
|
1421
1526
|
if (target === void 0) return void 0;
|
|
1422
1527
|
const onKey = (event) => {
|
|
@@ -1445,11 +1550,11 @@ function useGuestRecordAccess(meeting) {
|
|
|
1445
1550
|
const host = useMeetHost();
|
|
1446
1551
|
const api = host?.api ?? null;
|
|
1447
1552
|
const stored = guestRecordAccessSetting(meeting);
|
|
1448
|
-
const [chosen, setChosen] = (0,
|
|
1449
|
-
const [effective, setEffective] = (0,
|
|
1450
|
-
const [saving, setSaving] = (0,
|
|
1451
|
-
const [error, setError] = (0,
|
|
1452
|
-
(0,
|
|
1553
|
+
const [chosen, setChosen] = (0, import_react5.useState)(null);
|
|
1554
|
+
const [effective, setEffective] = (0, import_react5.useState)(null);
|
|
1555
|
+
const [saving, setSaving] = (0, import_react5.useState)(false);
|
|
1556
|
+
const [error, setError] = (0, import_react5.useState)(null);
|
|
1557
|
+
(0, import_react5.useEffect)(() => {
|
|
1453
1558
|
setChosen(null);
|
|
1454
1559
|
}, [stored, meeting?.id]);
|
|
1455
1560
|
return {
|
|
@@ -1457,7 +1562,7 @@ function useGuestRecordAccess(meeting) {
|
|
|
1457
1562
|
effective,
|
|
1458
1563
|
saving,
|
|
1459
1564
|
error,
|
|
1460
|
-
choose: (0,
|
|
1565
|
+
choose: (0, import_react5.useCallback)(
|
|
1461
1566
|
async (next) => {
|
|
1462
1567
|
if (api === null || meeting === null) return;
|
|
1463
1568
|
setSaving(true);
|
|
@@ -1485,74 +1590,8 @@ function useGuestRecordAccess(meeting) {
|
|
|
1485
1590
|
};
|
|
1486
1591
|
}
|
|
1487
1592
|
|
|
1488
|
-
// src/core/collab-state.ts
|
|
1489
|
-
function availableActivities(collab, isHost) {
|
|
1490
|
-
const settings = collab?.settings ?? null;
|
|
1491
|
-
if (settings === null) return [];
|
|
1492
|
-
const out = [];
|
|
1493
|
-
if (settings.whiteboardEnabled) out.push("whiteboard");
|
|
1494
|
-
if (settings.pollsEnabled && (isHost || (collab?.polls.length ?? 0) > 0)) out.push("polls");
|
|
1495
|
-
if (settings.qaEnabled) out.push("qa");
|
|
1496
|
-
if (settings.breakoutsEnabled && (isHost || collab?.breakout?.state === "open")) out.push("breakouts");
|
|
1497
|
-
return out;
|
|
1498
|
-
}
|
|
1499
|
-
function activityAttention(collab, isHost) {
|
|
1500
|
-
if (collab === null) return false;
|
|
1501
|
-
if (collab.polls.some((poll) => poll.state === "live" && poll.myVote.length === 0 && !isHost)) return true;
|
|
1502
|
-
if (isHost && collab.questions.some((q) => q.state === "open")) return true;
|
|
1503
|
-
return false;
|
|
1504
|
-
}
|
|
1505
|
-
async function performCollab(runtime, request) {
|
|
1506
|
-
if (runtime === null) return { ok: false, message: "This meeting is not connected." };
|
|
1507
|
-
try {
|
|
1508
|
-
const result = await runtime.inRoom.collab(request);
|
|
1509
|
-
return { ok: true, message: result.message, itemId: result.itemId };
|
|
1510
|
-
} catch (error) {
|
|
1511
|
-
return { ok: false, message: error.message ?? "That did not work." };
|
|
1512
|
-
}
|
|
1513
|
-
}
|
|
1514
|
-
async function moveToRoom(runtime, roomId) {
|
|
1515
|
-
if (runtime === null) return { ok: false, message: "This meeting is not connected." };
|
|
1516
|
-
try {
|
|
1517
|
-
await runtime.engine.moveToBreakout(roomId);
|
|
1518
|
-
return { ok: true, message: roomId === null ? "Back in the main room." : "Joined the breakout room." };
|
|
1519
|
-
} catch (error) {
|
|
1520
|
-
return { ok: false, message: error.message ?? "That room could not be joined." };
|
|
1521
|
-
}
|
|
1522
|
-
}
|
|
1523
|
-
function untranslatedLines(lines, translations) {
|
|
1524
|
-
return lines.filter((line) => line.final && translations[line.id] === void 0).map(({ id, text }) => ({ id, text }));
|
|
1525
|
-
}
|
|
1526
|
-
function nextTranslationBatch(pending, language, asked) {
|
|
1527
|
-
const batch = pending.filter((line) => !asked.has(`${language}:${line.id}`)).slice(-20);
|
|
1528
|
-
for (const line of batch) asked.add(`${language}:${line.id}`);
|
|
1529
|
-
return batch;
|
|
1530
|
-
}
|
|
1531
|
-
function setCaptionLanguage(store, next) {
|
|
1532
|
-
store.patch({
|
|
1533
|
-
collab: {
|
|
1534
|
-
...store.snapshot().collab,
|
|
1535
|
-
captionLanguage: next,
|
|
1536
|
-
captionTranslations: {},
|
|
1537
|
-
captionTranslationError: null
|
|
1538
|
-
}
|
|
1539
|
-
});
|
|
1540
|
-
}
|
|
1541
|
-
function takePanelRequest(store) {
|
|
1542
|
-
const request = store.snapshot().collab.panelRequest;
|
|
1543
|
-
if (request === null) return null;
|
|
1544
|
-
store.patch({ collab: { ...store.snapshot().collab, panelRequest: null } });
|
|
1545
|
-
return request.panel;
|
|
1546
|
-
}
|
|
1547
|
-
function takeMoveRequest(store) {
|
|
1548
|
-
const request = store.snapshot().collab.moveRequest;
|
|
1549
|
-
if (request === null) return null;
|
|
1550
|
-
store.patch({ collab: { ...store.snapshot().collab, moveRequest: null } });
|
|
1551
|
-
return { roomId: request.roomId };
|
|
1552
|
-
}
|
|
1553
|
-
|
|
1554
1593
|
// src/react/collab-hooks.ts
|
|
1555
|
-
var
|
|
1594
|
+
var import_react7 = require("react");
|
|
1556
1595
|
function useCollab() {
|
|
1557
1596
|
const host = useMeetHost();
|
|
1558
1597
|
const snapshot = useMeetSnapshot();
|
|
@@ -1579,13 +1618,13 @@ function useCaptionTranslation(lines) {
|
|
|
1579
1618
|
const snapshot = useMeetSnapshot();
|
|
1580
1619
|
const collab = snapshot?.collab ?? null;
|
|
1581
1620
|
const language = collab?.captionLanguage ?? null;
|
|
1582
|
-
const asked = (0,
|
|
1621
|
+
const asked = (0, import_react7.useRef)(/* @__PURE__ */ new Set());
|
|
1583
1622
|
const translations = collab?.captionTranslations ?? {};
|
|
1584
1623
|
const missing = untranslatedLines(lines, translations);
|
|
1585
1624
|
const key = `${language ?? ""}|${missing.map((l) => l.id).join(",")}`;
|
|
1586
|
-
const pending = (0,
|
|
1625
|
+
const pending = (0, import_react7.useRef)(missing);
|
|
1587
1626
|
pending.current = missing;
|
|
1588
|
-
(0,
|
|
1627
|
+
(0, import_react7.useEffect)(() => {
|
|
1589
1628
|
if (host === null || language === null) return;
|
|
1590
1629
|
const batch = nextTranslationBatch(pending.current, language, asked.current);
|
|
1591
1630
|
if (batch.length === 0) return;
|
|
@@ -1596,9 +1635,9 @@ function useCaptionTranslation(lines) {
|
|
|
1596
1635
|
function useCollabPanelRequest(onRequest) {
|
|
1597
1636
|
const host = useMeetHost();
|
|
1598
1637
|
const at = useMeetSnapshot()?.collab.panelRequest?.at ?? null;
|
|
1599
|
-
const callback = (0,
|
|
1638
|
+
const callback = (0, import_react7.useRef)(onRequest);
|
|
1600
1639
|
callback.current = onRequest;
|
|
1601
|
-
(0,
|
|
1640
|
+
(0, import_react7.useEffect)(() => {
|
|
1602
1641
|
if (host === null) return;
|
|
1603
1642
|
const panel = takePanelRequest(host.store);
|
|
1604
1643
|
if (panel === null) return;
|
|
@@ -1617,7 +1656,7 @@ function useMeetCore() {
|
|
|
1617
1656
|
const role = useRole();
|
|
1618
1657
|
const isHost = useIsHost();
|
|
1619
1658
|
const observation = useCoreObservation();
|
|
1620
|
-
return (0,
|
|
1659
|
+
return (0, import_react8.useMemo)(
|
|
1621
1660
|
() => ({ host, snapshot, devices, role, isHost, observation }),
|
|
1622
1661
|
[host, snapshot, devices, role, isHost, observation]
|
|
1623
1662
|
);
|
|
@@ -1627,12 +1666,12 @@ function useMeetCore() {
|
|
|
1627
1666
|
var import_design_system = require("@ai-matrx/design-system");
|
|
1628
1667
|
|
|
1629
1668
|
// src/skins/meet/collab.tsx
|
|
1630
|
-
var
|
|
1669
|
+
var import_react9 = require("react");
|
|
1631
1670
|
|
|
1632
1671
|
// src/skins/meet/icons.tsx
|
|
1633
|
-
var
|
|
1672
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
1634
1673
|
function Icon({ children, ...props }) {
|
|
1635
|
-
return /* @__PURE__ */ (0,
|
|
1674
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1636
1675
|
"svg",
|
|
1637
1676
|
{
|
|
1638
1677
|
width: "20",
|
|
@@ -1651,227 +1690,227 @@ function Icon({ children, ...props }) {
|
|
|
1651
1690
|
);
|
|
1652
1691
|
}
|
|
1653
1692
|
function MicIcon(props) {
|
|
1654
|
-
return /* @__PURE__ */ (0,
|
|
1655
|
-
/* @__PURE__ */ (0,
|
|
1656
|
-
/* @__PURE__ */ (0,
|
|
1657
|
-
/* @__PURE__ */ (0,
|
|
1693
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1694
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z" }),
|
|
1695
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M19 10v2a7 7 0 0 1-14 0v-2" }),
|
|
1696
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 19v3" })
|
|
1658
1697
|
] });
|
|
1659
1698
|
}
|
|
1660
1699
|
function MicOffIcon(props) {
|
|
1661
|
-
return /* @__PURE__ */ (0,
|
|
1662
|
-
/* @__PURE__ */ (0,
|
|
1663
|
-
/* @__PURE__ */ (0,
|
|
1664
|
-
/* @__PURE__ */ (0,
|
|
1665
|
-
/* @__PURE__ */ (0,
|
|
1666
|
-
/* @__PURE__ */ (0,
|
|
1700
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1701
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M2 2l20 20" }),
|
|
1702
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M9 9v3a3 3 0 0 0 5.12 2.12" }),
|
|
1703
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M15 9.34V5a3 3 0 0 0-5.94-.6" }),
|
|
1704
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M19 10v2a7 7 0 0 1-.11 1.23M5 10v2a7 7 0 0 0 11 5.66" }),
|
|
1705
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 19v3" })
|
|
1667
1706
|
] });
|
|
1668
1707
|
}
|
|
1669
1708
|
function CameraIcon(props) {
|
|
1670
|
-
return /* @__PURE__ */ (0,
|
|
1671
|
-
/* @__PURE__ */ (0,
|
|
1672
|
-
/* @__PURE__ */ (0,
|
|
1709
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1710
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m23 7-7 5 7 5V7Z" }),
|
|
1711
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { x: "1", y: "5", width: "15", height: "14", rx: "2" })
|
|
1673
1712
|
] });
|
|
1674
1713
|
}
|
|
1675
1714
|
function CameraOffIcon(props) {
|
|
1676
|
-
return /* @__PURE__ */ (0,
|
|
1677
|
-
/* @__PURE__ */ (0,
|
|
1678
|
-
/* @__PURE__ */ (0,
|
|
1679
|
-
/* @__PURE__ */ (0,
|
|
1715
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1716
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M2 2l20 20" }),
|
|
1717
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M10.66 5H14a2 2 0 0 1 2 2v3.34l1 1L23 7v10" }),
|
|
1718
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M16 16a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2" })
|
|
1680
1719
|
] });
|
|
1681
1720
|
}
|
|
1682
1721
|
function ScreenShareIcon(props) {
|
|
1683
|
-
return /* @__PURE__ */ (0,
|
|
1684
|
-
/* @__PURE__ */ (0,
|
|
1685
|
-
/* @__PURE__ */ (0,
|
|
1686
|
-
/* @__PURE__ */ (0,
|
|
1722
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1723
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2" }),
|
|
1724
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M8 21h8M12 17v4" }),
|
|
1725
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 13V8m0 0-2.5 2.5M12 8l2.5 2.5" })
|
|
1687
1726
|
] });
|
|
1688
1727
|
}
|
|
1689
1728
|
function PhoneIcon(props) {
|
|
1690
|
-
return /* @__PURE__ */ (0,
|
|
1729
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6A19.79 19.79 0 0 1 2.12 4.18 2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.9.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92Z" }) });
|
|
1691
1730
|
}
|
|
1692
1731
|
function PhoneOffIcon(props) {
|
|
1693
|
-
return /* @__PURE__ */ (0,
|
|
1732
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { fill: "currentColor", stroke: "none", ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 9c-1.6 0-3.15.25-4.6.72v3.1c0 .39-.23.74-.56.9-.98.49-1.87 1.12-2.66 1.85-.18.18-.43.28-.7.28-.28 0-.53-.11-.71-.29L.29 13.08a.99.99 0 0 1-.29-.7c0-.28.11-.53.29-.71C3.34 8.78 7.46 7 12 7s8.66 1.78 11.71 4.67c.18.18.29.43.29.71 0 .28-.11.53-.29.71l-2.48 2.48c-.18.18-.43.29-.71.29-.27 0-.52-.11-.7-.28a11.27 11.27 0 0 0-2.67-1.85.996.996 0 0 1-.56-.9v-3.1C15.15 9.25 13.6 9 12 9Z" }) });
|
|
1694
1733
|
}
|
|
1695
1734
|
function HandIcon(props) {
|
|
1696
|
-
return /* @__PURE__ */ (0,
|
|
1697
|
-
/* @__PURE__ */ (0,
|
|
1698
|
-
/* @__PURE__ */ (0,
|
|
1699
|
-
/* @__PURE__ */ (0,
|
|
1700
|
-
/* @__PURE__ */ (0,
|
|
1735
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1736
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M18 11V6a2 2 0 0 0-4 0v5" }),
|
|
1737
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M14 10V4a2 2 0 0 0-4 0v7" }),
|
|
1738
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M10 10.5V6a2 2 0 0 0-4 0v8" }),
|
|
1739
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2a8 8 0 0 1-8-8v-1a2 2 0 1 1 4 0" })
|
|
1701
1740
|
] });
|
|
1702
1741
|
}
|
|
1703
1742
|
function ChatIcon(props) {
|
|
1704
|
-
return /* @__PURE__ */ (0,
|
|
1743
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2Z" }) });
|
|
1705
1744
|
}
|
|
1706
1745
|
function PeopleIcon(props) {
|
|
1707
|
-
return /* @__PURE__ */ (0,
|
|
1708
|
-
/* @__PURE__ */ (0,
|
|
1709
|
-
/* @__PURE__ */ (0,
|
|
1710
|
-
/* @__PURE__ */ (0,
|
|
1746
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1747
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" }),
|
|
1748
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "9", cy: "7", r: "4" }),
|
|
1749
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75" })
|
|
1711
1750
|
] });
|
|
1712
1751
|
}
|
|
1713
1752
|
function RecordIcon(props) {
|
|
1714
|
-
return /* @__PURE__ */ (0,
|
|
1753
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "12", cy: "12", r: "8", fill: "currentColor", stroke: "none" }) });
|
|
1715
1754
|
}
|
|
1716
1755
|
function SparklesIcon(props) {
|
|
1717
|
-
return /* @__PURE__ */ (0,
|
|
1718
|
-
/* @__PURE__ */ (0,
|
|
1719
|
-
/* @__PURE__ */ (0,
|
|
1756
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1757
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 3l1.9 4.6L18.5 9.5l-4.6 1.9L12 16l-1.9-4.6L5.5 9.5l4.6-1.9L12 3Z" }),
|
|
1758
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M19 15l.9 2.1 2.1.9-2.1.9-.9 2.1-.9-2.1-2.1-.9 2.1-.9L19 15Z" })
|
|
1720
1759
|
] });
|
|
1721
1760
|
}
|
|
1722
1761
|
function LockIcon(props) {
|
|
1723
|
-
return /* @__PURE__ */ (0,
|
|
1724
|
-
/* @__PURE__ */ (0,
|
|
1725
|
-
/* @__PURE__ */ (0,
|
|
1762
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1763
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { x: "4", y: "10", width: "16", height: "11", rx: "2" }),
|
|
1764
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M8 10V7a4 4 0 0 1 8 0v3" })
|
|
1726
1765
|
] });
|
|
1727
1766
|
}
|
|
1728
1767
|
function LayoutIcon(props) {
|
|
1729
|
-
return /* @__PURE__ */ (0,
|
|
1730
|
-
/* @__PURE__ */ (0,
|
|
1731
|
-
/* @__PURE__ */ (0,
|
|
1768
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1769
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
|
|
1770
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M3 9h18M9 21V9" })
|
|
1732
1771
|
] });
|
|
1733
1772
|
}
|
|
1734
1773
|
function SettingsIcon(props) {
|
|
1735
|
-
return /* @__PURE__ */ (0,
|
|
1736
|
-
/* @__PURE__ */ (0,
|
|
1737
|
-
/* @__PURE__ */ (0,
|
|
1774
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1775
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "12", cy: "12", r: "3" }),
|
|
1776
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.6a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z" })
|
|
1738
1777
|
] });
|
|
1739
1778
|
}
|
|
1740
1779
|
function CheckIcon(props) {
|
|
1741
|
-
return /* @__PURE__ */ (0,
|
|
1780
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M20 6 9 17l-5-5" }) });
|
|
1742
1781
|
}
|
|
1743
1782
|
function CloseIcon(props) {
|
|
1744
|
-
return /* @__PURE__ */ (0,
|
|
1783
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M18 6 6 18M6 6l12 12" }) });
|
|
1745
1784
|
}
|
|
1746
1785
|
function PinIcon(props) {
|
|
1747
|
-
return /* @__PURE__ */ (0,
|
|
1748
|
-
/* @__PURE__ */ (0,
|
|
1749
|
-
/* @__PURE__ */ (0,
|
|
1786
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1787
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 17v5" }),
|
|
1788
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M9 2h6l-1 6 3.5 3.5V14H6.5v-2.5L10 8 9 2Z" })
|
|
1750
1789
|
] });
|
|
1751
1790
|
}
|
|
1752
1791
|
function WifiLowIcon(props) {
|
|
1753
|
-
return /* @__PURE__ */ (0,
|
|
1754
|
-
/* @__PURE__ */ (0,
|
|
1755
|
-
/* @__PURE__ */ (0,
|
|
1792
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1793
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 20h.01" }),
|
|
1794
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M8.5 16.5a5 5 0 0 1 7 0" })
|
|
1756
1795
|
] });
|
|
1757
1796
|
}
|
|
1758
1797
|
function SmileIcon(props) {
|
|
1759
|
-
return /* @__PURE__ */ (0,
|
|
1760
|
-
/* @__PURE__ */ (0,
|
|
1761
|
-
/* @__PURE__ */ (0,
|
|
1762
|
-
/* @__PURE__ */ (0,
|
|
1763
|
-
/* @__PURE__ */ (0,
|
|
1798
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1799
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
|
|
1800
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M8 14s1.5 2 4 2 4-2 4-2" }),
|
|
1801
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "9", x2: "9.01", y1: "9", y2: "9" }),
|
|
1802
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "15", x2: "15.01", y1: "9", y2: "9" })
|
|
1764
1803
|
] });
|
|
1765
1804
|
}
|
|
1766
1805
|
function MoreIcon(props) {
|
|
1767
|
-
return /* @__PURE__ */ (0,
|
|
1768
|
-
/* @__PURE__ */ (0,
|
|
1769
|
-
/* @__PURE__ */ (0,
|
|
1770
|
-
/* @__PURE__ */ (0,
|
|
1806
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1807
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "12", cy: "12", r: "1" }),
|
|
1808
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "19", cy: "12", r: "1" }),
|
|
1809
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "5", cy: "12", r: "1" })
|
|
1771
1810
|
] });
|
|
1772
1811
|
}
|
|
1773
1812
|
function SearchIcon(props) {
|
|
1774
|
-
return /* @__PURE__ */ (0,
|
|
1775
|
-
/* @__PURE__ */ (0,
|
|
1776
|
-
/* @__PURE__ */ (0,
|
|
1813
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1814
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "11", cy: "11", r: "8" }),
|
|
1815
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m21 21-4.3-4.3" })
|
|
1777
1816
|
] });
|
|
1778
1817
|
}
|
|
1779
1818
|
function KeyboardIcon(props) {
|
|
1780
|
-
return /* @__PURE__ */ (0,
|
|
1781
|
-
/* @__PURE__ */ (0,
|
|
1782
|
-
/* @__PURE__ */ (0,
|
|
1819
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1820
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M10 8h.01M12 12h.01M14 8h.01M16 12h.01M18 8h.01M6 8h.01M7 16h10M8 12h.01" }),
|
|
1821
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { width: "20", height: "16", x: "2", y: "4", rx: "2" })
|
|
1783
1822
|
] });
|
|
1784
1823
|
}
|
|
1785
1824
|
function SpotlightIcon(props) {
|
|
1786
|
-
return /* @__PURE__ */ (0,
|
|
1825
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 2 15 8.5 22 9.3 17 14 18.2 21 12 17.6 5.8 21 7 14 2 9.3 9 8.5Z" }) });
|
|
1787
1826
|
}
|
|
1788
1827
|
function SignalIcon({ bars, ...props }) {
|
|
1789
|
-
return /* @__PURE__ */ (0,
|
|
1790
|
-
/* @__PURE__ */ (0,
|
|
1791
|
-
/* @__PURE__ */ (0,
|
|
1792
|
-
/* @__PURE__ */ (0,
|
|
1793
|
-
/* @__PURE__ */ (0,
|
|
1828
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1829
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M4 20v-2", opacity: bars >= 1 ? 1 : 0.3 }),
|
|
1830
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M10 20v-6", opacity: bars >= 2 ? 1 : 0.3 }),
|
|
1831
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M16 20V9", opacity: bars >= 3 ? 1 : 0.3 }),
|
|
1832
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M22 20V4", opacity: bars >= 3 ? 1 : 0.3 })
|
|
1794
1833
|
] });
|
|
1795
1834
|
}
|
|
1796
1835
|
function SpeakerIcon(props) {
|
|
1797
|
-
return /* @__PURE__ */ (0,
|
|
1798
|
-
/* @__PURE__ */ (0,
|
|
1799
|
-
/* @__PURE__ */ (0,
|
|
1800
|
-
/* @__PURE__ */ (0,
|
|
1836
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1837
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M11 5 6 9H2v6h4l5 4V5Z" }),
|
|
1838
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M15.54 8.46a5 5 0 0 1 0 7.07" }),
|
|
1839
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M19.07 4.93a10 10 0 0 1 0 14.14" })
|
|
1801
1840
|
] });
|
|
1802
1841
|
}
|
|
1803
1842
|
function FlagIcon(props) {
|
|
1804
|
-
return /* @__PURE__ */ (0,
|
|
1805
|
-
/* @__PURE__ */ (0,
|
|
1806
|
-
/* @__PURE__ */ (0,
|
|
1843
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1844
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z" }),
|
|
1845
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "4", x2: "4", y1: "22", y2: "15" })
|
|
1807
1846
|
] });
|
|
1808
1847
|
}
|
|
1809
1848
|
function PencilIcon(props) {
|
|
1810
|
-
return /* @__PURE__ */ (0,
|
|
1849
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z" }) });
|
|
1811
1850
|
}
|
|
1812
1851
|
function ActivitiesIcon(props) {
|
|
1813
|
-
return /* @__PURE__ */ (0,
|
|
1814
|
-
/* @__PURE__ */ (0,
|
|
1815
|
-
/* @__PURE__ */ (0,
|
|
1816
|
-
/* @__PURE__ */ (0,
|
|
1852
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1853
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z" }),
|
|
1854
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1" }),
|
|
1855
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("circle", { cx: "17.5", cy: "17.5", r: "3.5" })
|
|
1817
1856
|
] });
|
|
1818
1857
|
}
|
|
1819
1858
|
function PollIcon(props) {
|
|
1820
|
-
return /* @__PURE__ */ (0,
|
|
1821
|
-
/* @__PURE__ */ (0,
|
|
1822
|
-
/* @__PURE__ */ (0,
|
|
1823
|
-
/* @__PURE__ */ (0,
|
|
1859
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1860
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "18", x2: "18", y1: "20", y2: "10" }),
|
|
1861
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "12", x2: "12", y1: "20", y2: "4" }),
|
|
1862
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("line", { x1: "6", x2: "6", y1: "20", y2: "14" })
|
|
1824
1863
|
] });
|
|
1825
1864
|
}
|
|
1826
1865
|
function QuestionIcon(props) {
|
|
1827
|
-
return /* @__PURE__ */ (0,
|
|
1828
|
-
/* @__PURE__ */ (0,
|
|
1829
|
-
/* @__PURE__ */ (0,
|
|
1830
|
-
/* @__PURE__ */ (0,
|
|
1866
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1867
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M7.9 20A9 9 0 1 0 4 16.1L2 22Z" }),
|
|
1868
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" }),
|
|
1869
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M12 17h.01" })
|
|
1831
1870
|
] });
|
|
1832
1871
|
}
|
|
1833
1872
|
function WhiteboardIcon(props) {
|
|
1834
|
-
return /* @__PURE__ */ (0,
|
|
1835
|
-
/* @__PURE__ */ (0,
|
|
1836
|
-
/* @__PURE__ */ (0,
|
|
1837
|
-
/* @__PURE__ */ (0,
|
|
1873
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1874
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M2 3h20" }),
|
|
1875
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3" }),
|
|
1876
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m7 21 5-5 5 5" })
|
|
1838
1877
|
] });
|
|
1839
1878
|
}
|
|
1840
1879
|
function BreakoutIcon(props) {
|
|
1841
|
-
return /* @__PURE__ */ (0,
|
|
1842
|
-
/* @__PURE__ */ (0,
|
|
1843
|
-
/* @__PURE__ */ (0,
|
|
1844
|
-
/* @__PURE__ */ (0,
|
|
1880
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1881
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { width: "7", height: "18", x: "3", y: "3", rx: "1" }),
|
|
1882
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { width: "7", height: "7", x: "14", y: "3", rx: "1" }),
|
|
1883
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("rect", { width: "7", height: "7", x: "14", y: "14", rx: "1" })
|
|
1845
1884
|
] });
|
|
1846
1885
|
}
|
|
1847
1886
|
function UpvoteIcon(props) {
|
|
1848
|
-
return /* @__PURE__ */ (0,
|
|
1887
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Icon, { ...props, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M9 18v-6H5l7-7 7 7h-4v6H9z" }) });
|
|
1849
1888
|
}
|
|
1850
1889
|
function EraserIcon(props) {
|
|
1851
|
-
return /* @__PURE__ */ (0,
|
|
1852
|
-
/* @__PURE__ */ (0,
|
|
1853
|
-
/* @__PURE__ */ (0,
|
|
1854
|
-
/* @__PURE__ */ (0,
|
|
1890
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1891
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21" }),
|
|
1892
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M22 21H7" }),
|
|
1893
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m5 11 9 9" })
|
|
1855
1894
|
] });
|
|
1856
1895
|
}
|
|
1857
1896
|
function HighlighterIcon(props) {
|
|
1858
|
-
return /* @__PURE__ */ (0,
|
|
1859
|
-
/* @__PURE__ */ (0,
|
|
1860
|
-
/* @__PURE__ */ (0,
|
|
1897
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1898
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m9 11-6 6v3h9l3-3" }),
|
|
1899
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4" })
|
|
1861
1900
|
] });
|
|
1862
1901
|
}
|
|
1863
1902
|
function UndoIcon(props) {
|
|
1864
|
-
return /* @__PURE__ */ (0,
|
|
1865
|
-
/* @__PURE__ */ (0,
|
|
1866
|
-
/* @__PURE__ */ (0,
|
|
1903
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Icon, { ...props, children: [
|
|
1904
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M9 14 4 9l5-5" }),
|
|
1905
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11" })
|
|
1867
1906
|
] });
|
|
1868
1907
|
}
|
|
1869
1908
|
|
|
1870
1909
|
// src/skins/meet/collab.tsx
|
|
1871
|
-
var
|
|
1910
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
1872
1911
|
function useNotice() {
|
|
1873
|
-
const [notice, setNotice] = (0,
|
|
1874
|
-
(0,
|
|
1912
|
+
const [notice, setNotice] = (0, import_react9.useState)(null);
|
|
1913
|
+
(0, import_react9.useEffect)(() => {
|
|
1875
1914
|
if (notice === null) return void 0;
|
|
1876
1915
|
const timer = setTimeout(() => setNotice(null), notice.failed ? 7e3 : 3e3);
|
|
1877
1916
|
return () => clearTimeout(timer);
|
|
@@ -1880,7 +1919,7 @@ function useNotice() {
|
|
|
1880
1919
|
}
|
|
1881
1920
|
function Notice({ notice }) {
|
|
1882
1921
|
if (notice === null) return null;
|
|
1883
|
-
return /* @__PURE__ */ (0,
|
|
1922
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: notice.failed ? "mx-meet__panel-note mx-meet__collab-error" : "mx-meet__panel-note", role: "status", children: notice.text });
|
|
1884
1923
|
}
|
|
1885
1924
|
var ACTIVITY_LABELS = {
|
|
1886
1925
|
polls: "Polls",
|
|
@@ -1890,25 +1929,25 @@ var ACTIVITY_LABELS = {
|
|
|
1890
1929
|
};
|
|
1891
1930
|
function ActivityIcon({ panel }) {
|
|
1892
1931
|
const props = { width: 16, height: 16 };
|
|
1893
|
-
if (panel === "polls") return /* @__PURE__ */ (0,
|
|
1894
|
-
if (panel === "qa") return /* @__PURE__ */ (0,
|
|
1895
|
-
if (panel === "whiteboard") return /* @__PURE__ */ (0,
|
|
1896
|
-
return /* @__PURE__ */ (0,
|
|
1932
|
+
if (panel === "polls") return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PollIcon, { ...props });
|
|
1933
|
+
if (panel === "qa") return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(QuestionIcon, { ...props });
|
|
1934
|
+
if (panel === "whiteboard") return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(WhiteboardIcon, { ...props });
|
|
1935
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(BreakoutIcon, { ...props });
|
|
1897
1936
|
}
|
|
1898
1937
|
function ActivitiesControl({
|
|
1899
1938
|
active,
|
|
1900
1939
|
onOpen
|
|
1901
1940
|
}) {
|
|
1902
|
-
const [open, setOpen] = (0,
|
|
1941
|
+
const [open, setOpen] = (0, import_react9.useState)(false);
|
|
1903
1942
|
const available = useAvailableActivities();
|
|
1904
1943
|
const attention = useActivityAttention();
|
|
1905
1944
|
if (available.length === 0) return null;
|
|
1906
|
-
return /* @__PURE__ */ (0,
|
|
1907
|
-
/* @__PURE__ */ (0,
|
|
1908
|
-
/* @__PURE__ */ (0,
|
|
1909
|
-
attention ? /* @__PURE__ */ (0,
|
|
1945
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__anchor", children: [
|
|
1946
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(ControlButton, { label: "Activities", active: open || active !== null, onClick: () => setOpen(!open), children: [
|
|
1947
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ActivitiesIcon, {}),
|
|
1948
|
+
attention ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
|
|
1910
1949
|
] }),
|
|
1911
|
-
open ? /* @__PURE__ */ (0,
|
|
1950
|
+
open ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Popover, { label: "Activities", onClose: () => setOpen(false), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__menu", role: "menu", children: available.map((panel) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1912
1951
|
MenuItem,
|
|
1913
1952
|
{
|
|
1914
1953
|
onSelect: () => {
|
|
@@ -1916,7 +1955,7 @@ function ActivitiesControl({
|
|
|
1916
1955
|
onOpen(panel);
|
|
1917
1956
|
},
|
|
1918
1957
|
children: [
|
|
1919
|
-
/* @__PURE__ */ (0,
|
|
1958
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ActivityIcon, { panel }),
|
|
1920
1959
|
" ",
|
|
1921
1960
|
ACTIVITY_LABELS[panel]
|
|
1922
1961
|
]
|
|
@@ -1927,11 +1966,11 @@ function ActivitiesControl({
|
|
|
1927
1966
|
}
|
|
1928
1967
|
function PollComposer({ maxOptions, onDone }) {
|
|
1929
1968
|
const { act } = useCollab();
|
|
1930
|
-
const [question, setQuestion] = (0,
|
|
1931
|
-
const [options, setOptions] = (0,
|
|
1932
|
-
const [multiple, setMultiple] = (0,
|
|
1933
|
-
const [anonymous, setAnonymous] = (0,
|
|
1934
|
-
const [busy, setBusy] = (0,
|
|
1969
|
+
const [question, setQuestion] = (0, import_react9.useState)("");
|
|
1970
|
+
const [options, setOptions] = (0, import_react9.useState)(["", ""]);
|
|
1971
|
+
const [multiple, setMultiple] = (0, import_react9.useState)(false);
|
|
1972
|
+
const [anonymous, setAnonymous] = (0, import_react9.useState)(false);
|
|
1973
|
+
const [busy, setBusy] = (0, import_react9.useState)(false);
|
|
1935
1974
|
const [notice, show] = useNotice();
|
|
1936
1975
|
const filled = options.map((o) => o.trim()).filter(Boolean);
|
|
1937
1976
|
const ready = question.trim().length > 0 && filled.length >= 2;
|
|
@@ -1954,7 +1993,7 @@ function PollComposer({ maxOptions, onDone }) {
|
|
|
1954
1993
|
setBusy(false);
|
|
1955
1994
|
onDone();
|
|
1956
1995
|
};
|
|
1957
|
-
return /* @__PURE__ */ (0,
|
|
1996
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
1958
1997
|
"form",
|
|
1959
1998
|
{
|
|
1960
1999
|
className: "mx-meet__collab-card",
|
|
@@ -1963,9 +2002,9 @@ function PollComposer({ maxOptions, onDone }) {
|
|
|
1963
2002
|
if (ready) void save(true);
|
|
1964
2003
|
},
|
|
1965
2004
|
children: [
|
|
1966
|
-
/* @__PURE__ */ (0,
|
|
1967
|
-
/* @__PURE__ */ (0,
|
|
1968
|
-
/* @__PURE__ */ (0,
|
|
2005
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__field", children: [
|
|
2006
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__field-label", children: "Question" }),
|
|
2007
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1969
2008
|
"input",
|
|
1970
2009
|
{
|
|
1971
2010
|
className: "mx-meet__input",
|
|
@@ -1977,8 +2016,8 @@ function PollComposer({ maxOptions, onDone }) {
|
|
|
1977
2016
|
}
|
|
1978
2017
|
)
|
|
1979
2018
|
] }),
|
|
1980
|
-
options.map((option, index) => /* @__PURE__ */ (0,
|
|
1981
|
-
/* @__PURE__ */ (0,
|
|
2019
|
+
options.map((option, index) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__composer-row", children: [
|
|
2020
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1982
2021
|
"input",
|
|
1983
2022
|
{
|
|
1984
2023
|
className: "mx-meet__input",
|
|
@@ -1989,22 +2028,22 @@ function PollComposer({ maxOptions, onDone }) {
|
|
|
1989
2028
|
onChange: (event) => setOptions(options.map((o, i) => i === index ? event.target.value : o))
|
|
1990
2029
|
}
|
|
1991
2030
|
),
|
|
1992
|
-
options.length > 2 ? /* @__PURE__ */ (0,
|
|
2031
|
+
options.length > 2 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ControlButton, { label: `Remove answer ${index + 1}`, onClick: () => setOptions(options.filter((_, i) => i !== index)), children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseIcon, { width: 14, height: 14 }) }) : null
|
|
1993
2032
|
] }, index)),
|
|
1994
|
-
options.length < maxOptions ? /* @__PURE__ */ (0,
|
|
1995
|
-
/* @__PURE__ */ (0,
|
|
1996
|
-
/* @__PURE__ */ (0,
|
|
2033
|
+
options.length < maxOptions ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => setOptions([...options, ""]), children: "Add an answer" }) : null,
|
|
2034
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__toggle", children: [
|
|
2035
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("input", { type: "checkbox", checked: multiple, onChange: (event) => setMultiple(event.target.checked) }),
|
|
1997
2036
|
"People can pick more than one"
|
|
1998
2037
|
] }),
|
|
1999
|
-
/* @__PURE__ */ (0,
|
|
2000
|
-
/* @__PURE__ */ (0,
|
|
2038
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__toggle", children: [
|
|
2039
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("input", { type: "checkbox", checked: anonymous, onChange: (event) => setAnonymous(event.target.checked) }),
|
|
2001
2040
|
"Anonymous \u2014 nobody sees who picked what"
|
|
2002
2041
|
] }),
|
|
2003
|
-
/* @__PURE__ */ (0,
|
|
2004
|
-
/* @__PURE__ */ (0,
|
|
2005
|
-
/* @__PURE__ */ (0,
|
|
2006
|
-
/* @__PURE__ */ (0,
|
|
2007
|
-
/* @__PURE__ */ (0,
|
|
2042
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
|
|
2043
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__collab-actions", children: [
|
|
2044
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "submit", className: "mx-meet__primary mx-meet__primary--small", disabled: !ready || busy, children: "Launch" }),
|
|
2045
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", disabled: !ready || busy, onClick: () => void save(false), children: "Save draft" }),
|
|
2046
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: onDone, children: "Cancel" })
|
|
2008
2047
|
] })
|
|
2009
2048
|
]
|
|
2010
2049
|
}
|
|
@@ -2012,9 +2051,9 @@ function PollComposer({ maxOptions, onDone }) {
|
|
|
2012
2051
|
}
|
|
2013
2052
|
function PollCard({ poll }) {
|
|
2014
2053
|
const { act, isHost } = useCollab();
|
|
2015
|
-
const [picked, setPicked] = (0,
|
|
2054
|
+
const [picked, setPicked] = (0, import_react9.useState)(poll.myVote.slice());
|
|
2016
2055
|
const [notice, show] = useNotice();
|
|
2017
|
-
(0,
|
|
2056
|
+
(0, import_react9.useEffect)(() => setPicked(poll.myVote.slice()), [poll.myVote]);
|
|
2018
2057
|
const counts = poll.options.some((o) => o.votes !== void 0);
|
|
2019
2058
|
const total = poll.options.reduce((sum, o) => sum + (o.votes ?? 0), 0);
|
|
2020
2059
|
const canVote = poll.state === "live";
|
|
@@ -2024,22 +2063,22 @@ function PollCard({ poll }) {
|
|
|
2024
2063
|
if (!canVote) return;
|
|
2025
2064
|
setPicked(poll.multiple ? picked.includes(id) ? picked.filter((p) => p !== id) : [...picked, id] : [id]);
|
|
2026
2065
|
};
|
|
2027
|
-
return /* @__PURE__ */ (0,
|
|
2028
|
-
/* @__PURE__ */ (0,
|
|
2029
|
-
/* @__PURE__ */ (0,
|
|
2030
|
-
/* @__PURE__ */ (0,
|
|
2066
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("article", { className: "mx-meet__collab-card", "aria-label": poll.question, children: [
|
|
2067
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("header", { className: "mx-meet__collab-head", children: [
|
|
2068
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { className: "mx-meet__collab-title", children: poll.question }),
|
|
2069
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__collab-state", children: stateWord })
|
|
2031
2070
|
] }),
|
|
2032
|
-
/* @__PURE__ */ (0,
|
|
2071
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "mx-meet__panel-note", children: [
|
|
2033
2072
|
poll.multiple ? "Pick any." : "Pick one.",
|
|
2034
2073
|
poll.anonymous ? " Anonymous." : "",
|
|
2035
2074
|
counts && poll.voterCount !== null ? ` ${poll.voterCount} voted.` : "",
|
|
2036
2075
|
isHost && poll.state !== "draft" && !poll.resultsShared ? " Results are visible only to hosts." : ""
|
|
2037
2076
|
] }),
|
|
2038
|
-
/* @__PURE__ */ (0,
|
|
2077
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__poll-options", children: poll.options.map((option) => {
|
|
2039
2078
|
const share = counts && total > 0 ? Math.round((option.votes ?? 0) / total * 100) : 0;
|
|
2040
2079
|
const chosen = picked.includes(option.id);
|
|
2041
|
-
return /* @__PURE__ */ (0,
|
|
2042
|
-
/* @__PURE__ */ (0,
|
|
2080
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { children: [
|
|
2081
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2043
2082
|
"button",
|
|
2044
2083
|
{
|
|
2045
2084
|
type: "button",
|
|
@@ -2048,9 +2087,9 @@ function PollCard({ poll }) {
|
|
|
2048
2087
|
disabled: !canVote,
|
|
2049
2088
|
onClick: () => toggle(option.id),
|
|
2050
2089
|
children: [
|
|
2051
|
-
counts ? /* @__PURE__ */ (0,
|
|
2052
|
-
/* @__PURE__ */ (0,
|
|
2053
|
-
counts ? /* @__PURE__ */ (0,
|
|
2090
|
+
counts ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__poll-bar", style: { width: `${share}%` }, "aria-hidden": "true" }) : null,
|
|
2091
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__poll-text", children: option.text }),
|
|
2092
|
+
counts ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__poll-count", children: [
|
|
2054
2093
|
option.votes ?? 0,
|
|
2055
2094
|
" \xB7 ",
|
|
2056
2095
|
share,
|
|
@@ -2059,12 +2098,12 @@ function PollCard({ poll }) {
|
|
|
2059
2098
|
]
|
|
2060
2099
|
}
|
|
2061
2100
|
),
|
|
2062
|
-
option.voters !== void 0 && option.voters.length > 0 ? /* @__PURE__ */ (0,
|
|
2101
|
+
option.voters !== void 0 && option.voters.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__poll-voters", children: option.voters.join(", ") }) : null
|
|
2063
2102
|
] }, option.id);
|
|
2064
2103
|
}) }),
|
|
2065
|
-
/* @__PURE__ */ (0,
|
|
2066
|
-
/* @__PURE__ */ (0,
|
|
2067
|
-
canVote ? /* @__PURE__ */ (0,
|
|
2104
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
|
|
2105
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__collab-actions", children: [
|
|
2106
|
+
canVote ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2068
2107
|
"button",
|
|
2069
2108
|
{
|
|
2070
2109
|
type: "button",
|
|
@@ -2074,35 +2113,35 @@ function PollCard({ poll }) {
|
|
|
2074
2113
|
children: voted ? "Change vote" : "Vote"
|
|
2075
2114
|
}
|
|
2076
2115
|
) : null,
|
|
2077
|
-
isHost && poll.state === "draft" ? /* @__PURE__ */ (0,
|
|
2078
|
-
isHost && poll.state === "live" ? /* @__PURE__ */ (0,
|
|
2079
|
-
isHost && poll.state !== "draft" ? /* @__PURE__ */ (0,
|
|
2080
|
-
isHost && poll.state === "live" ? null : isHost ? /* @__PURE__ */ (0,
|
|
2116
|
+
isHost && poll.state === "draft" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__primary mx-meet__primary--small", onClick: () => void act({ action: "poll_launch", itemId: poll.id }).then(show), children: "Launch" }) : null,
|
|
2117
|
+
isHost && poll.state === "live" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "poll_close", itemId: poll.id }).then(show), children: "End poll" }) : null,
|
|
2118
|
+
isHost && poll.state !== "draft" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "poll_share", itemId: poll.id }).then(show), children: poll.resultsShared ? "Hide results" : "Share results" }) : null,
|
|
2119
|
+
isHost && poll.state === "live" ? null : isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => void act({ action: "poll_delete", itemId: poll.id }).then(show), children: "Delete" }) : null
|
|
2081
2120
|
] })
|
|
2082
2121
|
] });
|
|
2083
2122
|
}
|
|
2084
2123
|
function PollsPanel({ onClose }) {
|
|
2085
2124
|
const { collab, isHost } = useCollab();
|
|
2086
|
-
const [composing, setComposing] = (0,
|
|
2125
|
+
const [composing, setComposing] = (0, import_react9.useState)(false);
|
|
2087
2126
|
const polls = collab?.polls ?? [];
|
|
2088
2127
|
const maxOptions = collab?.settings?.pollMaxOptions ?? 10;
|
|
2089
2128
|
const ordered = [...polls].reverse();
|
|
2090
|
-
return /* @__PURE__ */ (0,
|
|
2091
|
-
collab?.error != null ? /* @__PURE__ */ (0,
|
|
2092
|
-
isHost && !composing ? /* @__PURE__ */ (0,
|
|
2093
|
-
isHost && composing ? /* @__PURE__ */ (0,
|
|
2094
|
-
ordered.length === 0 && !composing ? /* @__PURE__ */ (0,
|
|
2095
|
-
ordered.map((poll) => /* @__PURE__ */ (0,
|
|
2129
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(PanelShell, { title: "Polls", onClose, children: [
|
|
2130
|
+
collab?.error != null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
|
|
2131
|
+
isHost && !composing ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__primary mx-meet__primary--small", onClick: () => setComposing(true), children: "New poll" }) : null,
|
|
2132
|
+
isHost && composing ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PollComposer, { maxOptions, onDone: () => setComposing(false) }) : null,
|
|
2133
|
+
ordered.length === 0 && !composing ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", children: isHost ? "No polls yet. Polls and their results are kept with the meeting." : "No polls yet." }) : null,
|
|
2134
|
+
ordered.map((poll) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PollCard, { poll }, poll.id))
|
|
2096
2135
|
] });
|
|
2097
2136
|
}
|
|
2098
2137
|
function QuestionCard({ question }) {
|
|
2099
2138
|
const { act, isHost } = useCollab();
|
|
2100
|
-
const [answering, setAnswering] = (0,
|
|
2101
|
-
const [reply, setReply] = (0,
|
|
2139
|
+
const [answering, setAnswering] = (0, import_react9.useState)(false);
|
|
2140
|
+
const [reply, setReply] = (0, import_react9.useState)("");
|
|
2102
2141
|
const [notice, show] = useNotice();
|
|
2103
|
-
return /* @__PURE__ */ (0,
|
|
2104
|
-
/* @__PURE__ */ (0,
|
|
2105
|
-
/* @__PURE__ */ (0,
|
|
2142
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { className: `mx-meet__collab-card mx-meet__question mx-meet__question--${question.state}`, children: [
|
|
2143
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__question-row", children: [
|
|
2144
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2106
2145
|
"button",
|
|
2107
2146
|
{
|
|
2108
2147
|
type: "button",
|
|
@@ -2112,20 +2151,20 @@ function QuestionCard({ question }) {
|
|
|
2112
2151
|
disabled: question.state === "dismissed",
|
|
2113
2152
|
onClick: () => void act({ action: "question_upvote", itemId: question.id }).then((r) => r.ok ? void 0 : show(r)),
|
|
2114
2153
|
children: [
|
|
2115
|
-
/* @__PURE__ */ (0,
|
|
2116
|
-
/* @__PURE__ */ (0,
|
|
2154
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(UpvoteIcon, { width: 16, height: 16 }),
|
|
2155
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: question.upvotes })
|
|
2117
2156
|
]
|
|
2118
2157
|
}
|
|
2119
2158
|
),
|
|
2120
|
-
/* @__PURE__ */ (0,
|
|
2121
|
-
/* @__PURE__ */ (0,
|
|
2122
|
-
/* @__PURE__ */ (0,
|
|
2123
|
-
question.mine && question.anonymous ? /* @__PURE__ */ (0,
|
|
2124
|
-
question.state !== "open" ? /* @__PURE__ */ (0,
|
|
2159
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__question-body", children: [
|
|
2160
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__chat-meta", children: [
|
|
2161
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: question.mine ? "You" : question.askerName }),
|
|
2162
|
+
question.mine && question.anonymous ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__chat-private", children: "anonymous" }) : null,
|
|
2163
|
+
question.state !== "open" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__collab-state", children: question.state === "answered" ? "Answered" : "Dismissed" }) : null
|
|
2125
2164
|
] }),
|
|
2126
|
-
/* @__PURE__ */ (0,
|
|
2127
|
-
question.answer !== null ? /* @__PURE__ */ (0,
|
|
2128
|
-
/* @__PURE__ */ (0,
|
|
2165
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__chat-text", children: question.text }),
|
|
2166
|
+
question.answer !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__question-answer", children: [
|
|
2167
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("strong", { children: [
|
|
2129
2168
|
question.answeredByName ?? "Host",
|
|
2130
2169
|
":"
|
|
2131
2170
|
] }),
|
|
@@ -2134,7 +2173,7 @@ function QuestionCard({ question }) {
|
|
|
2134
2173
|
] }) : null
|
|
2135
2174
|
] })
|
|
2136
2175
|
] }),
|
|
2137
|
-
answering ? /* @__PURE__ */ (0,
|
|
2176
|
+
answering ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2138
2177
|
"form",
|
|
2139
2178
|
{
|
|
2140
2179
|
className: "mx-meet__composer-row",
|
|
@@ -2149,7 +2188,7 @@ function QuestionCard({ question }) {
|
|
|
2149
2188
|
});
|
|
2150
2189
|
},
|
|
2151
2190
|
children: [
|
|
2152
|
-
/* @__PURE__ */ (0,
|
|
2191
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2153
2192
|
"input",
|
|
2154
2193
|
{
|
|
2155
2194
|
className: "mx-meet__input",
|
|
@@ -2161,24 +2200,24 @@ function QuestionCard({ question }) {
|
|
|
2161
2200
|
autoFocus: true
|
|
2162
2201
|
}
|
|
2163
2202
|
),
|
|
2164
|
-
/* @__PURE__ */ (0,
|
|
2203
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "submit", className: "mx-meet__send", children: "Done" })
|
|
2165
2204
|
]
|
|
2166
2205
|
}
|
|
2167
2206
|
) : null,
|
|
2168
|
-
/* @__PURE__ */ (0,
|
|
2169
|
-
isHost || question.mine ? /* @__PURE__ */ (0,
|
|
2170
|
-
isHost && question.state === "open" && !answering ? /* @__PURE__ */ (0,
|
|
2171
|
-
isHost && question.state === "open" ? /* @__PURE__ */ (0,
|
|
2172
|
-
isHost && question.state !== "open" ? /* @__PURE__ */ (0,
|
|
2173
|
-
question.mine || isHost ? /* @__PURE__ */ (0,
|
|
2207
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
|
|
2208
|
+
isHost || question.mine ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__collab-actions", children: [
|
|
2209
|
+
isHost && question.state === "open" && !answering ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => setAnswering(true), children: "Answer" }) : null,
|
|
2210
|
+
isHost && question.state === "open" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "question_dismiss", itemId: question.id }).then(show), children: "Dismiss" }) : null,
|
|
2211
|
+
isHost && question.state !== "open" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "question_reopen", itemId: question.id }).then(show), children: "Reopen" }) : null,
|
|
2212
|
+
question.mine || isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => void act({ action: "question_delete", itemId: question.id }).then(show), children: "Delete" }) : null
|
|
2174
2213
|
] }) : null
|
|
2175
2214
|
] });
|
|
2176
2215
|
}
|
|
2177
2216
|
function QaPanel({ onClose }) {
|
|
2178
2217
|
const { collab, act } = useCollab();
|
|
2179
|
-
const [draft, setDraft] = (0,
|
|
2180
|
-
const [anonymous, setAnonymous] = (0,
|
|
2181
|
-
const [order, setOrder] = (0,
|
|
2218
|
+
const [draft, setDraft] = (0, import_react9.useState)("");
|
|
2219
|
+
const [anonymous, setAnonymous] = (0, import_react9.useState)(false);
|
|
2220
|
+
const [order, setOrder] = (0, import_react9.useState)("popular");
|
|
2182
2221
|
const [notice, show] = useNotice();
|
|
2183
2222
|
const allowAnonymous = collab?.settings?.qaAnonymousAllowed === true;
|
|
2184
2223
|
const questions = [...collab?.questions ?? []];
|
|
@@ -2186,9 +2225,9 @@ function QaPanel({ onClose }) {
|
|
|
2186
2225
|
questions.sort(
|
|
2187
2226
|
(a, b) => rank(a) !== rank(b) ? rank(a) - rank(b) : order === "popular" ? b.upvotes - a.upvotes || (b.createdAt ?? "").localeCompare(a.createdAt ?? "") : (b.createdAt ?? "").localeCompare(a.createdAt ?? "")
|
|
2188
2227
|
);
|
|
2189
|
-
return /* @__PURE__ */ (0,
|
|
2190
|
-
collab?.error != null ? /* @__PURE__ */ (0,
|
|
2191
|
-
/* @__PURE__ */ (0,
|
|
2228
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(PanelShell, { title: "Q&A", onClose, children: [
|
|
2229
|
+
collab?.error != null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
|
|
2230
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2192
2231
|
"form",
|
|
2193
2232
|
{
|
|
2194
2233
|
className: "mx-meet__composer mx-meet__composer--chat",
|
|
@@ -2202,8 +2241,8 @@ function QaPanel({ onClose }) {
|
|
|
2202
2241
|
});
|
|
2203
2242
|
},
|
|
2204
2243
|
children: [
|
|
2205
|
-
/* @__PURE__ */ (0,
|
|
2206
|
-
/* @__PURE__ */ (0,
|
|
2244
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__composer-row", children: [
|
|
2245
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2207
2246
|
"input",
|
|
2208
2247
|
{
|
|
2209
2248
|
className: "mx-meet__input",
|
|
@@ -2214,17 +2253,17 @@ function QaPanel({ onClose }) {
|
|
|
2214
2253
|
"aria-label": "Ask the host a question"
|
|
2215
2254
|
}
|
|
2216
2255
|
),
|
|
2217
|
-
/* @__PURE__ */ (0,
|
|
2256
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: draft.trim().length === 0, children: "Ask" })
|
|
2218
2257
|
] }),
|
|
2219
|
-
allowAnonymous ? /* @__PURE__ */ (0,
|
|
2220
|
-
/* @__PURE__ */ (0,
|
|
2258
|
+
allowAnonymous ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__toggle", children: [
|
|
2259
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("input", { type: "checkbox", checked: anonymous, onChange: (event) => setAnonymous(event.target.checked) }),
|
|
2221
2260
|
"Ask anonymously"
|
|
2222
2261
|
] }) : null
|
|
2223
2262
|
]
|
|
2224
2263
|
}
|
|
2225
2264
|
),
|
|
2226
|
-
/* @__PURE__ */ (0,
|
|
2227
|
-
questions.length > 1 ? /* @__PURE__ */ (0,
|
|
2265
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
|
|
2266
|
+
questions.length > 1 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__pills", role: "group", "aria-label": "Order questions", children: ["popular", "recent"].map((value) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2228
2267
|
"button",
|
|
2229
2268
|
{
|
|
2230
2269
|
type: "button",
|
|
@@ -2235,7 +2274,7 @@ function QaPanel({ onClose }) {
|
|
|
2235
2274
|
},
|
|
2236
2275
|
value
|
|
2237
2276
|
)) }) : null,
|
|
2238
|
-
questions.length === 0 ? /* @__PURE__ */ (0,
|
|
2277
|
+
questions.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", children: "No questions yet. Questions are kept with the meeting." }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__chat", children: questions.map((question) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(QuestionCard, { question }, question.id)) })
|
|
2239
2278
|
] });
|
|
2240
2279
|
}
|
|
2241
2280
|
var BOARD_W = 1600;
|
|
@@ -2249,7 +2288,7 @@ function strokePath(points) {
|
|
|
2249
2288
|
return `${move} ${rest.map(([x, y]) => `L${(x * BOARD_W).toFixed(1)} ${(y * BOARD_H).toFixed(1)}`).join(" ")}`;
|
|
2250
2289
|
}
|
|
2251
2290
|
function StrokeView({ stroke, onPick }) {
|
|
2252
|
-
return /* @__PURE__ */ (0,
|
|
2291
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2253
2292
|
"path",
|
|
2254
2293
|
{
|
|
2255
2294
|
d: strokePath(stroke.points),
|
|
@@ -2261,18 +2300,18 @@ function StrokeView({ stroke, onPick }) {
|
|
|
2261
2300
|
strokeLinejoin: "round",
|
|
2262
2301
|
onPointerDown: onPick,
|
|
2263
2302
|
style: onPick !== void 0 ? { cursor: "pointer" } : void 0,
|
|
2264
|
-
children: /* @__PURE__ */ (0,
|
|
2303
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("title", { children: stroke.byName })
|
|
2265
2304
|
}
|
|
2266
2305
|
);
|
|
2267
2306
|
}
|
|
2268
2307
|
function WhiteboardPanel({ onClose }) {
|
|
2269
2308
|
const { collab, act, isHost, localIdentity } = useCollab();
|
|
2270
|
-
const [tool, setTool] = (0,
|
|
2271
|
-
const [color, setColor] = (0,
|
|
2272
|
-
const [drawing, setDrawing] = (0,
|
|
2273
|
-
const [pending, setPending] = (0,
|
|
2309
|
+
const [tool, setTool] = (0, import_react9.useState)("pen");
|
|
2310
|
+
const [color, setColor] = (0, import_react9.useState)(INK[0]);
|
|
2311
|
+
const [drawing, setDrawing] = (0, import_react9.useState)(null);
|
|
2312
|
+
const [pending, setPending] = (0, import_react9.useState)([]);
|
|
2274
2313
|
const [notice, show] = useNotice();
|
|
2275
|
-
const svgRef = (0,
|
|
2314
|
+
const svgRef = (0, import_react9.useRef)(null);
|
|
2276
2315
|
const strokes = collab?.strokes ?? [];
|
|
2277
2316
|
const mine = strokes.filter((s) => s.by === localIdentity);
|
|
2278
2317
|
const point = (event) => {
|
|
@@ -2304,14 +2343,14 @@ function WhiteboardPanel({ onClose }) {
|
|
|
2304
2343
|
if (!result.ok) show(result);
|
|
2305
2344
|
});
|
|
2306
2345
|
};
|
|
2307
|
-
return /* @__PURE__ */ (0,
|
|
2308
|
-
/* @__PURE__ */ (0,
|
|
2309
|
-
/* @__PURE__ */ (0,
|
|
2310
|
-
/* @__PURE__ */ (0,
|
|
2311
|
-
["pen", "Pen", /* @__PURE__ */ (0,
|
|
2312
|
-
["highlighter", "Highlighter", /* @__PURE__ */ (0,
|
|
2313
|
-
["eraser", "Eraser \u2014 click a stroke", /* @__PURE__ */ (0,
|
|
2314
|
-
].map(([value, label, icon]) => /* @__PURE__ */ (0,
|
|
2346
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__whiteboard", "aria-label": "Whiteboard", children: [
|
|
2347
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("header", { className: "mx-meet__whiteboard-bar", children: [
|
|
2348
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { className: "mx-meet__panel-title", children: "Whiteboard" }),
|
|
2349
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__pills", role: "group", "aria-label": "Tool", children: [
|
|
2350
|
+
["pen", "Pen", /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PencilIcon, { width: 16, height: 16 }, "p")],
|
|
2351
|
+
["highlighter", "Highlighter", /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(HighlighterIcon, { width: 16, height: 16 }, "h")],
|
|
2352
|
+
["eraser", "Eraser \u2014 click a stroke", /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EraserIcon, { width: 16, height: 16 }, "e")]
|
|
2353
|
+
].map(([value, label, icon]) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2315
2354
|
"button",
|
|
2316
2355
|
{
|
|
2317
2356
|
type: "button",
|
|
@@ -2324,7 +2363,7 @@ function WhiteboardPanel({ onClose }) {
|
|
|
2324
2363
|
},
|
|
2325
2364
|
value
|
|
2326
2365
|
)) }),
|
|
2327
|
-
/* @__PURE__ */ (0,
|
|
2366
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__swatches", role: "group", "aria-label": "Color", children: INK.map((ink) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2328
2367
|
"button",
|
|
2329
2368
|
{
|
|
2330
2369
|
type: "button",
|
|
@@ -2339,7 +2378,7 @@ function WhiteboardPanel({ onClose }) {
|
|
|
2339
2378
|
},
|
|
2340
2379
|
ink
|
|
2341
2380
|
)) }),
|
|
2342
|
-
/* @__PURE__ */ (0,
|
|
2381
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2343
2382
|
ControlButton,
|
|
2344
2383
|
{
|
|
2345
2384
|
label: "Undo my last stroke",
|
|
@@ -2347,15 +2386,15 @@ function WhiteboardPanel({ onClose }) {
|
|
|
2347
2386
|
const last = mine[mine.length - 1];
|
|
2348
2387
|
if (last !== void 0) void act({ action: "stroke_erase", itemId: last.id }).then((r) => r.ok ? void 0 : show(r));
|
|
2349
2388
|
},
|
|
2350
|
-
children: /* @__PURE__ */ (0,
|
|
2389
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(UndoIcon, { width: 16, height: 16 })
|
|
2351
2390
|
}
|
|
2352
2391
|
),
|
|
2353
|
-
isHost && strokes.length > 0 ? /* @__PURE__ */ (0,
|
|
2354
|
-
/* @__PURE__ */ (0,
|
|
2355
|
-
/* @__PURE__ */ (0,
|
|
2392
|
+
isHost && strokes.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void act({ action: "whiteboard_clear" }).then(show), children: "Clear board" }) : null,
|
|
2393
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__whiteboard-note", children: "Saved with the meeting" }),
|
|
2394
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ControlButton, { label: "Close whiteboard", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CloseIcon, { width: 16, height: 16 }) })
|
|
2356
2395
|
] }),
|
|
2357
|
-
/* @__PURE__ */ (0,
|
|
2358
|
-
/* @__PURE__ */ (0,
|
|
2396
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
|
|
2397
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2359
2398
|
"svg",
|
|
2360
2399
|
{
|
|
2361
2400
|
ref: svgRef,
|
|
@@ -2379,8 +2418,8 @@ function WhiteboardPanel({ onClose }) {
|
|
|
2379
2418
|
onPointerUp: finish,
|
|
2380
2419
|
onPointerCancel: finish,
|
|
2381
2420
|
children: [
|
|
2382
|
-
/* @__PURE__ */ (0,
|
|
2383
|
-
strokes.map((stroke) => /* @__PURE__ */ (0,
|
|
2421
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("rect", { x: 0, y: 0, width: BOARD_W, height: BOARD_H, className: "mx-meet__board-paper" }),
|
|
2422
|
+
strokes.map((stroke) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2384
2423
|
StrokeView,
|
|
2385
2424
|
{
|
|
2386
2425
|
stroke,
|
|
@@ -2388,8 +2427,8 @@ function WhiteboardPanel({ onClose }) {
|
|
|
2388
2427
|
},
|
|
2389
2428
|
stroke.id
|
|
2390
2429
|
)),
|
|
2391
|
-
pending.map((stroke) => /* @__PURE__ */ (0,
|
|
2392
|
-
drawing !== null ? /* @__PURE__ */ (0,
|
|
2430
|
+
pending.map((stroke) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StrokeView, { stroke }, stroke.id)),
|
|
2431
|
+
drawing !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2393
2432
|
StrokeView,
|
|
2394
2433
|
{
|
|
2395
2434
|
stroke: {
|
|
@@ -2413,8 +2452,8 @@ function clock(ms) {
|
|
|
2413
2452
|
}
|
|
2414
2453
|
var BREAKOUT_EXPIRE_RETRY_MS = 5e3;
|
|
2415
2454
|
function useNow(active) {
|
|
2416
|
-
const [now, setNow] = (0,
|
|
2417
|
-
(0,
|
|
2455
|
+
const [now, setNow] = (0, import_react9.useState)(() => Date.now());
|
|
2456
|
+
(0, import_react9.useEffect)(() => {
|
|
2418
2457
|
if (!active) return void 0;
|
|
2419
2458
|
const timer = setInterval(() => setNow(Date.now()), 1e3);
|
|
2420
2459
|
return () => clearInterval(timer);
|
|
@@ -2428,11 +2467,11 @@ function BreakoutSetup() {
|
|
|
2428
2467
|
const people = (snapshot?.participants ?? []).filter(
|
|
2429
2468
|
(p) => !p.isAgent && p.role !== "host" && p.role !== "cohost"
|
|
2430
2469
|
);
|
|
2431
|
-
const [count, setCount] = (0,
|
|
2432
|
-
const [mode, setMode] = (0,
|
|
2433
|
-
const [minutes, setMinutes] = (0,
|
|
2434
|
-
const [manual, setManual] = (0,
|
|
2435
|
-
const [busy, setBusy] = (0,
|
|
2470
|
+
const [count, setCount] = (0, import_react9.useState)(Math.min(Math.max(2, Math.ceil(people.length / 4)), settings?.breakoutMaxRooms ?? 20));
|
|
2471
|
+
const [mode, setMode] = (0, import_react9.useState)("auto");
|
|
2472
|
+
const [minutes, setMinutes] = (0, import_react9.useState)(settings?.breakoutDefaultMinutes ?? 15);
|
|
2473
|
+
const [manual, setManual] = (0, import_react9.useState)({});
|
|
2474
|
+
const [busy, setBusy] = (0, import_react9.useState)(false);
|
|
2436
2475
|
const [notice, show] = useNotice();
|
|
2437
2476
|
const max = settings?.breakoutMaxRooms ?? 20;
|
|
2438
2477
|
const rooms = Math.min(Math.max(1, count), max);
|
|
@@ -2444,10 +2483,10 @@ function BreakoutSetup() {
|
|
|
2444
2483
|
(_, index) => people.filter((p) => (manual[p.identity] ?? -1) === index).map((p) => p.identity)
|
|
2445
2484
|
) : Array.from({ length: rooms }, () => []);
|
|
2446
2485
|
const nameOf = (identity) => people.find((p) => p.identity === identity)?.displayName ?? identity;
|
|
2447
|
-
return /* @__PURE__ */ (0,
|
|
2448
|
-
/* @__PURE__ */ (0,
|
|
2449
|
-
/* @__PURE__ */ (0,
|
|
2450
|
-
/* @__PURE__ */ (0,
|
|
2486
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__collab-card", children: [
|
|
2487
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__field", children: [
|
|
2488
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__field-label", children: "Rooms" }),
|
|
2489
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2451
2490
|
"input",
|
|
2452
2491
|
{
|
|
2453
2492
|
className: "mx-meet__input",
|
|
@@ -2459,11 +2498,11 @@ function BreakoutSetup() {
|
|
|
2459
2498
|
}
|
|
2460
2499
|
)
|
|
2461
2500
|
] }),
|
|
2462
|
-
/* @__PURE__ */ (0,
|
|
2501
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "mx-meet__pills", role: "group", "aria-label": "How people are placed", children: [
|
|
2463
2502
|
["auto", "Automatically"],
|
|
2464
2503
|
["manual", "Manually"],
|
|
2465
2504
|
["choose", "Let people choose"]
|
|
2466
|
-
].map(([value, label]) => /* @__PURE__ */ (0,
|
|
2505
|
+
].map(([value, label]) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2467
2506
|
"button",
|
|
2468
2507
|
{
|
|
2469
2508
|
type: "button",
|
|
@@ -2474,9 +2513,9 @@ function BreakoutSetup() {
|
|
|
2474
2513
|
},
|
|
2475
2514
|
value
|
|
2476
2515
|
)) }),
|
|
2477
|
-
/* @__PURE__ */ (0,
|
|
2478
|
-
/* @__PURE__ */ (0,
|
|
2479
|
-
/* @__PURE__ */ (0,
|
|
2516
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__field", children: [
|
|
2517
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__field-label", children: "Timer (minutes, 0 for none)" }),
|
|
2518
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2480
2519
|
"input",
|
|
2481
2520
|
{
|
|
2482
2521
|
className: "mx-meet__input",
|
|
@@ -2488,9 +2527,9 @@ function BreakoutSetup() {
|
|
|
2488
2527
|
}
|
|
2489
2528
|
)
|
|
2490
2529
|
] }),
|
|
2491
|
-
mode === "manual" ? people.length === 0 ? /* @__PURE__ */ (0,
|
|
2492
|
-
/* @__PURE__ */ (0,
|
|
2493
|
-
/* @__PURE__ */ (0,
|
|
2530
|
+
mode === "manual" ? people.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", children: "Nobody else is in the meeting yet." }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__people", children: people.map((person) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { className: "mx-meet__person", children: [
|
|
2531
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__person-name", children: person.displayName }),
|
|
2532
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2494
2533
|
"select",
|
|
2495
2534
|
{
|
|
2496
2535
|
className: "mx-meet__select mx-meet__select--compact",
|
|
@@ -2498,24 +2537,24 @@ function BreakoutSetup() {
|
|
|
2498
2537
|
value: manual[person.identity] ?? -1,
|
|
2499
2538
|
onChange: (event) => setManual({ ...manual, [person.identity]: Number(event.target.value) }),
|
|
2500
2539
|
children: [
|
|
2501
|
-
/* @__PURE__ */ (0,
|
|
2502
|
-
Array.from({ length: rooms }, (_, index) => /* @__PURE__ */ (0,
|
|
2540
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("option", { value: -1, children: "Main room" }),
|
|
2541
|
+
Array.from({ length: rooms }, (_, index) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("option", { value: index, children: [
|
|
2503
2542
|
"Room ",
|
|
2504
2543
|
index + 1
|
|
2505
2544
|
] }, index))
|
|
2506
2545
|
]
|
|
2507
2546
|
}
|
|
2508
2547
|
)
|
|
2509
|
-
] }, person.identity)) }) : mode === "auto" ? /* @__PURE__ */ (0,
|
|
2510
|
-
/* @__PURE__ */ (0,
|
|
2548
|
+
] }, person.identity)) }) : mode === "auto" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__breakout-rooms", children: assignment.map((members, index) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { children: [
|
|
2549
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("strong", { children: [
|
|
2511
2550
|
"Room ",
|
|
2512
2551
|
index + 1
|
|
2513
2552
|
] }),
|
|
2514
2553
|
" ",
|
|
2515
|
-
/* @__PURE__ */ (0,
|
|
2516
|
-
] }, index)) }) : /* @__PURE__ */ (0,
|
|
2517
|
-
/* @__PURE__ */ (0,
|
|
2518
|
-
/* @__PURE__ */ (0,
|
|
2554
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__panel-note", children: members.length === 0 ? "empty" : members.map(nameOf).join(", ") })
|
|
2555
|
+
] }, index)) }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", children: "Everyone picks a room from their own screen." }),
|
|
2556
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
|
|
2557
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2519
2558
|
"button",
|
|
2520
2559
|
{
|
|
2521
2560
|
type: "button",
|
|
@@ -2548,7 +2587,7 @@ function BreakoutRun({ plan }) {
|
|
|
2548
2587
|
const snapshot = useMeetSnapshot();
|
|
2549
2588
|
const now = useNow(plan.endsAt !== null);
|
|
2550
2589
|
const remaining = breakoutRemainingMs(plan, now);
|
|
2551
|
-
const [broadcast, setBroadcast] = (0,
|
|
2590
|
+
const [broadcast, setBroadcast] = (0, import_react9.useState)("");
|
|
2552
2591
|
const [notice, show] = useNotice();
|
|
2553
2592
|
const nameOf = (identity) => displayNameFor(snapshot?.names ?? {}, identity, snapshot?.participants.find((p) => p.identity === identity)?.displayName);
|
|
2554
2593
|
const mine = assignedRoom(plan, localIdentity);
|
|
@@ -2560,8 +2599,8 @@ function BreakoutRun({ plan }) {
|
|
|
2560
2599
|
}
|
|
2561
2600
|
show(await moveTo(roomId));
|
|
2562
2601
|
};
|
|
2563
|
-
return /* @__PURE__ */ (0,
|
|
2564
|
-
/* @__PURE__ */ (0,
|
|
2602
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__collab-card", children: [
|
|
2603
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("p", { className: "mx-meet__panel-note", children: [
|
|
2565
2604
|
plan.rooms.length,
|
|
2566
2605
|
" room",
|
|
2567
2606
|
plan.rooms.length === 1 ? "" : "s",
|
|
@@ -2569,18 +2608,18 @@ function BreakoutRun({ plan }) {
|
|
|
2569
2608
|
remaining !== null ? ` \xB7 ${clock(remaining)} left` : "",
|
|
2570
2609
|
plan.allowChoose ? " \xB7 people choose their room" : ""
|
|
2571
2610
|
] }),
|
|
2572
|
-
/* @__PURE__ */ (0,
|
|
2611
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__breakout-rooms", children: plan.rooms.map((room) => {
|
|
2573
2612
|
const here = breakoutRoomId === room.id;
|
|
2574
2613
|
const mayJoin = isHost || plan.allowChoose || mine?.id === room.id;
|
|
2575
|
-
return /* @__PURE__ */ (0,
|
|
2576
|
-
/* @__PURE__ */ (0,
|
|
2577
|
-
/* @__PURE__ */ (0,
|
|
2578
|
-
here ? /* @__PURE__ */ (0,
|
|
2614
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { className: here ? "mx-meet__breakout-room mx-meet__breakout-room--here" : "mx-meet__breakout-room", children: [
|
|
2615
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__collab-head", children: [
|
|
2616
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: room.name }),
|
|
2617
|
+
here ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__collab-state", children: "You are here" }) : mayJoin ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void join(room.id), children: "Join" }) : null
|
|
2579
2618
|
] }),
|
|
2580
|
-
/* @__PURE__ */ (0,
|
|
2581
|
-
isHost && room.identities.length > 0 ? /* @__PURE__ */ (0,
|
|
2582
|
-
/* @__PURE__ */ (0,
|
|
2583
|
-
/* @__PURE__ */ (0,
|
|
2619
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__panel-note", children: room.identities.length === 0 ? "Nobody assigned" : room.identities.map(nameOf).join(", ") }),
|
|
2620
|
+
isHost && room.identities.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "mx-meet__people", children: room.identities.map((identity) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("li", { className: "mx-meet__person", children: [
|
|
2621
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__person-name", children: nameOf(identity) }),
|
|
2622
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2584
2623
|
"select",
|
|
2585
2624
|
{
|
|
2586
2625
|
className: "mx-meet__select mx-meet__select--compact",
|
|
@@ -2592,16 +2631,16 @@ function BreakoutRun({ plan }) {
|
|
|
2592
2631
|
roomId: event.target.value === "" ? null : event.target.value
|
|
2593
2632
|
}).then(show),
|
|
2594
2633
|
children: [
|
|
2595
|
-
/* @__PURE__ */ (0,
|
|
2596
|
-
plan.rooms.map((option) => /* @__PURE__ */ (0,
|
|
2634
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("option", { value: "", children: "Main room" }),
|
|
2635
|
+
plan.rooms.map((option) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("option", { value: option.id, children: option.name }, option.id))
|
|
2597
2636
|
]
|
|
2598
2637
|
}
|
|
2599
2638
|
)
|
|
2600
2639
|
] }, identity)) }) : null
|
|
2601
2640
|
] }, room.id);
|
|
2602
2641
|
}) }),
|
|
2603
|
-
breakoutRoomId !== null ? /* @__PURE__ */ (0,
|
|
2604
|
-
isHost ? /* @__PURE__ */ (0,
|
|
2642
|
+
breakoutRoomId !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void join(null), children: "Return to the main room" }) : null,
|
|
2643
|
+
isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2605
2644
|
"form",
|
|
2606
2645
|
{
|
|
2607
2646
|
className: "mx-meet__composer-row",
|
|
@@ -2615,7 +2654,7 @@ function BreakoutRun({ plan }) {
|
|
|
2615
2654
|
});
|
|
2616
2655
|
},
|
|
2617
2656
|
children: [
|
|
2618
|
-
/* @__PURE__ */ (0,
|
|
2657
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2619
2658
|
"input",
|
|
2620
2659
|
{
|
|
2621
2660
|
className: "mx-meet__input",
|
|
@@ -2626,12 +2665,12 @@ function BreakoutRun({ plan }) {
|
|
|
2626
2665
|
"aria-label": "Message every room"
|
|
2627
2666
|
}
|
|
2628
2667
|
),
|
|
2629
|
-
/* @__PURE__ */ (0,
|
|
2668
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: broadcast.trim().length === 0, children: "Send" })
|
|
2630
2669
|
]
|
|
2631
2670
|
}
|
|
2632
2671
|
) : null,
|
|
2633
|
-
/* @__PURE__ */ (0,
|
|
2634
|
-
isHost ? /* @__PURE__ */ (0,
|
|
2672
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Notice, { notice }),
|
|
2673
|
+
isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2635
2674
|
"button",
|
|
2636
2675
|
{
|
|
2637
2676
|
type: "button",
|
|
@@ -2645,9 +2684,9 @@ function BreakoutRun({ plan }) {
|
|
|
2645
2684
|
function BreakoutsPanel({ onClose }) {
|
|
2646
2685
|
const { collab, isHost } = useCollab();
|
|
2647
2686
|
const plan = collab?.breakout?.state === "open" ? collab.breakout : null;
|
|
2648
|
-
return /* @__PURE__ */ (0,
|
|
2649
|
-
collab?.error != null ? /* @__PURE__ */ (0,
|
|
2650
|
-
plan !== null ? /* @__PURE__ */ (0,
|
|
2687
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(PanelShell, { title: "Breakout rooms", onClose, children: [
|
|
2688
|
+
collab?.error != null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.error }) : null,
|
|
2689
|
+
plan !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(BreakoutRun, { plan }) : isHost ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(BreakoutSetup, {}) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note", children: "Breakout rooms are closed." })
|
|
2651
2690
|
] });
|
|
2652
2691
|
}
|
|
2653
2692
|
function BreakoutBanner() {
|
|
@@ -2658,11 +2697,11 @@ function BreakoutBanner() {
|
|
|
2658
2697
|
const now = useNow(open?.endsAt != null);
|
|
2659
2698
|
const remaining = breakoutRemainingMs(open, now);
|
|
2660
2699
|
const assigned = assignedRoom(open, localIdentity);
|
|
2661
|
-
const [dismissedBroadcast, setDismissedBroadcast] = (0,
|
|
2662
|
-
const [failure, setFailure] = (0,
|
|
2663
|
-
const expireAsked = (0,
|
|
2700
|
+
const [dismissedBroadcast, setDismissedBroadcast] = (0, import_react9.useState)(null);
|
|
2701
|
+
const [failure, setFailure] = (0, import_react9.useState)(null);
|
|
2702
|
+
const expireAsked = (0, import_react9.useRef)(null);
|
|
2664
2703
|
const moveAt = collab?.moveRequest?.at ?? null;
|
|
2665
|
-
(0,
|
|
2704
|
+
(0, import_react9.useEffect)(() => {
|
|
2666
2705
|
if (host === null) return;
|
|
2667
2706
|
const request = takeMoveRequest(host.store);
|
|
2668
2707
|
if (request === null) return;
|
|
@@ -2670,7 +2709,7 @@ function BreakoutBanner() {
|
|
|
2670
2709
|
if ((here ?? null) === request.roomId) return;
|
|
2671
2710
|
void moveTo(request.roomId).then((result) => setFailure(result.ok ? null : result.message));
|
|
2672
2711
|
}, [moveAt, host, moveTo]);
|
|
2673
|
-
(0,
|
|
2712
|
+
(0, import_react9.useEffect)(() => {
|
|
2674
2713
|
if (open === null || remaining === null || remaining > 0) return;
|
|
2675
2714
|
const asked = expireAsked.current;
|
|
2676
2715
|
if (asked !== null && asked.id === open.id && now - asked.at < BREAKOUT_EXPIRE_RETRY_MS) return;
|
|
@@ -2681,17 +2720,17 @@ function BreakoutBanner() {
|
|
|
2681
2720
|
const showBroadcast = broadcast !== null && broadcast.at !== dismissedBroadcast && open !== null;
|
|
2682
2721
|
const room = open?.rooms.find((r) => r.id === breakoutRoomId) ?? null;
|
|
2683
2722
|
if (open === null && failure === null) return null;
|
|
2684
|
-
return /* @__PURE__ */ (0,
|
|
2685
|
-
failure !== null ? /* @__PURE__ */ (0,
|
|
2686
|
-
room !== null ? /* @__PURE__ */ (0,
|
|
2687
|
-
/* @__PURE__ */ (0,
|
|
2723
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-meet__breakout-banner", role: "status", children: [
|
|
2724
|
+
failure !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__collab-error", children: failure }) : null,
|
|
2725
|
+
room !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { children: [
|
|
2726
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: room.name }),
|
|
2688
2727
|
remaining !== null ? ` \xB7 ${clock(remaining)} left` : "",
|
|
2689
|
-
/* @__PURE__ */ (0,
|
|
2690
|
-
] }) : assigned !== null ? /* @__PURE__ */ (0,
|
|
2728
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__chip", onClick: () => void moveTo(null), children: "Return to main room" })
|
|
2729
|
+
] }) : assigned !== null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { children: [
|
|
2691
2730
|
"You are assigned to ",
|
|
2692
|
-
/* @__PURE__ */ (0,
|
|
2731
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("strong", { children: assigned.name }),
|
|
2693
2732
|
remaining !== null ? ` \xB7 ${clock(remaining)} left` : "",
|
|
2694
|
-
/* @__PURE__ */ (0,
|
|
2733
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
2695
2734
|
"button",
|
|
2696
2735
|
{
|
|
2697
2736
|
type: "button",
|
|
@@ -2703,15 +2742,15 @@ function BreakoutBanner() {
|
|
|
2703
2742
|
children: "Join"
|
|
2704
2743
|
}
|
|
2705
2744
|
)
|
|
2706
|
-
] }) : open?.allowChoose ? /* @__PURE__ */ (0,
|
|
2707
|
-
showBroadcast ? /* @__PURE__ */ (0,
|
|
2708
|
-
/* @__PURE__ */ (0,
|
|
2745
|
+
] }) : open?.allowChoose ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { children: "Breakout rooms are open \u2014 pick one under Activities." }) : null,
|
|
2746
|
+
showBroadcast ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "mx-meet__breakout-broadcast", children: [
|
|
2747
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("strong", { children: [
|
|
2709
2748
|
broadcast.by,
|
|
2710
2749
|
":"
|
|
2711
2750
|
] }),
|
|
2712
2751
|
" ",
|
|
2713
2752
|
broadcast.text,
|
|
2714
|
-
/* @__PURE__ */ (0,
|
|
2753
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => setDismissedBroadcast(broadcast.at), children: "Dismiss" })
|
|
2715
2754
|
] }) : null
|
|
2716
2755
|
] });
|
|
2717
2756
|
}
|
|
@@ -2725,10 +2764,10 @@ function CaptionLanguageSettings() {
|
|
|
2725
2764
|
const preferred = defaultCaptionLanguage(settings, viewer);
|
|
2726
2765
|
const current = collab?.captionLanguage ?? "";
|
|
2727
2766
|
const choices = CAPTION_LANGUAGES.some((l) => l.tag === preferred) ? CAPTION_LANGUAGES : [{ tag: preferred, name: preferred }, ...CAPTION_LANGUAGES];
|
|
2728
|
-
return /* @__PURE__ */ (0,
|
|
2729
|
-
/* @__PURE__ */ (0,
|
|
2730
|
-
/* @__PURE__ */ (0,
|
|
2731
|
-
/* @__PURE__ */ (0,
|
|
2767
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: "mx-meet__section", "aria-label": "Captions", children: [
|
|
2768
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("label", { className: "mx-meet__field", children: [
|
|
2769
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "mx-meet__field-label", children: "Translate captions to" }),
|
|
2770
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
2732
2771
|
"select",
|
|
2733
2772
|
{
|
|
2734
2773
|
className: "mx-meet__select",
|
|
@@ -2738,29 +2777,29 @@ function CaptionLanguageSettings() {
|
|
|
2738
2777
|
setCaptionLanguage(host.store, next);
|
|
2739
2778
|
},
|
|
2740
2779
|
children: [
|
|
2741
|
-
/* @__PURE__ */ (0,
|
|
2742
|
-
current === "" ? /* @__PURE__ */ (0,
|
|
2780
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("option", { value: "", children: "Off \u2014 as spoken" }),
|
|
2781
|
+
current === "" ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("option", { value: preferred, children: [
|
|
2743
2782
|
choices.find((c) => c.tag === preferred)?.name ?? preferred,
|
|
2744
2783
|
" (yours)"
|
|
2745
2784
|
] }) : null,
|
|
2746
|
-
choices.filter((choice) => current !== "" || choice.tag !== preferred).map((choice) => /* @__PURE__ */ (0,
|
|
2785
|
+
choices.filter((choice) => current !== "" || choice.tag !== preferred).map((choice) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("option", { value: choice.tag, children: choice.name }, choice.tag))
|
|
2747
2786
|
]
|
|
2748
2787
|
}
|
|
2749
2788
|
)
|
|
2750
2789
|
] }),
|
|
2751
|
-
collab?.captionTranslationError != null ? /* @__PURE__ */ (0,
|
|
2790
|
+
collab?.captionTranslationError != null ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mx-meet__panel-note mx-meet__collab-error", children: collab.captionTranslationError }) : null
|
|
2752
2791
|
] });
|
|
2753
2792
|
}
|
|
2754
2793
|
|
|
2755
2794
|
// src/skins/meet/components.tsx
|
|
2756
|
-
var
|
|
2795
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
2757
2796
|
function InertNotice({ what }) {
|
|
2758
|
-
return /* @__PURE__ */ (0,
|
|
2759
|
-
/* @__PURE__ */ (0,
|
|
2797
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__empty", role: "status", children: [
|
|
2798
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__empty-title", children: [
|
|
2760
2799
|
what,
|
|
2761
2800
|
" is not ready yet"
|
|
2762
2801
|
] }),
|
|
2763
|
-
/* @__PURE__ */ (0,
|
|
2802
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__empty-body", children: "Calls and meetings need a signed-in identity and an active organization. This will appear as soon as they resolve." })
|
|
2764
2803
|
] });
|
|
2765
2804
|
}
|
|
2766
2805
|
function Avatar({
|
|
@@ -2770,7 +2809,7 @@ function Avatar({
|
|
|
2770
2809
|
}) {
|
|
2771
2810
|
const tint = (0, import_format2.avatarPaletteIndex)(name);
|
|
2772
2811
|
if (url != null && url.length > 0) {
|
|
2773
|
-
return /* @__PURE__ */ (0,
|
|
2812
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
2774
2813
|
"img",
|
|
2775
2814
|
{
|
|
2776
2815
|
className: "mx-meet__avatar",
|
|
@@ -2782,7 +2821,7 @@ function Avatar({
|
|
|
2782
2821
|
}
|
|
2783
2822
|
);
|
|
2784
2823
|
}
|
|
2785
|
-
return /* @__PURE__ */ (0,
|
|
2824
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
2786
2825
|
"span",
|
|
2787
2826
|
{
|
|
2788
2827
|
className: "mx-meet__avatar mx-meet__avatar--initials",
|
|
@@ -2804,7 +2843,7 @@ function ControlButton({
|
|
|
2804
2843
|
onClick,
|
|
2805
2844
|
children
|
|
2806
2845
|
}) {
|
|
2807
|
-
return /* @__PURE__ */ (0,
|
|
2846
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
2808
2847
|
"button",
|
|
2809
2848
|
{
|
|
2810
2849
|
type: "button",
|
|
@@ -2823,14 +2862,14 @@ function ControlButton({
|
|
|
2823
2862
|
function RecordingIndicator() {
|
|
2824
2863
|
const { state, label } = useRecording();
|
|
2825
2864
|
if (label === null) return null;
|
|
2826
|
-
return /* @__PURE__ */ (0,
|
|
2865
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
2827
2866
|
"span",
|
|
2828
2867
|
{
|
|
2829
2868
|
className: `mx-meet__recording mx-meet__recording--${state}`,
|
|
2830
2869
|
role: "status",
|
|
2831
2870
|
"aria-live": "polite",
|
|
2832
2871
|
children: [
|
|
2833
|
-
/* @__PURE__ */ (0,
|
|
2872
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(RecordIcon, { width: 10, height: 10 }),
|
|
2834
2873
|
label
|
|
2835
2874
|
]
|
|
2836
2875
|
}
|
|
@@ -2838,15 +2877,16 @@ function RecordingIndicator() {
|
|
|
2838
2877
|
}
|
|
2839
2878
|
function ConnectionDot({ quality }) {
|
|
2840
2879
|
if (quality === "excellent" || quality === "good" || quality === "unknown") return null;
|
|
2841
|
-
return /* @__PURE__ */ (0,
|
|
2880
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: `mx-meet__quality mx-meet__quality--${quality}`, title: `Connection ${quality}`, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(WifiLowIcon, { width: 14, height: 14 }) });
|
|
2842
2881
|
}
|
|
2843
2882
|
function RoleBadge({
|
|
2844
2883
|
role,
|
|
2845
2884
|
standing
|
|
2846
2885
|
}) {
|
|
2847
|
-
if (role === "host") return /* @__PURE__ */ (0,
|
|
2848
|
-
if (role === "cohost") return /* @__PURE__ */ (0,
|
|
2849
|
-
if (
|
|
2886
|
+
if (role === "host") return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "Host" });
|
|
2887
|
+
if (role === "cohost") return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "Co-host" });
|
|
2888
|
+
if (isObserverRole(role)) return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", "data-meet-observing": "", children: "Observing" });
|
|
2889
|
+
if (isLinkFollower(standing)) return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "Guest" });
|
|
2850
2890
|
return null;
|
|
2851
2891
|
}
|
|
2852
2892
|
function ParticipantTile({
|
|
@@ -2856,7 +2896,7 @@ function ParticipantTile({
|
|
|
2856
2896
|
const host = useMeetHost();
|
|
2857
2897
|
const snapshot = useMeetSnapshot();
|
|
2858
2898
|
const queue = useHandQueue();
|
|
2859
|
-
const [menu, setMenu] = (0,
|
|
2899
|
+
const [menu, setMenu] = (0, import_react10.useState)(false);
|
|
2860
2900
|
const videoRef = useTrack(
|
|
2861
2901
|
participant.identity,
|
|
2862
2902
|
participant.screenSharing ? "screen" : "camera"
|
|
@@ -2865,7 +2905,7 @@ function ParticipantTile({
|
|
|
2865
2905
|
const pinnedHere = snapshot?.pinned === participant.identity;
|
|
2866
2906
|
const spotlit = snapshot?.spotlight === participant.identity;
|
|
2867
2907
|
const handPosition = participant.handRaised ? queue.findIndex((entry) => entry.identity === participant.identity) + 1 : 0;
|
|
2868
|
-
return /* @__PURE__ */ (0,
|
|
2908
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
2869
2909
|
"div",
|
|
2870
2910
|
{
|
|
2871
2911
|
className: [
|
|
@@ -2876,7 +2916,7 @@ function ParticipantTile({
|
|
|
2876
2916
|
"data-identity": participant.identity,
|
|
2877
2917
|
...participantAttributes(participant),
|
|
2878
2918
|
children: [
|
|
2879
|
-
showVideo ? /* @__PURE__ */ (0,
|
|
2919
|
+
showVideo ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
2880
2920
|
"video",
|
|
2881
2921
|
{
|
|
2882
2922
|
ref: videoRef,
|
|
@@ -2885,43 +2925,43 @@ function ParticipantTile({
|
|
|
2885
2925
|
playsInline: true,
|
|
2886
2926
|
muted: participant.isLocal
|
|
2887
2927
|
}
|
|
2888
|
-
) : /* @__PURE__ */ (0,
|
|
2889
|
-
participant.handRaised ? /* @__PURE__ */ (0,
|
|
2890
|
-
/* @__PURE__ */ (0,
|
|
2928
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__tile-placeholder", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: featured ? 96 : 56 }) }),
|
|
2929
|
+
participant.handRaised ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__tile-hand", title: `Hand raised \xB7 ${ordinal(handPosition)} in line`, children: [
|
|
2930
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(HandIcon, { width: 14, height: 14 }),
|
|
2891
2931
|
handPosition > 0 ? handPosition : null
|
|
2892
2932
|
] }) : null,
|
|
2893
|
-
/* @__PURE__ */ (0,
|
|
2894
|
-
/* @__PURE__ */ (0,
|
|
2895
|
-
spotlit ? /* @__PURE__ */ (0,
|
|
2933
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__tile-bar", children: [
|
|
2934
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__tile-name", children: [
|
|
2935
|
+
spotlit ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { title: "Spotlighted for everyone", className: "mx-meet__tile-flag", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SpotlightIcon, { width: 12, height: 12 }) }) : null,
|
|
2896
2936
|
participant.displayName,
|
|
2897
2937
|
participant.isLocal ? " (you)" : "",
|
|
2898
|
-
participant.isAgent ? /* @__PURE__ */ (0,
|
|
2899
|
-
/* @__PURE__ */ (0,
|
|
2938
|
+
participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "AI" }) : null,
|
|
2939
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(RoleBadge, { role: participant.role, standing: participant.standing })
|
|
2900
2940
|
] }),
|
|
2901
|
-
!participant.micEnabled ? /* @__PURE__ */ (0,
|
|
2902
|
-
/* @__PURE__ */ (0,
|
|
2941
|
+
!participant.micEnabled ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicOffIcon, { width: 14, height: 14 }) : null,
|
|
2942
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(QualityBars, { quality: participant.quality })
|
|
2903
2943
|
] }),
|
|
2904
|
-
/* @__PURE__ */ (0,
|
|
2905
|
-
/* @__PURE__ */ (0,
|
|
2944
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: menu ? "mx-meet__tile-actions mx-meet__tile-actions--open" : "mx-meet__tile-actions", children: [
|
|
2945
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
2906
2946
|
ControlButton,
|
|
2907
2947
|
{
|
|
2908
2948
|
label: pinnedHere ? "Unpin" : `Pin ${participant.displayName} for me`,
|
|
2909
2949
|
active: pinnedHere,
|
|
2910
2950
|
onClick: () => host?.engine.pin(pinnedHere ? null : participant.identity),
|
|
2911
|
-
children: /* @__PURE__ */ (0,
|
|
2951
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PinIcon, { width: 16, height: 16 })
|
|
2912
2952
|
}
|
|
2913
2953
|
),
|
|
2914
|
-
/* @__PURE__ */ (0,
|
|
2915
|
-
/* @__PURE__ */ (0,
|
|
2954
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__anchor", children: [
|
|
2955
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
2916
2956
|
ControlButton,
|
|
2917
2957
|
{
|
|
2918
2958
|
label: `More for ${participant.displayName}`,
|
|
2919
2959
|
active: menu,
|
|
2920
2960
|
onClick: () => setMenu(!menu),
|
|
2921
|
-
children: /* @__PURE__ */ (0,
|
|
2961
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MoreIcon, { width: 16, height: 16 })
|
|
2922
2962
|
}
|
|
2923
2963
|
),
|
|
2924
|
-
menu ? /* @__PURE__ */ (0,
|
|
2964
|
+
menu ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PersonMenu, { participant, onClose: () => setMenu(false), placement: "down" }) : null
|
|
2925
2965
|
] })
|
|
2926
2966
|
] })
|
|
2927
2967
|
]
|
|
@@ -2937,28 +2977,28 @@ function QualityBars({ quality }) {
|
|
|
2937
2977
|
if (quality === "unknown") return null;
|
|
2938
2978
|
const bars = quality === "excellent" ? 3 : quality === "good" ? 2 : quality === "poor" ? 1 : 0;
|
|
2939
2979
|
const label = quality === "lost" ? "Connection lost" : quality === "poor" ? "Poor connection" : `Connection ${quality}`;
|
|
2940
|
-
return /* @__PURE__ */ (0,
|
|
2980
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: `mx-meet__signal mx-meet__signal--${quality}`, title: label, "aria-label": label, role: "img", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SignalIcon, { bars, width: 14, height: 14 }) });
|
|
2941
2981
|
}
|
|
2942
2982
|
function Stage({ pageSize }) {
|
|
2943
2983
|
const stage = useStage(pageSize);
|
|
2944
2984
|
const columns = gridColumns(stage.tiles.length);
|
|
2945
2985
|
if (stage.feature === null && stage.tiles.length === 0) {
|
|
2946
|
-
return /* @__PURE__ */ (0,
|
|
2947
|
-
/* @__PURE__ */ (0,
|
|
2948
|
-
/* @__PURE__ */ (0,
|
|
2986
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__stage mx-meet__stage--empty", children: [
|
|
2987
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__empty-title", children: "Waiting for others to join" }),
|
|
2988
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__empty-body", children: "Share the meeting link and people can join from anywhere \u2014 no account needed." })
|
|
2949
2989
|
] });
|
|
2950
2990
|
}
|
|
2951
|
-
return /* @__PURE__ */ (0,
|
|
2952
|
-
stage.feature !== null ? /* @__PURE__ */ (0,
|
|
2953
|
-
/* @__PURE__ */ (0,
|
|
2991
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: `mx-meet__stage${stage.feature !== null ? " mx-meet__stage--speaker" : ""}`, children: [
|
|
2992
|
+
stage.feature !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ParticipantTile, { participant: stage.feature, featured: true }) : null,
|
|
2993
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
2954
2994
|
"div",
|
|
2955
2995
|
{
|
|
2956
2996
|
className: "mx-meet__grid",
|
|
2957
2997
|
style: { "--mx-meet-columns": columns },
|
|
2958
|
-
children: stage.tiles.map((participant) => /* @__PURE__ */ (0,
|
|
2998
|
+
children: stage.tiles.map((participant) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ParticipantTile, { participant }, participant.identity))
|
|
2959
2999
|
}
|
|
2960
3000
|
),
|
|
2961
|
-
stage.overflow > 0 ? /* @__PURE__ */ (0,
|
|
3001
|
+
stage.overflow > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__overflow", children: [
|
|
2962
3002
|
"+",
|
|
2963
3003
|
stage.overflow,
|
|
2964
3004
|
" more ",
|
|
@@ -2970,17 +3010,24 @@ function Stage({ pageSize }) {
|
|
|
2970
3010
|
function ControlBar({ onLeave }) {
|
|
2971
3011
|
const room = useRoom();
|
|
2972
3012
|
const recording = useRecording();
|
|
2973
|
-
const [panel, setPanel] = (0,
|
|
2974
|
-
const [chatTo, setChatTo] = (0,
|
|
2975
|
-
const [popover, setPopover] = (0,
|
|
2976
|
-
const [shortcuts, setShortcuts] = (0,
|
|
3013
|
+
const [panel, setPanel] = (0, import_react10.useState)("none");
|
|
3014
|
+
const [chatTo, setChatTo] = (0, import_react10.useState)(null);
|
|
3015
|
+
const [popover, setPopover] = (0, import_react10.useState)("none");
|
|
3016
|
+
const [shortcuts, setShortcuts] = (0, import_react10.useState)(false);
|
|
2977
3017
|
const snapshot = useMeetSnapshot();
|
|
2978
3018
|
const lobby = useLobby();
|
|
2979
3019
|
const controls = useHostControls();
|
|
2980
3020
|
const queue = useHandQueue();
|
|
2981
3021
|
const micUnavailable = useLocalMedia().microphone.unavailable;
|
|
2982
3022
|
const unread = useUnreadChat(panel === "chat");
|
|
2983
|
-
const [whiteboard, setWhiteboard] = (0,
|
|
3023
|
+
const [whiteboard, setWhiteboard] = (0, import_react10.useState)(false);
|
|
3024
|
+
const app = useMeetAppPanel();
|
|
3025
|
+
const appOpened = (0, import_react10.useRef)(false);
|
|
3026
|
+
(0, import_react10.useEffect)(() => {
|
|
3027
|
+
if (app === null || appOpened.current) return;
|
|
3028
|
+
appOpened.current = true;
|
|
3029
|
+
setPanel("app");
|
|
3030
|
+
}, [app]);
|
|
2984
3031
|
const toggle = (next) => setPanel(panel === next ? "none" : next);
|
|
2985
3032
|
const openActivity = (activity) => {
|
|
2986
3033
|
if (activity === "whiteboard") setWhiteboard(true);
|
|
@@ -2991,7 +3038,7 @@ function ControlBar({ onLeave }) {
|
|
|
2991
3038
|
});
|
|
2992
3039
|
const privateChatAt = snapshot?.privateChatRequest?.at ?? null;
|
|
2993
3040
|
const meetStore = useMeetHost()?.store ?? null;
|
|
2994
|
-
(0,
|
|
3041
|
+
(0, import_react10.useEffect)(() => {
|
|
2995
3042
|
const request = meetStore?.snapshot().privateChatRequest ?? null;
|
|
2996
3043
|
if (request === null) return;
|
|
2997
3044
|
setChatTo(request.to);
|
|
@@ -3007,11 +3054,11 @@ function ControlBar({ onLeave }) {
|
|
|
3007
3054
|
help: () => setShortcuts(true)
|
|
3008
3055
|
});
|
|
3009
3056
|
const hasSpotlight = snapshot?.spotlight !== null && snapshot?.spotlight !== void 0;
|
|
3010
|
-
return /* @__PURE__ */ (0,
|
|
3011
|
-
/* @__PURE__ */ (0,
|
|
3012
|
-
shortcuts ? /* @__PURE__ */ (0,
|
|
3013
|
-
panel === "chat" ? /* @__PURE__ */ (0,
|
|
3014
|
-
panel === "people" ? /* @__PURE__ */ (0,
|
|
3057
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
|
|
3058
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MeetingOverlays, {}),
|
|
3059
|
+
shortcuts ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ShortcutsSheet, { onClose: () => setShortcuts(false) }) : null,
|
|
3060
|
+
panel === "chat" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ChatPanel, { onClose: () => setPanel("none"), to: chatTo, onTo: setChatTo }) : null,
|
|
3061
|
+
panel === "people" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3015
3062
|
PeoplePanel,
|
|
3016
3063
|
{
|
|
3017
3064
|
onClose: () => setPanel("none"),
|
|
@@ -3021,53 +3068,61 @@ function ControlBar({ onLeave }) {
|
|
|
3021
3068
|
}
|
|
3022
3069
|
}
|
|
3023
3070
|
) : null,
|
|
3024
|
-
panel === "ai" ? /* @__PURE__ */ (0,
|
|
3025
|
-
panel === "settings" ? /* @__PURE__ */ (0,
|
|
3026
|
-
panel === "polls" ? /* @__PURE__ */ (0,
|
|
3027
|
-
panel === "qa" ? /* @__PURE__ */ (0,
|
|
3028
|
-
panel === "breakouts" ? /* @__PURE__ */ (0,
|
|
3029
|
-
whiteboard ? /* @__PURE__ */ (0,
|
|
3030
|
-
/* @__PURE__ */ (0,
|
|
3031
|
-
|
|
3032
|
-
|
|
3033
|
-
|
|
3071
|
+
panel === "ai" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AiPanel, { onClose: () => setPanel("none") }) : null,
|
|
3072
|
+
panel === "settings" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SettingsPanel, { onClose: () => setPanel("none") }) : null,
|
|
3073
|
+
panel === "polls" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PollsPanel, { onClose: () => setPanel("none") }) : null,
|
|
3074
|
+
panel === "qa" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(QaPanel, { onClose: () => setPanel("none") }) : null,
|
|
3075
|
+
panel === "breakouts" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(BreakoutsPanel, { onClose: () => setPanel("none") }) : null,
|
|
3076
|
+
whiteboard ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(WhiteboardPanel, { onClose: () => setWhiteboard(false) }) : null,
|
|
3077
|
+
panel === "app" && app !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PanelShell, { title: app.title, onClose: () => setPanel("none"), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__app-panel", "data-meet-app-panel": app.panel.key, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3078
|
+
app.Component,
|
|
3079
|
+
{
|
|
3080
|
+
recordId: app.panel.recordId,
|
|
3081
|
+
organizationId: app.organizationId,
|
|
3082
|
+
panelKey: app.panel.key
|
|
3083
|
+
}
|
|
3084
|
+
) }) }) : null,
|
|
3085
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(BreakoutBanner, {}),
|
|
3086
|
+
controls.notice !== null && panel !== "people" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Toast, { text: controls.notice.text, failed: controls.notice.failed, onDone: controls.clearNotice }) : null,
|
|
3087
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__controls", children: [
|
|
3088
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3034
3089
|
ControlButton,
|
|
3035
3090
|
{
|
|
3036
3091
|
label: micUnavailable !== null ? `Unmute \u2014 ${micUnavailable.remedy}` : room.local?.micEnabled === true ? "Mute (\u2318D)" : "Unmute (\u2318D)",
|
|
3037
3092
|
active: room.local?.micEnabled === true,
|
|
3038
3093
|
onClick: () => void room.toggleMicrophone(),
|
|
3039
|
-
children: room.local?.micEnabled === true ? /* @__PURE__ */ (0,
|
|
3094
|
+
children: room.local?.micEnabled === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicOffIcon, {})
|
|
3040
3095
|
}
|
|
3041
3096
|
),
|
|
3042
|
-
/* @__PURE__ */ (0,
|
|
3097
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3043
3098
|
ControlButton,
|
|
3044
3099
|
{
|
|
3045
3100
|
label: room.local?.cameraEnabled === true ? "Stop video (\u2318E)" : "Start video (\u2318E)",
|
|
3046
3101
|
active: room.local?.cameraEnabled === true,
|
|
3047
3102
|
onClick: () => void room.toggleCamera(),
|
|
3048
|
-
children: room.local?.cameraEnabled === true ? /* @__PURE__ */ (0,
|
|
3103
|
+
children: room.local?.cameraEnabled === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CameraIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CameraOffIcon, {})
|
|
3049
3104
|
}
|
|
3050
3105
|
),
|
|
3051
|
-
room.canShareScreen || room.local?.screenSharing === true ? /* @__PURE__ */ (0,
|
|
3106
|
+
room.canShareScreen || room.local?.screenSharing === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3052
3107
|
ControlButton,
|
|
3053
3108
|
{
|
|
3054
3109
|
label: room.local?.screenSharing === true ? "Stop sharing" : "Share screen",
|
|
3055
3110
|
active: room.local?.screenSharing === true,
|
|
3056
3111
|
onClick: () => void room.toggleScreenShare(),
|
|
3057
|
-
children: /* @__PURE__ */ (0,
|
|
3112
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ScreenShareIcon, {})
|
|
3058
3113
|
}
|
|
3059
3114
|
) : null,
|
|
3060
|
-
/* @__PURE__ */ (0,
|
|
3061
|
-
/* @__PURE__ */ (0,
|
|
3115
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__anchor", children: [
|
|
3116
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3062
3117
|
ControlButton,
|
|
3063
3118
|
{
|
|
3064
3119
|
label: "Send a reaction",
|
|
3065
3120
|
active: popover === "reactions",
|
|
3066
3121
|
onClick: () => setPopover(popover === "reactions" ? "none" : "reactions"),
|
|
3067
|
-
children: /* @__PURE__ */ (0,
|
|
3122
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SmileIcon, {})
|
|
3068
3123
|
}
|
|
3069
3124
|
),
|
|
3070
|
-
popover === "reactions" ? /* @__PURE__ */ (0,
|
|
3125
|
+
popover === "reactions" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Popover, { label: "Reactions", onClose: () => setPopover("none"), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__emoji-bar", children: MEET_REACTIONS.map((emoji) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3071
3126
|
"button",
|
|
3072
3127
|
{
|
|
3073
3128
|
type: "button",
|
|
@@ -3079,53 +3134,54 @@ function ControlBar({ onLeave }) {
|
|
|
3079
3134
|
emoji
|
|
3080
3135
|
)) }) }) : null
|
|
3081
3136
|
] }),
|
|
3082
|
-
/* @__PURE__ */ (0,
|
|
3137
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3083
3138
|
ControlButton,
|
|
3084
3139
|
{
|
|
3085
3140
|
label: room.local?.handRaised === true ? "Lower hand (\u2318\u2325H)" : "Raise hand (\u2318\u2325H)",
|
|
3086
3141
|
active: room.local?.handRaised === true,
|
|
3087
3142
|
onClick: () => void room.toggleHand(),
|
|
3088
|
-
children: /* @__PURE__ */ (0,
|
|
3143
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(HandIcon, {})
|
|
3089
3144
|
}
|
|
3090
3145
|
),
|
|
3091
|
-
/* @__PURE__ */ (0,
|
|
3092
|
-
|
|
3093
|
-
|
|
3146
|
+
app !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: app.title, active: panel === "app", onClick: () => toggle("app"), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FlagIcon, {}) }) : null,
|
|
3147
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(ControlButton, { label: "Chat (\u2318\u2325C)", active: panel === "chat", onClick: () => toggle("chat"), children: [
|
|
3148
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ChatIcon, {}),
|
|
3149
|
+
unread > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
|
|
3094
3150
|
] }),
|
|
3095
|
-
/* @__PURE__ */ (0,
|
|
3151
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3096
3152
|
ControlButton,
|
|
3097
3153
|
{
|
|
3098
3154
|
label: lobby.waiting.length > 0 ? `People \u2014 ${lobby.waiting.length} waiting` : `People \u2014 ${(snapshot?.participants ?? []).length} in the meeting`,
|
|
3099
3155
|
active: panel === "people",
|
|
3100
3156
|
onClick: () => toggle("people"),
|
|
3101
3157
|
children: [
|
|
3102
|
-
/* @__PURE__ */ (0,
|
|
3103
|
-
lobby.waiting.length > 0 || controls.isHost && queue.length > 0 ? /* @__PURE__ */ (0,
|
|
3158
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PeopleIcon, {}),
|
|
3159
|
+
lobby.waiting.length > 0 || controls.isHost && queue.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__dot", "aria-hidden": "true" }) : null
|
|
3104
3160
|
]
|
|
3105
3161
|
}
|
|
3106
3162
|
),
|
|
3107
|
-
/* @__PURE__ */ (0,
|
|
3163
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3108
3164
|
ActivitiesControl,
|
|
3109
3165
|
{
|
|
3110
3166
|
active: whiteboard ? "whiteboard" : panel === "polls" || panel === "qa" || panel === "breakouts" ? panel : null,
|
|
3111
3167
|
onOpen: openActivity
|
|
3112
3168
|
}
|
|
3113
3169
|
),
|
|
3114
|
-
/* @__PURE__ */ (0,
|
|
3115
|
-
recording.canStart ? /* @__PURE__ */ (0,
|
|
3116
|
-
recording.canStop ? /* @__PURE__ */ (0,
|
|
3117
|
-
/* @__PURE__ */ (0,
|
|
3118
|
-
/* @__PURE__ */ (0,
|
|
3170
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AiControl, { active: panel === "ai", onToggle: () => toggle("ai") }),
|
|
3171
|
+
recording.canStart ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: "Start recording", onClick: () => void recording.start(), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(RecordIcon, {}) }) : null,
|
|
3172
|
+
recording.canStop ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: "Stop recording", active: true, onClick: () => void recording.stop(), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(RecordIcon, {}) }) : null,
|
|
3173
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__anchor", children: [
|
|
3174
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3119
3175
|
ControlButton,
|
|
3120
3176
|
{
|
|
3121
3177
|
label: "More options",
|
|
3122
3178
|
active: popover === "more" || panel === "settings",
|
|
3123
3179
|
onClick: () => setPopover(popover === "more" ? "none" : "more"),
|
|
3124
|
-
children: /* @__PURE__ */ (0,
|
|
3180
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MoreIcon, {})
|
|
3125
3181
|
}
|
|
3126
3182
|
),
|
|
3127
|
-
popover === "more" ? /* @__PURE__ */ (0,
|
|
3128
|
-
/* @__PURE__ */ (0,
|
|
3183
|
+
popover === "more" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Popover, { label: "More options", onClose: () => setPopover("none"), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__menu", role: "menu", children: [
|
|
3184
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3129
3185
|
MenuItem,
|
|
3130
3186
|
{
|
|
3131
3187
|
onSelect: () => {
|
|
@@ -3133,12 +3189,12 @@ function ControlBar({ onLeave }) {
|
|
|
3133
3189
|
setPanel("settings");
|
|
3134
3190
|
},
|
|
3135
3191
|
children: [
|
|
3136
|
-
/* @__PURE__ */ (0,
|
|
3192
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SettingsIcon, { width: 16, height: 16 }),
|
|
3137
3193
|
" Settings"
|
|
3138
3194
|
]
|
|
3139
3195
|
}
|
|
3140
3196
|
),
|
|
3141
|
-
/* @__PURE__ */ (0,
|
|
3197
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3142
3198
|
MenuItem,
|
|
3143
3199
|
{
|
|
3144
3200
|
onSelect: () => {
|
|
@@ -3146,14 +3202,14 @@ function ControlBar({ onLeave }) {
|
|
|
3146
3202
|
setShortcuts(true);
|
|
3147
3203
|
},
|
|
3148
3204
|
children: [
|
|
3149
|
-
/* @__PURE__ */ (0,
|
|
3205
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(KeyboardIcon, { width: 16, height: 16 }),
|
|
3150
3206
|
" Keyboard shortcuts"
|
|
3151
3207
|
]
|
|
3152
3208
|
}
|
|
3153
3209
|
),
|
|
3154
|
-
controls.isHost ? /* @__PURE__ */ (0,
|
|
3155
|
-
/* @__PURE__ */ (0,
|
|
3156
|
-
/* @__PURE__ */ (0,
|
|
3210
|
+
controls.isHost ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
|
|
3211
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__menu-sep", role: "separator" }),
|
|
3212
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3157
3213
|
MenuItem,
|
|
3158
3214
|
{
|
|
3159
3215
|
onSelect: () => {
|
|
@@ -3161,12 +3217,12 @@ function ControlBar({ onLeave }) {
|
|
|
3161
3217
|
void controls.run({ action: "mute_all" });
|
|
3162
3218
|
},
|
|
3163
3219
|
children: [
|
|
3164
|
-
/* @__PURE__ */ (0,
|
|
3220
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicOffIcon, { width: 16, height: 16 }),
|
|
3165
3221
|
" Mute everyone"
|
|
3166
3222
|
]
|
|
3167
3223
|
}
|
|
3168
3224
|
),
|
|
3169
|
-
/* @__PURE__ */ (0,
|
|
3225
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3170
3226
|
MenuItem,
|
|
3171
3227
|
{
|
|
3172
3228
|
onSelect: () => {
|
|
@@ -3174,12 +3230,12 @@ function ControlBar({ onLeave }) {
|
|
|
3174
3230
|
void controls.run({ action: "ask_all_unmute" });
|
|
3175
3231
|
},
|
|
3176
3232
|
children: [
|
|
3177
|
-
/* @__PURE__ */ (0,
|
|
3233
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicIcon, { width: 16, height: 16 }),
|
|
3178
3234
|
" Ask everyone to unmute"
|
|
3179
3235
|
]
|
|
3180
3236
|
}
|
|
3181
3237
|
),
|
|
3182
|
-
queue.length > 0 ? /* @__PURE__ */ (0,
|
|
3238
|
+
queue.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3183
3239
|
MenuItem,
|
|
3184
3240
|
{
|
|
3185
3241
|
onSelect: () => {
|
|
@@ -3187,14 +3243,14 @@ function ControlBar({ onLeave }) {
|
|
|
3187
3243
|
void controls.run({ action: "lower_all_hands" });
|
|
3188
3244
|
},
|
|
3189
3245
|
children: [
|
|
3190
|
-
/* @__PURE__ */ (0,
|
|
3246
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(HandIcon, { width: 16, height: 16 }),
|
|
3191
3247
|
" Lower all hands (",
|
|
3192
3248
|
queue.length,
|
|
3193
3249
|
")"
|
|
3194
3250
|
]
|
|
3195
3251
|
}
|
|
3196
3252
|
) : null,
|
|
3197
|
-
hasSpotlight ? /* @__PURE__ */ (0,
|
|
3253
|
+
hasSpotlight ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3198
3254
|
MenuItem,
|
|
3199
3255
|
{
|
|
3200
3256
|
onSelect: () => {
|
|
@@ -3202,7 +3258,7 @@ function ControlBar({ onLeave }) {
|
|
|
3202
3258
|
void controls.run({ action: "spotlight", identity: null });
|
|
3203
3259
|
},
|
|
3204
3260
|
children: [
|
|
3205
|
-
/* @__PURE__ */ (0,
|
|
3261
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SpotlightIcon, { width: 16, height: 16 }),
|
|
3206
3262
|
" Remove spotlight"
|
|
3207
3263
|
]
|
|
3208
3264
|
}
|
|
@@ -3210,7 +3266,7 @@ function ControlBar({ onLeave }) {
|
|
|
3210
3266
|
] }) : null
|
|
3211
3267
|
] }) }) : null
|
|
3212
3268
|
] }),
|
|
3213
|
-
/* @__PURE__ */ (0,
|
|
3269
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3214
3270
|
ControlButton,
|
|
3215
3271
|
{
|
|
3216
3272
|
label: "Leave",
|
|
@@ -3219,7 +3275,7 @@ function ControlBar({ onLeave }) {
|
|
|
3219
3275
|
void room.leave();
|
|
3220
3276
|
onLeave?.();
|
|
3221
3277
|
},
|
|
3222
|
-
children: /* @__PURE__ */ (0,
|
|
3278
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PhoneOffIcon, {})
|
|
3223
3279
|
}
|
|
3224
3280
|
)
|
|
3225
3281
|
] })
|
|
@@ -3229,13 +3285,13 @@ function useUnreadChat(open) {
|
|
|
3229
3285
|
const snapshot = useMeetSnapshot();
|
|
3230
3286
|
const chat = snapshot?.chat ?? [];
|
|
3231
3287
|
const local = snapshot?.localIdentity ?? null;
|
|
3232
|
-
const [seen, setSeen] = (0,
|
|
3233
|
-
(0,
|
|
3288
|
+
const [seen, setSeen] = (0, import_react10.useState)(0);
|
|
3289
|
+
(0, import_react10.useEffect)(() => {
|
|
3234
3290
|
if (open) setSeen(chat.length);
|
|
3235
3291
|
}, [open, chat.length]);
|
|
3236
3292
|
const loaded = snapshot?.chatLoaded === true;
|
|
3237
|
-
const [baseline, setBaseline] = (0,
|
|
3238
|
-
(0,
|
|
3293
|
+
const [baseline, setBaseline] = (0, import_react10.useState)(null);
|
|
3294
|
+
(0, import_react10.useEffect)(() => {
|
|
3239
3295
|
if (loaded && baseline === null) setBaseline(chat.length);
|
|
3240
3296
|
}, [loaded, baseline, chat.length]);
|
|
3241
3297
|
if (open) return 0;
|
|
@@ -3248,14 +3304,14 @@ function Popover({
|
|
|
3248
3304
|
children,
|
|
3249
3305
|
placement = "up"
|
|
3250
3306
|
}) {
|
|
3251
|
-
const ref = (0,
|
|
3252
|
-
const [style, setStyle] = (0,
|
|
3307
|
+
const ref = (0, import_react10.useRef)(null);
|
|
3308
|
+
const [style, setStyle] = (0, import_react10.useState)({
|
|
3253
3309
|
position: "fixed",
|
|
3254
3310
|
top: 0,
|
|
3255
3311
|
left: 0,
|
|
3256
3312
|
visibility: "hidden"
|
|
3257
3313
|
});
|
|
3258
|
-
(0,
|
|
3314
|
+
(0, import_react10.useLayoutEffect)(() => {
|
|
3259
3315
|
const element = ref.current;
|
|
3260
3316
|
const anchor = element?.parentElement ?? null;
|
|
3261
3317
|
if (element === null || anchor === null) return;
|
|
@@ -3300,7 +3356,7 @@ function Popover({
|
|
|
3300
3356
|
window.removeEventListener("scroll", place, true);
|
|
3301
3357
|
};
|
|
3302
3358
|
}, [placement]);
|
|
3303
|
-
(0,
|
|
3359
|
+
(0, import_react10.useEffect)(() => {
|
|
3304
3360
|
const onKey = (event) => {
|
|
3305
3361
|
if (event.key === "Escape") onClose();
|
|
3306
3362
|
};
|
|
@@ -3315,14 +3371,14 @@ function Popover({
|
|
|
3315
3371
|
window.removeEventListener("pointerdown", onPointer);
|
|
3316
3372
|
};
|
|
3317
3373
|
}, [onClose]);
|
|
3318
|
-
return /* @__PURE__ */ (0,
|
|
3374
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { ref, className: "mx-meet__popover", style, role: "dialog", "aria-label": label, children });
|
|
3319
3375
|
}
|
|
3320
3376
|
function MenuItem({
|
|
3321
3377
|
onSelect,
|
|
3322
3378
|
danger = false,
|
|
3323
3379
|
children
|
|
3324
3380
|
}) {
|
|
3325
|
-
return /* @__PURE__ */ (0,
|
|
3381
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3326
3382
|
"button",
|
|
3327
3383
|
{
|
|
3328
3384
|
type: "button",
|
|
@@ -3334,28 +3390,28 @@ function MenuItem({
|
|
|
3334
3390
|
);
|
|
3335
3391
|
}
|
|
3336
3392
|
function Toast({ text, failed, onDone }) {
|
|
3337
|
-
(0,
|
|
3393
|
+
(0, import_react10.useEffect)(() => {
|
|
3338
3394
|
const timer = setTimeout(onDone, failed ? 7e3 : 4e3);
|
|
3339
3395
|
return () => clearTimeout(timer);
|
|
3340
3396
|
}, [text, failed, onDone]);
|
|
3341
|
-
return /* @__PURE__ */ (0,
|
|
3342
|
-
/* @__PURE__ */ (0,
|
|
3343
|
-
/* @__PURE__ */ (0,
|
|
3397
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: failed ? "mx-meet__toast mx-meet__toast--failed" : "mx-meet__toast", role: "status", children: [
|
|
3398
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: text }),
|
|
3399
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "mx-meet__toast-close", "aria-label": "Dismiss", onClick: onDone, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CloseIcon, { width: 14, height: 14 }) })
|
|
3344
3400
|
] });
|
|
3345
3401
|
}
|
|
3346
3402
|
function MeetingOverlays() {
|
|
3347
3403
|
const reactions = useReactions();
|
|
3348
3404
|
const { notice, dismiss } = useModerationNotice();
|
|
3349
3405
|
const room = useRoom();
|
|
3350
|
-
return /* @__PURE__ */ (0,
|
|
3351
|
-
/* @__PURE__ */ (0,
|
|
3406
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
|
|
3407
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ReactionOverlay, { reactions }),
|
|
3352
3408
|
notice !== null && notice.kind !== "removed" ? (
|
|
3353
3409
|
// A host's request ("the host is asking you to unmute"), not an error:
|
|
3354
3410
|
// an assertive status, so it is announced at once without being filed
|
|
3355
3411
|
// as a failure (design-system error-box census).
|
|
3356
|
-
/* @__PURE__ */ (0,
|
|
3357
|
-
/* @__PURE__ */ (0,
|
|
3358
|
-
notice.kind === "ask-unmute" && room.local?.micEnabled !== true ? /* @__PURE__ */ (0,
|
|
3412
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__notice-bar", role: "status", "aria-live": "assertive", children: [
|
|
3413
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: notice.text }),
|
|
3414
|
+
notice.kind === "ask-unmute" && room.local?.micEnabled !== true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3359
3415
|
"button",
|
|
3360
3416
|
{
|
|
3361
3417
|
type: "button",
|
|
@@ -3367,20 +3423,20 @@ function MeetingOverlays() {
|
|
|
3367
3423
|
children: "Unmute"
|
|
3368
3424
|
}
|
|
3369
3425
|
) : null,
|
|
3370
|
-
/* @__PURE__ */ (0,
|
|
3426
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "mx-meet__toast-close", "aria-label": "Dismiss", onClick: dismiss, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CloseIcon, { width: 14, height: 14 }) })
|
|
3371
3427
|
] })
|
|
3372
3428
|
) : null
|
|
3373
3429
|
] });
|
|
3374
3430
|
}
|
|
3375
3431
|
function ShortcutsSheet({ onClose }) {
|
|
3376
|
-
(0,
|
|
3432
|
+
(0, import_react10.useEffect)(() => {
|
|
3377
3433
|
const onKey = (event) => {
|
|
3378
3434
|
if (event.key === "Escape") onClose();
|
|
3379
3435
|
};
|
|
3380
3436
|
window.addEventListener("keydown", onKey);
|
|
3381
3437
|
return () => window.removeEventListener("keydown", onKey);
|
|
3382
3438
|
}, [onClose]);
|
|
3383
|
-
return /* @__PURE__ */ (0,
|
|
3439
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__sheet-backdrop", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3384
3440
|
"div",
|
|
3385
3441
|
{
|
|
3386
3442
|
className: "mx-meet__sheet",
|
|
@@ -3388,13 +3444,13 @@ function ShortcutsSheet({ onClose }) {
|
|
|
3388
3444
|
"aria-label": "Keyboard shortcuts",
|
|
3389
3445
|
onClick: (event) => event.stopPropagation(),
|
|
3390
3446
|
children: [
|
|
3391
|
-
/* @__PURE__ */ (0,
|
|
3392
|
-
/* @__PURE__ */ (0,
|
|
3393
|
-
/* @__PURE__ */ (0,
|
|
3447
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("header", { className: "mx-meet__panel-head", children: [
|
|
3448
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "mx-meet__panel-title", children: "Keyboard shortcuts" }),
|
|
3449
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: "Close", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CloseIcon, { width: 16, height: 16 }) })
|
|
3394
3450
|
] }),
|
|
3395
|
-
/* @__PURE__ */ (0,
|
|
3396
|
-
/* @__PURE__ */ (0,
|
|
3397
|
-
/* @__PURE__ */ (0,
|
|
3451
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("dl", { className: "mx-meet__shortcuts", children: MEET_SHORTCUTS.map((shortcut) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__shortcut", children: [
|
|
3452
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("dt", { children: shortcut.label }),
|
|
3453
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("dd", { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("kbd", { className: "mx-meet__kbd", children: shortcut.keys }) })
|
|
3398
3454
|
] }, shortcut.id)) })
|
|
3399
3455
|
]
|
|
3400
3456
|
}
|
|
@@ -3404,15 +3460,15 @@ function AiControl({ active, onToggle }) {
|
|
|
3404
3460
|
const snapshot = useMeetSnapshot();
|
|
3405
3461
|
const meeting = snapshot?.meeting ?? null;
|
|
3406
3462
|
if (meeting === null || !meeting.aiEnabled) return null;
|
|
3407
|
-
return /* @__PURE__ */ (0,
|
|
3463
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: "Meeting assistant", active, onClick: onToggle, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SparklesIcon, {}) });
|
|
3408
3464
|
}
|
|
3409
3465
|
function PanelShell({
|
|
3410
3466
|
title,
|
|
3411
3467
|
onClose,
|
|
3412
3468
|
children
|
|
3413
3469
|
}) {
|
|
3414
|
-
const ref = (0,
|
|
3415
|
-
(0,
|
|
3470
|
+
const ref = (0, import_react10.useRef)(null);
|
|
3471
|
+
(0, import_react10.useLayoutEffect)(() => {
|
|
3416
3472
|
const panel = ref.current;
|
|
3417
3473
|
const root = panel?.closest(".mx-meet");
|
|
3418
3474
|
const header = root?.querySelector(":scope > .mx-meet__header") ?? null;
|
|
@@ -3424,12 +3480,12 @@ function PanelShell({
|
|
|
3424
3480
|
observer.observe(header);
|
|
3425
3481
|
return () => observer.disconnect();
|
|
3426
3482
|
}, []);
|
|
3427
|
-
return /* @__PURE__ */ (0,
|
|
3428
|
-
/* @__PURE__ */ (0,
|
|
3429
|
-
/* @__PURE__ */ (0,
|
|
3430
|
-
/* @__PURE__ */ (0,
|
|
3483
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("aside", { ref, className: "mx-meet__panel", "aria-label": title, children: [
|
|
3484
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("header", { className: "mx-meet__panel-head", children: [
|
|
3485
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "mx-meet__panel-title", children: title }),
|
|
3486
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: "Close panel", onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CloseIcon, { width: 16, height: 16 }) })
|
|
3431
3487
|
] }),
|
|
3432
|
-
/* @__PURE__ */ (0,
|
|
3488
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__panel-body", children })
|
|
3433
3489
|
] });
|
|
3434
3490
|
}
|
|
3435
3491
|
function ChatPanel({
|
|
@@ -3439,17 +3495,17 @@ function ChatPanel({
|
|
|
3439
3495
|
}) {
|
|
3440
3496
|
const snapshot = useMeetSnapshot();
|
|
3441
3497
|
const room = useRoom();
|
|
3442
|
-
const [draft, setDraft] = (0,
|
|
3443
|
-
const [recipient, setRecipient] = (0,
|
|
3444
|
-
const listRef = (0,
|
|
3498
|
+
const [draft, setDraft] = (0, import_react10.useState)("");
|
|
3499
|
+
const [recipient, setRecipient] = (0, import_react10.useState)(to);
|
|
3500
|
+
const listRef = (0, import_react10.useRef)(null);
|
|
3445
3501
|
const messages = snapshot?.chat ?? [];
|
|
3446
3502
|
const local = snapshot?.localIdentity ?? null;
|
|
3447
3503
|
const people = (snapshot?.participants ?? []).filter(
|
|
3448
3504
|
(participant) => !participant.isLocal && !participant.isAgent
|
|
3449
3505
|
);
|
|
3450
3506
|
const recipientName = recipient === null ? null : people.find((p) => p.identity === recipient)?.displayName ?? null;
|
|
3451
|
-
(0,
|
|
3452
|
-
(0,
|
|
3507
|
+
(0, import_react10.useEffect)(() => setRecipient(to), [to]);
|
|
3508
|
+
(0, import_react10.useEffect)(() => {
|
|
3453
3509
|
const list = listRef.current;
|
|
3454
3510
|
if (list !== null) list.scrollTop = list.scrollHeight;
|
|
3455
3511
|
}, [messages.length]);
|
|
@@ -3457,13 +3513,13 @@ function ChatPanel({
|
|
|
3457
3513
|
setRecipient(next);
|
|
3458
3514
|
onTo?.(next);
|
|
3459
3515
|
};
|
|
3460
|
-
return /* @__PURE__ */ (0,
|
|
3461
|
-
/* @__PURE__ */ (0,
|
|
3462
|
-
snapshot?.chatHistoryError != null ? /* @__PURE__ */ (0,
|
|
3463
|
-
snapshot?.chatLoaded !== true && messages.length === 0 ? /* @__PURE__ */ (0,
|
|
3464
|
-
messages.map((message) => /* @__PURE__ */ (0,
|
|
3516
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(PanelShell, { title: "Chat", onClose, children: [
|
|
3517
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("ul", { className: "mx-meet__chat", ref: listRef, children: [
|
|
3518
|
+
snapshot?.chatHistoryError != null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("li", { className: "mx-meet__panel-note", children: snapshot.chatHistoryError }) : null,
|
|
3519
|
+
snapshot?.chatLoaded !== true && messages.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("li", { className: "mx-meet__panel-note", children: "Reading earlier messages\u2026" }) : messages.length === 0 && snapshot?.chatHistoryError == null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("li", { className: "mx-meet__panel-note", children: "No messages yet. Messages to everyone stay with the meeting, so people who join later see them." }) : null,
|
|
3520
|
+
messages.map((message) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ChatLine, { message, local, people }, message.id))
|
|
3465
3521
|
] }),
|
|
3466
|
-
/* @__PURE__ */ (0,
|
|
3522
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3467
3523
|
"form",
|
|
3468
3524
|
{
|
|
3469
3525
|
className: "mx-meet__composer mx-meet__composer--chat",
|
|
@@ -3476,7 +3532,7 @@ function ChatPanel({
|
|
|
3476
3532
|
else void room.sendPrivateChat(recipient, text);
|
|
3477
3533
|
},
|
|
3478
3534
|
children: [
|
|
3479
|
-
people.length > 0 ? /* @__PURE__ */ (0,
|
|
3535
|
+
people.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3480
3536
|
"select",
|
|
3481
3537
|
{
|
|
3482
3538
|
className: "mx-meet__select mx-meet__select--compact",
|
|
@@ -3484,16 +3540,16 @@ function ChatPanel({
|
|
|
3484
3540
|
value: recipient ?? "",
|
|
3485
3541
|
onChange: (event) => choose(event.target.value === "" ? null : event.target.value),
|
|
3486
3542
|
children: [
|
|
3487
|
-
/* @__PURE__ */ (0,
|
|
3488
|
-
people.map((participant) => /* @__PURE__ */ (0,
|
|
3543
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("option", { value: "", children: "Everyone" }),
|
|
3544
|
+
people.map((participant) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("option", { value: participant.identity, children: [
|
|
3489
3545
|
participant.displayName,
|
|
3490
3546
|
" (private)"
|
|
3491
3547
|
] }, participant.identity))
|
|
3492
3548
|
]
|
|
3493
3549
|
}
|
|
3494
3550
|
) : null,
|
|
3495
|
-
/* @__PURE__ */ (0,
|
|
3496
|
-
/* @__PURE__ */ (0,
|
|
3551
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__composer-row", children: [
|
|
3552
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3497
3553
|
"input",
|
|
3498
3554
|
{
|
|
3499
3555
|
className: "mx-meet__input",
|
|
@@ -3504,9 +3560,9 @@ function ChatPanel({
|
|
|
3504
3560
|
maxLength: 4e3
|
|
3505
3561
|
}
|
|
3506
3562
|
),
|
|
3507
|
-
/* @__PURE__ */ (0,
|
|
3563
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: draft.trim().length === 0, children: "Send" })
|
|
3508
3564
|
] }),
|
|
3509
|
-
recipientName !== null ? /* @__PURE__ */ (0,
|
|
3565
|
+
recipientName !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__panel-note", children: [
|
|
3510
3566
|
"Only ",
|
|
3511
3567
|
recipientName,
|
|
3512
3568
|
" sees this. Private messages are not saved."
|
|
@@ -3524,7 +3580,7 @@ function ChatLine({
|
|
|
3524
3580
|
const mine = message.identity === local;
|
|
3525
3581
|
const privateTo = message.to ?? null;
|
|
3526
3582
|
const counterpart = privateTo === null ? null : mine ? people.find((p) => p.identity === privateTo)?.displayName ?? "them" : "you";
|
|
3527
|
-
return /* @__PURE__ */ (0,
|
|
3583
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3528
3584
|
"li",
|
|
3529
3585
|
{
|
|
3530
3586
|
className: [
|
|
@@ -3533,17 +3589,17 @@ function ChatLine({
|
|
|
3533
3589
|
message.failed !== void 0 ? "mx-meet__chat-line--failed" : ""
|
|
3534
3590
|
].filter(Boolean).join(" "),
|
|
3535
3591
|
children: [
|
|
3536
|
-
/* @__PURE__ */ (0,
|
|
3537
|
-
/* @__PURE__ */ (0,
|
|
3538
|
-
counterpart !== null ? /* @__PURE__ */ (0,
|
|
3592
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__chat-meta", children: [
|
|
3593
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("strong", { children: mine ? "You" : message.displayName }),
|
|
3594
|
+
counterpart !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__chat-private", children: [
|
|
3539
3595
|
"to ",
|
|
3540
3596
|
counterpart,
|
|
3541
3597
|
" \xB7 private"
|
|
3542
3598
|
] }) : null,
|
|
3543
|
-
/* @__PURE__ */ (0,
|
|
3599
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("time", { dateTime: message.at, children: clockOf(message.at) })
|
|
3544
3600
|
] }),
|
|
3545
|
-
/* @__PURE__ */ (0,
|
|
3546
|
-
message.failed !== void 0 ? /* @__PURE__ */ (0,
|
|
3601
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__chat-text", children: message.text }),
|
|
3602
|
+
message.failed !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__chat-failed", children: message.failed }) : privateTo === null && message.saved === false ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__chat-pending", children: message.id.startsWith("pending-") ? "Sending\u2026" : "Not saved \u2014 people who join later will not see this" }) : null
|
|
3547
3603
|
]
|
|
3548
3604
|
}
|
|
3549
3605
|
);
|
|
@@ -3555,22 +3611,25 @@ function PeoplePanel({
|
|
|
3555
3611
|
const snapshot = useMeetSnapshot();
|
|
3556
3612
|
const controls = useHostControls();
|
|
3557
3613
|
const queue = useHandQueue();
|
|
3558
|
-
const [query, setQuery] = (0,
|
|
3559
|
-
const [menuFor, setMenuFor] = (0,
|
|
3614
|
+
const [query, setQuery] = (0, import_react10.useState)("");
|
|
3615
|
+
const [menuFor, setMenuFor] = (0, import_react10.useState)(null);
|
|
3560
3616
|
const myRole = useRole();
|
|
3561
3617
|
const local = snapshot?.localIdentity ?? null;
|
|
3562
|
-
const
|
|
3618
|
+
const observersHidden = snapshot?.grants.observersVisibleTo === "hosts" && !controls.isHost;
|
|
3619
|
+
const everyone = (snapshot?.participants ?? []).filter(
|
|
3620
|
+
(participant) => !observersHidden || !isObserverRole(participant.role) || participant.identity === local
|
|
3621
|
+
);
|
|
3563
3622
|
const needle = query.trim().toLowerCase();
|
|
3564
3623
|
const shown = needle.length === 0 ? everyone : everyone.filter((participant) => participant.displayName.toLowerCase().includes(needle));
|
|
3565
|
-
return /* @__PURE__ */ (0,
|
|
3566
|
-
/* @__PURE__ */ (0,
|
|
3567
|
-
queue.length > 0 ? /* @__PURE__ */ (0,
|
|
3568
|
-
/* @__PURE__ */ (0,
|
|
3569
|
-
/* @__PURE__ */ (0,
|
|
3624
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(PanelShell, { title: `People (${everyone.length})`, onClose, children: [
|
|
3625
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(LobbyPanel, {}),
|
|
3626
|
+
queue.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__section", "aria-label": "Raised hands", children: [
|
|
3627
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("header", { className: "mx-meet__section-head", children: [
|
|
3628
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("h3", { className: "mx-meet__section-title", children: [
|
|
3570
3629
|
"Raised hands \xB7 ",
|
|
3571
3630
|
queue.length
|
|
3572
3631
|
] }),
|
|
3573
|
-
controls.isHost ? /* @__PURE__ */ (0,
|
|
3632
|
+
controls.isHost ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3574
3633
|
"button",
|
|
3575
3634
|
{
|
|
3576
3635
|
type: "button",
|
|
@@ -3580,13 +3639,13 @@ function PeoplePanel({
|
|
|
3580
3639
|
}
|
|
3581
3640
|
) : null
|
|
3582
3641
|
] }),
|
|
3583
|
-
/* @__PURE__ */ (0,
|
|
3584
|
-
/* @__PURE__ */ (0,
|
|
3585
|
-
/* @__PURE__ */ (0,
|
|
3642
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ol", { className: "mx-meet__queue", children: queue.map((participant) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("li", { className: "mx-meet__person", children: [
|
|
3643
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: 28 }),
|
|
3644
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__person-name", children: [
|
|
3586
3645
|
participant.displayName,
|
|
3587
|
-
participant.identity === local ? /* @__PURE__ */ (0,
|
|
3646
|
+
participant.identity === local ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__you", children: " (you)" }) : null
|
|
3588
3647
|
] }),
|
|
3589
|
-
controls.isHost || participant.identity === local ? /* @__PURE__ */ (0,
|
|
3648
|
+
controls.isHost || participant.identity === local ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3590
3649
|
"button",
|
|
3591
3650
|
{
|
|
3592
3651
|
type: "button",
|
|
@@ -3597,27 +3656,27 @@ function PeoplePanel({
|
|
|
3597
3656
|
) : null
|
|
3598
3657
|
] }, participant.identity)) })
|
|
3599
3658
|
] }) : null,
|
|
3600
|
-
controls.isHost && everyone.length > 1 ? /* @__PURE__ */ (0,
|
|
3601
|
-
/* @__PURE__ */ (0,
|
|
3602
|
-
/* @__PURE__ */ (0,
|
|
3659
|
+
controls.isHost && everyone.length > 1 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__bulk", children: [
|
|
3660
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("button", { type: "button", className: "mx-meet__chip", onClick: () => void controls.run({ action: "mute_all" }), children: [
|
|
3661
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicOffIcon, { width: 14, height: 14 }),
|
|
3603
3662
|
" Mute all"
|
|
3604
3663
|
] }),
|
|
3605
|
-
/* @__PURE__ */ (0,
|
|
3664
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3606
3665
|
"button",
|
|
3607
3666
|
{
|
|
3608
3667
|
type: "button",
|
|
3609
3668
|
className: "mx-meet__chip",
|
|
3610
3669
|
onClick: () => void controls.run({ action: "ask_all_unmute" }),
|
|
3611
3670
|
children: [
|
|
3612
|
-
/* @__PURE__ */ (0,
|
|
3671
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicIcon, { width: 14, height: 14 }),
|
|
3613
3672
|
" Ask all to unmute"
|
|
3614
3673
|
]
|
|
3615
3674
|
}
|
|
3616
3675
|
)
|
|
3617
3676
|
] }) : null,
|
|
3618
|
-
everyone.length > 4 ? /* @__PURE__ */ (0,
|
|
3619
|
-
/* @__PURE__ */ (0,
|
|
3620
|
-
/* @__PURE__ */ (0,
|
|
3677
|
+
everyone.length > 4 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("label", { className: "mx-meet__search", children: [
|
|
3678
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SearchIcon, { width: 16, height: 16 }),
|
|
3679
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3621
3680
|
"input",
|
|
3622
3681
|
{
|
|
3623
3682
|
className: "mx-meet__input mx-meet__input--bare",
|
|
@@ -3628,37 +3687,37 @@ function PeoplePanel({
|
|
|
3628
3687
|
}
|
|
3629
3688
|
)
|
|
3630
3689
|
] }) : null,
|
|
3631
|
-
controls.notice !== null ? /* @__PURE__ */ (0,
|
|
3632
|
-
/* @__PURE__ */ (0,
|
|
3633
|
-
shown.map((participant) => /* @__PURE__ */ (0,
|
|
3634
|
-
/* @__PURE__ */ (0,
|
|
3635
|
-
/* @__PURE__ */ (0,
|
|
3690
|
+
controls.notice !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: controls.notice.failed ? "mx-meet__error" : "mx-meet__notice", role: "status", children: controls.notice.text }) : null,
|
|
3691
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("ul", { className: "mx-meet__people", children: [
|
|
3692
|
+
shown.map((participant) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("li", { className: "mx-meet__person", children: [
|
|
3693
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Avatar, { name: participant.displayName, url: participant.avatarUrl, size: 32 }),
|
|
3694
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__person-name", children: [
|
|
3636
3695
|
participant.displayName,
|
|
3637
|
-
participant.identity === local ? /* @__PURE__ */ (0,
|
|
3638
|
-
/* @__PURE__ */ (0,
|
|
3696
|
+
participant.identity === local ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__you", children: " (you)" }) : null,
|
|
3697
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3639
3698
|
RoleBadge,
|
|
3640
3699
|
{
|
|
3641
3700
|
role: participant.identity === local ? myRole : participant.role,
|
|
3642
3701
|
standing: participant.standing
|
|
3643
3702
|
}
|
|
3644
3703
|
),
|
|
3645
|
-
isNoteTaker(participant) ? /* @__PURE__ */ (0,
|
|
3646
|
-
snapshot?.spotlight === participant.identity ? /* @__PURE__ */ (0,
|
|
3704
|
+
isNoteTaker(participant) ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "Meeting assistant" }) : null,
|
|
3705
|
+
snapshot?.spotlight === participant.identity ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "Spotlight" }) : null
|
|
3647
3706
|
] }),
|
|
3648
|
-
participant.handRaised ? /* @__PURE__ */ (0,
|
|
3649
|
-
!participant.micEnabled && !isNoteTaker(participant) ? /* @__PURE__ */ (0,
|
|
3650
|
-
/* @__PURE__ */ (0,
|
|
3651
|
-
/* @__PURE__ */ (0,
|
|
3652
|
-
/* @__PURE__ */ (0,
|
|
3707
|
+
participant.handRaised ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(HandIcon, { width: 14, height: 14 }) : null,
|
|
3708
|
+
!participant.micEnabled && !isNoteTaker(participant) ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicOffIcon, { width: 14, height: 14 }) : null,
|
|
3709
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(QualityBars, { quality: participant.quality }),
|
|
3710
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__anchor", children: [
|
|
3711
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3653
3712
|
ControlButton,
|
|
3654
3713
|
{
|
|
3655
3714
|
label: `More for ${participant.displayName}`,
|
|
3656
3715
|
active: menuFor === participant.identity,
|
|
3657
3716
|
onClick: () => setMenuFor(menuFor === participant.identity ? null : participant.identity),
|
|
3658
|
-
children: /* @__PURE__ */ (0,
|
|
3717
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MoreIcon, { width: 16, height: 16 })
|
|
3659
3718
|
}
|
|
3660
3719
|
),
|
|
3661
|
-
menuFor === participant.identity ? /* @__PURE__ */ (0,
|
|
3720
|
+
menuFor === participant.identity ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3662
3721
|
PersonMenu,
|
|
3663
3722
|
{
|
|
3664
3723
|
participant,
|
|
@@ -3669,13 +3728,13 @@ function PeoplePanel({
|
|
|
3669
3728
|
) : null
|
|
3670
3729
|
] })
|
|
3671
3730
|
] }, participant.identity)),
|
|
3672
|
-
shown.length === 0 ? /* @__PURE__ */ (0,
|
|
3731
|
+
shown.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("li", { className: "mx-meet__panel-note", children: [
|
|
3673
3732
|
"Nobody matches \u201C",
|
|
3674
3733
|
query,
|
|
3675
3734
|
"\u201D."
|
|
3676
3735
|
] }) : null
|
|
3677
3736
|
] }),
|
|
3678
|
-
snapshot?.meeting !== null && snapshot?.meeting !== void 0 ? /* @__PURE__ */ (0,
|
|
3737
|
+
snapshot?.meeting !== null && snapshot?.meeting !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(GuestRecordAccessControl, { meeting: snapshot.meeting }) : null
|
|
3679
3738
|
] });
|
|
3680
3739
|
}
|
|
3681
3740
|
function PersonMenu({
|
|
@@ -3687,14 +3746,14 @@ function PersonMenu({
|
|
|
3687
3746
|
const host = useMeetHost();
|
|
3688
3747
|
const snapshot = useMeetSnapshot();
|
|
3689
3748
|
const controls = useHostControls();
|
|
3690
|
-
const [mode, setMode] = (0,
|
|
3691
|
-
const [text, setText] = (0,
|
|
3749
|
+
const [mode, setMode] = (0, import_react10.useState)("menu");
|
|
3750
|
+
const [text, setText] = (0, import_react10.useState)("");
|
|
3692
3751
|
const self = participant.identity === snapshot?.localIdentity;
|
|
3693
3752
|
const moderate = controls.canModerate(participant);
|
|
3694
3753
|
const pinned = snapshot?.pinned === participant.identity;
|
|
3695
3754
|
const spotlit = snapshot?.spotlight === participant.identity;
|
|
3696
3755
|
const hasAccount = participant.userId !== null;
|
|
3697
|
-
const [refused, setRefused] = (0,
|
|
3756
|
+
const [refused, setRefused] = (0, import_react10.useState)(false);
|
|
3698
3757
|
const act = (request) => {
|
|
3699
3758
|
setRefused(false);
|
|
3700
3759
|
void controls.run(request).then((result) => {
|
|
@@ -3702,10 +3761,10 @@ function PersonMenu({
|
|
|
3702
3761
|
else setRefused(true);
|
|
3703
3762
|
});
|
|
3704
3763
|
};
|
|
3705
|
-
const refusal = refused && controls.notice?.failed === true ? /* @__PURE__ */ (0,
|
|
3764
|
+
const refusal = refused && controls.notice?.failed === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.ErrorBox, { as: "p", className: "mx-meet__error", message: controls.notice.text, operation: "Change this participant", origin: "meet/components", children: controls.notice.text }) : null;
|
|
3706
3765
|
if (mode === "rename" || mode === "report") {
|
|
3707
3766
|
const renaming = mode === "rename";
|
|
3708
|
-
return /* @__PURE__ */ (0,
|
|
3767
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Popover, { label: renaming ? "Rename" : "Report", onClose, placement, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3709
3768
|
"form",
|
|
3710
3769
|
{
|
|
3711
3770
|
className: "mx-meet__menu-form",
|
|
@@ -3717,9 +3776,9 @@ function PersonMenu({
|
|
|
3717
3776
|
);
|
|
3718
3777
|
},
|
|
3719
3778
|
children: [
|
|
3720
|
-
/* @__PURE__ */ (0,
|
|
3721
|
-
/* @__PURE__ */ (0,
|
|
3722
|
-
renaming ? /* @__PURE__ */ (0,
|
|
3779
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("label", { className: "mx-meet__field", children: [
|
|
3780
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__field-label", children: renaming ? "Name shown in this meeting" : `What did ${participant.displayName} do?` }),
|
|
3781
|
+
renaming ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3723
3782
|
"input",
|
|
3724
3783
|
{
|
|
3725
3784
|
className: "mx-meet__input",
|
|
@@ -3728,7 +3787,7 @@ function PersonMenu({
|
|
|
3728
3787
|
value: text,
|
|
3729
3788
|
onChange: (event) => setText(event.target.value)
|
|
3730
3789
|
}
|
|
3731
|
-
) : /* @__PURE__ */ (0,
|
|
3790
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3732
3791
|
"textarea",
|
|
3733
3792
|
{
|
|
3734
3793
|
className: "mx-meet__input",
|
|
@@ -3741,9 +3800,9 @@ function PersonMenu({
|
|
|
3741
3800
|
)
|
|
3742
3801
|
] }),
|
|
3743
3802
|
refusal,
|
|
3744
|
-
/* @__PURE__ */ (0,
|
|
3745
|
-
/* @__PURE__ */ (0,
|
|
3746
|
-
/* @__PURE__ */ (0,
|
|
3803
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__menu-actions", children: [
|
|
3804
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => setMode("menu"), children: "Back" }),
|
|
3805
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: text.trim().length === 0 || controls.busy, children: renaming ? "Rename" : "Report" })
|
|
3747
3806
|
] })
|
|
3748
3807
|
]
|
|
3749
3808
|
}
|
|
@@ -3751,12 +3810,12 @@ function PersonMenu({
|
|
|
3751
3810
|
}
|
|
3752
3811
|
if (mode === "remove" || mode === "transfer") {
|
|
3753
3812
|
const removing = mode === "remove";
|
|
3754
|
-
return /* @__PURE__ */ (0,
|
|
3755
|
-
/* @__PURE__ */ (0,
|
|
3813
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Popover, { label: removing ? "Remove" : "Make host", onClose, placement, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__menu-form", children: [
|
|
3814
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__confirm-text", children: removing ? `Remove ${participant.displayName}? They leave immediately and cannot rejoin this meeting.` : `Make ${participant.displayName} the host? They get every host control and own this meeting. You stay on as a co-host.` }),
|
|
3756
3815
|
refusal,
|
|
3757
|
-
/* @__PURE__ */ (0,
|
|
3758
|
-
/* @__PURE__ */ (0,
|
|
3759
|
-
/* @__PURE__ */ (0,
|
|
3816
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__menu-actions", children: [
|
|
3817
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => setMode("menu"), children: "Cancel" }),
|
|
3818
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3760
3819
|
"button",
|
|
3761
3820
|
{
|
|
3762
3821
|
type: "button",
|
|
@@ -3769,8 +3828,8 @@ function PersonMenu({
|
|
|
3769
3828
|
] })
|
|
3770
3829
|
] }) });
|
|
3771
3830
|
}
|
|
3772
|
-
return /* @__PURE__ */ (0,
|
|
3773
|
-
/* @__PURE__ */ (0,
|
|
3831
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Popover, { label: `Options for ${participant.displayName}`, onClose, placement, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__menu", role: "menu", children: [
|
|
3832
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3774
3833
|
MenuItem,
|
|
3775
3834
|
{
|
|
3776
3835
|
onSelect: () => {
|
|
@@ -3778,13 +3837,13 @@ function PersonMenu({
|
|
|
3778
3837
|
onClose();
|
|
3779
3838
|
},
|
|
3780
3839
|
children: [
|
|
3781
|
-
/* @__PURE__ */ (0,
|
|
3840
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PinIcon, { width: 16, height: 16 }),
|
|
3782
3841
|
" ",
|
|
3783
3842
|
pinned ? "Unpin" : "Pin for me"
|
|
3784
3843
|
]
|
|
3785
3844
|
}
|
|
3786
3845
|
),
|
|
3787
|
-
!self && !participant.isAgent && (onMessage !== void 0 || host !== null) ? /* @__PURE__ */ (0,
|
|
3846
|
+
!self && !participant.isAgent && (onMessage !== void 0 || host !== null) ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3788
3847
|
MenuItem,
|
|
3789
3848
|
{
|
|
3790
3849
|
onSelect: () => {
|
|
@@ -3796,42 +3855,42 @@ function PersonMenu({
|
|
|
3796
3855
|
onClose();
|
|
3797
3856
|
},
|
|
3798
3857
|
children: [
|
|
3799
|
-
/* @__PURE__ */ (0,
|
|
3858
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ChatIcon, { width: 16, height: 16 }),
|
|
3800
3859
|
" Message privately"
|
|
3801
3860
|
]
|
|
3802
3861
|
}
|
|
3803
3862
|
) : null,
|
|
3804
|
-
controls.isHost ? /* @__PURE__ */ (0,
|
|
3805
|
-
/* @__PURE__ */ (0,
|
|
3863
|
+
controls.isHost ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "spotlight", identity: spotlit ? null : participant.identity }), children: [
|
|
3864
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SpotlightIcon, { width: 16, height: 16 }),
|
|
3806
3865
|
" ",
|
|
3807
3866
|
spotlit ? "Remove spotlight" : "Spotlight for everyone"
|
|
3808
3867
|
] }) : null,
|
|
3809
|
-
moderate ? /* @__PURE__ */ (0,
|
|
3810
|
-
/* @__PURE__ */ (0,
|
|
3811
|
-
participant.micEnabled ? /* @__PURE__ */ (0,
|
|
3812
|
-
/* @__PURE__ */ (0,
|
|
3868
|
+
moderate ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
|
|
3869
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__menu-sep", role: "separator" }),
|
|
3870
|
+
participant.micEnabled ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "mute", identity: participant.identity }), children: [
|
|
3871
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicOffIcon, { width: 16, height: 16 }),
|
|
3813
3872
|
" Mute"
|
|
3814
|
-
] }) : !participant.isAgent ? /* @__PURE__ */ (0,
|
|
3815
|
-
/* @__PURE__ */ (0,
|
|
3873
|
+
] }) : !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "ask_unmute", identity: participant.identity }), children: [
|
|
3874
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(MicIcon, { width: 16, height: 16 }),
|
|
3816
3875
|
" Ask to unmute"
|
|
3817
3876
|
] }) : null,
|
|
3818
|
-
participant.cameraEnabled ? /* @__PURE__ */ (0,
|
|
3819
|
-
/* @__PURE__ */ (0,
|
|
3877
|
+
participant.cameraEnabled ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "stop_video", identity: participant.identity }), children: [
|
|
3878
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CameraOffIcon, { width: 16, height: 16 }),
|
|
3820
3879
|
" Stop video"
|
|
3821
3880
|
] }) : null,
|
|
3822
|
-
participant.screenSharing ? /* @__PURE__ */ (0,
|
|
3823
|
-
/* @__PURE__ */ (0,
|
|
3881
|
+
participant.screenSharing ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "stop_screen", identity: participant.identity }), children: [
|
|
3882
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ScreenShareIcon, { width: 16, height: 16 }),
|
|
3824
3883
|
" Stop screen share"
|
|
3825
3884
|
] }) : null,
|
|
3826
|
-
participant.handRaised ? /* @__PURE__ */ (0,
|
|
3827
|
-
/* @__PURE__ */ (0,
|
|
3885
|
+
participant.handRaised ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "lower_hand", identity: participant.identity }), children: [
|
|
3886
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(HandIcon, { width: 16, height: 16 }),
|
|
3828
3887
|
" Lower hand"
|
|
3829
3888
|
] }) : null,
|
|
3830
|
-
hasAccount && !participant.isAgent && participant.role !== "cohost" ? /* @__PURE__ */ (0,
|
|
3831
|
-
/* @__PURE__ */ (0,
|
|
3889
|
+
hasAccount && !participant.isAgent && participant.role !== "cohost" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "make_cohost", identity: participant.identity }), children: [
|
|
3890
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PeopleIcon, { width: 16, height: 16 }),
|
|
3832
3891
|
" Make co-host"
|
|
3833
3892
|
] }) : null,
|
|
3834
|
-
!participant.isAgent ? /* @__PURE__ */ (0,
|
|
3893
|
+
!participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3835
3894
|
MenuItem,
|
|
3836
3895
|
{
|
|
3837
3896
|
onSelect: () => {
|
|
@@ -3839,21 +3898,21 @@ function PersonMenu({
|
|
|
3839
3898
|
setMode("rename");
|
|
3840
3899
|
},
|
|
3841
3900
|
children: [
|
|
3842
|
-
/* @__PURE__ */ (0,
|
|
3901
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PencilIcon, { width: 16, height: 16 }),
|
|
3843
3902
|
" Rename"
|
|
3844
3903
|
]
|
|
3845
3904
|
}
|
|
3846
3905
|
) : null
|
|
3847
3906
|
] }) : null,
|
|
3848
|
-
controls.isOwner && participant.role === "cohost" ? /* @__PURE__ */ (0,
|
|
3849
|
-
/* @__PURE__ */ (0,
|
|
3907
|
+
controls.isOwner && participant.role === "cohost" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => act({ action: "revoke_cohost", identity: participant.identity }), children: [
|
|
3908
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PeopleIcon, { width: 16, height: 16 }),
|
|
3850
3909
|
" Remove co-host"
|
|
3851
3910
|
] }) : null,
|
|
3852
|
-
controls.isOwner && !self && hasAccount && !participant.isAgent ? /* @__PURE__ */ (0,
|
|
3853
|
-
/* @__PURE__ */ (0,
|
|
3911
|
+
controls.isOwner && !self && hasAccount && !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { onSelect: () => setMode("transfer"), children: [
|
|
3912
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SpotlightIcon, { width: 16, height: 16 }),
|
|
3854
3913
|
" Make host"
|
|
3855
3914
|
] }) : null,
|
|
3856
|
-
self ? /* @__PURE__ */ (0,
|
|
3915
|
+
self ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3857
3916
|
MenuItem,
|
|
3858
3917
|
{
|
|
3859
3918
|
onSelect: () => {
|
|
@@ -3861,12 +3920,12 @@ function PersonMenu({
|
|
|
3861
3920
|
setMode("rename");
|
|
3862
3921
|
},
|
|
3863
3922
|
children: [
|
|
3864
|
-
/* @__PURE__ */ (0,
|
|
3923
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PencilIcon, { width: 16, height: 16 }),
|
|
3865
3924
|
" Rename yourself"
|
|
3866
3925
|
]
|
|
3867
3926
|
}
|
|
3868
3927
|
) : null,
|
|
3869
|
-
!self && !participant.isAgent ? /* @__PURE__ */ (0,
|
|
3928
|
+
!self && !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3870
3929
|
MenuItem,
|
|
3871
3930
|
{
|
|
3872
3931
|
onSelect: () => {
|
|
@@ -3874,21 +3933,21 @@ function PersonMenu({
|
|
|
3874
3933
|
setMode("report");
|
|
3875
3934
|
},
|
|
3876
3935
|
children: [
|
|
3877
|
-
/* @__PURE__ */ (0,
|
|
3936
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(FlagIcon, { width: 16, height: 16 }),
|
|
3878
3937
|
" Report"
|
|
3879
3938
|
]
|
|
3880
3939
|
}
|
|
3881
3940
|
) : null,
|
|
3882
|
-
moderate && !participant.isAgent ? /* @__PURE__ */ (0,
|
|
3883
|
-
/* @__PURE__ */ (0,
|
|
3941
|
+
moderate && !participant.isAgent ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(MenuItem, { danger: true, onSelect: () => setMode("remove"), children: [
|
|
3942
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CloseIcon, { width: 16, height: 16 }),
|
|
3884
3943
|
" Remove from meeting"
|
|
3885
3944
|
] }) : null
|
|
3886
3945
|
] }) });
|
|
3887
3946
|
}
|
|
3888
3947
|
function SettingsPanel({ onClose }) {
|
|
3889
3948
|
const host = useRequiredMeetHost();
|
|
3890
|
-
return /* @__PURE__ */ (0,
|
|
3891
|
-
/* @__PURE__ */ (0,
|
|
3949
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(PanelShell, { title: "Settings", onClose, children: [
|
|
3950
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3892
3951
|
DeviceSettings,
|
|
3893
3952
|
{
|
|
3894
3953
|
onPick: (kind, deviceId) => {
|
|
@@ -3897,8 +3956,8 @@ function SettingsPanel({ onClose }) {
|
|
|
3897
3956
|
}
|
|
3898
3957
|
}
|
|
3899
3958
|
),
|
|
3900
|
-
/* @__PURE__ */ (0,
|
|
3901
|
-
/* @__PURE__ */ (0,
|
|
3959
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(EffectsSettings, {}),
|
|
3960
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CaptionLanguageSettings, {})
|
|
3902
3961
|
] });
|
|
3903
3962
|
}
|
|
3904
3963
|
function DeviceSettings({
|
|
@@ -3910,15 +3969,15 @@ function DeviceSettings({
|
|
|
3910
3969
|
const speaker = devices?.selected.audiooutput ?? host.devices.resolve("audiooutput");
|
|
3911
3970
|
const stream = useMicrophoneStream(microphone);
|
|
3912
3971
|
const level = useAudioLevel(stream);
|
|
3913
|
-
const [testing, setTesting] = (0,
|
|
3914
|
-
(0,
|
|
3972
|
+
const [testing, setTesting] = (0, import_react10.useState)(false);
|
|
3973
|
+
(0, import_react10.useEffect)(() => {
|
|
3915
3974
|
void host.devices.refresh();
|
|
3916
3975
|
}, [host]);
|
|
3917
|
-
return /* @__PURE__ */ (0,
|
|
3918
|
-
/* @__PURE__ */ (0,
|
|
3919
|
-
/* @__PURE__ */ (0,
|
|
3920
|
-
/* @__PURE__ */ (0,
|
|
3921
|
-
/* @__PURE__ */ (0,
|
|
3976
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__section", "aria-label": "Devices", children: [
|
|
3977
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DevicePicker, { kind: "audioinput", label: "Microphone", onPick }),
|
|
3978
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__meter", role: "meter", "aria-label": "Microphone level", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(level * 100), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { width: `${Math.min(100, Math.round(level * 160))}%` } }) }),
|
|
3979
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DevicePicker, { kind: "audiooutput", label: "Speaker", onPick }),
|
|
3980
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
3922
3981
|
"button",
|
|
3923
3982
|
{
|
|
3924
3983
|
type: "button",
|
|
@@ -3929,19 +3988,19 @@ function DeviceSettings({
|
|
|
3929
3988
|
void playTestSound(speaker).finally(() => setTesting(false));
|
|
3930
3989
|
},
|
|
3931
3990
|
children: [
|
|
3932
|
-
/* @__PURE__ */ (0,
|
|
3991
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SpeakerIcon, { width: 14, height: 14 }),
|
|
3933
3992
|
" ",
|
|
3934
3993
|
testing ? "Playing\u2026" : "Test speaker"
|
|
3935
3994
|
]
|
|
3936
3995
|
}
|
|
3937
3996
|
),
|
|
3938
|
-
/* @__PURE__ */ (0,
|
|
3997
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DevicePicker, { kind: "videoinput", label: "Camera", onPick })
|
|
3939
3998
|
] });
|
|
3940
3999
|
}
|
|
3941
4000
|
function EffectsSettings({ preview }) {
|
|
3942
4001
|
const effects = useMediaEffects();
|
|
3943
|
-
const [error, setError] = (0,
|
|
3944
|
-
const fileRef = (0,
|
|
4002
|
+
const [error, setError] = (0, import_react10.useState)(null);
|
|
4003
|
+
const fileRef = (0, import_react10.useRef)(null);
|
|
3945
4004
|
const supported = effects.backgroundsSupported || preview != null || videoEffectsSupported();
|
|
3946
4005
|
const apply = (next) => {
|
|
3947
4006
|
setError(null);
|
|
@@ -3953,9 +4012,9 @@ function EffectsSettings({ preview }) {
|
|
|
3953
4012
|
);
|
|
3954
4013
|
}
|
|
3955
4014
|
};
|
|
3956
|
-
return /* @__PURE__ */ (0,
|
|
3957
|
-
/* @__PURE__ */ (0,
|
|
3958
|
-
/* @__PURE__ */ (0,
|
|
4015
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__section", "aria-label": "Effects", children: [
|
|
4016
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__check", children: [
|
|
4017
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3959
4018
|
import_design_system.Checkbox,
|
|
3960
4019
|
{
|
|
3961
4020
|
id: "mx-meet-noise",
|
|
@@ -3963,14 +4022,14 @@ function EffectsSettings({ preview }) {
|
|
|
3963
4022
|
onCheckedChange: (checked) => apply({ noiseSuppression: checked === true })
|
|
3964
4023
|
}
|
|
3965
4024
|
),
|
|
3966
|
-
/* @__PURE__ */ (0,
|
|
3967
|
-
/* @__PURE__ */ (0,
|
|
3968
|
-
/* @__PURE__ */ (0,
|
|
4025
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__check-text", children: [
|
|
4026
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Label, { htmlFor: "mx-meet-noise", children: "Noise suppression" }),
|
|
4027
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__hint", children: "Filters keyboards, fans and background chatter." })
|
|
3969
4028
|
] })
|
|
3970
4029
|
] }),
|
|
3971
|
-
supported ? /* @__PURE__ */ (0,
|
|
3972
|
-
/* @__PURE__ */ (0,
|
|
3973
|
-
/* @__PURE__ */ (0,
|
|
4030
|
+
supported ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__field", children: [
|
|
4031
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Label, { children: "Background" }),
|
|
4032
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3974
4033
|
import_design_system.SegmentedControl,
|
|
3975
4034
|
{
|
|
3976
4035
|
fullWidth: true,
|
|
@@ -3989,7 +4048,7 @@ function EffectsSettings({ preview }) {
|
|
|
3989
4048
|
]
|
|
3990
4049
|
}
|
|
3991
4050
|
),
|
|
3992
|
-
/* @__PURE__ */ (0,
|
|
4051
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3993
4052
|
"input",
|
|
3994
4053
|
{
|
|
3995
4054
|
ref: fileRef,
|
|
@@ -4004,7 +4063,7 @@ function EffectsSettings({ preview }) {
|
|
|
4004
4063
|
}
|
|
4005
4064
|
}
|
|
4006
4065
|
),
|
|
4007
|
-
error !== null ? /* @__PURE__ */ (0,
|
|
4066
|
+
error !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__error", children: error }) : null
|
|
4008
4067
|
] }) : null
|
|
4009
4068
|
] });
|
|
4010
4069
|
}
|
|
@@ -4063,8 +4122,8 @@ async function playTestSound(sinkId) {
|
|
|
4063
4122
|
await context.close();
|
|
4064
4123
|
}
|
|
4065
4124
|
function useMicrophoneStream(deviceId) {
|
|
4066
|
-
const [stream, setStream] = (0,
|
|
4067
|
-
(0,
|
|
4125
|
+
const [stream, setStream] = (0, import_react10.useState)(null);
|
|
4126
|
+
(0, import_react10.useEffect)(() => {
|
|
4068
4127
|
if (deviceId === "off") return void 0;
|
|
4069
4128
|
let live = true;
|
|
4070
4129
|
let opened = null;
|
|
@@ -4089,31 +4148,31 @@ function useMicrophoneStream(deviceId) {
|
|
|
4089
4148
|
function LobbyPanel() {
|
|
4090
4149
|
const lobby = useLobby();
|
|
4091
4150
|
if (!lobby.canAdmit || lobby.waiting.length === 0) return null;
|
|
4092
|
-
return /* @__PURE__ */ (0,
|
|
4093
|
-
/* @__PURE__ */ (0,
|
|
4094
|
-
/* @__PURE__ */ (0,
|
|
4095
|
-
/* @__PURE__ */ (0,
|
|
4151
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__lobby", "aria-label": "Waiting room", children: [
|
|
4152
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("header", { className: "mx-meet__lobby-head", children: [
|
|
4153
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "mx-meet__lobby-title", children: lobby.waiting.length === 1 ? "1 person is waiting" : `${lobby.waiting.length} people are waiting` }),
|
|
4154
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "mx-meet__link", onClick: () => void lobby.admitAll(), children: "Admit all" })
|
|
4096
4155
|
] }),
|
|
4097
|
-
/* @__PURE__ */ (0,
|
|
4156
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ul", { className: "mx-meet__lobby-list", children: lobby.waiting.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
4098
4157
|
"li",
|
|
4099
4158
|
{
|
|
4100
4159
|
className: "mx-meet__lobby-row",
|
|
4101
4160
|
"data-meet-lobby-entry": "",
|
|
4102
4161
|
"data-meet-participant-name": entry.displayName,
|
|
4103
4162
|
children: [
|
|
4104
|
-
/* @__PURE__ */ (0,
|
|
4105
|
-
/* @__PURE__ */ (0,
|
|
4163
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Avatar, { name: entry.displayName, url: entry.avatarUrl, size: 32 }),
|
|
4164
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__person-name", children: [
|
|
4106
4165
|
entry.displayName,
|
|
4107
|
-
entry.userId === null ? /* @__PURE__ */ (0,
|
|
4166
|
+
entry.userId === null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", children: "Guest" }) : null
|
|
4108
4167
|
] }),
|
|
4109
|
-
/* @__PURE__ */ (0,
|
|
4110
|
-
/* @__PURE__ */ (0,
|
|
4168
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlButton, { label: `Admit ${entry.displayName}`, onClick: () => void lobby.admit(entry), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CheckIcon, { width: 16, height: 16 }) }),
|
|
4169
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4111
4170
|
ControlButton,
|
|
4112
4171
|
{
|
|
4113
4172
|
label: `Deny ${entry.displayName}`,
|
|
4114
4173
|
danger: true,
|
|
4115
4174
|
onClick: () => void lobby.deny(entry),
|
|
4116
|
-
children: /* @__PURE__ */ (0,
|
|
4175
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(CloseIcon, { width: 16, height: 16 })
|
|
4117
4176
|
}
|
|
4118
4177
|
)
|
|
4119
4178
|
]
|
|
@@ -4126,21 +4185,21 @@ function NoteTakerRow() {
|
|
|
4126
4185
|
const ai = useMeetAi();
|
|
4127
4186
|
const status = ai.noteTaker;
|
|
4128
4187
|
const duplicateError = status.refusal !== null && ai.error !== null && status.refusal.reason === ai.error.message && status.refusal.remedy === ai.error.remedy;
|
|
4129
|
-
return /* @__PURE__ */ (0,
|
|
4130
|
-
/* @__PURE__ */ (0,
|
|
4131
|
-
/* @__PURE__ */ (0,
|
|
4188
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__note-taker", "aria-label": "Note-taker", children: [
|
|
4189
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: `mx-meet__note-taker-state mx-meet__note-taker-state--${status.state}`, children: [
|
|
4190
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__note-taker-dot", "aria-hidden": "true" }),
|
|
4132
4191
|
ai.noteTakerLabel
|
|
4133
4192
|
] }),
|
|
4134
|
-
status.detail !== null ? /* @__PURE__ */ (0,
|
|
4135
|
-
status.refusal !== null ? /* @__PURE__ */ (0,
|
|
4136
|
-
/* @__PURE__ */ (0,
|
|
4137
|
-
status.refusal.remedy.length > 0 ? /* @__PURE__ */ (0,
|
|
4193
|
+
status.detail !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__panel-note", children: status.detail }) : null,
|
|
4194
|
+
status.refusal !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_design_system.ErrorBox, { as: "div", className: "mx-meet__refusal", error: status.refusal, operation: "Join this meeting", origin: "meet/components", children: [
|
|
4195
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-reason", children: status.refusal.reason }),
|
|
4196
|
+
status.refusal.remedy.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-remedy", children: status.refusal.remedy }) : null
|
|
4138
4197
|
] }) : null,
|
|
4139
|
-
ai.error !== null && !duplicateError ? /* @__PURE__ */ (0,
|
|
4140
|
-
/* @__PURE__ */ (0,
|
|
4141
|
-
/* @__PURE__ */ (0,
|
|
4198
|
+
ai.error !== null && !duplicateError ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_design_system.ErrorBox, { as: "div", className: "mx-meet__refusal", error: ai.error, operation: "Run the meeting assistant", origin: "meet/components", children: [
|
|
4199
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-reason", children: ai.error.message }),
|
|
4200
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-remedy", children: ai.error.remedy })
|
|
4142
4201
|
] }) : null,
|
|
4143
|
-
ai.canControlNoteTaker ? status.state === "transcribing" || status.state === "joining" || status.state === "handoff_pending" ? /* @__PURE__ */ (0,
|
|
4202
|
+
ai.canControlNoteTaker ? status.state === "transcribing" || status.state === "joining" || status.state === "handoff_pending" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4144
4203
|
"button",
|
|
4145
4204
|
{
|
|
4146
4205
|
type: "button",
|
|
@@ -4148,7 +4207,7 @@ function NoteTakerRow() {
|
|
|
4148
4207
|
onClick: () => void ai.stopNoteTaker(),
|
|
4149
4208
|
children: "Dismiss the note-taker"
|
|
4150
4209
|
}
|
|
4151
|
-
) : /* @__PURE__ */ (0,
|
|
4210
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4152
4211
|
"button",
|
|
4153
4212
|
{
|
|
4154
4213
|
type: "button",
|
|
@@ -4164,24 +4223,24 @@ function NoteList({
|
|
|
4164
4223
|
notes,
|
|
4165
4224
|
empty
|
|
4166
4225
|
}) {
|
|
4167
|
-
return /* @__PURE__ */ (0,
|
|
4168
|
-
/* @__PURE__ */ (0,
|
|
4169
|
-
notes.length === 0 ? /* @__PURE__ */ (0,
|
|
4226
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__note-group", "aria-label": title, children: [
|
|
4227
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "mx-meet__note-group-title", children: title }),
|
|
4228
|
+
notes.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__panel-note", children: empty }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ul", { className: "mx-meet__notes", children: notes.map((note) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("li", { className: "mx-meet__note", children: [
|
|
4170
4229
|
note.text,
|
|
4171
|
-
note.assigneeDisplayName !== void 0 && note.assigneeDisplayName !== null ? /* @__PURE__ */ (0,
|
|
4230
|
+
note.assigneeDisplayName !== void 0 && note.assigneeDisplayName !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__assignee", children: note.assigneeDisplayName }) : null
|
|
4172
4231
|
] }, note.id)) })
|
|
4173
4232
|
] });
|
|
4174
4233
|
}
|
|
4175
4234
|
function AiPanel({ onClose }) {
|
|
4176
4235
|
const ai = useMeetAi();
|
|
4177
|
-
const [question, setQuestion] = (0,
|
|
4178
|
-
return /* @__PURE__ */ (0,
|
|
4179
|
-
/* @__PURE__ */ (0,
|
|
4180
|
-
ai.summary !== null ? /* @__PURE__ */ (0,
|
|
4181
|
-
/* @__PURE__ */ (0,
|
|
4182
|
-
/* @__PURE__ */ (0,
|
|
4236
|
+
const [question, setQuestion] = (0, import_react10.useState)("");
|
|
4237
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(PanelShell, { title: "Meeting assistant", onClose, children: [
|
|
4238
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(NoteTakerRow, {}),
|
|
4239
|
+
ai.summary !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__note-group", "aria-label": "Summary", children: [
|
|
4240
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "mx-meet__note-group-title", children: "Summary" }),
|
|
4241
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__summary", children: ai.summary.text })
|
|
4183
4242
|
] }) : null,
|
|
4184
|
-
ai.wrapUp !== null ? /* @__PURE__ */ (0,
|
|
4243
|
+
ai.wrapUp !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__wrap-up-notice", role: "status", children: [
|
|
4185
4244
|
"The wrap-up is written \u2014 ",
|
|
4186
4245
|
ai.wrapUp.noteIds.length,
|
|
4187
4246
|
" ",
|
|
@@ -4193,7 +4252,7 @@ function AiPanel({ onClose }) {
|
|
|
4193
4252
|
ai.wrapUp.segmentCount === 1 ? "transcript line" : "transcript lines",
|
|
4194
4253
|
"."
|
|
4195
4254
|
] }) : null,
|
|
4196
|
-
/* @__PURE__ */ (0,
|
|
4255
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4197
4256
|
NoteList,
|
|
4198
4257
|
{
|
|
4199
4258
|
title: "Notes",
|
|
@@ -4201,7 +4260,7 @@ function AiPanel({ onClose }) {
|
|
|
4201
4260
|
empty: "Notes appear here as the meeting goes on."
|
|
4202
4261
|
}
|
|
4203
4262
|
),
|
|
4204
|
-
/* @__PURE__ */ (0,
|
|
4263
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4205
4264
|
NoteList,
|
|
4206
4265
|
{
|
|
4207
4266
|
title: "Decisions",
|
|
@@ -4209,7 +4268,7 @@ function AiPanel({ onClose }) {
|
|
|
4209
4268
|
empty: "Nothing has been decided yet."
|
|
4210
4269
|
}
|
|
4211
4270
|
),
|
|
4212
|
-
/* @__PURE__ */ (0,
|
|
4271
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4213
4272
|
NoteList,
|
|
4214
4273
|
{
|
|
4215
4274
|
title: "Action items",
|
|
@@ -4217,21 +4276,21 @@ function AiPanel({ onClose }) {
|
|
|
4217
4276
|
empty: "No action items yet."
|
|
4218
4277
|
}
|
|
4219
4278
|
),
|
|
4220
|
-
ai.transcript.length > 0 ? /* @__PURE__ */ (0,
|
|
4221
|
-
/* @__PURE__ */ (0,
|
|
4222
|
-
/* @__PURE__ */ (0,
|
|
4279
|
+
ai.transcript.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__note-group", "aria-label": "Transcript", children: [
|
|
4280
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "mx-meet__note-group-title", children: "Transcript" }),
|
|
4281
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ul", { className: "mx-meet__transcript", children: ai.transcript.map((line) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
4223
4282
|
"li",
|
|
4224
4283
|
{
|
|
4225
4284
|
className: line.final && line.source === "record" ? "mx-meet__line" : "mx-meet__line mx-meet__line--interim",
|
|
4226
4285
|
children: [
|
|
4227
|
-
/* @__PURE__ */ (0,
|
|
4228
|
-
/* @__PURE__ */ (0,
|
|
4286
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("strong", { children: line.speaker }),
|
|
4287
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: line.text })
|
|
4229
4288
|
]
|
|
4230
4289
|
},
|
|
4231
4290
|
line.id
|
|
4232
4291
|
)) })
|
|
4233
4292
|
] }) : null,
|
|
4234
|
-
/* @__PURE__ */ (0,
|
|
4293
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
4235
4294
|
"form",
|
|
4236
4295
|
{
|
|
4237
4296
|
className: "mx-meet__composer",
|
|
@@ -4242,7 +4301,7 @@ function AiPanel({ onClose }) {
|
|
|
4242
4301
|
void ai.ask(asked);
|
|
4243
4302
|
},
|
|
4244
4303
|
children: [
|
|
4245
|
-
/* @__PURE__ */ (0,
|
|
4304
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4246
4305
|
"input",
|
|
4247
4306
|
{
|
|
4248
4307
|
className: "mx-meet__input",
|
|
@@ -4252,13 +4311,13 @@ function AiPanel({ onClose }) {
|
|
|
4252
4311
|
"aria-label": "Ask about this meeting"
|
|
4253
4312
|
}
|
|
4254
4313
|
),
|
|
4255
|
-
/* @__PURE__ */ (0,
|
|
4314
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "submit", className: "mx-meet__send", disabled: ai.asking, children: ai.asking ? "Asking\u2026" : "Ask" })
|
|
4256
4315
|
]
|
|
4257
4316
|
}
|
|
4258
4317
|
),
|
|
4259
|
-
ai.asking && ai.phase !== null ? /* @__PURE__ */ (0,
|
|
4260
|
-
ai.answer !== null ? /* @__PURE__ */ (0,
|
|
4261
|
-
ai.answer !== null && ai.coverage !== null ? /* @__PURE__ */ (0,
|
|
4318
|
+
ai.asking && ai.phase !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__panel-note", role: "status", children: ai.phase }) : null,
|
|
4319
|
+
ai.answer !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__answer", children: ai.answer }) : null,
|
|
4320
|
+
ai.answer !== null && ai.coverage !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__coverage", children: [
|
|
4262
4321
|
"Answered from ",
|
|
4263
4322
|
ai.coverage.segmentsUsed,
|
|
4264
4323
|
" of ",
|
|
@@ -4267,9 +4326,9 @@ function AiPanel({ onClose }) {
|
|
|
4267
4326
|
ai.coverage.truncated ? " (the oldest were left out)" : "",
|
|
4268
4327
|
"."
|
|
4269
4328
|
] }) : null,
|
|
4270
|
-
ai.error !== null ? /* @__PURE__ */ (0,
|
|
4271
|
-
/* @__PURE__ */ (0,
|
|
4272
|
-
/* @__PURE__ */ (0,
|
|
4329
|
+
ai.error !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_design_system.ErrorBox, { as: "div", className: "mx-meet__refusal", error: ai.error, operation: "Run the meeting assistant", origin: "meet/components", children: [
|
|
4330
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-reason", children: ai.error.message }),
|
|
4331
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-remedy", children: ai.error.remedy })
|
|
4273
4332
|
] }) : null
|
|
4274
4333
|
] });
|
|
4275
4334
|
}
|
|
@@ -4278,30 +4337,30 @@ function Captions({ lines = 3 }) {
|
|
|
4278
4337
|
const visible = ai.transcript.slice(-lines);
|
|
4279
4338
|
const translation = useCaptionTranslation(visible);
|
|
4280
4339
|
if (visible.length === 0) return null;
|
|
4281
|
-
return /* @__PURE__ */ (0,
|
|
4340
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__captions", "aria-live": "polite", "aria-label": "Live captions", children: [
|
|
4282
4341
|
visible.map((line) => {
|
|
4283
4342
|
const translated = translation.language === null ? void 0 : translation.translations[line.id];
|
|
4284
|
-
return /* @__PURE__ */ (0,
|
|
4343
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
4285
4344
|
"p",
|
|
4286
4345
|
{
|
|
4287
4346
|
className: line.final ? "mx-meet__caption" : "mx-meet__caption mx-meet__caption--interim",
|
|
4288
4347
|
children: [
|
|
4289
|
-
/* @__PURE__ */ (0,
|
|
4348
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("strong", { children: line.speaker }),
|
|
4290
4349
|
" ",
|
|
4291
4350
|
translated ?? line.text,
|
|
4292
|
-
translated !== void 0 ? /* @__PURE__ */ (0,
|
|
4351
|
+
translated !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__caption-original", children: line.text }) : null
|
|
4293
4352
|
]
|
|
4294
4353
|
},
|
|
4295
4354
|
line.id
|
|
4296
4355
|
);
|
|
4297
4356
|
}),
|
|
4298
|
-
translation.language !== null && translation.error !== null ? /* @__PURE__ */ (0,
|
|
4357
|
+
translation.language !== null && translation.error !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__caption mx-meet__caption--interim", children: translation.error }) : null
|
|
4299
4358
|
] });
|
|
4300
4359
|
}
|
|
4301
4360
|
function ConsentNotice() {
|
|
4302
4361
|
const notice = useConsentNotice();
|
|
4303
4362
|
if (notice === null) return null;
|
|
4304
|
-
return /* @__PURE__ */ (0,
|
|
4363
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__consent", role: "status", children: notice });
|
|
4305
4364
|
}
|
|
4306
4365
|
function AttendanceNotice() {
|
|
4307
4366
|
const media = useLocalMedia();
|
|
@@ -4309,7 +4368,7 @@ function AttendanceNotice() {
|
|
|
4309
4368
|
if (notice === null) return null;
|
|
4310
4369
|
const refused = media.microphone.unavailable;
|
|
4311
4370
|
const code = microphoneNoticeCode(media.microphone);
|
|
4312
|
-
return /* @__PURE__ */ (0,
|
|
4371
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
4313
4372
|
"p",
|
|
4314
4373
|
{
|
|
4315
4374
|
className: "mx-meet__banner mx-meet__banner--attendance",
|
|
@@ -4317,21 +4376,22 @@ function AttendanceNotice() {
|
|
|
4317
4376
|
...code !== null ? { "data-meet-notice": code } : {},
|
|
4318
4377
|
children: [
|
|
4319
4378
|
notice,
|
|
4320
|
-
refused === null ? null : /* @__PURE__ */ (0,
|
|
4379
|
+
refused === null ? null : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__remedy", children: refused.remedy })
|
|
4321
4380
|
]
|
|
4322
4381
|
}
|
|
4323
4382
|
);
|
|
4324
4383
|
}
|
|
4325
4384
|
function PreJoin(props) {
|
|
4326
4385
|
const host = useMeetHost();
|
|
4327
|
-
if (host === null) return /* @__PURE__ */ (0,
|
|
4328
|
-
return /* @__PURE__ */ (0,
|
|
4386
|
+
if (host === null) return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(InertNotice, { what: "This meeting" });
|
|
4387
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PreJoinBody, { ...props, host });
|
|
4329
4388
|
}
|
|
4330
4389
|
function PreJoinBody({
|
|
4331
4390
|
roomName,
|
|
4332
4391
|
meetingId,
|
|
4333
4392
|
slug,
|
|
4334
4393
|
onJoined,
|
|
4394
|
+
observe: observe2 = false,
|
|
4335
4395
|
host
|
|
4336
4396
|
}) {
|
|
4337
4397
|
const room = useRoom();
|
|
@@ -4339,21 +4399,21 @@ function PreJoinBody({
|
|
|
4339
4399
|
const recording = useRecording();
|
|
4340
4400
|
const effects = useMediaEffects();
|
|
4341
4401
|
const { notice } = useModerationNotice();
|
|
4342
|
-
const [mode, setMode] = (0,
|
|
4343
|
-
const [microphone, setMicrophone] = (0,
|
|
4344
|
-
const [joining, setJoining] = (0,
|
|
4402
|
+
const [mode, setMode] = (0, import_react10.useState)("video");
|
|
4403
|
+
const [microphone, setMicrophone] = (0, import_react10.useState)(true);
|
|
4404
|
+
const [joining, setJoining] = (0, import_react10.useState)(false);
|
|
4345
4405
|
const camera = devices?.selected.videoinput ?? host.devices.resolve("videoinput");
|
|
4346
4406
|
const mic = devices?.selected.audioinput ?? host.devices.resolve("audioinput");
|
|
4347
4407
|
const preview = useCameraPreview(mode === "video" ? camera : void 0, effects.effects);
|
|
4348
4408
|
const micStream = useMicrophoneStream(microphone ? mic : "off");
|
|
4349
4409
|
const level = useAudioLevel(micStream);
|
|
4350
|
-
const [speakerTesting, setSpeakerTesting] = (0,
|
|
4351
|
-
(0,
|
|
4410
|
+
const [speakerTesting, setSpeakerTesting] = (0, import_react10.useState)(false);
|
|
4411
|
+
(0, import_react10.useEffect)(() => {
|
|
4352
4412
|
void host.devices.refresh();
|
|
4353
4413
|
}, [host]);
|
|
4354
|
-
return /* @__PURE__ */ (0,
|
|
4355
|
-
/* @__PURE__ */ (0,
|
|
4356
|
-
mode === "video" && preview.preview !== null ? /* @__PURE__ */ (0,
|
|
4414
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__prejoin", children: [
|
|
4415
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__preview", children: [
|
|
4416
|
+
mode === "video" && preview.preview !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4357
4417
|
"video",
|
|
4358
4418
|
{
|
|
4359
4419
|
className: "mx-meet__video mx-meet__video--mirror",
|
|
@@ -4364,16 +4424,16 @@ function PreJoinBody({
|
|
|
4364
4424
|
if (element !== null) preview.preview?.attach(element);
|
|
4365
4425
|
}
|
|
4366
4426
|
}
|
|
4367
|
-
) : /* @__PURE__ */ (0,
|
|
4368
|
-
mode === "video" && preview.error !== null ? /* @__PURE__ */ (0,
|
|
4369
|
-
microphone && micStream !== null ? /* @__PURE__ */ (0,
|
|
4427
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__tile-placeholder", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Avatar, { name: host.identity.displayName, url: host.identity.avatarUrl, size: 96 }) }),
|
|
4428
|
+
mode === "video" && preview.error !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__preview-note", children: preview.error }) : null,
|
|
4429
|
+
microphone && micStream !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__meter mx-meet__meter--preview", role: "meter", "aria-label": "Microphone level", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(level * 100), children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { style: { width: `${Math.min(100, Math.round(level * 160))}%` } }) }) : null
|
|
4370
4430
|
] }),
|
|
4371
|
-
/* @__PURE__ */ (0,
|
|
4372
|
-
/* @__PURE__ */ (0,
|
|
4373
|
-
notice?.kind === "removed" ? /* @__PURE__ */ (0,
|
|
4374
|
-
devices?.labelsHidden === true ? /* @__PURE__ */ (0,
|
|
4431
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__prejoin-panel", children: [
|
|
4432
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h1", { className: "mx-meet__prejoin-title", children: "Ready to join?" }),
|
|
4433
|
+
notice?.kind === "removed" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__warning", children: notice.text }) : null,
|
|
4434
|
+
devices?.labelsHidden === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__panel-note", children: [
|
|
4375
4435
|
"Your browser is hiding device names until you allow camera and microphone access.",
|
|
4376
|
-
/* @__PURE__ */ (0,
|
|
4436
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4377
4437
|
"button",
|
|
4378
4438
|
{
|
|
4379
4439
|
type: "button",
|
|
@@ -4385,11 +4445,11 @@ function PreJoinBody({
|
|
|
4385
4445
|
}
|
|
4386
4446
|
)
|
|
4387
4447
|
] }) : null,
|
|
4388
|
-
devices?.fallbackNotice != null ? /* @__PURE__ */ (0,
|
|
4389
|
-
/* @__PURE__ */ (0,
|
|
4390
|
-
/* @__PURE__ */ (0,
|
|
4391
|
-
/* @__PURE__ */ (0,
|
|
4392
|
-
/* @__PURE__ */ (0,
|
|
4448
|
+
devices?.fallbackNotice != null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__warning", children: devices.fallbackNotice }) : null,
|
|
4449
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DevicePicker, { kind: "audioinput", label: "Microphone" }),
|
|
4450
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__field-row", children: [
|
|
4451
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DevicePicker, { kind: "audiooutput", label: "Speaker" }),
|
|
4452
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
4393
4453
|
import_design_system.Button,
|
|
4394
4454
|
{
|
|
4395
4455
|
type: "button",
|
|
@@ -4402,19 +4462,19 @@ function PreJoinBody({
|
|
|
4402
4462
|
);
|
|
4403
4463
|
},
|
|
4404
4464
|
children: [
|
|
4405
|
-
/* @__PURE__ */ (0,
|
|
4465
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SpeakerIcon, {}),
|
|
4406
4466
|
" ",
|
|
4407
4467
|
speakerTesting ? "Playing\u2026" : "Test"
|
|
4408
4468
|
]
|
|
4409
4469
|
}
|
|
4410
4470
|
)
|
|
4411
4471
|
] }),
|
|
4412
|
-
/* @__PURE__ */ (0,
|
|
4413
|
-
/* @__PURE__ */ (0,
|
|
4414
|
-
recording.consentNotice !== null ? /* @__PURE__ */ (0,
|
|
4415
|
-
/* @__PURE__ */ (0,
|
|
4416
|
-
/* @__PURE__ */ (0,
|
|
4417
|
-
/* @__PURE__ */ (0,
|
|
4472
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DevicePicker, { kind: "videoinput", label: "Camera" }),
|
|
4473
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(EffectsSettings, { preview: preview.preview }),
|
|
4474
|
+
recording.consentNotice !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Alert, { variant: "info", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.AlertDescription, { children: recording.consentNotice }) }) : null,
|
|
4475
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__prejoin-actions", children: [
|
|
4476
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__check", children: [
|
|
4477
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4418
4478
|
import_design_system.Checkbox,
|
|
4419
4479
|
{
|
|
4420
4480
|
id: "mx-meet-join-video",
|
|
@@ -4422,10 +4482,10 @@ function PreJoinBody({
|
|
|
4422
4482
|
onCheckedChange: (checked) => setMode(checked === true ? "video" : "audio")
|
|
4423
4483
|
}
|
|
4424
4484
|
),
|
|
4425
|
-
/* @__PURE__ */ (0,
|
|
4485
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Label, { htmlFor: "mx-meet-join-video", children: "Join with video" })
|
|
4426
4486
|
] }),
|
|
4427
|
-
/* @__PURE__ */ (0,
|
|
4428
|
-
/* @__PURE__ */ (0,
|
|
4487
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__check", children: [
|
|
4488
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4429
4489
|
import_design_system.Checkbox,
|
|
4430
4490
|
{
|
|
4431
4491
|
id: "mx-meet-join-mic",
|
|
@@ -4433,9 +4493,9 @@ function PreJoinBody({
|
|
|
4433
4493
|
onCheckedChange: (checked) => setMicrophone(checked === true)
|
|
4434
4494
|
}
|
|
4435
4495
|
),
|
|
4436
|
-
/* @__PURE__ */ (0,
|
|
4496
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Label, { htmlFor: "mx-meet-join-mic", children: "Join with microphone" })
|
|
4437
4497
|
] }),
|
|
4438
|
-
/* @__PURE__ */ (0,
|
|
4498
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4439
4499
|
import_design_system.Button,
|
|
4440
4500
|
{
|
|
4441
4501
|
type: "button",
|
|
@@ -4446,30 +4506,32 @@ function PreJoinBody({
|
|
|
4446
4506
|
preview.release();
|
|
4447
4507
|
void room.join({
|
|
4448
4508
|
roomName,
|
|
4449
|
-
|
|
4450
|
-
|
|
4509
|
+
// An observer publishes nothing: no camera, no microphone (MD-16).
|
|
4510
|
+
mode: observe2 ? "audio" : mode,
|
|
4511
|
+
microphone: observe2 ? false : microphone,
|
|
4451
4512
|
...meetingId !== void 0 ? { meetingId } : {},
|
|
4452
|
-
...slug !== void 0 ? { slug } : {}
|
|
4513
|
+
...slug !== void 0 ? { slug } : {},
|
|
4514
|
+
...observe2 ? { observe: true } : {}
|
|
4453
4515
|
}).then(() => onJoined?.()).catch(() => void 0).finally(() => setJoining(false));
|
|
4454
4516
|
},
|
|
4455
|
-
children: joining ? "Joining\u2026" : "Join now"
|
|
4517
|
+
children: joining ? "Joining\u2026" : observe2 ? "Observe" : "Join now"
|
|
4456
4518
|
}
|
|
4457
4519
|
)
|
|
4458
4520
|
] }),
|
|
4459
|
-
room.failure !== null ? /* @__PURE__ */ (0,
|
|
4521
|
+
room.failure !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__error", children: [
|
|
4460
4522
|
room.failure.message,
|
|
4461
|
-
/* @__PURE__ */ (0,
|
|
4523
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__remedy", children: room.failure.remedy })
|
|
4462
4524
|
] }) : null
|
|
4463
4525
|
] })
|
|
4464
4526
|
] });
|
|
4465
4527
|
}
|
|
4466
4528
|
function useCameraPreview(deviceId, effects) {
|
|
4467
|
-
const [preview, setPreview] = (0,
|
|
4468
|
-
const [error, setError] = (0,
|
|
4469
|
-
const current = (0,
|
|
4470
|
-
const initialEffect = (0,
|
|
4529
|
+
const [preview, setPreview] = (0, import_react10.useState)(null);
|
|
4530
|
+
const [error, setError] = (0, import_react10.useState)(null);
|
|
4531
|
+
const current = (0, import_react10.useRef)(null);
|
|
4532
|
+
const initialEffect = (0, import_react10.useRef)(toVideoEffect(effects));
|
|
4471
4533
|
initialEffect.current = toVideoEffect(effects);
|
|
4472
|
-
(0,
|
|
4534
|
+
(0, import_react10.useEffect)(() => {
|
|
4473
4535
|
if (deviceId === void 0) return void 0;
|
|
4474
4536
|
let live = true;
|
|
4475
4537
|
setError(null);
|
|
@@ -4516,9 +4578,9 @@ function DevicePicker({
|
|
|
4516
4578
|
const triggerId = `mx-meet-device-${kind}`;
|
|
4517
4579
|
const valueOf = (deviceId) => deviceId.length > 0 ? deviceId : "default";
|
|
4518
4580
|
const current = devices?.selected[kind] ?? host.devices.resolve(kind) ?? "";
|
|
4519
|
-
return /* @__PURE__ */ (0,
|
|
4520
|
-
/* @__PURE__ */ (0,
|
|
4521
|
-
/* @__PURE__ */ (0,
|
|
4581
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__field", children: [
|
|
4582
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Label, { htmlFor: triggerId, children: label }),
|
|
4583
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
4522
4584
|
import_design_system.Select,
|
|
4523
4585
|
{
|
|
4524
4586
|
...current.length > 0 ? { value: valueOf(current) } : {},
|
|
@@ -4528,8 +4590,8 @@ function DevicePicker({
|
|
|
4528
4590
|
else host.devices.select(kind, deviceId);
|
|
4529
4591
|
},
|
|
4530
4592
|
children: [
|
|
4531
|
-
/* @__PURE__ */ (0,
|
|
4532
|
-
/* @__PURE__ */ (0,
|
|
4593
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.SelectTrigger, { id: triggerId, "aria-label": label, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.SelectValue, { placeholder: label }) }),
|
|
4594
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.SelectContent, { children: list.map((device) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.SelectItem, { value: valueOf(device.deviceId), children: device.label.length > 0 ? device.label : `${label} (name hidden)` }, device.deviceId || "default")) })
|
|
4533
4595
|
]
|
|
4534
4596
|
}
|
|
4535
4597
|
)
|
|
@@ -4540,83 +4602,86 @@ function MeetSkinRoom({
|
|
|
4540
4602
|
meetingId,
|
|
4541
4603
|
slug,
|
|
4542
4604
|
onLeave,
|
|
4543
|
-
headerControls
|
|
4605
|
+
headerControls,
|
|
4606
|
+
observe: observe2 = false
|
|
4544
4607
|
}) {
|
|
4545
4608
|
const { host, snapshot, isHost } = useMeetCore();
|
|
4546
4609
|
const elapsed = useElapsed(snapshot?.meeting?.startedAt ?? null);
|
|
4547
4610
|
const phase = snapshot?.phase ?? "idle";
|
|
4548
4611
|
if (host === null) return null;
|
|
4549
4612
|
if (phase === "idle" || phase === "failed" || phase === "left") {
|
|
4550
|
-
return /* @__PURE__ */ (0,
|
|
4613
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4551
4614
|
PreJoin,
|
|
4552
4615
|
{
|
|
4553
4616
|
roomName,
|
|
4554
4617
|
...meetingId !== void 0 ? { meetingId } : {},
|
|
4555
|
-
...slug !== void 0 ? { slug } : {}
|
|
4618
|
+
...slug !== void 0 ? { slug } : {},
|
|
4619
|
+
observe: observe2
|
|
4556
4620
|
}
|
|
4557
4621
|
) });
|
|
4558
4622
|
}
|
|
4559
4623
|
if (phase === "lobby") {
|
|
4560
|
-
return /* @__PURE__ */ (0,
|
|
4624
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet mx-meet--lobby", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(WaitingRoom, { host, ...onLeave !== void 0 ? { onLeave } : {} }) });
|
|
4561
4625
|
}
|
|
4562
|
-
return /* @__PURE__ */ (0,
|
|
4563
|
-
/* @__PURE__ */ (0,
|
|
4564
|
-
/* @__PURE__ */ (0,
|
|
4565
|
-
/* @__PURE__ */ (0,
|
|
4566
|
-
/* @__PURE__ */ (0,
|
|
4567
|
-
/* @__PURE__ */ (0,
|
|
4626
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet", children: [
|
|
4627
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ConsentNotice, {}),
|
|
4628
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AttendanceNotice, {}),
|
|
4629
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("header", { className: "mx-meet__header", children: [
|
|
4630
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h1", { className: "mx-meet__title", children: snapshot?.meeting?.title ?? "Meeting" }),
|
|
4631
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__meta", children: [
|
|
4568
4632
|
participantSummary(snapshot?.participants ?? []),
|
|
4569
4633
|
elapsed > 0 ? ` \xB7 ${(0, import_format2.formatDurationMs)(elapsed)}` : ""
|
|
4570
4634
|
] }),
|
|
4571
|
-
/* @__PURE__ */ (0,
|
|
4572
|
-
snapshot?.
|
|
4573
|
-
|
|
4635
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(RecordingIndicator, {}),
|
|
4636
|
+
isObserverRole(snapshot?.grants.role) ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__badge", "data-meet-observing": "self", children: "Observing" }) : null,
|
|
4637
|
+
snapshot?.locked === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__badge", children: [
|
|
4638
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(LockIcon, { width: 12, height: 12 }),
|
|
4574
4639
|
" Locked"
|
|
4575
4640
|
] }) : null,
|
|
4576
|
-
headerControls !== void 0 && headerControls !== null ? /* @__PURE__ */ (0,
|
|
4577
|
-
isHost ? /* @__PURE__ */ (0,
|
|
4641
|
+
headerControls !== void 0 && headerControls !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__header-controls", "data-meet-header-controls": "", children: headerControls }) : null,
|
|
4642
|
+
isHost ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(HostMenu, {}) : null
|
|
4578
4643
|
] }),
|
|
4579
|
-
phase === "reconnecting" ? /* @__PURE__ */ (0,
|
|
4580
|
-
/* @__PURE__ */ (0,
|
|
4581
|
-
/* @__PURE__ */ (0,
|
|
4582
|
-
/* @__PURE__ */ (0,
|
|
4644
|
+
phase === "reconnecting" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__banner", role: "status", children: "Reconnecting\u2026" }) : null,
|
|
4645
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Stage, {}),
|
|
4646
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Captions, {}),
|
|
4647
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ControlBar, { ...onLeave !== void 0 ? { onLeave } : {} })
|
|
4583
4648
|
] });
|
|
4584
4649
|
}
|
|
4585
4650
|
function WaitingRoom({ host, onLeave }) {
|
|
4586
4651
|
const { waiting, withdraw, askAgain } = useWaiting();
|
|
4587
|
-
const [busy, setBusy] = (0,
|
|
4652
|
+
const [busy, setBusy] = (0, import_react10.useState)(false);
|
|
4588
4653
|
const admission = waiting?.admission ?? "knocking";
|
|
4589
4654
|
const run = (action) => () => {
|
|
4590
4655
|
setBusy(true);
|
|
4591
4656
|
void action().catch(() => void 0).finally(() => setBusy(false));
|
|
4592
4657
|
};
|
|
4593
|
-
const home = /* @__PURE__ */ (0,
|
|
4658
|
+
const home = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Button, { type: "button", variant: "outline", onClick: () => onLeave !== void 0 ? onLeave() : window.location.assign("/"), children: "Back to home" });
|
|
4594
4659
|
let title;
|
|
4595
4660
|
let line = null;
|
|
4596
4661
|
let actions;
|
|
4597
4662
|
switch (admission) {
|
|
4598
4663
|
case "waiting_host":
|
|
4599
4664
|
title = "Waiting for the host to start";
|
|
4600
|
-
actions = /* @__PURE__ */ (0,
|
|
4665
|
+
actions = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Button, { type: "button", variant: "outline", disabled: busy, onClick: run(withdraw), children: "Leave" });
|
|
4601
4666
|
break;
|
|
4602
4667
|
case "denied":
|
|
4603
4668
|
title = "The host declined your request";
|
|
4604
|
-
actions = /* @__PURE__ */ (0,
|
|
4605
|
-
waiting?.reknockAllowed === true ? /* @__PURE__ */ (0,
|
|
4669
|
+
actions = /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
|
|
4670
|
+
waiting?.reknockAllowed === true ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Button, { type: "button", disabled: busy, onClick: run(askAgain), children: "Ask to join again" }) : null,
|
|
4606
4671
|
home
|
|
4607
4672
|
] });
|
|
4608
4673
|
break;
|
|
4609
4674
|
case "expired":
|
|
4610
4675
|
title = "No one responded";
|
|
4611
|
-
actions = /* @__PURE__ */ (0,
|
|
4612
|
-
/* @__PURE__ */ (0,
|
|
4676
|
+
actions = /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
|
|
4677
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Button, { type: "button", disabled: busy, onClick: run(askAgain), children: "Ask again" }),
|
|
4613
4678
|
home
|
|
4614
4679
|
] });
|
|
4615
4680
|
break;
|
|
4616
4681
|
case "withdrawn":
|
|
4617
4682
|
title = "You left the waiting room";
|
|
4618
|
-
actions = /* @__PURE__ */ (0,
|
|
4619
|
-
/* @__PURE__ */ (0,
|
|
4683
|
+
actions = /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
|
|
4684
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Button, { type: "button", disabled: busy, onClick: run(askAgain), children: "Rejoin" }),
|
|
4620
4685
|
home
|
|
4621
4686
|
] });
|
|
4622
4687
|
break;
|
|
@@ -4627,23 +4692,23 @@ function WaitingRoom({ host, onLeave }) {
|
|
|
4627
4692
|
default:
|
|
4628
4693
|
title = "Waiting for the host to let you in";
|
|
4629
4694
|
line = waiting?.admittersPresent === false ? "The host isn't here yet" : null;
|
|
4630
|
-
actions = /* @__PURE__ */ (0,
|
|
4695
|
+
actions = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_design_system.Button, { type: "button", variant: "outline", disabled: busy, onClick: run(withdraw), children: "Cancel request" });
|
|
4631
4696
|
}
|
|
4632
|
-
return /* @__PURE__ */ (0,
|
|
4633
|
-
/* @__PURE__ */ (0,
|
|
4634
|
-
/* @__PURE__ */ (0,
|
|
4635
|
-
line !== null ? /* @__PURE__ */ (0,
|
|
4636
|
-
/* @__PURE__ */ (0,
|
|
4697
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__waiting", children: [
|
|
4698
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Avatar, { name: host.identity.displayName, url: host.identity.avatarUrl, size: 72 }),
|
|
4699
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h1", { className: "mx-meet__prejoin-title", children: title }),
|
|
4700
|
+
line !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__empty-body", role: "status", "data-meet-notice": "host-absent", children: line }) : null,
|
|
4701
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__waiting-actions", children: actions })
|
|
4637
4702
|
] });
|
|
4638
4703
|
}
|
|
4639
4704
|
function HostMenu() {
|
|
4640
4705
|
const host = useRequiredMeetHost();
|
|
4641
4706
|
const snapshot = useMeetSnapshot();
|
|
4642
4707
|
const end = useEndMeeting();
|
|
4643
|
-
const [confirmingEnd, setConfirmingEnd] = (0,
|
|
4708
|
+
const [confirmingEnd, setConfirmingEnd] = (0, import_react10.useState)(false);
|
|
4644
4709
|
const locked = snapshot?.locked === true;
|
|
4645
|
-
return /* @__PURE__ */ (0,
|
|
4646
|
-
/* @__PURE__ */ (0,
|
|
4710
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mx-meet__host-menu", children: [
|
|
4711
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4647
4712
|
"button",
|
|
4648
4713
|
{
|
|
4649
4714
|
type: "button",
|
|
@@ -4654,9 +4719,9 @@ function HostMenu() {
|
|
|
4654
4719
|
children: locked ? "Unlock meeting" : "Lock meeting"
|
|
4655
4720
|
}
|
|
4656
4721
|
),
|
|
4657
|
-
end.canEnd ? confirmingEnd ? /* @__PURE__ */ (0,
|
|
4658
|
-
/* @__PURE__ */ (0,
|
|
4659
|
-
/* @__PURE__ */ (0,
|
|
4722
|
+
end.canEnd ? confirmingEnd ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("span", { className: "mx-meet__confirm", role: "group", "aria-label": "End this meeting?", children: [
|
|
4723
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__confirm-text", children: "End it for everyone? Every participant is disconnected, the note-taker stops, and the wrap-up is written. Nobody can rejoin this meeting afterwards." }),
|
|
4724
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4660
4725
|
"button",
|
|
4661
4726
|
{
|
|
4662
4727
|
type: "button",
|
|
@@ -4668,7 +4733,7 @@ function HostMenu() {
|
|
|
4668
4733
|
children: "End it"
|
|
4669
4734
|
}
|
|
4670
4735
|
),
|
|
4671
|
-
/* @__PURE__ */ (0,
|
|
4736
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4672
4737
|
"button",
|
|
4673
4738
|
{
|
|
4674
4739
|
type: "button",
|
|
@@ -4677,7 +4742,7 @@ function HostMenu() {
|
|
|
4677
4742
|
children: "Keep it running"
|
|
4678
4743
|
}
|
|
4679
4744
|
)
|
|
4680
|
-
] }) : /* @__PURE__ */ (0,
|
|
4745
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4681
4746
|
"button",
|
|
4682
4747
|
{
|
|
4683
4748
|
type: "button",
|
|
@@ -4686,14 +4751,14 @@ function HostMenu() {
|
|
|
4686
4751
|
children: end.ending ? "Ending\u2026" : "End meeting for everyone"
|
|
4687
4752
|
}
|
|
4688
4753
|
) : null,
|
|
4689
|
-
end.notice !== null ? /* @__PURE__ */ (0,
|
|
4754
|
+
end.notice !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__notice", role: "status", children: end.notice }) : null
|
|
4690
4755
|
] });
|
|
4691
4756
|
}
|
|
4692
4757
|
function ReactionOverlay({
|
|
4693
4758
|
reactions
|
|
4694
4759
|
}) {
|
|
4695
4760
|
if (reactions.length === 0) return null;
|
|
4696
|
-
return /* @__PURE__ */ (0,
|
|
4761
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mx-meet__reactions", "aria-hidden": "true", children: reactions.map((reaction) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__reaction", children: reaction.emoji }, reaction.id)) });
|
|
4697
4762
|
}
|
|
4698
4763
|
function clockOf(iso) {
|
|
4699
4764
|
const at = new Date(iso);
|
|
@@ -4710,11 +4775,11 @@ function GuestRecordAccessControl({
|
|
|
4710
4775
|
const isHost = inRoomHost || viewerId !== null && meeting.hostUserId === viewerId;
|
|
4711
4776
|
if (host === null || !isHost) return null;
|
|
4712
4777
|
const resolved = access.setting === "default" && access.effective !== null ? ` Right now that means: ${guestRecordAccessLabel(access.effective.level).toLowerCase()}.` : "";
|
|
4713
|
-
return /* @__PURE__ */ (0,
|
|
4714
|
-
/* @__PURE__ */ (0,
|
|
4715
|
-
/* @__PURE__ */ (0,
|
|
4716
|
-
/* @__PURE__ */ (0,
|
|
4717
|
-
/* @__PURE__ */ (0,
|
|
4778
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: "mx-meet__record-section", "aria-label": "What guests may read", children: [
|
|
4779
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "mx-meet__record-section-title", children: "What guests may read" }),
|
|
4780
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("label", { className: "mx-meet__field", children: [
|
|
4781
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "mx-meet__field-label", children: "People who attended by link, without an account" }),
|
|
4782
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
4718
4783
|
"select",
|
|
4719
4784
|
{
|
|
4720
4785
|
className: "mx-meet__select",
|
|
@@ -4725,18 +4790,18 @@ function GuestRecordAccessControl({
|
|
|
4725
4790
|
event.target.value
|
|
4726
4791
|
);
|
|
4727
4792
|
},
|
|
4728
|
-
children: GUEST_RECORD_ACCESS_CHOICES.map((choice) => /* @__PURE__ */ (0,
|
|
4793
|
+
children: GUEST_RECORD_ACCESS_CHOICES.map((choice) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("option", { value: choice, children: guestRecordAccessLabel(choice) }, choice))
|
|
4729
4794
|
}
|
|
4730
4795
|
)
|
|
4731
4796
|
] }),
|
|
4732
|
-
/* @__PURE__ */ (0,
|
|
4797
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "mx-meet__panel-note", children: [
|
|
4733
4798
|
guestRecordAccessExplanation(access.setting),
|
|
4734
4799
|
resolved
|
|
4735
4800
|
] }),
|
|
4736
|
-
access.saving ? /* @__PURE__ */ (0,
|
|
4737
|
-
access.error !== null ? /* @__PURE__ */ (0,
|
|
4738
|
-
/* @__PURE__ */ (0,
|
|
4739
|
-
/* @__PURE__ */ (0,
|
|
4801
|
+
access.saving ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__panel-note", role: "status", children: "Saving what guests may read\u2026" }) : null,
|
|
4802
|
+
access.error !== null ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_design_system.ErrorBox, { as: "div", className: "mx-meet__refusal", error: access.error, operation: "Change who can join", origin: "meet/components", children: [
|
|
4803
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-reason", children: access.error.message }),
|
|
4804
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mx-meet__refusal-remedy", children: access.error.remedy })
|
|
4740
4805
|
] }) : null
|
|
4741
4806
|
] });
|
|
4742
4807
|
}
|