Parcourir la source

[WEB] add UI for transcription (#3213)

* [WEB] add UI for transcription

* add analytics event for button, do not use global APP object

* use props instead of state, use local conference to kick participant

* put imports in alphabetical order

* add translation for TranscribingLabel

* fix merge conflict

* add closed caption button

* purge OverFlowMenuItem which starts and stops Transcription

* readd closed caption icon and fix small issues due to purge

* delete unused icon in _font.scss
master
Nik il y a 6 ans
Parent
révision
b8daf0a9f9

+ 9
- 1
conference.js Voir le fichier

@@ -72,6 +72,8 @@ import {
72 72
     getAvatarURLByParticipantId,
73 73
     getLocalParticipant,
74 74
     getParticipantById,
75
+    hiddenParticipantJoined,
76
+    hiddenParticipantLeft,
75 77
     localParticipantConnectionStatusChanged,
76 78
     localParticipantRoleChanged,
77 79
     MAX_DISPLAY_NAME_LENGTH,
@@ -1654,10 +1656,13 @@ export default {
1654 1656
         room.on(JitsiConferenceEvents.PARTCIPANT_FEATURES_CHANGED,
1655 1657
             user => APP.UI.onUserFeaturesChanged(user));
1656 1658
         room.on(JitsiConferenceEvents.USER_JOINED, (id, user) => {
1659
+            const displayName = user.getDisplayName();
1660
+
1657 1661
             if (user.isHidden()) {
1662
+                APP.store.dispatch(hiddenParticipantJoined(id, displayName));
1663
+
1658 1664
                 return;
1659 1665
             }
1660
-            const displayName = user.getDisplayName();
1661 1666
 
1662 1667
             APP.store.dispatch(participantJoined({
1663 1668
                 botType: user.getBotType(),
@@ -1682,8 +1687,11 @@ export default {
1682 1687
 
1683 1688
         room.on(JitsiConferenceEvents.USER_LEFT, (id, user) => {
1684 1689
             if (user.isHidden()) {
1690
+                APP.store.dispatch(hiddenParticipantLeft(id));
1691
+
1685 1692
                 return;
1686 1693
             }
1694
+
1687 1695
             APP.store.dispatch(participantLeft(id, room));
1688 1696
             logger.log('USER %s LEFT', id, user);
1689 1697
             APP.API.notifyUserLeft(id);

+ 4
- 0
config.js Voir le fichier

@@ -175,6 +175,10 @@ var config = {
175 175
     // Whether to enable live streaming or not.
176 176
     // liveStreamingEnabled: false,
177 177
 
178
+    // Transcription (in interface_config,
179
+    // subtitles and buttons can be configured)
180
+    transcribingEnabled: false,
181
+
178 182
     // Misc
179 183
 
180 184
     // Default value for the channel "last N" attribute. -1 for unlimited.

+ 4
- 0
css/_font.scss Voir le fichier

@@ -24,6 +24,7 @@
24 24
     -webkit-font-smoothing: antialiased;
25 25
     -moz-osx-font-smoothing: grayscale;
26 26
 }
27
+
27 28
 .icon-arrow_back:before {
28 29
   content: "\e5c4";
29 30
 }
@@ -216,3 +217,6 @@
216 217
 .icon-tiles-one:before {
217 218
   content: "\e92f";
218 219
 }
220
+.icon-closed_caption:before {
221
+    content: "\e930";
222
+}

BIN
fonts/jitsi.eot Voir le fichier


+ 1
- 0
fonts/jitsi.svg Voir le fichier

@@ -74,4 +74,5 @@
74 74
 <glyph unicode="&#xe92d;" glyph-name="speaker" d="M0 512c0-282.795 229.205-512 512-512s512 229.205 512 512c0 282.795-229.205 512-512 512s-512-229.205-512-512zM525.005 759.362c-20.475 24.944-16.326 61.342 9.268 81.297s62.94 15.911 83.416-9.033c16.036-19.536 38.593-52.97 60.894-97.797 81.621-164.065 89.461-340.992-26.857-506.352-8.384-11.919-17.386-23.69-27.012-35.307-20.593-24.851-57.959-28.727-83.458-8.657s-29.476 56.487-8.882 81.338c7.686 9.275 14.833 18.621 21.455 28.035 88.66 126.041 82.71 260.306 17.953 390.475-10.599 21.305-21.94 40.51-33.198 57.196-6.515 9.657-11.322 16.057-13.578 18.805zM353.479 647.46c-19.353 24.679-15.129 60.448 9.434 79.893s60.164 15.2 79.517-9.479c9.635-12.287 22.577-32.644 35.209-60.034 50.35-109.176 50.35-231.689-33.639-349.612-18.198-25.551-53.566-31.441-78.997-13.157s-31.294 53.819-13.096 79.37c57.564 80.822 57.564 160.581 22.983 235.565-8.601 18.65-16.892 31.691-21.412 37.455z" />
75 75
 <glyph unicode="&#xe92e;" glyph-name="tiles-many" d="M113.778 1024h227.556c62.838 0 113.778-50.94 113.778-113.778v-227.556c0-62.838-50.94-113.778-113.778-113.778h-227.556c-62.838 0-113.778 50.94-113.778 113.778v227.556c0 62.838 50.94 113.778 113.778 113.778zM170.667 910.222c-31.419 0-56.889-25.47-56.889-56.889v-113.778c0-31.419 25.47-56.889 56.889-56.889h113.778c31.419 0 56.889 25.47 56.889 56.889v113.778c0 31.419-25.47 56.889-56.889 56.889h-113.778zM113.778 455.111h227.556c62.838 0 113.778-50.94 113.778-113.778v-227.556c0-62.838-50.94-113.778-113.778-113.778h-227.556c-62.838 0-113.778 50.94-113.778 113.778v227.556c0 62.838 50.94 113.778 113.778 113.778zM170.667 341.333c-31.419 0-56.889-25.47-56.889-56.889v-113.778c0-31.419 25.47-56.889 56.889-56.889h113.778c31.419 0 56.889 25.47 56.889 56.889v113.778c0 31.419-25.47 56.889-56.889 56.889h-113.778zM682.667 1024h227.556c62.838 0 113.778-50.94 113.778-113.778v-227.556c0-62.838-50.94-113.778-113.778-113.778h-227.556c-62.838 0-113.778 50.94-113.778 113.778v227.556c0 62.838 50.94 113.778 113.778 113.778zM739.556 910.222c-31.419 0-56.889-25.47-56.889-56.889v-113.778c0-31.419 25.47-56.889 56.889-56.889h113.778c31.419 0 56.889 25.47 56.889 56.889v113.778c0 31.419-25.47 56.889-56.889 56.889h-113.778zM682.667 455.111h227.556c62.838 0 113.778-50.94 113.778-113.778v-227.556c0-62.838-50.94-113.778-113.778-113.778h-227.556c-62.838 0-113.778 50.94-113.778 113.778v227.556c0 62.838 50.94 113.778 113.778 113.778zM739.556 341.333c-31.419 0-56.889-25.47-56.889-56.889v-113.778c0-31.419 25.47-56.889 56.889-56.889h113.778c31.419 0 56.889 25.47 56.889 56.889v113.778c0 31.419-25.47 56.889-56.889 56.889h-113.778z" />
76 76
 <glyph unicode="&#xe92f;" glyph-name="tiles-one" d="M170.667 810.667h682.667c47.128 0 85.333-38.205 85.333-85.333v-426.667c0-47.128-38.205-85.333-85.333-85.333h-682.667c-47.128 0-85.333 38.205-85.333 85.333v426.667c0 47.128 38.205 85.333 85.333 85.333zM213.333 725.333c-23.564 0-42.667-19.103-42.667-42.667v-341.333c0-23.564 19.103-42.667 42.667-42.667h597.333c23.564 0 42.667 19.103 42.667 42.667v341.333c0 23.564-19.103 42.667-42.667 42.667h-597.333z" />
77
+<glyph unicode="&#xe930;" glyph-name="closed_caption" d="M768 554v44c0 24-18 42-42 42h-128c-24 0-44-18-44-42v-172c0-24 20-42 44-42h128c24 0 42 18 42 42v44h-64v-22h-86v128h86v-22h64zM470 554v44c0 24-20 42-44 42h-128c-24 0-42-18-42-42v-172c0-24 18-42 42-42h128c24 0 44 18 44 42v44h-64v-22h-86v128h86v-22h64zM810 854c46 0 86-40 86-86v-512c0-46-40-86-86-86h-596c-48 0-86 40-86 86v512c0 46 38 86 86 86h596z" />
77 78
 </font></defs></svg>

BIN
fonts/jitsi.ttf Voir le fichier


BIN
fonts/jitsi.woff Voir le fichier


+ 180
- 151
fonts/selection.json Voir le fichier

@@ -1,6 +1,35 @@
1 1
 {
2 2
   "IcoMoonType": "selection",
3 3
   "icons": [
4
+    {
5
+      "icon": {
6
+        "paths": [
7
+          "M768 470v-44c0-24-18-42-42-42h-128c-24 0-44 18-44 42v172c0 24 20 42 44 42h128c24 0 42-18 42-42v-44h-64v22h-86v-128h86v22h64zM470 470v-44c0-24-20-42-44-42h-128c-24 0-42 18-42 42v172c0 24 18 42 42 42h128c24 0 44-18 44-42v-44h-64v22h-86v-128h86v22h64zM810 170c46 0 86 40 86 86v512c0 46-40 86-86 86h-596c-48 0-86-40-86-86v-512c0-46 38-86 86-86h596z"
8
+        ],
9
+        "attrs": [
10
+          {}
11
+        ],
12
+        "isMulticolor": false,
13
+        "isMulticolor2": false,
14
+        "tags": [
15
+          "closed_caption"
16
+        ],
17
+        "grid": 24
18
+      },
19
+      "attrs": [
20
+        {}
21
+      ],
22
+      "properties": {
23
+        "order": 1,
24
+        "id": 0,
25
+        "prevSize": 24,
26
+        "code": 59696,
27
+        "name": "closed_caption"
28
+      },
29
+      "setIdx": 0,
30
+      "setId": 2,
31
+      "iconIdx": 0
32
+    },
4 33
     {
5 34
       "icon": {
6 35
         "paths": [
@@ -23,10 +52,10 @@
23 52
         "order": 1377,
24 53
         "id": 1065,
25 54
         "name": "tiles-many",
26
-        "prevSize": 32,
55
+        "prevSize": 24,
27 56
         "code": 59694
28 57
       },
29
-      "setIdx": 0,
58
+      "setIdx": 1,
30 59
       "setId": 1,
31 60
       "iconIdx": 0
32 61
     },
@@ -52,10 +81,10 @@
52 81
         "order": 1378,
53 82
         "id": 1064,
54 83
         "name": "tiles-one",
55
-        "prevSize": 32,
84
+        "prevSize": 24,
56 85
         "code": 59695
57 86
       },
58
-      "setIdx": 0,
87
+      "setIdx": 1,
59 88
       "setId": 1,
60 89
       "iconIdx": 1
61 90
     },
@@ -78,13 +107,13 @@
78 107
         "ligatures": "clear, close",
79 108
         "id": 157,
80 109
         "order": 1313,
81
-        "prevSize": 32,
110
+        "prevSize": 24,
82 111
         "code": 58829,
83 112
         "name": "close"
84 113
       },
85
-      "setIdx": 0,
114
+      "setIdx": 1,
86 115
       "setId": 1,
87
-      "iconIdx": 50
116
+      "iconIdx": 2
88 117
     },
89 118
     {
90 119
       "icon": {
@@ -105,13 +134,13 @@
105 134
         "ligatures": "launch, open_in_new",
106 135
         "id": 1047,
107 136
         "order": 1314,
108
-        "prevSize": 32,
137
+        "prevSize": 24,
109 138
         "name": "open_in_new",
110 139
         "code": 59550
111 140
       },
112
-      "setIdx": 0,
141
+      "setIdx": 1,
113 142
       "setId": 1,
114
-      "iconIdx": 51
143
+      "iconIdx": 3
115 144
     },
116 145
     {
117 146
       "icon": {
@@ -132,13 +161,13 @@
132 161
         "ligatures": "history, restore",
133 162
         "id": 1048,
134 163
         "order": 1315,
135
-        "prevSize": 32,
164
+        "prevSize": 24,
136 165
         "code": 59571,
137 166
         "name": "restore"
138 167
       },
139
-      "setIdx": 0,
168
+      "setIdx": 1,
140 169
       "setId": 1,
141
-      "iconIdx": 52
170
+      "iconIdx": 4
142 171
     },
143 172
     {
144 173
       "icon": {
@@ -159,13 +188,13 @@
159 188
         "ligatures": "chevron_right, navigate_next",
160 189
         "id": 1049,
161 190
         "order": 1316,
162
-        "prevSize": 32,
191
+        "prevSize": 24,
163 192
         "code": 58377,
164 193
         "name": "navigate_next"
165 194
       },
166
-      "setIdx": 0,
195
+      "setIdx": 1,
167 196
       "setId": 1,
168
-      "iconIdx": 53
197
+      "iconIdx": 5
169 198
     },
170 199
     {
171 200
       "icon": {
@@ -186,13 +215,13 @@
186 215
         "ligatures": "menu",
187 216
         "id": 1050,
188 217
         "order": 1317,
189
-        "prevSize": 32,
218
+        "prevSize": 24,
190 219
         "code": 58834,
191 220
         "name": "menu"
192 221
       },
193
-      "setIdx": 0,
222
+      "setIdx": 1,
194 223
       "setId": 1,
195
-      "iconIdx": 54
224
+      "iconIdx": 6
196 225
     },
197 226
     {
198 227
       "icon": {
@@ -213,13 +242,13 @@
213 242
         "ligatures": "arrow_back",
214 243
         "id": 1051,
215 244
         "order": 1318,
216
-        "prevSize": 32,
245
+        "prevSize": 24,
217 246
         "code": 58820,
218 247
         "name": "arrow_back"
219 248
       },
220
-      "setIdx": 0,
249
+      "setIdx": 1,
221 250
       "setId": 1,
222
-      "iconIdx": 55
251
+      "iconIdx": 7
223 252
     },
224 253
     {
225 254
       "icon": {
@@ -240,13 +269,13 @@
240 269
         "ligatures": "chevron_left, navigate_before",
241 270
         "id": 1052,
242 271
         "order": 1319,
243
-        "prevSize": 32,
272
+        "prevSize": 24,
244 273
         "code": 58376,
245 274
         "name": "navigate_before"
246 275
       },
247
-      "setIdx": 0,
276
+      "setIdx": 1,
248 277
       "setId": 1,
249
-      "iconIdx": 56
278
+      "iconIdx": 8
250 279
     },
251 280
     {
252 281
       "icon": {
@@ -267,13 +296,13 @@
267 296
         "ligatures": "public",
268 297
         "id": 1053,
269 298
         "order": 1320,
270
-        "prevSize": 32,
299
+        "prevSize": 24,
271 300
         "code": 59403,
272 301
         "name": "public"
273 302
       },
274
-      "setIdx": 0,
303
+      "setIdx": 1,
275 304
       "setId": 1,
276
-      "iconIdx": 57
305
+      "iconIdx": 9
277 306
     },
278 307
     {
279 308
       "icon": {
@@ -294,13 +323,13 @@
294 323
         "ligatures": "event_note",
295 324
         "id": 1054,
296 325
         "order": 1321,
297
-        "prevSize": 32,
326
+        "prevSize": 24,
298 327
         "code": 58902,
299 328
         "name": "event_note"
300 329
       },
301
-      "setIdx": 0,
330
+      "setIdx": 1,
302 331
       "setId": 1,
303
-      "iconIdx": 58
332
+      "iconIdx": 10
304 333
     },
305 334
     {
306 335
       "icon": {
@@ -321,13 +350,13 @@
321 350
         "ligatures": "timer",
322 351
         "id": 1055,
323 352
         "order": 1322,
324
-        "prevSize": 32,
353
+        "prevSize": 24,
325 354
         "code": 58405,
326 355
         "name": "timer"
327 356
       },
328
-      "setIdx": 0,
357
+      "setIdx": 1,
329 358
       "setId": 1,
330
-      "iconIdx": 59
359
+      "iconIdx": 11
331 360
     },
332 361
     {
333 362
       "icon": {
@@ -348,13 +377,13 @@
348 377
         "ligatures": "bluetooth_audio, bluetooth_searching",
349 378
         "id": 1056,
350 379
         "order": 1323,
351
-        "prevSize": 32,
380
+        "prevSize": 24,
352 381
         "code": 57770,
353 382
         "name": "bluetooth"
354 383
       },
355
-      "setIdx": 0,
384
+      "setIdx": 1,
356 385
       "setId": 1,
357
-      "iconIdx": 60
386
+      "iconIdx": 12
358 387
     },
359 388
     {
360 389
       "icon": {
@@ -375,13 +404,13 @@
375 404
         "ligatures": "headset",
376 405
         "id": 1057,
377 406
         "order": 1324,
378
-        "prevSize": 32,
407
+        "prevSize": 24,
379 408
         "code": 58128,
380 409
         "name": "headset"
381 410
       },
382
-      "setIdx": 0,
411
+      "setIdx": 1,
383 412
       "setId": 1,
384
-      "iconIdx": 61
413
+      "iconIdx": 13
385 414
     },
386 415
     {
387 416
       "icon": {
@@ -402,13 +431,13 @@
402 431
         "ligatures": "phone_in_talk",
403 432
         "id": 1058,
404 433
         "order": 1325,
405
-        "prevSize": 32,
434
+        "prevSize": 24,
406 435
         "code": 58909,
407 436
         "name": "phone-talk"
408 437
       },
409
-      "setIdx": 0,
438
+      "setIdx": 1,
410 439
       "setId": 1,
411
-      "iconIdx": 62
440
+      "iconIdx": 14
412 441
     },
413 442
     {
414 443
       "icon": {
@@ -429,13 +458,13 @@
429 458
         "ligatures": "more_vert",
430 459
         "id": 1059,
431 460
         "order": 1326,
432
-        "prevSize": 32,
461
+        "prevSize": 24,
433 462
         "code": 58836,
434 463
         "name": "thumb-menu"
435 464
       },
436
-      "setIdx": 0,
465
+      "setIdx": 1,
437 466
       "setId": 1,
438
-      "iconIdx": 63
467
+      "iconIdx": 15
439 468
     },
440 469
     {
441 470
       "icon": {
@@ -459,12 +488,12 @@
459 488
         "order": 1327,
460 489
         "id": 1060,
461 490
         "name": "ninja",
462
-        "prevSize": 32,
491
+        "prevSize": 24,
463 492
         "code": 59657
464 493
       },
465
-      "setIdx": 0,
494
+      "setIdx": 1,
466 495
       "setId": 1,
467
-      "iconIdx": 64
496
+      "iconIdx": 16
468 497
     },
469 498
     {
470 499
       "icon": {
@@ -485,13 +514,13 @@
485 514
         "ligatures": "call, local_phone, phone",
486 515
         "id": 1061,
487 516
         "order": 1328,
488
-        "prevSize": 32,
517
+        "prevSize": 24,
489 518
         "code": 57549,
490 519
         "name": "phone"
491 520
       },
492
-      "setIdx": 0,
521
+      "setIdx": 1,
493 522
       "setId": 1,
494
-      "iconIdx": 65
523
+      "iconIdx": 17
495 524
     },
496 525
     {
497 526
       "icon": {
@@ -512,13 +541,13 @@
512 541
         "ligatures": "add",
513 542
         "id": 1062,
514 543
         "order": 1329,
515
-        "prevSize": 32,
544
+        "prevSize": 24,
516 545
         "code": 57669,
517 546
         "name": "add"
518 547
       },
519
-      "setIdx": 0,
548
+      "setIdx": 1,
520 549
       "setId": 1,
521
-      "iconIdx": 66
550
+      "iconIdx": 18
522 551
     },
523 552
     {
524 553
       "icon": {
@@ -545,9 +574,9 @@
545 574
         "prevSize": 32,
546 575
         "code": 59693
547 576
       },
548
-      "setIdx": 0,
577
+      "setIdx": 1,
549 578
       "setId": 1,
550
-      "iconIdx": 2
579
+      "iconIdx": 19
551 580
     },
552 581
     {
553 582
       "icon": {
@@ -574,9 +603,9 @@
574 603
         "prevSize": 32,
575 604
         "code": 59692
576 605
       },
577
-      "setIdx": 0,
606
+      "setIdx": 1,
578 607
       "setId": 1,
579
-      "iconIdx": 3
608
+      "iconIdx": 20
580 609
     },
581 610
     {
582 611
       "icon": {
@@ -603,9 +632,9 @@
603 632
         "prevSize": 32,
604 633
         "code": 59691
605 634
       },
606
-      "setIdx": 0,
635
+      "setIdx": 1,
607 636
       "setId": 1,
608
-      "iconIdx": 4
637
+      "iconIdx": 21
609 638
     },
610 639
     {
611 640
       "icon": {
@@ -635,9 +664,9 @@
635 664
         "prevSize": 32,
636 665
         "code": 59690
637 666
       },
638
-      "setIdx": 0,
667
+      "setIdx": 1,
639 668
       "setId": 1,
640
-      "iconIdx": 5
669
+      "iconIdx": 22
641 670
     },
642 671
     {
643 672
       "icon": {
@@ -664,9 +693,9 @@
664 693
         "prevSize": 32,
665 694
         "code": 59648
666 695
       },
667
-      "setIdx": 0,
696
+      "setIdx": 1,
668 697
       "setId": 1,
669
-      "iconIdx": 6
698
+      "iconIdx": 23
670 699
     },
671 700
     {
672 701
       "icon": {
@@ -693,9 +722,9 @@
693 722
         "prevSize": 32,
694 723
         "code": 59687
695 724
       },
696
-      "setIdx": 0,
725
+      "setIdx": 1,
697 726
       "setId": 1,
698
-      "iconIdx": 7
727
+      "iconIdx": 24
699 728
     },
700 729
     {
701 730
       "icon": {
@@ -722,9 +751,9 @@
722 751
         "prevSize": 32,
723 752
         "code": 59688
724 753
       },
725
-      "setIdx": 0,
754
+      "setIdx": 1,
726 755
       "setId": 1,
727
-      "iconIdx": 8
756
+      "iconIdx": 25
728 757
     },
729 758
     {
730 759
       "icon": {
@@ -751,9 +780,9 @@
751 780
         "prevSize": 32,
752 781
         "code": 59689
753 782
       },
754
-      "setIdx": 0,
783
+      "setIdx": 1,
755 784
       "setId": 1,
756
-      "iconIdx": 9
785
+      "iconIdx": 26
757 786
     },
758 787
     {
759 788
       "icon": {
@@ -780,9 +809,9 @@
780 809
         "prevSize": 32,
781 810
         "code": 59686
782 811
       },
783
-      "setIdx": 0,
812
+      "setIdx": 1,
784 813
       "setId": 1,
785
-      "iconIdx": 10
814
+      "iconIdx": 27
786 815
     },
787 816
     {
788 817
       "icon": {
@@ -809,9 +838,9 @@
809 838
         "prevSize": 32,
810 839
         "code": 59682
811 840
       },
812
-      "setIdx": 0,
841
+      "setIdx": 1,
813 842
       "setId": 1,
814
-      "iconIdx": 11
843
+      "iconIdx": 28
815 844
     },
816 845
     {
817 846
       "icon": {
@@ -838,9 +867,9 @@
838 867
         "prevSize": 32,
839 868
         "code": 59651
840 869
       },
841
-      "setIdx": 0,
870
+      "setIdx": 1,
842 871
       "setId": 1,
843
-      "iconIdx": 12
872
+      "iconIdx": 29
844 873
     },
845 874
     {
846 875
       "icon": {
@@ -867,9 +896,9 @@
867 896
         "prevSize": 32,
868 897
         "code": 59677
869 898
       },
870
-      "setIdx": 0,
899
+      "setIdx": 1,
871 900
       "setId": 1,
872
-      "iconIdx": 13
901
+      "iconIdx": 30
873 902
     },
874 903
     {
875 904
       "icon": {
@@ -896,9 +925,9 @@
896 925
         "prevSize": 32,
897 926
         "code": 59676
898 927
       },
899
-      "setIdx": 0,
928
+      "setIdx": 1,
900 929
       "setId": 1,
901
-      "iconIdx": 14
930
+      "iconIdx": 31
902 931
     },
903 932
     {
904 933
       "icon": {
@@ -922,9 +951,9 @@
922 951
         "code": 59649,
923 952
         "name": "avatar"
924 953
       },
925
-      "setIdx": 0,
954
+      "setIdx": 1,
926 955
       "setId": 1,
927
-      "iconIdx": 15
956
+      "iconIdx": 32
928 957
     },
929 958
     {
930 959
       "icon": {
@@ -948,9 +977,9 @@
948 977
         "code": 59653,
949 978
         "name": "hangup"
950 979
       },
951
-      "setIdx": 0,
980
+      "setIdx": 1,
952 981
       "setId": 1,
953
-      "iconIdx": 16
982
+      "iconIdx": 33
954 983
     },
955 984
     {
956 985
       "icon": {
@@ -974,9 +1003,9 @@
974 1003
         "code": 59654,
975 1004
         "name": "chat"
976 1005
       },
977
-      "setIdx": 0,
1006
+      "setIdx": 1,
978 1007
       "setId": 1,
979
-      "iconIdx": 17
1008
+      "iconIdx": 34
980 1009
     },
981 1010
     {
982 1011
       "icon": {
@@ -1000,9 +1029,9 @@
1000 1029
         "code": 59650,
1001 1030
         "name": "download"
1002 1031
       },
1003
-      "setIdx": 0,
1032
+      "setIdx": 1,
1004 1033
       "setId": 1,
1005
-      "iconIdx": 18
1034
+      "iconIdx": 35
1006 1035
     },
1007 1036
     {
1008 1037
       "icon": {
@@ -1026,9 +1055,9 @@
1026 1055
         "code": 59655,
1027 1056
         "name": "edit"
1028 1057
       },
1029
-      "setIdx": 0,
1058
+      "setIdx": 1,
1030 1059
       "setId": 1,
1031
-      "iconIdx": 19
1060
+      "iconIdx": 36
1032 1061
     },
1033 1062
     {
1034 1063
       "icon": {
@@ -1052,9 +1081,9 @@
1052 1081
         "code": 59656,
1053 1082
         "name": "share-doc"
1054 1083
       },
1055
-      "setIdx": 0,
1084
+      "setIdx": 1,
1056 1085
       "setId": 1,
1057
-      "iconIdx": 20
1086
+      "iconIdx": 37
1058 1087
     },
1059 1088
     {
1060 1089
       "icon": {
@@ -1078,9 +1107,9 @@
1078 1107
         "code": 59652,
1079 1108
         "name": "kick"
1080 1109
       },
1081
-      "setIdx": 0,
1110
+      "setIdx": 1,
1082 1111
       "setId": 1,
1083
-      "iconIdx": 21
1112
+      "iconIdx": 38
1084 1113
     },
1085 1114
     {
1086 1115
       "icon": {
@@ -1104,9 +1133,9 @@
1104 1133
         "code": 59679,
1105 1134
         "name": "menu-up"
1106 1135
       },
1107
-      "setIdx": 0,
1136
+      "setIdx": 1,
1108 1137
       "setId": 1,
1109
-      "iconIdx": 22
1138
+      "iconIdx": 39
1110 1139
     },
1111 1140
     {
1112 1141
       "icon": {
@@ -1130,9 +1159,9 @@
1130 1159
         "code": 59680,
1131 1160
         "name": "menu-down"
1132 1161
       },
1133
-      "setIdx": 0,
1162
+      "setIdx": 1,
1134 1163
       "setId": 1,
1135
-      "iconIdx": 23
1164
+      "iconIdx": 40
1136 1165
     },
1137 1166
     {
1138 1167
       "icon": {
@@ -1156,9 +1185,9 @@
1156 1185
         "code": 59659,
1157 1186
         "name": "full-screen"
1158 1187
       },
1159
-      "setIdx": 0,
1188
+      "setIdx": 1,
1160 1189
       "setId": 1,
1161
-      "iconIdx": 24
1190
+      "iconIdx": 41
1162 1191
     },
1163 1192
     {
1164 1193
       "icon": {
@@ -1182,9 +1211,9 @@
1182 1211
         "code": 59660,
1183 1212
         "name": "exit-full-screen"
1184 1213
       },
1185
-      "setIdx": 0,
1214
+      "setIdx": 1,
1186 1215
       "setId": 1,
1187
-      "iconIdx": 25
1216
+      "iconIdx": 42
1188 1217
     },
1189 1218
     {
1190 1219
       "icon": {
@@ -1208,9 +1237,9 @@
1208 1237
         "code": 59658,
1209 1238
         "name": "star-full"
1210 1239
       },
1211
-      "setIdx": 0,
1240
+      "setIdx": 1,
1212 1241
       "setId": 1,
1213
-      "iconIdx": 26
1242
+      "iconIdx": 43
1214 1243
     },
1215 1244
     {
1216 1245
       "icon": {
@@ -1234,9 +1263,9 @@
1234 1263
         "code": 59661,
1235 1264
         "name": "security"
1236 1265
       },
1237
-      "setIdx": 0,
1266
+      "setIdx": 1,
1238 1267
       "setId": 1,
1239
-      "iconIdx": 27
1268
+      "iconIdx": 44
1240 1269
     },
1241 1270
     {
1242 1271
       "icon": {
@@ -1260,9 +1289,9 @@
1260 1289
         "code": 59662,
1261 1290
         "name": "security-locked"
1262 1291
       },
1263
-      "setIdx": 0,
1292
+      "setIdx": 1,
1264 1293
       "setId": 1,
1265
-      "iconIdx": 28
1294
+      "iconIdx": 45
1266 1295
     },
1267 1296
     {
1268 1297
       "icon": {
@@ -1286,9 +1315,9 @@
1286 1315
         "code": 59663,
1287 1316
         "name": "reload"
1288 1317
       },
1289
-      "setIdx": 0,
1318
+      "setIdx": 1,
1290 1319
       "setId": 1,
1291
-      "iconIdx": 29
1320
+      "iconIdx": 46
1292 1321
     },
1293 1322
     {
1294 1323
       "icon": {
@@ -1312,9 +1341,9 @@
1312 1341
         "code": 59664,
1313 1342
         "name": "microphone"
1314 1343
       },
1315
-      "setIdx": 0,
1344
+      "setIdx": 1,
1316 1345
       "setId": 1,
1317
-      "iconIdx": 30
1346
+      "iconIdx": 47
1318 1347
     },
1319 1348
     {
1320 1349
       "icon": {
@@ -1338,9 +1367,9 @@
1338 1367
         "code": 59665,
1339 1368
         "name": "mic-empty"
1340 1369
       },
1341
-      "setIdx": 0,
1370
+      "setIdx": 1,
1342 1371
       "setId": 1,
1343
-      "iconIdx": 31
1372
+      "iconIdx": 48
1344 1373
     },
1345 1374
     {
1346 1375
       "icon": {
@@ -1364,9 +1393,9 @@
1364 1393
         "code": 59666,
1365 1394
         "name": "mic-disabled"
1366 1395
       },
1367
-      "setIdx": 0,
1396
+      "setIdx": 1,
1368 1397
       "setId": 1,
1369
-      "iconIdx": 32
1398
+      "iconIdx": 49
1370 1399
     },
1371 1400
     {
1372 1401
       "icon": {
@@ -1390,9 +1419,9 @@
1390 1419
         "code": 59678,
1391 1420
         "name": "raised-hand"
1392 1421
       },
1393
-      "setIdx": 0,
1422
+      "setIdx": 1,
1394 1423
       "setId": 1,
1395
-      "iconIdx": 33
1424
+      "iconIdx": 50
1396 1425
     },
1397 1426
     {
1398 1427
       "icon": {
@@ -1416,9 +1445,9 @@
1416 1445
         "code": 59675,
1417 1446
         "name": "contactList"
1418 1447
       },
1419
-      "setIdx": 0,
1448
+      "setIdx": 1,
1420 1449
       "setId": 1,
1421
-      "iconIdx": 34
1450
+      "iconIdx": 51
1422 1451
     },
1423 1452
     {
1424 1453
       "icon": {
@@ -1442,9 +1471,9 @@
1442 1471
         "code": 59667,
1443 1472
         "name": "link"
1444 1473
       },
1445
-      "setIdx": 0,
1474
+      "setIdx": 1,
1446 1475
       "setId": 1,
1447
-      "iconIdx": 35
1476
+      "iconIdx": 52
1448 1477
     },
1449 1478
     {
1450 1479
       "icon": {
@@ -1468,9 +1497,9 @@
1468 1497
         "code": 59668,
1469 1498
         "name": "shared-video"
1470 1499
       },
1471
-      "setIdx": 0,
1500
+      "setIdx": 1,
1472 1501
       "setId": 1,
1473
-      "iconIdx": 36
1502
+      "iconIdx": 53
1474 1503
     },
1475 1504
     {
1476 1505
       "icon": {
@@ -1494,9 +1523,9 @@
1494 1523
         "code": 59669,
1495 1524
         "name": "settings"
1496 1525
       },
1497
-      "setIdx": 0,
1526
+      "setIdx": 1,
1498 1527
       "setId": 1,
1499
-      "iconIdx": 37
1528
+      "iconIdx": 54
1500 1529
     },
1501 1530
     {
1502 1531
       "icon": {
@@ -1520,9 +1549,9 @@
1520 1549
         "code": 59670,
1521 1550
         "name": "star"
1522 1551
       },
1523
-      "setIdx": 0,
1552
+      "setIdx": 1,
1524 1553
       "setId": 1,
1525
-      "iconIdx": 38
1554
+      "iconIdx": 55
1526 1555
     },
1527 1556
     {
1528 1557
       "icon": {
@@ -1546,9 +1575,9 @@
1546 1575
         "code": 59681,
1547 1576
         "name": "switch-camera"
1548 1577
       },
1549
-      "setIdx": 0,
1578
+      "setIdx": 1,
1550 1579
       "setId": 1,
1551
-      "iconIdx": 39
1580
+      "iconIdx": 56
1552 1581
     },
1553 1582
     {
1554 1583
       "icon": {
@@ -1572,9 +1601,9 @@
1572 1601
         "code": 59671,
1573 1602
         "name": "share-desktop"
1574 1603
       },
1575
-      "setIdx": 0,
1604
+      "setIdx": 1,
1576 1605
       "setId": 1,
1577
-      "iconIdx": 40
1606
+      "iconIdx": 57
1578 1607
     },
1579 1608
     {
1580 1609
       "icon": {
@@ -1598,9 +1627,9 @@
1598 1627
         "code": 59672,
1599 1628
         "name": "camera"
1600 1629
       },
1601
-      "setIdx": 0,
1630
+      "setIdx": 1,
1602 1631
       "setId": 1,
1603
-      "iconIdx": 41
1632
+      "iconIdx": 58
1604 1633
     },
1605 1634
     {
1606 1635
       "icon": {
@@ -1624,9 +1653,9 @@
1624 1653
         "code": 59673,
1625 1654
         "name": "camera-disabled"
1626 1655
       },
1627
-      "setIdx": 0,
1656
+      "setIdx": 1,
1628 1657
       "setId": 1,
1629
-      "iconIdx": 42
1658
+      "iconIdx": 59
1630 1659
     },
1631 1660
     {
1632 1661
       "icon": {
@@ -1650,9 +1679,9 @@
1650 1679
         "code": 59674,
1651 1680
         "name": "volume"
1652 1681
       },
1653
-      "setIdx": 0,
1682
+      "setIdx": 1,
1654 1683
       "setId": 1,
1655
-      "iconIdx": 43
1684
+      "iconIdx": 60
1656 1685
     },
1657 1686
     {
1658 1687
       "icon": {
@@ -1679,9 +1708,9 @@
1679 1708
         "name": "recDisable",
1680 1709
         "ligatures": ""
1681 1710
       },
1682
-      "setIdx": 0,
1711
+      "setIdx": 1,
1683 1712
       "setId": 1,
1684
-      "iconIdx": 44
1713
+      "iconIdx": 61
1685 1714
     },
1686 1715
     {
1687 1716
       "icon": {
@@ -1709,9 +1738,9 @@
1709 1738
         "name": "recEnable",
1710 1739
         "ligatures": ""
1711 1740
       },
1712
-      "setIdx": 0,
1741
+      "setIdx": 1,
1713 1742
       "setId": 1,
1714
-      "iconIdx": 45
1743
+      "iconIdx": 62
1715 1744
     },
1716 1745
     {
1717 1746
       "icon": {
@@ -1739,9 +1768,9 @@
1739 1768
         "name": "presentation",
1740 1769
         "ligatures": ""
1741 1770
       },
1742
-      "setIdx": 0,
1771
+      "setIdx": 1,
1743 1772
       "setId": 1,
1744
-      "iconIdx": 46
1773
+      "iconIdx": 63
1745 1774
     },
1746 1775
     {
1747 1776
       "icon": {
@@ -1765,9 +1794,9 @@
1765 1794
         "code": 59685,
1766 1795
         "name": "dialpad"
1767 1796
       },
1768
-      "setIdx": 0,
1797
+      "setIdx": 1,
1769 1798
       "setId": 1,
1770
-      "iconIdx": 47
1799
+      "iconIdx": 64
1771 1800
     },
1772 1801
     {
1773 1802
       "icon": {
@@ -1791,9 +1820,9 @@
1791 1820
         "code": 59683,
1792 1821
         "name": "visibility"
1793 1822
       },
1794
-      "setIdx": 0,
1823
+      "setIdx": 1,
1795 1824
       "setId": 1,
1796
-      "iconIdx": 48
1825
+      "iconIdx": 65
1797 1826
     },
1798 1827
     {
1799 1828
       "icon": {
@@ -1817,9 +1846,9 @@
1817 1846
         "code": 59684,
1818 1847
         "name": "visibility-off"
1819 1848
       },
1820
-      "setIdx": 0,
1849
+      "setIdx": 1,
1821 1850
       "setId": 1,
1822
-      "iconIdx": 49
1851
+      "iconIdx": 66
1823 1852
     }
1824 1853
   ],
1825 1854
   "height": 1024,

+ 4
- 4
interface_config.js Voir le fichier

@@ -45,10 +45,10 @@ var interfaceConfig = {
45 45
      * jwt.
46 46
      */
47 47
     TOOLBAR_BUTTONS: [
48
-        'microphone', 'camera', 'desktop', 'fullscreen', 'fodeviceselection', 'hangup',
49
-        'profile', 'info', 'chat', 'recording', 'livestreaming', 'etherpad',
50
-        'sharedvideo', 'settings', 'raisehand', 'videoquality', 'filmstrip',
51
-        'invite', 'feedback', 'stats', 'shortcuts'
48
+        'microphone', 'camera', 'closedcaptions', 'desktop', 'fullscreen',
49
+        'fodeviceselection', 'hangup', 'profile', 'info', 'chat', 'recording',
50
+        'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand',
51
+        'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts'
52 52
     ],
53 53
 
54 54
     SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile' ],

+ 13
- 1
lang/main.json Voir le fichier

@@ -81,6 +81,7 @@
81 81
             "audioRoute": "Select the sound device",
82 82
             "callQuality": "Manage call quality",
83 83
             "chat": "Toggle chat window",
84
+            "cc": "Toggle subtitles",
84 85
             "document": "Toggle shared document",
85 86
             "feedback": "Leave feedback",
86 87
             "fullScreen": "Toggle full screen",
@@ -381,7 +382,8 @@
381 382
         "shareYourScreenDisabled": "Screen sharing disabled.",
382 383
         "shareYourScreenDisabledForGuest": "Guests can't screen share.",
383 384
         "yourEntireScreen": "Your entire screen",
384
-        "applicationWindow": "Application window"
385
+        "applicationWindow": "Application window",
386
+        "transcribing": "Transcribing"
385 387
     },
386 388
     "email":
387 389
     {
@@ -448,6 +450,16 @@
448 450
         "unavailable": "Oops! The __serviceName__ is currently unavailable. We're working on resolving the issue. Please try again later.",
449 451
         "unavailableTitle": "Recording unavailable"
450 452
     },
453
+    "transcribing":
454
+    {
455
+        "pending" : "Preparing to transcribe the meeting...",
456
+        "off" : "Transcribing stopped",
457
+        "error": "Transcribing failed. Please try again.",
458
+        "failedToStart": "Transcribing failed to start",
459
+        "tr": "TR",
460
+        "labelToolTip": "The meeting is being transcribed",
461
+        "ccButtonTooltip": "Start / Stop showing subtitles"
462
+    },
451 463
     "liveStreaming":
452 464
     {
453 465
         "busy": "We're working on freeing streaming resources. Please try again in a few minutes.",

+ 180
- 151
react/features/base/font-icons/jitsi.json Voir le fichier

@@ -1,6 +1,35 @@
1 1
 {
2 2
   "IcoMoonType": "selection",
3 3
   "icons": [
4
+    {
5
+      "icon": {
6
+        "paths": [
7
+          "M768 470v-44c0-24-18-42-42-42h-128c-24 0-44 18-44 42v172c0 24 20 42 44 42h128c24 0 42-18 42-42v-44h-64v22h-86v-128h86v22h64zM470 470v-44c0-24-20-42-44-42h-128c-24 0-42 18-42 42v172c0 24 18 42 42 42h128c24 0 44-18 44-42v-44h-64v22h-86v-128h86v22h64zM810 170c46 0 86 40 86 86v512c0 46-40 86-86 86h-596c-48 0-86-40-86-86v-512c0-46 38-86 86-86h596z"
8
+        ],
9
+        "attrs": [
10
+          {}
11
+        ],
12
+        "isMulticolor": false,
13
+        "isMulticolor2": false,
14
+        "tags": [
15
+          "closed_caption"
16
+        ],
17
+        "grid": 24
18
+      },
19
+      "attrs": [
20
+        {}
21
+      ],
22
+      "properties": {
23
+        "order": 1,
24
+        "id": 0,
25
+        "prevSize": 24,
26
+        "code": 59696,
27
+        "name": "closed_caption"
28
+      },
29
+      "setIdx": 0,
30
+      "setId": 2,
31
+      "iconIdx": 0
32
+    },
4 33
     {
5 34
       "icon": {
6 35
         "paths": [
@@ -23,10 +52,10 @@
23 52
         "order": 1377,
24 53
         "id": 1065,
25 54
         "name": "tiles-many",
26
-        "prevSize": 32,
55
+        "prevSize": 24,
27 56
         "code": 59694
28 57
       },
29
-      "setIdx": 0,
58
+      "setIdx": 1,
30 59
       "setId": 1,
31 60
       "iconIdx": 0
32 61
     },
@@ -52,10 +81,10 @@
52 81
         "order": 1378,
53 82
         "id": 1064,
54 83
         "name": "tiles-one",
55
-        "prevSize": 32,
84
+        "prevSize": 24,
56 85
         "code": 59695
57 86
       },
58
-      "setIdx": 0,
87
+      "setIdx": 1,
59 88
       "setId": 1,
60 89
       "iconIdx": 1
61 90
     },
@@ -78,13 +107,13 @@
78 107
         "ligatures": "clear, close",
79 108
         "id": 157,
80 109
         "order": 1313,
81
-        "prevSize": 32,
110
+        "prevSize": 24,
82 111
         "code": 58829,
83 112
         "name": "close"
84 113
       },
85
-      "setIdx": 0,
114
+      "setIdx": 1,
86 115
       "setId": 1,
87
-      "iconIdx": 50
116
+      "iconIdx": 2
88 117
     },
89 118
     {
90 119
       "icon": {
@@ -105,13 +134,13 @@
105 134
         "ligatures": "launch, open_in_new",
106 135
         "id": 1047,
107 136
         "order": 1314,
108
-        "prevSize": 32,
137
+        "prevSize": 24,
109 138
         "name": "open_in_new",
110 139
         "code": 59550
111 140
       },
112
-      "setIdx": 0,
141
+      "setIdx": 1,
113 142
       "setId": 1,
114
-      "iconIdx": 51
143
+      "iconIdx": 3
115 144
     },
116 145
     {
117 146
       "icon": {
@@ -132,13 +161,13 @@
132 161
         "ligatures": "history, restore",
133 162
         "id": 1048,
134 163
         "order": 1315,
135
-        "prevSize": 32,
164
+        "prevSize": 24,
136 165
         "code": 59571,
137 166
         "name": "restore"
138 167
       },
139
-      "setIdx": 0,
168
+      "setIdx": 1,
140 169
       "setId": 1,
141
-      "iconIdx": 52
170
+      "iconIdx": 4
142 171
     },
143 172
     {
144 173
       "icon": {
@@ -159,13 +188,13 @@
159 188
         "ligatures": "chevron_right, navigate_next",
160 189
         "id": 1049,
161 190
         "order": 1316,
162
-        "prevSize": 32,
191
+        "prevSize": 24,
163 192
         "code": 58377,
164 193
         "name": "navigate_next"
165 194
       },
166
-      "setIdx": 0,
195
+      "setIdx": 1,
167 196
       "setId": 1,
168
-      "iconIdx": 53
197
+      "iconIdx": 5
169 198
     },
170 199
     {
171 200
       "icon": {
@@ -186,13 +215,13 @@
186 215
         "ligatures": "menu",
187 216
         "id": 1050,
188 217
         "order": 1317,
189
-        "prevSize": 32,
218
+        "prevSize": 24,
190 219
         "code": 58834,
191 220
         "name": "menu"
192 221
       },
193
-      "setIdx": 0,
222
+      "setIdx": 1,
194 223
       "setId": 1,
195
-      "iconIdx": 54
224
+      "iconIdx": 6
196 225
     },
197 226
     {
198 227
       "icon": {
@@ -213,13 +242,13 @@
213 242
         "ligatures": "arrow_back",
214 243
         "id": 1051,
215 244
         "order": 1318,
216
-        "prevSize": 32,
245
+        "prevSize": 24,
217 246
         "code": 58820,
218 247
         "name": "arrow_back"
219 248
       },
220
-      "setIdx": 0,
249
+      "setIdx": 1,
221 250
       "setId": 1,
222
-      "iconIdx": 55
251
+      "iconIdx": 7
223 252
     },
224 253
     {
225 254
       "icon": {
@@ -240,13 +269,13 @@
240 269
         "ligatures": "chevron_left, navigate_before",
241 270
         "id": 1052,
242 271
         "order": 1319,
243
-        "prevSize": 32,
272
+        "prevSize": 24,
244 273
         "code": 58376,
245 274
         "name": "navigate_before"
246 275
       },
247
-      "setIdx": 0,
276
+      "setIdx": 1,
248 277
       "setId": 1,
249
-      "iconIdx": 56
278
+      "iconIdx": 8
250 279
     },
251 280
     {
252 281
       "icon": {
@@ -267,13 +296,13 @@
267 296
         "ligatures": "public",
268 297
         "id": 1053,
269 298
         "order": 1320,
270
-        "prevSize": 32,
299
+        "prevSize": 24,
271 300
         "code": 59403,
272 301
         "name": "public"
273 302
       },
274
-      "setIdx": 0,
303
+      "setIdx": 1,
275 304
       "setId": 1,
276
-      "iconIdx": 57
305
+      "iconIdx": 9
277 306
     },
278 307
     {
279 308
       "icon": {
@@ -294,13 +323,13 @@
294 323
         "ligatures": "event_note",
295 324
         "id": 1054,
296 325
         "order": 1321,
297
-        "prevSize": 32,
326
+        "prevSize": 24,
298 327
         "code": 58902,
299 328
         "name": "event_note"
300 329
       },
301
-      "setIdx": 0,
330
+      "setIdx": 1,
302 331
       "setId": 1,
303
-      "iconIdx": 58
332
+      "iconIdx": 10
304 333
     },
305 334
     {
306 335
       "icon": {
@@ -321,13 +350,13 @@
321 350
         "ligatures": "timer",
322 351
         "id": 1055,
323 352
         "order": 1322,
324
-        "prevSize": 32,
353
+        "prevSize": 24,
325 354
         "code": 58405,
326 355
         "name": "timer"
327 356
       },
328
-      "setIdx": 0,
357
+      "setIdx": 1,
329 358
       "setId": 1,
330
-      "iconIdx": 59
359
+      "iconIdx": 11
331 360
     },
332 361
     {
333 362
       "icon": {
@@ -348,13 +377,13 @@
348 377
         "ligatures": "bluetooth_audio, bluetooth_searching",
349 378
         "id": 1056,
350 379
         "order": 1323,
351
-        "prevSize": 32,
380
+        "prevSize": 24,
352 381
         "code": 57770,
353 382
         "name": "bluetooth"
354 383
       },
355
-      "setIdx": 0,
384
+      "setIdx": 1,
356 385
       "setId": 1,
357
-      "iconIdx": 60
386
+      "iconIdx": 12
358 387
     },
359 388
     {
360 389
       "icon": {
@@ -375,13 +404,13 @@
375 404
         "ligatures": "headset",
376 405
         "id": 1057,
377 406
         "order": 1324,
378
-        "prevSize": 32,
407
+        "prevSize": 24,
379 408
         "code": 58128,
380 409
         "name": "headset"
381 410
       },
382
-      "setIdx": 0,
411
+      "setIdx": 1,
383 412
       "setId": 1,
384
-      "iconIdx": 61
413
+      "iconIdx": 13
385 414
     },
386 415
     {
387 416
       "icon": {
@@ -402,13 +431,13 @@
402 431
         "ligatures": "phone_in_talk",
403 432
         "id": 1058,
404 433
         "order": 1325,
405
-        "prevSize": 32,
434
+        "prevSize": 24,
406 435
         "code": 58909,
407 436
         "name": "phone-talk"
408 437
       },
409
-      "setIdx": 0,
438
+      "setIdx": 1,
410 439
       "setId": 1,
411
-      "iconIdx": 62
440
+      "iconIdx": 14
412 441
     },
413 442
     {
414 443
       "icon": {
@@ -429,13 +458,13 @@
429 458
         "ligatures": "more_vert",
430 459
         "id": 1059,
431 460
         "order": 1326,
432
-        "prevSize": 32,
461
+        "prevSize": 24,
433 462
         "code": 58836,
434 463
         "name": "thumb-menu"
435 464
       },
436
-      "setIdx": 0,
465
+      "setIdx": 1,
437 466
       "setId": 1,
438
-      "iconIdx": 63
467
+      "iconIdx": 15
439 468
     },
440 469
     {
441 470
       "icon": {
@@ -459,12 +488,12 @@
459 488
         "order": 1327,
460 489
         "id": 1060,
461 490
         "name": "ninja",
462
-        "prevSize": 32,
491
+        "prevSize": 24,
463 492
         "code": 59657
464 493
       },
465
-      "setIdx": 0,
494
+      "setIdx": 1,
466 495
       "setId": 1,
467
-      "iconIdx": 64
496
+      "iconIdx": 16
468 497
     },
469 498
     {
470 499
       "icon": {
@@ -485,13 +514,13 @@
485 514
         "ligatures": "call, local_phone, phone",
486 515
         "id": 1061,
487 516
         "order": 1328,
488
-        "prevSize": 32,
517
+        "prevSize": 24,
489 518
         "code": 57549,
490 519
         "name": "phone"
491 520
       },
492
-      "setIdx": 0,
521
+      "setIdx": 1,
493 522
       "setId": 1,
494
-      "iconIdx": 65
523
+      "iconIdx": 17
495 524
     },
496 525
     {
497 526
       "icon": {
@@ -512,13 +541,13 @@
512 541
         "ligatures": "add",
513 542
         "id": 1062,
514 543
         "order": 1329,
515
-        "prevSize": 32,
544
+        "prevSize": 24,
516 545
         "code": 57669,
517 546
         "name": "add"
518 547
       },
519
-      "setIdx": 0,
548
+      "setIdx": 1,
520 549
       "setId": 1,
521
-      "iconIdx": 66
550
+      "iconIdx": 18
522 551
     },
523 552
     {
524 553
       "icon": {
@@ -545,9 +574,9 @@
545 574
         "prevSize": 32,
546 575
         "code": 59693
547 576
       },
548
-      "setIdx": 0,
577
+      "setIdx": 1,
549 578
       "setId": 1,
550
-      "iconIdx": 2
579
+      "iconIdx": 19
551 580
     },
552 581
     {
553 582
       "icon": {
@@ -574,9 +603,9 @@
574 603
         "prevSize": 32,
575 604
         "code": 59692
576 605
       },
577
-      "setIdx": 0,
606
+      "setIdx": 1,
578 607
       "setId": 1,
579
-      "iconIdx": 3
608
+      "iconIdx": 20
580 609
     },
581 610
     {
582 611
       "icon": {
@@ -603,9 +632,9 @@
603 632
         "prevSize": 32,
604 633
         "code": 59691
605 634
       },
606
-      "setIdx": 0,
635
+      "setIdx": 1,
607 636
       "setId": 1,
608
-      "iconIdx": 4
637
+      "iconIdx": 21
609 638
     },
610 639
     {
611 640
       "icon": {
@@ -635,9 +664,9 @@
635 664
         "prevSize": 32,
636 665
         "code": 59690
637 666
       },
638
-      "setIdx": 0,
667
+      "setIdx": 1,
639 668
       "setId": 1,
640
-      "iconIdx": 5
669
+      "iconIdx": 22
641 670
     },
642 671
     {
643 672
       "icon": {
@@ -664,9 +693,9 @@
664 693
         "prevSize": 32,
665 694
         "code": 59648
666 695
       },
667
-      "setIdx": 0,
696
+      "setIdx": 1,
668 697
       "setId": 1,
669
-      "iconIdx": 6
698
+      "iconIdx": 23
670 699
     },
671 700
     {
672 701
       "icon": {
@@ -693,9 +722,9 @@
693 722
         "prevSize": 32,
694 723
         "code": 59687
695 724
       },
696
-      "setIdx": 0,
725
+      "setIdx": 1,
697 726
       "setId": 1,
698
-      "iconIdx": 7
727
+      "iconIdx": 24
699 728
     },
700 729
     {
701 730
       "icon": {
@@ -722,9 +751,9 @@
722 751
         "prevSize": 32,
723 752
         "code": 59688
724 753
       },
725
-      "setIdx": 0,
754
+      "setIdx": 1,
726 755
       "setId": 1,
727
-      "iconIdx": 8
756
+      "iconIdx": 25
728 757
     },
729 758
     {
730 759
       "icon": {
@@ -751,9 +780,9 @@
751 780
         "prevSize": 32,
752 781
         "code": 59689
753 782
       },
754
-      "setIdx": 0,
783
+      "setIdx": 1,
755 784
       "setId": 1,
756
-      "iconIdx": 9
785
+      "iconIdx": 26
757 786
     },
758 787
     {
759 788
       "icon": {
@@ -780,9 +809,9 @@
780 809
         "prevSize": 32,
781 810
         "code": 59686
782 811
       },
783
-      "setIdx": 0,
812
+      "setIdx": 1,
784 813
       "setId": 1,
785
-      "iconIdx": 10
814
+      "iconIdx": 27
786 815
     },
787 816
     {
788 817
       "icon": {
@@ -809,9 +838,9 @@
809 838
         "prevSize": 32,
810 839
         "code": 59682
811 840
       },
812
-      "setIdx": 0,
841
+      "setIdx": 1,
813 842
       "setId": 1,
814
-      "iconIdx": 11
843
+      "iconIdx": 28
815 844
     },
816 845
     {
817 846
       "icon": {
@@ -838,9 +867,9 @@
838 867
         "prevSize": 32,
839 868
         "code": 59651
840 869
       },
841
-      "setIdx": 0,
870
+      "setIdx": 1,
842 871
       "setId": 1,
843
-      "iconIdx": 12
872
+      "iconIdx": 29
844 873
     },
845 874
     {
846 875
       "icon": {
@@ -867,9 +896,9 @@
867 896
         "prevSize": 32,
868 897
         "code": 59677
869 898
       },
870
-      "setIdx": 0,
899
+      "setIdx": 1,
871 900
       "setId": 1,
872
-      "iconIdx": 13
901
+      "iconIdx": 30
873 902
     },
874 903
     {
875 904
       "icon": {
@@ -896,9 +925,9 @@
896 925
         "prevSize": 32,
897 926
         "code": 59676
898 927
       },
899
-      "setIdx": 0,
928
+      "setIdx": 1,
900 929
       "setId": 1,
901
-      "iconIdx": 14
930
+      "iconIdx": 31
902 931
     },
903 932
     {
904 933
       "icon": {
@@ -922,9 +951,9 @@
922 951
         "code": 59649,
923 952
         "name": "avatar"
924 953
       },
925
-      "setIdx": 0,
954
+      "setIdx": 1,
926 955
       "setId": 1,
927
-      "iconIdx": 15
956
+      "iconIdx": 32
928 957
     },
929 958
     {
930 959
       "icon": {
@@ -948,9 +977,9 @@
948 977
         "code": 59653,
949 978
         "name": "hangup"
950 979
       },
951
-      "setIdx": 0,
980
+      "setIdx": 1,
952 981
       "setId": 1,
953
-      "iconIdx": 16
982
+      "iconIdx": 33
954 983
     },
955 984
     {
956 985
       "icon": {
@@ -974,9 +1003,9 @@
974 1003
         "code": 59654,
975 1004
         "name": "chat"
976 1005
       },
977
-      "setIdx": 0,
1006
+      "setIdx": 1,
978 1007
       "setId": 1,
979
-      "iconIdx": 17
1008
+      "iconIdx": 34
980 1009
     },
981 1010
     {
982 1011
       "icon": {
@@ -1000,9 +1029,9 @@
1000 1029
         "code": 59650,
1001 1030
         "name": "download"
1002 1031
       },
1003
-      "setIdx": 0,
1032
+      "setIdx": 1,
1004 1033
       "setId": 1,
1005
-      "iconIdx": 18
1034
+      "iconIdx": 35
1006 1035
     },
1007 1036
     {
1008 1037
       "icon": {
@@ -1026,9 +1055,9 @@
1026 1055
         "code": 59655,
1027 1056
         "name": "edit"
1028 1057
       },
1029
-      "setIdx": 0,
1058
+      "setIdx": 1,
1030 1059
       "setId": 1,
1031
-      "iconIdx": 19
1060
+      "iconIdx": 36
1032 1061
     },
1033 1062
     {
1034 1063
       "icon": {
@@ -1052,9 +1081,9 @@
1052 1081
         "code": 59656,
1053 1082
         "name": "share-doc"
1054 1083
       },
1055
-      "setIdx": 0,
1084
+      "setIdx": 1,
1056 1085
       "setId": 1,
1057
-      "iconIdx": 20
1086
+      "iconIdx": 37
1058 1087
     },
1059 1088
     {
1060 1089
       "icon": {
@@ -1078,9 +1107,9 @@
1078 1107
         "code": 59652,
1079 1108
         "name": "kick"
1080 1109
       },
1081
-      "setIdx": 0,
1110
+      "setIdx": 1,
1082 1111
       "setId": 1,
1083
-      "iconIdx": 21
1112
+      "iconIdx": 38
1084 1113
     },
1085 1114
     {
1086 1115
       "icon": {
@@ -1104,9 +1133,9 @@
1104 1133
         "code": 59679,
1105 1134
         "name": "menu-up"
1106 1135
       },
1107
-      "setIdx": 0,
1136
+      "setIdx": 1,
1108 1137
       "setId": 1,
1109
-      "iconIdx": 22
1138
+      "iconIdx": 39
1110 1139
     },
1111 1140
     {
1112 1141
       "icon": {
@@ -1130,9 +1159,9 @@
1130 1159
         "code": 59680,
1131 1160
         "name": "menu-down"
1132 1161
       },
1133
-      "setIdx": 0,
1162
+      "setIdx": 1,
1134 1163
       "setId": 1,
1135
-      "iconIdx": 23
1164
+      "iconIdx": 40
1136 1165
     },
1137 1166
     {
1138 1167
       "icon": {
@@ -1156,9 +1185,9 @@
1156 1185
         "code": 59659,
1157 1186
         "name": "full-screen"
1158 1187
       },
1159
-      "setIdx": 0,
1188
+      "setIdx": 1,
1160 1189
       "setId": 1,
1161
-      "iconIdx": 24
1190
+      "iconIdx": 41
1162 1191
     },
1163 1192
     {
1164 1193
       "icon": {
@@ -1182,9 +1211,9 @@
1182 1211
         "code": 59660,
1183 1212
         "name": "exit-full-screen"
1184 1213
       },
1185
-      "setIdx": 0,
1214
+      "setIdx": 1,
1186 1215
       "setId": 1,
1187
-      "iconIdx": 25
1216
+      "iconIdx": 42
1188 1217
     },
1189 1218
     {
1190 1219
       "icon": {
@@ -1208,9 +1237,9 @@
1208 1237
         "code": 59658,
1209 1238
         "name": "star-full"
1210 1239
       },
1211
-      "setIdx": 0,
1240
+      "setIdx": 1,
1212 1241
       "setId": 1,
1213
-      "iconIdx": 26
1242
+      "iconIdx": 43
1214 1243
     },
1215 1244
     {
1216 1245
       "icon": {
@@ -1234,9 +1263,9 @@
1234 1263
         "code": 59661,
1235 1264
         "name": "security"
1236 1265
       },
1237
-      "setIdx": 0,
1266
+      "setIdx": 1,
1238 1267
       "setId": 1,
1239
-      "iconIdx": 27
1268
+      "iconIdx": 44
1240 1269
     },
1241 1270
     {
1242 1271
       "icon": {
@@ -1260,9 +1289,9 @@
1260 1289
         "code": 59662,
1261 1290
         "name": "security-locked"
1262 1291
       },
1263
-      "setIdx": 0,
1292
+      "setIdx": 1,
1264 1293
       "setId": 1,
1265
-      "iconIdx": 28
1294
+      "iconIdx": 45
1266 1295
     },
1267 1296
     {
1268 1297
       "icon": {
@@ -1286,9 +1315,9 @@
1286 1315
         "code": 59663,
1287 1316
         "name": "reload"
1288 1317
       },
1289
-      "setIdx": 0,
1318
+      "setIdx": 1,
1290 1319
       "setId": 1,
1291
-      "iconIdx": 29
1320
+      "iconIdx": 46
1292 1321
     },
1293 1322
     {
1294 1323
       "icon": {
@@ -1312,9 +1341,9 @@
1312 1341
         "code": 59664,
1313 1342
         "name": "microphone"
1314 1343
       },
1315
-      "setIdx": 0,
1344
+      "setIdx": 1,
1316 1345
       "setId": 1,
1317
-      "iconIdx": 30
1346
+      "iconIdx": 47
1318 1347
     },
1319 1348
     {
1320 1349
       "icon": {
@@ -1338,9 +1367,9 @@
1338 1367
         "code": 59665,
1339 1368
         "name": "mic-empty"
1340 1369
       },
1341
-      "setIdx": 0,
1370
+      "setIdx": 1,
1342 1371
       "setId": 1,
1343
-      "iconIdx": 31
1372
+      "iconIdx": 48
1344 1373
     },
1345 1374
     {
1346 1375
       "icon": {
@@ -1364,9 +1393,9 @@
1364 1393
         "code": 59666,
1365 1394
         "name": "mic-disabled"
1366 1395
       },
1367
-      "setIdx": 0,
1396
+      "setIdx": 1,
1368 1397
       "setId": 1,
1369
-      "iconIdx": 32
1398
+      "iconIdx": 49
1370 1399
     },
1371 1400
     {
1372 1401
       "icon": {
@@ -1390,9 +1419,9 @@
1390 1419
         "code": 59678,
1391 1420
         "name": "raised-hand"
1392 1421
       },
1393
-      "setIdx": 0,
1422
+      "setIdx": 1,
1394 1423
       "setId": 1,
1395
-      "iconIdx": 33
1424
+      "iconIdx": 50
1396 1425
     },
1397 1426
     {
1398 1427
       "icon": {
@@ -1416,9 +1445,9 @@
1416 1445
         "code": 59675,
1417 1446
         "name": "contactList"
1418 1447
       },
1419
-      "setIdx": 0,
1448
+      "setIdx": 1,
1420 1449
       "setId": 1,
1421
-      "iconIdx": 34
1450
+      "iconIdx": 51
1422 1451
     },
1423 1452
     {
1424 1453
       "icon": {
@@ -1442,9 +1471,9 @@
1442 1471
         "code": 59667,
1443 1472
         "name": "link"
1444 1473
       },
1445
-      "setIdx": 0,
1474
+      "setIdx": 1,
1446 1475
       "setId": 1,
1447
-      "iconIdx": 35
1476
+      "iconIdx": 52
1448 1477
     },
1449 1478
     {
1450 1479
       "icon": {
@@ -1468,9 +1497,9 @@
1468 1497
         "code": 59668,
1469 1498
         "name": "shared-video"
1470 1499
       },
1471
-      "setIdx": 0,
1500
+      "setIdx": 1,
1472 1501
       "setId": 1,
1473
-      "iconIdx": 36
1502
+      "iconIdx": 53
1474 1503
     },
1475 1504
     {
1476 1505
       "icon": {
@@ -1494,9 +1523,9 @@
1494 1523
         "code": 59669,
1495 1524
         "name": "settings"
1496 1525
       },
1497
-      "setIdx": 0,
1526
+      "setIdx": 1,
1498 1527
       "setId": 1,
1499
-      "iconIdx": 37
1528
+      "iconIdx": 54
1500 1529
     },
1501 1530
     {
1502 1531
       "icon": {
@@ -1520,9 +1549,9 @@
1520 1549
         "code": 59670,
1521 1550
         "name": "star"
1522 1551
       },
1523
-      "setIdx": 0,
1552
+      "setIdx": 1,
1524 1553
       "setId": 1,
1525
-      "iconIdx": 38
1554
+      "iconIdx": 55
1526 1555
     },
1527 1556
     {
1528 1557
       "icon": {
@@ -1546,9 +1575,9 @@
1546 1575
         "code": 59681,
1547 1576
         "name": "switch-camera"
1548 1577
       },
1549
-      "setIdx": 0,
1578
+      "setIdx": 1,
1550 1579
       "setId": 1,
1551
-      "iconIdx": 39
1580
+      "iconIdx": 56
1552 1581
     },
1553 1582
     {
1554 1583
       "icon": {
@@ -1572,9 +1601,9 @@
1572 1601
         "code": 59671,
1573 1602
         "name": "share-desktop"
1574 1603
       },
1575
-      "setIdx": 0,
1604
+      "setIdx": 1,
1576 1605
       "setId": 1,
1577
-      "iconIdx": 40
1606
+      "iconIdx": 57
1578 1607
     },
1579 1608
     {
1580 1609
       "icon": {
@@ -1598,9 +1627,9 @@
1598 1627
         "code": 59672,
1599 1628
         "name": "camera"
1600 1629
       },
1601
-      "setIdx": 0,
1630
+      "setIdx": 1,
1602 1631
       "setId": 1,
1603
-      "iconIdx": 41
1632
+      "iconIdx": 58
1604 1633
     },
1605 1634
     {
1606 1635
       "icon": {
@@ -1624,9 +1653,9 @@
1624 1653
         "code": 59673,
1625 1654
         "name": "camera-disabled"
1626 1655
       },
1627
-      "setIdx": 0,
1656
+      "setIdx": 1,
1628 1657
       "setId": 1,
1629
-      "iconIdx": 42
1658
+      "iconIdx": 59
1630 1659
     },
1631 1660
     {
1632 1661
       "icon": {
@@ -1650,9 +1679,9 @@
1650 1679
         "code": 59674,
1651 1680
         "name": "volume"
1652 1681
       },
1653
-      "setIdx": 0,
1682
+      "setIdx": 1,
1654 1683
       "setId": 1,
1655
-      "iconIdx": 43
1684
+      "iconIdx": 60
1656 1685
     },
1657 1686
     {
1658 1687
       "icon": {
@@ -1679,9 +1708,9 @@
1679 1708
         "name": "recDisable",
1680 1709
         "ligatures": ""
1681 1710
       },
1682
-      "setIdx": 0,
1711
+      "setIdx": 1,
1683 1712
       "setId": 1,
1684
-      "iconIdx": 44
1713
+      "iconIdx": 61
1685 1714
     },
1686 1715
     {
1687 1716
       "icon": {
@@ -1709,9 +1738,9 @@
1709 1738
         "name": "recEnable",
1710 1739
         "ligatures": ""
1711 1740
       },
1712
-      "setIdx": 0,
1741
+      "setIdx": 1,
1713 1742
       "setId": 1,
1714
-      "iconIdx": 45
1743
+      "iconIdx": 62
1715 1744
     },
1716 1745
     {
1717 1746
       "icon": {
@@ -1739,9 +1768,9 @@
1739 1768
         "name": "presentation",
1740 1769
         "ligatures": ""
1741 1770
       },
1742
-      "setIdx": 0,
1771
+      "setIdx": 1,
1743 1772
       "setId": 1,
1744
-      "iconIdx": 46
1773
+      "iconIdx": 63
1745 1774
     },
1746 1775
     {
1747 1776
       "icon": {
@@ -1765,9 +1794,9 @@
1765 1794
         "code": 59685,
1766 1795
         "name": "dialpad"
1767 1796
       },
1768
-      "setIdx": 0,
1797
+      "setIdx": 1,
1769 1798
       "setId": 1,
1770
-      "iconIdx": 47
1799
+      "iconIdx": 64
1771 1800
     },
1772 1801
     {
1773 1802
       "icon": {
@@ -1791,9 +1820,9 @@
1791 1820
         "code": 59683,
1792 1821
         "name": "visibility"
1793 1822
       },
1794
-      "setIdx": 0,
1823
+      "setIdx": 1,
1795 1824
       "setId": 1,
1796
-      "iconIdx": 48
1825
+      "iconIdx": 65
1797 1826
     },
1798 1827
     {
1799 1828
       "icon": {
@@ -1817,9 +1846,9 @@
1817 1846
         "code": 59684,
1818 1847
         "name": "visibility-off"
1819 1848
       },
1820
-      "setIdx": 0,
1849
+      "setIdx": 1,
1821 1850
       "setId": 1,
1822
-      "iconIdx": 49
1851
+      "iconIdx": 66
1823 1852
     }
1824 1853
   ],
1825 1854
   "height": 1024,

+ 22
- 0
react/features/base/participants/actionTypes.js Voir le fichier

@@ -98,3 +98,25 @@ export const PARTICIPANT_UPDATED = Symbol('PARTICIPANT_UPDATED');
98 98
  * }
99 99
  */
100 100
 export const PIN_PARTICIPANT = Symbol('PIN_PARTICIPANT');
101
+
102
+/**
103
+ * Action to signal that a hidden participant has joined.
104
+ *
105
+ * {
106
+ *     type: HIDDEN_PARTICIPANT_JOINED,
107
+ *     participant: Participant
108
+ * }
109
+ */
110
+export const HIDDEN_PARTICIPANT_JOINED = Symbol('HIDDEN_PARTICIPANT_JOINED');
111
+
112
+/**
113
+ * Action to handle case when hidden participant leaves.
114
+ *
115
+ * {
116
+ *     type: PARTICIPANT_LEFT,
117
+ *     participant: {
118
+ *         id: string
119
+ *     }
120
+ * }
121
+ */
122
+export const HIDDEN_PARTICIPANT_LEFT = Symbol('HIDDEN_PARTICIPANT_LEFT');

+ 38
- 0
react/features/base/participants/actions.js Voir le fichier

@@ -7,6 +7,8 @@ import { showNotification } from '../../notifications';
7 7
 
8 8
 import {
9 9
     DOMINANT_SPEAKER_CHANGED,
10
+    HIDDEN_PARTICIPANT_JOINED,
11
+    HIDDEN_PARTICIPANT_LEFT,
10 12
     KICK_PARTICIPANT,
11 13
     MUTE_REMOTE_PARTICIPANT,
12 14
     PARTICIPANT_DISPLAY_NAME_CHANGED,
@@ -276,6 +278,42 @@ export function participantJoined(participant) {
276 278
     };
277 279
 }
278 280
 
281
+/**
282
+ * Action to signal that a hidden participant has joined the conference.
283
+ *
284
+ * @param {string} id - The id of the participant.
285
+ * @param {string} displayName - The display name, or undefined when
286
+ * unknown.
287
+ * @returns {{
288
+ *     type: HIDDEN_PARTICIPANT_JOINED,
289
+ *     displayName: string,
290
+ *     id: string
291
+ * }}
292
+ */
293
+export function hiddenParticipantJoined(id, displayName) {
294
+    return {
295
+        type: HIDDEN_PARTICIPANT_JOINED,
296
+        id,
297
+        displayName
298
+    };
299
+}
300
+
301
+/**
302
+ * Action to signal that a hidden participant has left the conference.
303
+ *
304
+ * @param {string} id - The id of the participant.
305
+ * @returns {{
306
+ *     type: HIDDEN_PARTICIPANT_LEFT,
307
+ *     id: string
308
+ * }}
309
+ */
310
+export function hiddenParticipantLeft(id) {
311
+    return {
312
+        type: HIDDEN_PARTICIPANT_LEFT,
313
+        id
314
+    };
315
+}
316
+
279 317
 /**
280 318
  * Action to signal that a participant has left.
281 319
  *

+ 13
- 0
react/features/large-video/components/AbstractLabels.js Voir le fichier

@@ -5,6 +5,7 @@ import React, { Component } from 'react';
5 5
 import { isFilmstripVisible } from '../../filmstrip';
6 6
 import { RecordingLabel } from '../../recording';
7 7
 import { VideoQualityLabel } from '../../video-quality';
8
+import { TranscribingLabel } from '../../transcribing/';
8 9
 
9 10
 /**
10 11
  * The type of the React {@code Component} props of {@link AbstractLabels}.
@@ -50,6 +51,18 @@ export default class AbstractLabels<P: Props, S> extends Component<P, S> {
50 51
             <VideoQualityLabel />
51 52
         );
52 53
     }
54
+
55
+    /**
56
+     * Renders the {@code TranscribingLabel}.
57
+     *
58
+     * @returns {React$Element}
59
+     * @protected
60
+     */
61
+    _renderTranscribingLabel() {
62
+        return (
63
+            <TranscribingLabel />
64
+        );
65
+    }
53 66
 }
54 67
 
55 68
 /**

+ 5
- 0
react/features/large-video/components/Labels.web.js Voir le fichier

@@ -85,6 +85,9 @@ class Labels extends AbstractLabels<Props, State> {
85 85
                     this._renderRecordingLabel(
86 86
                         JitsiRecordingConstants.mode.STREAM)
87 87
                 }
88
+                {
89
+                    this._renderTranscribingLabel()
90
+                }
88 91
                 {
89 92
                     this._renderVideoQualityLabel()
90 93
                 }
@@ -95,6 +98,8 @@ class Labels extends AbstractLabels<Props, State> {
95 98
     _renderRecordingLabel: string => React$Element<*>
96 99
 
97 100
     _renderVideoQualityLabel: () => React$Element<*>
101
+
102
+    _renderTranscribingLabel: () => React$Element<*>
98 103
 }
99 104
 
100 105
 export default connect(_mapStateToProps)(Labels);

+ 23
- 1
react/features/toolbox/components/web/Toolbox.js Voir le fichier

@@ -14,7 +14,8 @@ import { translate } from '../../../base/i18n';
14 14
 import {
15 15
     getLocalParticipant,
16 16
     getParticipants,
17
-    participantUpdated
17
+    participantUpdated,
18
+    isLocalParticipantModerator
18 19
 } from '../../../base/participants';
19 20
 import { getLocalVideoTrack, toggleScreensharing } from '../../../base/tracks';
20 21
 import { ChatCounter } from '../../../chat';
@@ -56,6 +57,9 @@ import OverflowMenuItem from './OverflowMenuItem';
56 57
 import OverflowMenuProfileItem from './OverflowMenuProfileItem';
57 58
 import ToolbarButton from './ToolbarButton';
58 59
 import VideoMuteButton from '../VideoMuteButton';
60
+import {
61
+    ClosedCaptionButton
62
+} from '../../../transcribing';
59 63
 
60 64
 /**
61 65
  * The type of the React {@code Component} props of {@link Toolbox}.
@@ -144,6 +148,11 @@ type Props = {
144 148
      */
145 149
     _sharingVideo: boolean,
146 150
 
151
+    /**
152
+     * Whether or not transcribing is enabled.
153
+     */
154
+    _transcribingEnabled: boolean,
155
+
147 156
     /**
148 157
      * Flag showing whether toolbar is visible.
149 158
      */
@@ -302,6 +311,7 @@ class Toolbox extends Component<Props> {
302 311
             _chatOpen,
303 312
             _hideInviteButton,
304 313
             _overflowMenuVisible,
314
+            _transcribingEnabled,
305 315
             _raisedHand,
306 316
             _visible,
307 317
             _visibleButtons,
@@ -344,6 +354,11 @@ class Toolbox extends Component<Props> {
344 354
                                 tooltip = { t('toolbar.chat') } />
345 355
                             <ChatCounter />
346 356
                         </div> }
357
+                    {
358
+                        _transcribingEnabled
359
+                        && this._shouldShowButton('closedcaptions')
360
+                        && <ClosedCaptionButton />
361
+                    }
347 362
                 </div>
348 363
                 <div className = 'button-group-center'>
349 364
                     <AudioMuteButton
@@ -990,6 +1005,9 @@ function _mapStateToProps(state) {
990 1005
         callStatsID,
991 1006
         iAmRecorder
992 1007
     } = state['features/base/config'];
1008
+    let {
1009
+        transcribingEnabled
1010
+    } = state['features/base/config'];
993 1011
     const sharedVideoStatus = state['features/shared-video'].status;
994 1012
     const { current } = state['features/side-panel'];
995 1013
     const {
@@ -1006,6 +1024,9 @@ function _mapStateToProps(state) {
1006 1024
 
1007 1025
     let desktopSharingDisabledTooltipKey;
1008 1026
 
1027
+    transcribingEnabled
1028
+        = isLocalParticipantModerator(state) && transcribingEnabled;
1029
+
1009 1030
     if (state['features/base/config'].enableFeaturesBasedOnToken) {
1010 1031
         // we enable desktop sharing if any participant already have this
1011 1032
         // feature enabled
@@ -1040,6 +1061,7 @@ function _mapStateToProps(state) {
1040 1061
         _overflowMenuVisible: overflowMenuVisible,
1041 1062
         _raisedHand: localParticipant.raisedHand,
1042 1063
         _screensharing: localVideo && localVideo.videoType === 'desktop',
1064
+        _transcribingEnabled: transcribingEnabled,
1043 1065
         _sharingVideo: sharedVideoStatus === 'playing'
1044 1066
             || sharedVideoStatus === 'start'
1045 1067
             || sharedVideoStatus === 'pause',

+ 78
- 0
react/features/transcribing/actionTypes.js Voir le fichier

@@ -0,0 +1,78 @@
1
+/**
2
+ * The type of Redux action triggering the transcriber to join (be 'dialed' in)
3
+ *
4
+ * {
5
+ *     type: DIAL_TRANSCRIBER
6
+ * }
7
+ * @public
8
+ */
9
+export const DIAL_TRANSCRIBER = Symbol('DIAL_TRANSCRIBER');
10
+
11
+/**
12
+ * The type of Redux action triggering the transcriber to leave.
13
+ *
14
+ * {
15
+ *     type: STOP_TRANSCRBIBING
16
+ * }
17
+ * @public
18
+ */
19
+export const STOP_TRANSCRIBING = Symbol('STOP_TRANSCRBIBING');
20
+
21
+/**
22
+ * The type of Redux action triggering storage of participantId of transcriber,
23
+ * so that it can later be kicked
24
+ *
25
+ * {
26
+ *     type: TRANSCRIBER_JOINED,
27
+ *     participantId: String
28
+ * }
29
+ * @private
30
+ */
31
+export const _TRANSCRIBER_JOINED = Symbol('TRANSCRIBER_JOINED');
32
+
33
+/**
34
+ * The type of Redux action signalling that the transcriber has left
35
+ *
36
+ * {
37
+ *     type: TRANSCRIBER_LEFT,
38
+ *     participantId: String
39
+ * }
40
+ * @private
41
+ */
42
+export const _TRANSCRIBER_LEFT = Symbol('TRANSCRIBER_LEFT');
43
+
44
+/**
45
+ * The type of a Redux action signalling that a hidden participant has joined,
46
+ * which can be candidate for being a transcriber.
47
+ *
48
+ * {
49
+ *     type: _POTENTIAL_TRANSCRIBER_JOINED,
50
+ * }
51
+ * @private
52
+ */
53
+export const _POTENTIAL_TRANSCRIBER_JOINED
54
+    = Symbol('POTENTIAL_TRANSCRIBER_JOINED');
55
+
56
+/**
57
+ * The type of a Redux action signalling that dialing the transcriber failed.
58
+ *
59
+ * {
60
+ *     type: _DIAL_ERROR,
61
+ * }
62
+ * @private
63
+ */
64
+export const _DIAL_ERROR = Symbol('DIAL_ERROR');
65
+
66
+/**
67
+ * The type of Redux action which sets the pending transcribing notification UID
68
+ * to use it for when hiding the notification is necessary, or unsets it when
69
+ * undefined (or no param) is passed.
70
+ *
71
+ * {
72
+ *     type: SET_PENDING_TRANSCRIBING_NOTIFICATION_UID,
73
+ *     uid: ?number
74
+ * }
75
+ * @public
76
+ */
77
+export const SET_PENDING_TRANSCRIBING_NOTIFICATION_UID
78
+    = Symbol('SET_PENDING_TRANSCRIBING_NOTIFICATION_UID');

+ 189
- 0
react/features/transcribing/actions.js Voir le fichier

@@ -0,0 +1,189 @@
1
+// @flow
2
+
3
+import {
4
+    _DIAL_ERROR,
5
+    _POTENTIAL_TRANSCRIBER_JOINED,
6
+    _TRANSCRIBER_JOINED,
7
+    _TRANSCRIBER_LEFT,
8
+    DIAL_TRANSCRIBER,
9
+    SET_PENDING_TRANSCRIBING_NOTIFICATION_UID,
10
+    STOP_TRANSCRIBING
11
+} from './actionTypes';
12
+import {
13
+    hideNotification,
14
+    showErrorNotification,
15
+    showNotification
16
+} from '../notifications';
17
+
18
+/**
19
+ * Dial the transcriber into the room.
20
+ *
21
+ * @public
22
+ * @returns {{
23
+ *     type: DIAL_TRANSCRIBER
24
+ * }}
25
+ */
26
+export function dialTranscriber() {
27
+    return {
28
+        type: DIAL_TRANSCRIBER
29
+    };
30
+}
31
+
32
+/**
33
+ * Stop the transcribing by kicking the transcriber participant.
34
+ *
35
+ * @returns {{
36
+ *     type: STOP_TRANSCRIBING
37
+ * }}
38
+ */
39
+export function stopTranscribing() {
40
+    return {
41
+        type: STOP_TRANSCRIBING
42
+    };
43
+}
44
+
45
+/**
46
+ * Notify that the transcriber, with a unique ID, has joined.
47
+ *
48
+ * @param {string} participantId - The participant id of the transcriber.
49
+ * @returns {{
50
+ *     type: _TRANSCRIBER_JOINED,
51
+ *     participantId: string
52
+ * }}
53
+ */
54
+export function transcriberJoined(participantId: string) {
55
+    return {
56
+        type: _TRANSCRIBER_JOINED,
57
+        transcriberJID: participantId
58
+    };
59
+}
60
+
61
+/**
62
+ * Notify that the transcriber, with a unique ID, has left.
63
+ *
64
+ * @param {string} participantId - The participant id of the transcriber.
65
+ * @returns {{
66
+ *     type: _TRANSCRIBER_LEFT,
67
+ *     participantId: string
68
+ * }}
69
+ */
70
+export function transcriberLeft(participantId: string) {
71
+    return {
72
+        type: _TRANSCRIBER_LEFT,
73
+        transcriberJID: participantId
74
+    };
75
+}
76
+
77
+/**
78
+ * Notify that a potential transcriber, with a unique ID, has joined.
79
+ *
80
+ * @param {string} participantId - The participant id of the transcriber.
81
+ * @returns {{
82
+ *     type: _POTENTIAL_TRANSCRIBER_JOINED,
83
+ *     participantId: string
84
+ * }}
85
+ */
86
+export function potentialTranscriberJoined(participantId: string) {
87
+    return {
88
+        type: _POTENTIAL_TRANSCRIBER_JOINED,
89
+        transcriberJID: participantId
90
+    };
91
+}
92
+
93
+/**
94
+ * Notify that dialing the transcriber resulted in an error.
95
+ *
96
+ * @returns {{
97
+ *      type: _DIAL_ERROR
98
+ * }}
99
+ */
100
+export function dialError() {
101
+    return {
102
+        type: _DIAL_ERROR
103
+    };
104
+}
105
+
106
+/**
107
+ * Signals that the pending transcribing notification should be shown on the
108
+ * screen.
109
+ *
110
+ * @returns {Function}
111
+ */
112
+export function showPendingTranscribingNotification() {
113
+    return (dispatch: Function) => {
114
+        const showNotificationAction = showNotification({
115
+            descriptionKey: 'transcribing.pending',
116
+            isDismissAllowed: false,
117
+            titleKey: 'dialog.transcribing'
118
+        });
119
+
120
+        dispatch(showNotificationAction);
121
+
122
+        dispatch(setPendingTranscribingNotificationUid(
123
+            showNotificationAction.uid));
124
+    };
125
+}
126
+
127
+/**
128
+ * Sets UID of the the pending transcribing notification to use it when hiding
129
+ * the notification is necessary, or unsets it when
130
+ * undefined (or no param) is passed.
131
+ *
132
+ * @param {?number} uid - The UID of the notification.
133
+ * redux.
134
+ * @returns {{
135
+ *     type: SET_PENDING_TRANSCRIBING_NOTIFICATION_UID,
136
+ *     uid: number
137
+ * }}
138
+ */
139
+export function setPendingTranscribingNotificationUid(uid: ?number) {
140
+    return {
141
+        type: SET_PENDING_TRANSCRIBING_NOTIFICATION_UID,
142
+        uid
143
+    };
144
+}
145
+
146
+/**
147
+ * Signals that the pending transcribing notification should be removed from the
148
+ * screen.
149
+ *
150
+ * @returns {Function}
151
+ */
152
+export function hidePendingTranscribingNotification() {
153
+    return (dispatch: Function, getState: Function) => {
154
+        const { pendingNotificationUid } = getState()['features/transcribing'];
155
+
156
+        if (pendingNotificationUid) {
157
+            dispatch(hideNotification(pendingNotificationUid));
158
+            dispatch(setPendingTranscribingNotificationUid());
159
+        }
160
+    };
161
+}
162
+
163
+/**
164
+ * Signals that the stopped transcribing notification should be shown on the
165
+ * screen for a 2500 ms.
166
+ *
167
+ * @returns {showNotification}
168
+ */
169
+export function showStoppedTranscribingNotification() {
170
+    return showNotification({
171
+        descriptionKey: 'transcribing.off',
172
+        titleKey: 'dialog.transcribing'
173
+    }, 2500);
174
+}
175
+
176
+
177
+/**
178
+ * Signals that the transcribing error notification should be shown.
179
+ *
180
+ * @returns {showErrorNotification}
181
+ */
182
+export function showTranscribingError() {
183
+    return showErrorNotification({
184
+        descriptionKey: 'transcribing.error',
185
+        titleKey: 'transcribing.failedToStart'
186
+    });
187
+}
188
+
189
+

+ 0
- 0
react/features/transcribing/components/ClosedCaptionButton.native.js Voir le fichier


+ 131
- 0
react/features/transcribing/components/ClosedCaptionButton.web.js Voir le fichier

@@ -0,0 +1,131 @@
1
+// @flow
2
+
3
+import React, { Component } from 'react';
4
+import { connect } from 'react-redux';
5
+import { translate } from '../../base/i18n/index';
6
+
7
+import { ToolbarButton } from '../../toolbox/';
8
+
9
+import { dialTranscriber, stopTranscribing } from '../actions';
10
+import { createToolbarEvent, sendAnalytics } from '../../analytics';
11
+
12
+
13
+/**
14
+ * The type of the React {@code Component} props of {@link TranscribingLabel}.
15
+ */
16
+type Props = {
17
+
18
+    /**
19
+     * Invoked to obtain translated strings.
20
+     */
21
+    t: Function,
22
+
23
+    /**
24
+     * Invoked to Dispatch an Action to the redux store.
25
+     */
26
+    dispatch: Function,
27
+
28
+    /**
29
+     * Boolean value indicating current transcribing status
30
+     */
31
+    _transcribing: boolean,
32
+
33
+    /**
34
+     * Boolean value indicating current dialing status
35
+     */
36
+    _dialing: boolean
37
+};
38
+
39
+/**
40
+ * React Component for displaying a label when a transcriber is in the
41
+ * conference.
42
+ *
43
+ * @extends Component
44
+ */
45
+class ClosedCaptionButton extends Component<Props> {
46
+
47
+    /**
48
+     * Initializes a new {@code ClosedCaptionButton} instance.
49
+     *
50
+     * @param {Props} props - The read-only properties with which the new
51
+     * instance is to be initialized.
52
+     */
53
+    constructor(props: Props) {
54
+        super(props);
55
+
56
+        // Bind event handler so it is only bound once for every instance.
57
+        this._onToggleButton = this._onToggleButton.bind(this);
58
+    }
59
+
60
+    /**
61
+     * Implements React's {@link Component#render()}.
62
+     *
63
+     * @inheritdoc
64
+     * @returns {ReactElement}
65
+     */
66
+    render() {
67
+        const { _dialing, _transcribing, t } = this.props;
68
+        const iconClass = `icon-closed_caption ${_dialing || _transcribing
69
+            ? 'toggled' : ''}`;
70
+
71
+        return (
72
+            <ToolbarButton
73
+                accessibilityLabel
74
+                    = { t('toolbar.accessibilityLabel.cc') }
75
+                iconName = { iconClass }
76
+                onClick = { this._onToggleButton }
77
+                tooltip = { t('transcribing.ccButtonTooltip') } />
78
+        );
79
+    }
80
+
81
+    _onToggleButton: () => void;
82
+
83
+    /**
84
+     * Dispatch actions for starting or stopping transcription, based on
85
+     * current state.
86
+     *
87
+     * @private
88
+     * @returns {void}
89
+     */
90
+    _onToggleButton() {
91
+        const { _transcribing, _dialing, dispatch } = this.props;
92
+
93
+        sendAnalytics(createToolbarEvent(
94
+            'transcribing.ccButton',
95
+            {
96
+                'is_transcribing': Boolean(_transcribing),
97
+                'is_dialing': Boolean(_dialing)
98
+            }));
99
+
100
+        if (_dialing) {
101
+            return;
102
+        }
103
+
104
+        if (_transcribing) {
105
+            dispatch(stopTranscribing());
106
+        } else {
107
+            dispatch(dialTranscriber());
108
+        }
109
+    }
110
+
111
+}
112
+
113
+/**
114
+ * Maps (parts of) the Redux state to the associated props for the
115
+ * {@code ClosedCaptionButton} component.
116
+ *
117
+ * @param {Object} state - The Redux state.
118
+ * @private
119
+ * @returns {{
120
+ * }}
121
+ */
122
+function _mapStateToProps(state) {
123
+    const { isTranscribing, isDialing } = state['features/transcribing'];
124
+
125
+    return {
126
+        _transcribing: isTranscribing,
127
+        _dialing: isDialing
128
+    };
129
+}
130
+
131
+export default translate(connect(_mapStateToProps)(ClosedCaptionButton));

+ 0
- 0
react/features/transcribing/components/TranscribingLabel.native.js Voir le fichier


+ 75
- 0
react/features/transcribing/components/TranscribingLabel.web.js Voir le fichier

@@ -0,0 +1,75 @@
1
+// @flow
2
+
3
+import React, { Component } from 'react';
4
+import { connect } from 'react-redux';
5
+import { translate } from '../../base/i18n/index';
6
+
7
+import { CircularLabel } from '../../base/label/index';
8
+import Tooltip from '@atlaskit/tooltip';
9
+
10
+/**
11
+ * The type of the React {@code Component} props of {@link TranscribingLabel}.
12
+ */
13
+type Props = {
14
+
15
+    /**
16
+     * Invoked to obtain translated strings.
17
+     */
18
+    t: Function,
19
+
20
+    /**
21
+     * Boolean value indicating current transcribing status
22
+     */
23
+    _transcribing: boolean
24
+};
25
+
26
+/**
27
+ * React Component for displaying a label when a transcriber is in the
28
+ * conference.
29
+ *
30
+ * @extends Component
31
+ */
32
+class TranscribingLabel extends Component<Props> {
33
+
34
+    /**
35
+     * Implements React's {@link Component#render()}.
36
+     *
37
+     * @inheritdoc
38
+     * @returns {ReactElement}
39
+     */
40
+    render() {
41
+        if (!this.props._transcribing) {
42
+            return null;
43
+        }
44
+
45
+        return (
46
+            <Tooltip
47
+                content = { this.props.t('transcribing.labelToolTip') }
48
+                position = { 'left' }>
49
+                <CircularLabel
50
+                    className = 'recording-label'
51
+                    label = { this.props.t('transcribing.tr') } />
52
+            </Tooltip>
53
+        );
54
+    }
55
+
56
+}
57
+
58
+/**
59
+ * Maps (parts of) the Redux state to the associated props for the
60
+ * {@code TranscribingLabel} component.
61
+ *
62
+ * @param {Object} state - The Redux state.
63
+ * @private
64
+ * @returns {{
65
+ * }}
66
+ */
67
+function _mapStateToProps(state) {
68
+    const { isTranscribing } = state['features/transcribing'];
69
+
70
+    return {
71
+        _transcribing: isTranscribing
72
+    };
73
+}
74
+
75
+export default translate(connect(_mapStateToProps)(TranscribingLabel));

+ 2
- 0
react/features/transcribing/components/index.js Voir le fichier

@@ -0,0 +1,2 @@
1
+export { default as TranscribingLabel } from './TranscribingLabel';
2
+export { default as ClosedCaptionButton } from './ClosedCaptionButton';

+ 5
- 0
react/features/transcribing/index.js Voir le fichier

@@ -0,0 +1,5 @@
1
+export * from './actions';
2
+export * from './components';
3
+
4
+import './middleware';
5
+import './reducer';

+ 100
- 0
react/features/transcribing/middleware.js Voir le fichier

@@ -0,0 +1,100 @@
1
+// @flow
2
+
3
+import { MiddlewareRegistry } from '../base/redux';
4
+
5
+import {
6
+    _TRANSCRIBER_LEFT,
7
+    DIAL_TRANSCRIBER,
8
+    STOP_TRANSCRIBING
9
+} from './actionTypes';
10
+import {
11
+    dialError,
12
+    hidePendingTranscribingNotification,
13
+    potentialTranscriberJoined,
14
+    showPendingTranscribingNotification,
15
+    showStoppedTranscribingNotification,
16
+    showTranscribingError,
17
+    transcriberJoined,
18
+    transcriberLeft
19
+} from './actions';
20
+import {
21
+    HIDDEN_PARTICIPANT_JOINED,
22
+    HIDDEN_PARTICIPANT_LEFT,
23
+    PARTICIPANT_UPDATED
24
+} from './../base/participants';
25
+
26
+declare var APP: Object;
27
+
28
+const TRANSCRIBER_DIAL_COMMAND = 'jitsi_meet_transcribe';
29
+const TRANSCRIBER_DISPLAY_NAME = 'Transcriber';
30
+
31
+/**
32
+ * Implements the middleware of the feature transcribing.
33
+ *
34
+ * @param {Store} store - The redux store.
35
+ * @returns {Function}
36
+ */
37
+// eslint-disable-next-line no-unused-vars
38
+MiddlewareRegistry.register(store => next => action => {
39
+    const {
40
+        isDialing,
41
+        isTranscribing,
42
+        transcriberJID,
43
+        potentialTranscriberJIDs
44
+    } = store.getState()['features/transcribing'];
45
+
46
+    const { conference } = store.getState()['features/base/conference'];
47
+
48
+    switch (action.type) {
49
+    case DIAL_TRANSCRIBER:
50
+        if (!(isDialing || isTranscribing)) {
51
+            store.dispatch(showPendingTranscribingNotification());
52
+
53
+            conference.room.dial(TRANSCRIBER_DIAL_COMMAND).catch(
54
+                () => {
55
+                    store.dispatch(dialError());
56
+                    store.dispatch(hidePendingTranscribingNotification());
57
+                    store.dispatch(showTranscribingError());
58
+                }
59
+            );
60
+        }
61
+        break;
62
+    case STOP_TRANSCRIBING:
63
+        if (isTranscribing) {
64
+            const participant = conference.getParticipantById(transcriberJID);
65
+
66
+            conference.room.kick(participant.getJid());
67
+        }
68
+        break;
69
+    case _TRANSCRIBER_LEFT:
70
+        store.dispatch(showStoppedTranscribingNotification());
71
+        break;
72
+    case HIDDEN_PARTICIPANT_JOINED:
73
+        if (action.displayName
74
+                && action.displayName === TRANSCRIBER_DISPLAY_NAME) {
75
+            store.dispatch(transcriberJoined(action.id));
76
+        } else {
77
+            store.dispatch(potentialTranscriberJoined(action.id));
78
+        }
79
+
80
+        break;
81
+    case HIDDEN_PARTICIPANT_LEFT:
82
+        if (action.id === transcriberJID) {
83
+            store.dispatch(transcriberLeft(action.id));
84
+        }
85
+        break;
86
+    case PARTICIPANT_UPDATED: {
87
+        const { participant } = action;
88
+
89
+        if (potentialTranscriberJIDs.includes(participant.id)
90
+            && participant.name === TRANSCRIBER_DISPLAY_NAME) {
91
+            store.dispatch(transcriberJoined(participant.id));
92
+            store.dispatch(hidePendingTranscribingNotification());
93
+        }
94
+
95
+        break;
96
+    }
97
+    }
98
+
99
+    return next(action);
100
+});

+ 115
- 0
react/features/transcribing/reducer.js Voir le fichier

@@ -0,0 +1,115 @@
1
+import { ReducerRegistry } from '../base/redux';
2
+import {
3
+    _DIAL_ERROR,
4
+    _TRANSCRIBER_JOINED,
5
+    _TRANSCRIBER_LEFT,
6
+    _POTENTIAL_TRANSCRIBER_JOINED,
7
+    DIAL_TRANSCRIBER,
8
+    SET_PENDING_TRANSCRIBING_NOTIFICATION_UID,
9
+    STOP_TRANSCRIBING
10
+} from '../transcribing/actionTypes';
11
+
12
+/**
13
+ * Returns initial state for transcribing feature part of Redux store.
14
+ *
15
+ * @returns {{
16
+ * isTranscribing: boolean,
17
+ * isDialing: boolean,
18
+ * transcriberJID: null,
19
+ * potentialTranscriberJIDs: Array
20
+ * }}
21
+ * @private
22
+ */
23
+function _getInitialState() {
24
+    return {
25
+        /**
26
+         * Indicates whether there is currently an active transcriber in the
27
+         * room
28
+         *
29
+         * @type {boolean}
30
+         */
31
+        isTranscribing: false,
32
+
33
+        /**
34
+         * Indicates whether the transcriber has been dialed into the room and
35
+         * we're currently awaiting successfull joining or failure of joining
36
+         *
37
+         * @type {boolean}
38
+         */
39
+        isDialing: false,
40
+
41
+        /**
42
+         * Indicates whether the transcribing feature is in the process of
43
+         * terminating; the transcriber has been told to leave.
44
+         */
45
+        isTerminating: false,
46
+
47
+        /**
48
+         * The JID of the active transcriber
49
+         *
50
+         * @type { string }
51
+         */
52
+        transcriberJID: null,
53
+
54
+        /**
55
+         * A list containing potential JID's of transcriber participants
56
+         *
57
+         * @type { Array }
58
+         */
59
+        potentialTranscriberJIDs: []
60
+    };
61
+}
62
+
63
+/**
64
+ * Reduces the Redux actions of the feature features/transcribing.
65
+ */
66
+ReducerRegistry.register('features/transcribing',
67
+    (state = _getInitialState(), action) => {
68
+        switch (action.type) {
69
+        case DIAL_TRANSCRIBER:
70
+            return {
71
+                ...state,
72
+                isDialing: true
73
+            };
74
+        case STOP_TRANSCRIBING:
75
+            return {
76
+                ...state,
77
+                isTerminating: true
78
+            };
79
+        case _DIAL_ERROR:
80
+            return {
81
+                ...state,
82
+                isDialing: false,
83
+                potentialTranscriberJIDs: []
84
+            };
85
+        case _TRANSCRIBER_JOINED:
86
+            return {
87
+                ...state,
88
+                isTranscribing: true,
89
+                isDialing: false,
90
+                transcriberJID: action.transcriberJID
91
+            };
92
+        case _TRANSCRIBER_LEFT:
93
+            return {
94
+                ...state,
95
+                isTerminating: false,
96
+                isTranscribing: false,
97
+                transcriberJID: undefined,
98
+                potentialTranscriberJIDs: []
99
+            };
100
+        case _POTENTIAL_TRANSCRIBER_JOINED:
101
+            return {
102
+                ...state,
103
+                potentialTranscriberJIDs:
104
+                    [ action.transcriberJID ]
105
+                        .concat(state.potentialTranscriberJIDs)
106
+            };
107
+        case SET_PENDING_TRANSCRIBING_NOTIFICATION_UID:
108
+            return {
109
+                ...state,
110
+                pendingNotificationUid: action.uid
111
+            };
112
+        default:
113
+            return state;
114
+        }
115
+    });

Chargement…
Annuler
Enregistrer