Browse 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 7 years ago
parent
commit
b8daf0a9f9

+ 9
- 1
conference.js View File

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

+ 4
- 0
config.js View File

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

+ 4
- 0
css/_font.scss View File

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

BIN
fonts/jitsi.eot View File


+ 1
- 0
fonts/jitsi.svg View File

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" />
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
 <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" />
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
 <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" />
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
 </font></defs></svg>
78
 </font></defs></svg>

BIN
fonts/jitsi.ttf View File


BIN
fonts/jitsi.woff View File


+ 180
- 151
fonts/selection.json View File

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

+ 4
- 4
interface_config.js View File

45
      * jwt.
45
      * jwt.
46
      */
46
      */
47
     TOOLBAR_BUTTONS: [
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
     SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile' ],
54
     SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile' ],

+ 13
- 1
lang/main.json View File

81
             "audioRoute": "Select the sound device",
81
             "audioRoute": "Select the sound device",
82
             "callQuality": "Manage call quality",
82
             "callQuality": "Manage call quality",
83
             "chat": "Toggle chat window",
83
             "chat": "Toggle chat window",
84
+            "cc": "Toggle subtitles",
84
             "document": "Toggle shared document",
85
             "document": "Toggle shared document",
85
             "feedback": "Leave feedback",
86
             "feedback": "Leave feedback",
86
             "fullScreen": "Toggle full screen",
87
             "fullScreen": "Toggle full screen",
381
         "shareYourScreenDisabled": "Screen sharing disabled.",
382
         "shareYourScreenDisabled": "Screen sharing disabled.",
382
         "shareYourScreenDisabledForGuest": "Guests can't screen share.",
383
         "shareYourScreenDisabledForGuest": "Guests can't screen share.",
383
         "yourEntireScreen": "Your entire screen",
384
         "yourEntireScreen": "Your entire screen",
384
-        "applicationWindow": "Application window"
385
+        "applicationWindow": "Application window",
386
+        "transcribing": "Transcribing"
385
     },
387
     },
386
     "email":
388
     "email":
387
     {
389
     {
448
         "unavailable": "Oops! The __serviceName__ is currently unavailable. We're working on resolving the issue. Please try again later.",
450
         "unavailable": "Oops! The __serviceName__ is currently unavailable. We're working on resolving the issue. Please try again later.",
449
         "unavailableTitle": "Recording unavailable"
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
     "liveStreaming":
463
     "liveStreaming":
452
     {
464
     {
453
         "busy": "We're working on freeing streaming resources. Please try again in a few minutes.",
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 View File

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

+ 22
- 0
react/features/base/participants/actionTypes.js View File

98
  * }
98
  * }
99
  */
99
  */
100
 export const PIN_PARTICIPANT = Symbol('PIN_PARTICIPANT');
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 View File

7
 
7
 
8
 import {
8
 import {
9
     DOMINANT_SPEAKER_CHANGED,
9
     DOMINANT_SPEAKER_CHANGED,
10
+    HIDDEN_PARTICIPANT_JOINED,
11
+    HIDDEN_PARTICIPANT_LEFT,
10
     KICK_PARTICIPANT,
12
     KICK_PARTICIPANT,
11
     MUTE_REMOTE_PARTICIPANT,
13
     MUTE_REMOTE_PARTICIPANT,
12
     PARTICIPANT_DISPLAY_NAME_CHANGED,
14
     PARTICIPANT_DISPLAY_NAME_CHANGED,
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
  * Action to signal that a participant has left.
318
  * Action to signal that a participant has left.
281
  *
319
  *

+ 13
- 0
react/features/large-video/components/AbstractLabels.js View File

5
 import { isFilmstripVisible } from '../../filmstrip';
5
 import { isFilmstripVisible } from '../../filmstrip';
6
 import { RecordingLabel } from '../../recording';
6
 import { RecordingLabel } from '../../recording';
7
 import { VideoQualityLabel } from '../../video-quality';
7
 import { VideoQualityLabel } from '../../video-quality';
8
+import { TranscribingLabel } from '../../transcribing/';
8
 
9
 
9
 /**
10
 /**
10
  * The type of the React {@code Component} props of {@link AbstractLabels}.
11
  * The type of the React {@code Component} props of {@link AbstractLabels}.
50
             <VideoQualityLabel />
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 View File

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

+ 23
- 1
react/features/toolbox/components/web/Toolbox.js View File

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

+ 78
- 0
react/features/transcribing/actionTypes.js View File

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 View File

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 View File


+ 131
- 0
react/features/transcribing/components/ClosedCaptionButton.web.js View File

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 View File


+ 75
- 0
react/features/transcribing/components/TranscribingLabel.web.js View File

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 View File

1
+export { default as TranscribingLabel } from './TranscribingLabel';
2
+export { default as ClosedCaptionButton } from './ClosedCaptionButton';

+ 5
- 0
react/features/transcribing/index.js View File

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

+ 100
- 0
react/features/transcribing/middleware.js View File

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 View File

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
+    });

Loading…
Cancel
Save