@agilemotion/oui-react-js 2.0.15 → 2.0.17
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/README.TXT +2 -2
- package/dist/components/Calender.css +1 -1
- package/dist/components/TableCellContent.js +8 -18
- package/dist/components/dashboard/FoldingSideTabDashboard.css +1 -1
- package/dist/components/dashboard/FoldingSideTabDashboard.js +10 -7
- package/dist/components/form/LookupField.js +27 -3
- package/dist/components/layout/Layout.js +15 -3
- package/dist/components/layout/ViewPort.js +2 -2
- package/dist/components/layout/Window.css +4 -1
- package/dist/components/layout/Window.js +147 -29
- package/dist/components/layout/WindowDialog.js +8 -5
- package/dist/components/layout/WindowViewPort.js +8 -2
- package/dist/components/media/Chat.js +4 -2
- package/dist/components/media/ClosablePanel.js +55 -27
- package/dist/components/media/MediaSoupHelper.js +13 -1
- package/dist/components/media/SideBarContent.js +22 -8
- package/dist/components/media/TrainingRoom.js +32 -5
- package/dist/components/media/VCEventType.js +3 -1
- package/dist/components/media/VCParticipantList.js +53 -27
- package/dist/components/media/VCRoom.css +22 -0
- package/dist/components/media/VCRoom.js +34 -15
- package/dist/components/media/VCRoomParticipant.css +3 -2
- package/dist/components/media/VCRoomParticipant.js +140 -48
- package/dist/components/media/VCRoomRecorder.js +117 -40
- package/dist/components/media/VCRoomWorkspace.css +0 -1
- package/dist/components/media/VCRoomWorkspace.js +158 -23
- package/dist/components/media/VCSettings.js +462 -0
- package/dist/components/media/VideoPlayer.js +4 -1
- package/dist/components/media/audioLevelMeter.js +96 -0
- package/dist/components/media/chat/ChatRoom.js +13 -9
- package/dist/components/media/chat/ChatRoomItem.js +3 -2
- package/dist/components/media/chat/ChatRoomWrapper.js +4 -1
- package/dist/components/media/chat/ChatRooms.scss +5 -3
- package/dist/hooks/useContainerWidth.js +44 -0
- package/dist/view/security/RegisterInteractionPortal.js +101 -3
- package/package.json +1 -1
|
@@ -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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
|