@agilemotion/oui-react-js 2.0.16 → 2.0.18

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.
Files changed (36) hide show
  1. package/dist/components/Calender.css +1 -1
  2. package/dist/components/TableCellContent.js +9 -18
  3. package/dist/components/dashboard/FoldingSideTabDashboard.css +1 -1
  4. package/dist/components/dashboard/FoldingSideTabDashboard.js +10 -7
  5. package/dist/components/form/LookupField.js +27 -3
  6. package/dist/components/layout/Layout.js +15 -3
  7. package/dist/components/layout/ViewPort.js +2 -2
  8. package/dist/components/layout/Window.css +4 -1
  9. package/dist/components/layout/Window.js +147 -29
  10. package/dist/components/layout/WindowDialog.js +8 -5
  11. package/dist/components/layout/WindowViewPort.js +8 -2
  12. package/dist/components/media/Chat.js +4 -2
  13. package/dist/components/media/ClosablePanel.js +55 -27
  14. package/dist/components/media/MediaSoupHelper.js +13 -1
  15. package/dist/components/media/SideBarContent.js +22 -8
  16. package/dist/components/media/TrainingRoom.js +141 -46
  17. package/dist/components/media/VCEventType.js +3 -1
  18. package/dist/components/media/VCParticipantList.js +53 -27
  19. package/dist/components/media/VCRoom.css +22 -0
  20. package/dist/components/media/VCRoom.js +34 -15
  21. package/dist/components/media/VCRoomParticipant.css +3 -2
  22. package/dist/components/media/VCRoomParticipant.js +140 -48
  23. package/dist/components/media/VCRoomRecorder.js +117 -40
  24. package/dist/components/media/VCRoomWorkspace.css +0 -1
  25. package/dist/components/media/VCRoomWorkspace.js +158 -23
  26. package/dist/components/media/VCSettings.js +462 -0
  27. package/dist/components/media/VideoPlayer.js +4 -1
  28. package/dist/components/media/audioLevelMeter.js +96 -0
  29. package/dist/components/media/chat/ChatRoom.js +13 -9
  30. package/dist/components/media/chat/ChatRoomItem.js +3 -2
  31. package/dist/components/media/chat/ChatRoomWrapper.js +4 -1
  32. package/dist/components/media/chat/ChatRooms.scss +5 -3
  33. package/dist/hooks/useContainerWidth.js +44 -0
  34. package/dist/js/Media.js +11 -2
  35. package/dist/view/security/RegisterInteractionPortal.js +101 -3
  36. package/package.json +2 -2
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.startAudioLevelMeter = startAudioLevelMeter;
7
+ // Lightweight per-stream audio level meter for active-speaker highlighting.
8
+ //
9
+ // It only READS a MediaStream via a Web Audio AnalyserNode (never connected to
10
+ // the context destination), so it has no effect on playback — the <audio>
11
+ // element that actually plays the stream is independent. A single shared
12
+ // AudioContext is reused across all meters (browsers cap the number of
13
+ // contexts, and a meeting can have several participants).
14
+
15
+ let sharedCtx = null;
16
+ function getSharedContext() {
17
+ if (!sharedCtx) {
18
+ const AudioCtx = window.AudioContext || window.webkitAudioContext;
19
+ if (!AudioCtx) return null;
20
+ sharedCtx = new AudioCtx();
21
+ }
22
+ // Autoplay policies can leave the context suspended until a user gesture;
23
+ // by the time someone is in a meeting they've interacted, so this resolves.
24
+ if (sharedCtx.state === 'suspended') {
25
+ sharedCtx.resume().catch(() => {});
26
+ }
27
+ return sharedCtx;
28
+ }
29
+
30
+ /**
31
+ * Start metering a stream's audio level.
32
+ *
33
+ * @param {MediaStream} stream the stream to measure
34
+ * @param {(level:number)=>void} onLevel called with a 0..100 level, throttled
35
+ * @param {number} [intervalMs=100] minimum gap between onLevel callbacks
36
+ * @returns {() => void} stop function — disconnects nodes and stops the loop
37
+ */
38
+ function startAudioLevelMeter(stream, onLevel) {
39
+ let intervalMs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 100;
40
+ let stopped = false;
41
+ let raf = null;
42
+ let source = null;
43
+ let analyser = null;
44
+ let lastEmit = 0;
45
+ let lastLevel = -1;
46
+ try {
47
+ if (!stream || stream.getAudioTracks().length === 0) {
48
+ return () => {};
49
+ }
50
+ const ctx = getSharedContext();
51
+ if (!ctx) return () => {};
52
+ source = ctx.createMediaStreamSource(stream);
53
+ analyser = ctx.createAnalyser();
54
+ analyser.fftSize = 512;
55
+ analyser.smoothingTimeConstant = 0.6;
56
+ source.connect(analyser); // NB: analyser is NOT connected onward — read-only.
57
+
58
+ const data = new Uint8Array(analyser.frequencyBinCount);
59
+ const tick = () => {
60
+ if (stopped) return;
61
+ raf = requestAnimationFrame(tick);
62
+ const now = typeof performance !== 'undefined' && performance.now ? performance.now() : 0;
63
+ if (now - lastEmit < intervalMs) return;
64
+ lastEmit = now;
65
+ analyser.getByteTimeDomainData(data);
66
+ let sumSquares = 0;
67
+ for (let i = 0; i < data.length; i++) {
68
+ const v = (data[i] - 128) / 128; // -1..1
69
+ sumSquares += v * v;
70
+ }
71
+ const rms = Math.sqrt(sumSquares / data.length); // 0..1
72
+ // Scale + quantise so tiny fluctuations don't spam re-renders.
73
+ const level = Math.min(100, Math.round(rms * 200 / 2) * 2);
74
+ if (level !== lastLevel) {
75
+ lastLevel = level;
76
+ onLevel(level);
77
+ }
78
+ };
79
+ raf = requestAnimationFrame(tick);
80
+ } catch (e) {
81
+ // Web Audio unavailable / stream not analysable — degrade silently.
82
+ return () => {};
83
+ }
84
+ return () => {
85
+ stopped = true;
86
+ if (raf) cancelAnimationFrame(raf);
87
+ try {
88
+ source && source.disconnect();
89
+ } catch (e) {/* noop */}
90
+ try {
91
+ analyser && analyser.disconnect();
92
+ } catch (e) {/* noop */}
93
+ // Intentionally do NOT close the shared context — other meters use it.
94
+ };
95
+ }
96
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaGFyZWRDdHgiLCJnZXRTaGFyZWRDb250ZXh0IiwiQXVkaW9DdHgiLCJ3aW5kb3ciLCJBdWRpb0NvbnRleHQiLCJ3ZWJraXRBdWRpb0NvbnRleHQiLCJzdGF0ZSIsInJlc3VtZSIsImNhdGNoIiwic3RhcnRBdWRpb0xldmVsTWV0ZXIiLCJzdHJlYW0iLCJvbkxldmVsIiwiaW50ZXJ2YWxNcyIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsInN0b3BwZWQiLCJyYWYiLCJzb3VyY2UiLCJhbmFseXNlciIsImxhc3RFbWl0IiwibGFzdExldmVsIiwiZ2V0QXVkaW9UcmFja3MiLCJjdHgiLCJjcmVhdGVNZWRpYVN0cmVhbVNvdXJjZSIsImNyZWF0ZUFuYWx5c2VyIiwiZmZ0U2l6ZSIsInNtb290aGluZ1RpbWVDb25zdGFudCIsImNvbm5lY3QiLCJkYXRhIiwiVWludDhBcnJheSIsImZyZXF1ZW5jeUJpbkNvdW50IiwidGljayIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsIm5vdyIsInBlcmZvcm1hbmNlIiwiZ2V0Qnl0ZVRpbWVEb21haW5EYXRhIiwic3VtU3F1YXJlcyIsImkiLCJ2Iiwicm1zIiwiTWF0aCIsInNxcnQiLCJsZXZlbCIsIm1pbiIsInJvdW5kIiwiZSIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiZGlzY29ubmVjdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tZWRpYS9hdWRpb0xldmVsTWV0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gTGlnaHR3ZWlnaHQgcGVyLXN0cmVhbSBhdWRpbyBsZXZlbCBtZXRlciBmb3IgYWN0aXZlLXNwZWFrZXIgaGlnaGxpZ2h0aW5nLlxuLy9cbi8vIEl0IG9ubHkgUkVBRFMgYSBNZWRpYVN0cmVhbSB2aWEgYSBXZWIgQXVkaW8gQW5hbHlzZXJOb2RlIChuZXZlciBjb25uZWN0ZWQgdG9cbi8vIHRoZSBjb250ZXh0IGRlc3RpbmF0aW9uKSwgc28gaXQgaGFzIG5vIGVmZmVjdCBvbiBwbGF5YmFjayDigJQgdGhlIDxhdWRpbz5cbi8vIGVsZW1lbnQgdGhhdCBhY3R1YWxseSBwbGF5cyB0aGUgc3RyZWFtIGlzIGluZGVwZW5kZW50LiBBIHNpbmdsZSBzaGFyZWRcbi8vIEF1ZGlvQ29udGV4dCBpcyByZXVzZWQgYWNyb3NzIGFsbCBtZXRlcnMgKGJyb3dzZXJzIGNhcCB0aGUgbnVtYmVyIG9mXG4vLyBjb250ZXh0cywgYW5kIGEgbWVldGluZyBjYW4gaGF2ZSBzZXZlcmFsIHBhcnRpY2lwYW50cykuXG5cbmxldCBzaGFyZWRDdHggPSBudWxsO1xuXG5mdW5jdGlvbiBnZXRTaGFyZWRDb250ZXh0KCkge1xuICAgIGlmICghc2hhcmVkQ3R4KSB7XG4gICAgICAgIGNvbnN0IEF1ZGlvQ3R4ID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0O1xuICAgICAgICBpZiAoIUF1ZGlvQ3R4KSByZXR1cm4gbnVsbDtcbiAgICAgICAgc2hhcmVkQ3R4ID0gbmV3IEF1ZGlvQ3R4KCk7XG4gICAgfVxuICAgIC8vIEF1dG9wbGF5IHBvbGljaWVzIGNhbiBsZWF2ZSB0aGUgY29udGV4dCBzdXNwZW5kZWQgdW50aWwgYSB1c2VyIGdlc3R1cmU7XG4gICAgLy8gYnkgdGhlIHRpbWUgc29tZW9uZSBpcyBpbiBhIG1lZXRpbmcgdGhleSd2ZSBpbnRlcmFjdGVkLCBzbyB0aGlzIHJlc29sdmVzLlxuICAgIGlmIChzaGFyZWRDdHguc3RhdGUgPT09ICdzdXNwZW5kZWQnKSB7XG4gICAgICAgIHNoYXJlZEN0eC5yZXN1bWUoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICAgIHJldHVybiBzaGFyZWRDdHg7XG59XG5cbi8qKlxuICogU3RhcnQgbWV0ZXJpbmcgYSBzdHJlYW0ncyBhdWRpbyBsZXZlbC5cbiAqXG4gKiBAcGFyYW0ge01lZGlhU3RyZWFtfSBzdHJlYW0gICAgICB0aGUgc3RyZWFtIHRvIG1lYXN1cmVcbiAqIEBwYXJhbSB7KGxldmVsOm51bWJlcik9PnZvaWR9IG9uTGV2ZWwgIGNhbGxlZCB3aXRoIGEgMC4uMTAwIGxldmVsLCB0aHJvdHRsZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW50ZXJ2YWxNcz0xMDBdIG1pbmltdW0gZ2FwIGJldHdlZW4gb25MZXZlbCBjYWxsYmFja3NcbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSBzdG9wIGZ1bmN0aW9uIOKAlCBkaXNjb25uZWN0cyBub2RlcyBhbmQgc3RvcHMgdGhlIGxvb3BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0QXVkaW9MZXZlbE1ldGVyKHN0cmVhbSwgb25MZXZlbCwgaW50ZXJ2YWxNcyA9IDEwMCkge1xuICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgbGV0IHJhZiA9IG51bGw7XG4gICAgbGV0IHNvdXJjZSA9IG51bGw7XG4gICAgbGV0IGFuYWx5c2VyID0gbnVsbDtcbiAgICBsZXQgbGFzdEVtaXQgPSAwO1xuICAgIGxldCBsYXN0TGV2ZWwgPSAtMTtcblxuICAgIHRyeSB7XG4gICAgICAgIGlmICghc3RyZWFtIHx8IHN0cmVhbS5nZXRBdWRpb1RyYWNrcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN0eCA9IGdldFNoYXJlZENvbnRleHQoKTtcbiAgICAgICAgaWYgKCFjdHgpIHJldHVybiAoKSA9PiB7fTtcblxuICAgICAgICBzb3VyY2UgPSBjdHguY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2Uoc3RyZWFtKTtcbiAgICAgICAgYW5hbHlzZXIgPSBjdHguY3JlYXRlQW5hbHlzZXIoKTtcbiAgICAgICAgYW5hbHlzZXIuZmZ0U2l6ZSA9IDUxMjtcbiAgICAgICAgYW5hbHlzZXIuc21vb3RoaW5nVGltZUNvbnN0YW50ID0gMC42O1xuICAgICAgICBzb3VyY2UuY29ubmVjdChhbmFseXNlcik7IC8vIE5COiBhbmFseXNlciBpcyBOT1QgY29ubmVjdGVkIG9ud2FyZCDigJQgcmVhZC1vbmx5LlxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShhbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCk7XG5cbiAgICAgICAgY29uc3QgdGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdG9wcGVkKSByZXR1cm47XG4gICAgICAgICAgICByYWYgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vdyA9ICh0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnICYmIHBlcmZvcm1hbmNlLm5vdylcbiAgICAgICAgICAgICAgICA/IHBlcmZvcm1hbmNlLm5vdygpIDogMDtcbiAgICAgICAgICAgIGlmIChub3cgLSBsYXN0RW1pdCA8IGludGVydmFsTXMpIHJldHVybjtcbiAgICAgICAgICAgIGxhc3RFbWl0ID0gbm93O1xuXG4gICAgICAgICAgICBhbmFseXNlci5nZXRCeXRlVGltZURvbWFpbkRhdGEoZGF0YSk7XG4gICAgICAgICAgICBsZXQgc3VtU3F1YXJlcyA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gKGRhdGFbaV0gLSAxMjgpIC8gMTI4OyAvLyAtMS4uMVxuICAgICAgICAgICAgICAgIHN1bVNxdWFyZXMgKz0gdiAqIHY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBybXMgPSBNYXRoLnNxcnQoc3VtU3F1YXJlcyAvIGRhdGEubGVuZ3RoKTsgLy8gMC4uMVxuICAgICAgICAgICAgLy8gU2NhbGUgKyBxdWFudGlzZSBzbyB0aW55IGZsdWN0dWF0aW9ucyBkb24ndCBzcGFtIHJlLXJlbmRlcnMuXG4gICAgICAgICAgICBjb25zdCBsZXZlbCA9IE1hdGgubWluKDEwMCwgTWF0aC5yb3VuZCgocm1zICogMjAwKSAvIDIpICogMik7XG4gICAgICAgICAgICBpZiAobGV2ZWwgIT09IGxhc3RMZXZlbCkge1xuICAgICAgICAgICAgICAgIGxhc3RMZXZlbCA9IGxldmVsO1xuICAgICAgICAgICAgICAgIG9uTGV2ZWwobGV2ZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByYWYgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBXZWIgQXVkaW8gdW5hdmFpbGFibGUgLyBzdHJlYW0gbm90IGFuYWx5c2FibGUg4oCUIGRlZ3JhZGUgc2lsZW50bHkuXG4gICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHJhZikgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTtcbiAgICAgICAgdHJ5IHsgc291cmNlICYmIHNvdXJjZS5kaXNjb25uZWN0KCk7IH0gY2F0Y2ggKGUpIHsgLyogbm9vcCAqLyB9XG4gICAgICAgIHRyeSB7IGFuYWx5c2VyICYmIGFuYWx5c2VyLmRpc2Nvbm5lY3QoKTsgfSBjYXRjaCAoZSkgeyAvKiBub29wICovIH1cbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBkbyBOT1QgY2xvc2UgdGhlIHNoYXJlZCBjb250ZXh0IOKAlCBvdGhlciBtZXRlcnMgdXNlIGl0LlxuICAgIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUlBLFNBQVMsR0FBRyxJQUFJO0FBRXBCLFNBQVNDLGdCQUFnQkEsQ0FBQSxFQUFHO0VBQ3hCLElBQUksQ0FBQ0QsU0FBUyxFQUFFO0lBQ1osTUFBTUUsUUFBUSxHQUFHQyxNQUFNLENBQUNDLFlBQVksSUFBSUQsTUFBTSxDQUFDRSxrQkFBa0I7SUFDakUsSUFBSSxDQUFDSCxRQUFRLEVBQUUsT0FBTyxJQUFJO0lBQzFCRixTQUFTLEdBQUcsSUFBSUUsUUFBUSxDQUFDLENBQUM7RUFDOUI7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