@ai-matrx/meet 0.11.44 → 0.11.45

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.
@@ -1,6 +1,6 @@
1
- export { A as AiPanel, a as AttendanceNotice, b as Avatar, C as Captions, c as ChatPanel, d as ConnectionDot, e as ConsentNotice, f as ControlBar, g as ControlButton, H as HostMenu, L as LobbyPanel, M as MeetSkinRoom, h as MeetingOverlays, i as MenuItem, P as PanelShell, j as ParticipantTile, k as PeoplePanel, l as PersonMenu, m as Popover, n as PreJoin, Q as QualityBars, R as ReactionOverlay, o as RecordingIndicator, S as SettingsPanel, p as ShortcutsSheet, q as Stage, T as Toast } from '../components-BxK993iW.cjs';
1
+ export { A as AiPanel, a as AttendanceNotice, b as Avatar, C as Captions, c as ChatPanel, d as ConnectionDot, e as ConsentNotice, f as ControlBar, g as ControlButton, H as HostMenu, L as LobbyPanel, M as MeetSkinRoom, h as MeetingOverlays, i as MenuItem, P as PanelShell, j as ParticipantTile, k as PeoplePanel, l as PersonMenu, m as Popover, n as PreJoin, Q as QualityBars, R as ReactionOverlay, o as RecordingIndicator, S as SettingsPanel, p as ShortcutsSheet, q as Stage, T as Toast } from '../components-CkyDos0f.cjs';
2
2
  import { ReactNode, SVGProps } from 'react';
3
- import { C as CollabPanel } from '../collab-BNJNgXFB.cjs';
3
+ import { C as CollabPanel } from '../collab-D1TX5uf9.cjs';
4
4
 
5
5
  /**
6
6
  * POLLS, Q&A, THE SHARED WHITEBOARD AND BREAKOUT ROOMS — the in-room surfaces (Meet wave 5).
@@ -1,6 +1,6 @@
1
- export { A as AiPanel, a as AttendanceNotice, b as Avatar, C as Captions, c as ChatPanel, d as ConnectionDot, e as ConsentNotice, f as ControlBar, g as ControlButton, H as HostMenu, L as LobbyPanel, M as MeetSkinRoom, h as MeetingOverlays, i as MenuItem, P as PanelShell, j as ParticipantTile, k as PeoplePanel, l as PersonMenu, m as Popover, n as PreJoin, Q as QualityBars, R as ReactionOverlay, o as RecordingIndicator, S as SettingsPanel, p as ShortcutsSheet, q as Stage, T as Toast } from '../components-BDtGzHf4.js';
1
+ export { A as AiPanel, a as AttendanceNotice, b as Avatar, C as Captions, c as ChatPanel, d as ConnectionDot, e as ConsentNotice, f as ControlBar, g as ControlButton, H as HostMenu, L as LobbyPanel, M as MeetSkinRoom, h as MeetingOverlays, i as MenuItem, P as PanelShell, j as ParticipantTile, k as PeoplePanel, l as PersonMenu, m as Popover, n as PreJoin, Q as QualityBars, R as ReactionOverlay, o as RecordingIndicator, S as SettingsPanel, p as ShortcutsSheet, q as Stage, T as Toast } from '../components-CNwBgmYU.js';
2
2
  import { ReactNode, SVGProps } from 'react';
3
- import { C as CollabPanel } from '../collab-BNJNgXFB.js';
3
+ import { C as CollabPanel } from '../collab-D1TX5uf9.js';
4
4
 
5
5
  /**
6
6
  * POLLS, Q&A, THE SHARED WHITEBOARD AND BREAKOUT ROOMS — the in-room surfaces (Meet wave 5).
@@ -7,6 +7,33 @@ import { useEffect as useEffect6, useLayoutEffect, useRef as useRef6, useState a
7
7
  // src/react/facade.ts
8
8
  import { useMemo as useMemo5 } from "react";
9
9
 
10
+ // src/core/phase.ts
11
+ var LIVE_PHASES = /* @__PURE__ */ new Set(["joining", "in_call"]);
12
+ var WAITING_PHASES = /* @__PURE__ */ new Set([
13
+ "waiting:host_not_started",
14
+ "waiting:knocking",
15
+ "denied",
16
+ "knock_expired"
17
+ ]);
18
+ var RETRYABLE_REFUSALS = /* @__PURE__ */ new Set([
19
+ "refused:locked",
20
+ "refused:too_early",
21
+ "refused:meeting_full",
22
+ "refused:platform_capacity"
23
+ ]);
24
+ function isLivePhase(phase) {
25
+ return LIVE_PHASES.has(phase);
26
+ }
27
+ function isWaitingPhase(phase) {
28
+ return WAITING_PHASES.has(phase);
29
+ }
30
+ function isRefusedPhase(phase) {
31
+ return phase.startsWith("refused:");
32
+ }
33
+ function reasonOf(phase) {
34
+ return isRefusedPhase(phase) ? phase.slice("refused:".length) : null;
35
+ }
36
+
10
37
  // src/core/names.ts
11
38
  var CONNECTION_SEPARATOR = "~";
12
39
  function personOf(identity) {
@@ -322,27 +349,6 @@ function isObserverRole(role) {
322
349
  return role === "viewer";
323
350
  }
324
351
 
325
- // src/core/phase.ts
326
- var LIVE_PHASES = /* @__PURE__ */ new Set(["joining", "in_call"]);
327
- var WAITING_PHASES = /* @__PURE__ */ new Set([
328
- "waiting:host_not_started",
329
- "waiting:knocking",
330
- "denied",
331
- "knock_expired"
332
- ]);
333
- function isLivePhase(phase) {
334
- return LIVE_PHASES.has(phase);
335
- }
336
- function isWaitingPhase(phase) {
337
- return WAITING_PHASES.has(phase);
338
- }
339
- function isRefusedPhase(phase) {
340
- return phase.startsWith("refused:");
341
- }
342
- function reasonOf(phase) {
343
- return isRefusedPhase(phase) ? phase.slice("refused:".length) : null;
344
- }
345
-
346
352
  // src/core/app-panel.ts
347
353
  function appPanelOf(meeting) {
348
354
  const raw = meeting?.metadata?.["app_panel"];
@@ -2000,6 +2006,10 @@ function actionsFor(host) {
2000
2006
  leave: () => engine.leave(),
2001
2007
  backToPrejoin: () => engine.backToPrejoin(),
2002
2008
  retry: () => {
2009
+ if (RETRYABLE_REFUSALS.has(store.snapshot().phase)) {
2010
+ void engine.rejoin().catch(() => void 0);
2011
+ return;
2012
+ }
2003
2013
  store.dispatch({ type: "retry", click: true });
2004
2014
  },
2005
2015
  resolved: () => {
@@ -3735,6 +3745,7 @@ function ControlBar({ onLeave }) {
3735
3745
  ]
3736
3746
  }
3737
3747
  ),
3748
+ /* @__PURE__ */ jsx6(WaitingRoomRule, {}),
3738
3749
  queue.length > 0 ? /* @__PURE__ */ jsxs4(
3739
3750
  MenuItem,
3740
3751
  {
@@ -3954,6 +3965,58 @@ function MenuItem({
3954
3965
  }
3955
3966
  );
3956
3967
  }
3968
+ var LOBBY_BYPASS_CHOICES = [
3969
+ { value: "everyone", label: "Everyone" },
3970
+ { value: "org_and_invited", label: "Your organization and invited people" },
3971
+ { value: "org", label: "Your organization" },
3972
+ { value: "invited", label: "Invited people" },
3973
+ { value: "host_only", label: "Only hosts" }
3974
+ ];
3975
+ function WaitingRoomRule() {
3976
+ const host = useRequiredMeetHost();
3977
+ const [open, setOpen] = useState5(false);
3978
+ const [value, setValue] = useState5(null);
3979
+ const [notice, setNotice] = useState5(null);
3980
+ useEffect6(() => {
3981
+ let live = true;
3982
+ void host.meetings.meetingRule("lobby_bypass").then((rule) => {
3983
+ if (live) setValue(typeof rule === "string" ? rule : null);
3984
+ }).catch(() => void 0);
3985
+ return () => {
3986
+ live = false;
3987
+ };
3988
+ }, [host]);
3989
+ const current = LOBBY_BYPASS_CHOICES.find((choice) => choice.value === value)?.label ?? null;
3990
+ return /* @__PURE__ */ jsxs4(Fragment, { children: [
3991
+ /* @__PURE__ */ jsxs4(MenuItem, { onSelect: () => setOpen(!open), children: [
3992
+ /* @__PURE__ */ jsx6(LockIcon, { width: 16, height: 16 }),
3993
+ " Who can skip the waiting room",
3994
+ current !== null ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__menu-value", children: current }) : null
3995
+ ] }),
3996
+ open ? /* @__PURE__ */ jsxs4("div", { role: "group", "aria-label": "Who can skip the waiting room", "data-meet-rule": "lobby_bypass", children: [
3997
+ LOBBY_BYPASS_CHOICES.map((choice) => /* @__PURE__ */ jsxs4(
3998
+ "button",
3999
+ {
4000
+ type: "button",
4001
+ role: "menuitemradio",
4002
+ "aria-checked": choice.value === value,
4003
+ className: "mx-meet__menu-item mx-meet__menu-item--sub",
4004
+ onClick: () => {
4005
+ setNotice(null);
4006
+ void host.meetings.setMeetingRule("lobby_bypass", choice.value).then(() => setValue(choice.value)).catch((error) => setNotice(error instanceof Error ? error.message : String(error)));
4007
+ },
4008
+ children: [
4009
+ choice.value === value ? /* @__PURE__ */ jsx6(CheckIcon, { width: 14, height: 14 }) : null,
4010
+ " ",
4011
+ choice.label
4012
+ ]
4013
+ },
4014
+ choice.value
4015
+ )),
4016
+ notice !== null ? /* @__PURE__ */ jsx6("p", { className: "mx-meet__menu-note", role: "status", children: notice }) : null
4017
+ ] }) : null
4018
+ ] });
4019
+ }
3957
4020
  function Toast({ text, failed, onDone }) {
3958
4021
  useEffect6(() => {
3959
4022
  const timer = setTimeout(onDone, failed ? 7e3 : 4e3);
@@ -5042,7 +5105,11 @@ function WaitingList({ lobby }) {
5042
5105
  /* @__PURE__ */ jsx6(Avatar, { name: entry.displayName, url: entry.avatarUrl, size: 32 }),
5043
5106
  /* @__PURE__ */ jsxs4("span", { className: "mx-meet__person-name", children: [
5044
5107
  entry.displayName,
5045
- entry.userId === null ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Guest" }) : null
5108
+ entry.userId === null ? /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge", children: "Guest" }) : null,
5109
+ entry.flag === "previously_removed" ? (
5110
+ // `mod-removed-bypass`: advice for the host, never a block — Admit stays.
5111
+ /* @__PURE__ */ jsx6("span", { className: "mx-meet__badge mx-meet__badge--warn", "data-meet-notice": "knock-flagged", children: "Previously removed" })
5112
+ ) : null
5046
5113
  ] }),
5047
5114
  /* @__PURE__ */ jsx6(ControlButton, { label: `Admit ${entry.displayName}`, onClick: () => void lobby.admit(entry), children: /* @__PURE__ */ jsx6(CheckIcon, { width: 16, height: 16 }) }),
5048
5115
  /* @__PURE__ */ jsx6(
@@ -5667,7 +5734,20 @@ function ExitScreen({ onLeave }) {
5667
5734
  const { phase, reason, host, snapshot, actions, call, connection } = useMeetCore();
5668
5735
  const [busy, setBusy] = useState5(false);
5669
5736
  const failure = snapshot?.failure ?? null;
5670
- const retryLeft = useCountdown(phase === "refused:lobby_rejects" ? failure?.retryAt ?? null : null);
5737
+ const retryLeft = useCountdown(
5738
+ phase === "refused:lobby_rejects" || phase === "refused:too_early" ? failure?.retryAt ?? null : null
5739
+ );
5740
+ const reaskedAtZero = useRef6(false);
5741
+ useEffect6(() => {
5742
+ if (phase !== "refused:too_early") {
5743
+ reaskedAtZero.current = false;
5744
+ return;
5745
+ }
5746
+ if (retryLeft === 0 && !reaskedAtZero.current) {
5747
+ reaskedAtZero.current = true;
5748
+ actions.retry();
5749
+ }
5750
+ }, [phase, retryLeft, actions]);
5671
5751
  const rejoin = /* @__PURE__ */ jsx6(
5672
5752
  Button,
5673
5753
  {
@@ -5705,11 +5785,19 @@ function ExitScreen({ onLeave }) {
5705
5785
  if (phase.startsWith("refused:")) {
5706
5786
  const code = phase.slice("refused:".length);
5707
5787
  title = REFUSED_TITLES[code] ?? "You can't join this meeting";
5708
- line = code === "too_early" || code === "registration_required" || code === "cancelled" ? failure?.remedy ?? null : null;
5788
+ line = code === "too_early" || code === "registration_required" || code === "cancelled" || code === "wrong_account" ? failure?.remedy ?? null : null;
5789
+ if (code === "too_early" && retryLeft !== null && retryLeft > 0) line = `Opens in ${clockText(retryLeft)}`;
5709
5790
  actionsNode = /* @__PURE__ */ jsxs4(Fragment, { children: [
5710
5791
  /* @__PURE__ */ jsx6(Button, { type: "button", variant: "outline", onClick: actions.retry, children: "Try again" }),
5711
5792
  home
5712
5793
  ] });
5794
+ if (code === "sign_in_required" || code === "wrong_account") {
5795
+ const back = typeof window === "undefined" ? "/" : `${window.location.pathname}${window.location.search}`;
5796
+ actionsNode = /* @__PURE__ */ jsxs4(Fragment, { children: [
5797
+ /* @__PURE__ */ jsx6(Button, { asChild: true, children: /* @__PURE__ */ jsx6("a", { href: `/login?redirectTo=${encodeURIComponent(back)}`, children: code === "sign_in_required" ? "Sign in" : "Switch account" }) }),
5798
+ home
5799
+ ] });
5800
+ }
5713
5801
  if (code === "lobby_rejects") {
5714
5802
  if (retryLeft !== null && retryLeft > 0) {
5715
5803
  line = `You can ask again in ${clockText(retryLeft)}`;