Selaa lähdekoodia

Add conference notification

master
zbettenbuk 7 vuotta sitten
vanhempi
commit
ae0bf876a8

+ 3
- 0
css/_font.scss Näytä tiedosto

36
 .icon-navigate_before:before {
36
 .icon-navigate_before:before {
37
   content: "\e408";
37
   content: "\e408";
38
 }
38
 }
39
+.icon-navigate_next:before {
40
+  content: "\e409";
41
+}
39
 .icon-public:before {
42
 .icon-public:before {
40
     content: "\e80b";
43
     content: "\e80b";
41
 }
44
 }

BIN
fonts/jitsi.eot Näytä tiedosto


+ 1
- 0
fonts/jitsi.svg Näytä tiedosto

12
 <glyph unicode="&#xe1aa;" glyph-name="bluetooth" d="M550 328l-80 82v-162zM470 776v-162l80 82zM670 696l-184-184 184-184-244-242h-42v324l-196-196-60 60 238 238-238 238 60 60 196-196v324h42zM834 738c40-64 62-142 62-222 0-84-24-160-66-226l-50 50c26 52 42 110 42 172s-16 120-42 172zM608 512l98 98c12-30 20-64 20-98s-8-70-20-100z" />
12
 <glyph unicode="&#xe1aa;" glyph-name="bluetooth" d="M550 328l-80 82v-162zM470 776v-162l80 82zM670 696l-184-184 184-184-244-242h-42v324l-196-196-60 60 238 238-238 238 60 60 196-196v324h42zM834 738c40-64 62-142 62-222 0-84-24-160-66-226l-50 50c26 52 42 110 42 172s-16 120-42 172zM608 512l98 98c12-30 20-64 20-98s-8-70-20-100z" />
13
 <glyph unicode="&#xe310;" glyph-name="headset" d="M512 982c212 0 384-172 384-384v-300c0-70-58-128-128-128h-128v342h170v86c0 166-132 298-298 298s-298-132-298-298v-86h170v-342h-128c-70 0-128 58-128 128v300c0 212 172 384 384 384z" />
13
 <glyph unicode="&#xe310;" glyph-name="headset" d="M512 982c212 0 384-172 384-384v-300c0-70-58-128-128-128h-128v342h170v86c0 166-132 298-298 298s-298-132-298-298v-86h170v-342h-128c-70 0-128 58-128 128v300c0 212 172 384 384 384z" />
14
 <glyph unicode="&#xe408;" glyph-name="navigate_before" d="M658 708l-196-196 196-196-60-60-256 256 256 256z" />
14
 <glyph unicode="&#xe408;" glyph-name="navigate_before" d="M658 708l-196-196 196-196-60-60-256 256 256 256z" />
15
+<glyph unicode="&#xe409;" glyph-name="navigate_next" d="M426 768l256-256-256-256-60 60 196 196-196 196z" />
15
 <glyph unicode="&#xe425;" glyph-name="timer" d="M512 170c166 0 298 134 298 300s-132 298-298 298-298-132-298-298 132-300 298-300zM812 708c52-66 84-148 84-238 0-212-172-384-384-384s-384 172-384 384 172 384 384 384c90 0 174-34 240-86l60 62c22-18 42-38 60-60zM470 426v256h84v-256h-84zM640 982v-86h-256v86h256z" />
16
 <glyph unicode="&#xe425;" glyph-name="timer" d="M512 170c166 0 298 134 298 300s-132 298-298 298-298-132-298-298 132-300 298-300zM812 708c52-66 84-148 84-238 0-212-172-384-384-384s-384 172-384 384 172 384 384 384c90 0 174-34 240-86l60 62c22-18 42-38 60-60zM470 426v256h84v-256h-84zM640 982v-86h-256v86h256z" />
16
 <glyph unicode="&#xe5c4;" glyph-name="arrow_back" d="M854 554v-84h-520l238-240-60-60-342 342 342 342 60-60-238-240h520z" />
17
 <glyph unicode="&#xe5c4;" glyph-name="arrow_back" d="M854 554v-84h-520l238-240-60-60-342 342 342 342 60-60-238-240h520z" />
17
 <glyph unicode="&#xe5d2;" glyph-name="menu" d="M128 768h768v-86h-768v86zM128 470v84h768v-84h-768zM128 256v86h768v-86h-768z" />
18
 <glyph unicode="&#xe5d2;" glyph-name="menu" d="M128 768h768v-86h-768v86zM128 470v84h768v-84h-768zM128 256v86h768v-86h-768z" />

BIN
fonts/jitsi.ttf Näytä tiedosto


BIN
fonts/jitsi.woff Näytä tiedosto


+ 82
- 55
fonts/selection.json Näytä tiedosto

1
 {
1
 {
2
   "IcoMoonType": "selection",
2
   "IcoMoonType": "selection",
3
   "icons": [
3
   "icons": [
4
+    {
5
+      "icon": {
6
+        "paths": [
7
+          "M426 256l256 256-256 256-60-60 196-196-196-196z"
8
+        ],
9
+        "attrs": [],
10
+        "isMulticolor": false,
11
+        "isMulticolor2": false,
12
+        "tags": [
13
+          "navigate_next"
14
+        ],
15
+        "defaultCode": 58377,
16
+        "grid": 24
17
+      },
18
+      "attrs": [],
19
+      "properties": {
20
+        "ligatures": "chevron_right, navigate_next",
21
+        "id": 153,
22
+        "order": 927,
23
+        "prevSize": 24,
24
+        "code": 58377,
25
+        "name": "navigate_next"
26
+      },
27
+      "setIdx": 0,
28
+      "setId": 2,
29
+      "iconIdx": 153
30
+    },
4
     {
31
     {
5
       "icon": {
32
       "icon": {
6
         "paths": [
33
         "paths": [
24
         "code": 58834,
51
         "code": 58834,
25
         "name": "menu"
52
         "name": "menu"
26
       },
53
       },
27
-      "setIdx": 0,
28
-      "setId": 2,
29
-      "iconIdx": 489
54
+      "setIdx": 1,
55
+      "setId": 1,
56
+      "iconIdx": 0
30
     },
57
     },
31
     {
58
     {
32
       "icon": {
59
       "icon": {
53
       },
80
       },
54
       "setIdx": 1,
81
       "setIdx": 1,
55
       "setId": 1,
82
       "setId": 1,
56
-      "iconIdx": 0
83
+      "iconIdx": 1
57
     },
84
     },
58
     {
85
     {
59
       "icon": {
86
       "icon": {
80
       },
107
       },
81
       "setIdx": 1,
108
       "setIdx": 1,
82
       "setId": 1,
109
       "setId": 1,
83
-      "iconIdx": 1
110
+      "iconIdx": 2
84
     },
111
     },
85
     {
112
     {
86
       "icon": {
113
       "icon": {
107
       },
134
       },
108
       "setIdx": 1,
135
       "setIdx": 1,
109
       "setId": 1,
136
       "setId": 1,
110
-      "iconIdx": 2
137
+      "iconIdx": 3
111
     },
138
     },
112
     {
139
     {
113
       "icon": {
140
       "icon": {
134
       },
161
       },
135
       "setIdx": 1,
162
       "setIdx": 1,
136
       "setId": 1,
163
       "setId": 1,
137
-      "iconIdx": 3
164
+      "iconIdx": 4
138
     },
165
     },
139
     {
166
     {
140
       "icon": {
167
       "icon": {
161
       },
188
       },
162
       "setIdx": 1,
189
       "setIdx": 1,
163
       "setId": 1,
190
       "setId": 1,
164
-      "iconIdx": 4
191
+      "iconIdx": 5
165
     },
192
     },
166
     {
193
     {
167
       "icon": {
194
       "icon": {
188
       },
215
       },
189
       "setIdx": 1,
216
       "setIdx": 1,
190
       "setId": 1,
217
       "setId": 1,
191
-      "iconIdx": 5
218
+      "iconIdx": 6
192
     },
219
     },
193
     {
220
     {
194
       "icon": {
221
       "icon": {
215
       },
242
       },
216
       "setIdx": 1,
243
       "setIdx": 1,
217
       "setId": 1,
244
       "setId": 1,
218
-      "iconIdx": 6
245
+      "iconIdx": 7
219
     },
246
     },
220
     {
247
     {
221
       "icon": {
248
       "icon": {
242
       },
269
       },
243
       "setIdx": 1,
270
       "setIdx": 1,
244
       "setId": 1,
271
       "setId": 1,
245
-      "iconIdx": 7
272
+      "iconIdx": 8
246
     },
273
     },
247
     {
274
     {
248
       "icon": {
275
       "icon": {
269
       },
296
       },
270
       "setIdx": 1,
297
       "setIdx": 1,
271
       "setId": 1,
298
       "setId": 1,
272
-      "iconIdx": 8
299
+      "iconIdx": 9
273
     },
300
     },
274
     {
301
     {
275
       "icon": {
302
       "icon": {
298
       },
325
       },
299
       "setIdx": 1,
326
       "setIdx": 1,
300
       "setId": 1,
327
       "setId": 1,
301
-      "iconIdx": 9
328
+      "iconIdx": 10
302
     },
329
     },
303
     {
330
     {
304
       "icon": {
331
       "icon": {
325
       },
352
       },
326
       "setIdx": 1,
353
       "setIdx": 1,
327
       "setId": 1,
354
       "setId": 1,
328
-      "iconIdx": 10
355
+      "iconIdx": 11
329
     },
356
     },
330
     {
357
     {
331
       "icon": {
358
       "icon": {
352
       },
379
       },
353
       "setIdx": 1,
380
       "setIdx": 1,
354
       "setId": 1,
381
       "setId": 1,
355
-      "iconIdx": 11
382
+      "iconIdx": 12
356
     },
383
     },
357
     {
384
     {
358
       "icon": {
385
       "icon": {
381
       },
408
       },
382
       "setIdx": 1,
409
       "setIdx": 1,
383
       "setId": 1,
410
       "setId": 1,
384
-      "iconIdx": 12
411
+      "iconIdx": 13
385
     },
412
     },
386
     {
413
     {
387
       "icon": {
414
       "icon": {
410
       },
437
       },
411
       "setIdx": 1,
438
       "setIdx": 1,
412
       "setId": 1,
439
       "setId": 1,
413
-      "iconIdx": 13
440
+      "iconIdx": 14
414
     },
441
     },
415
     {
442
     {
416
       "icon": {
443
       "icon": {
439
       },
466
       },
440
       "setIdx": 1,
467
       "setIdx": 1,
441
       "setId": 1,
468
       "setId": 1,
442
-      "iconIdx": 14
469
+      "iconIdx": 15
443
     },
470
     },
444
     {
471
     {
445
       "icon": {
472
       "icon": {
468
       },
495
       },
469
       "setIdx": 1,
496
       "setIdx": 1,
470
       "setId": 1,
497
       "setId": 1,
471
-      "iconIdx": 15
498
+      "iconIdx": 16
472
     },
499
     },
473
     {
500
     {
474
       "icon": {
501
       "icon": {
497
       },
524
       },
498
       "setIdx": 1,
525
       "setIdx": 1,
499
       "setId": 1,
526
       "setId": 1,
500
-      "iconIdx": 16
527
+      "iconIdx": 17
501
     },
528
     },
502
     {
529
     {
503
       "icon": {
530
       "icon": {
523
       },
550
       },
524
       "setIdx": 1,
551
       "setIdx": 1,
525
       "setId": 1,
552
       "setId": 1,
526
-      "iconIdx": 17
553
+      "iconIdx": 18
527
     },
554
     },
528
     {
555
     {
529
       "icon": {
556
       "icon": {
549
       },
576
       },
550
       "setIdx": 1,
577
       "setIdx": 1,
551
       "setId": 1,
578
       "setId": 1,
552
-      "iconIdx": 18
579
+      "iconIdx": 19
553
     },
580
     },
554
     {
581
     {
555
       "icon": {
582
       "icon": {
575
       },
602
       },
576
       "setIdx": 1,
603
       "setIdx": 1,
577
       "setId": 1,
604
       "setId": 1,
578
-      "iconIdx": 19
605
+      "iconIdx": 20
579
     },
606
     },
580
     {
607
     {
581
       "icon": {
608
       "icon": {
601
       },
628
       },
602
       "setIdx": 1,
629
       "setIdx": 1,
603
       "setId": 1,
630
       "setId": 1,
604
-      "iconIdx": 20
631
+      "iconIdx": 21
605
     },
632
     },
606
     {
633
     {
607
       "icon": {
634
       "icon": {
627
       },
654
       },
628
       "setIdx": 1,
655
       "setIdx": 1,
629
       "setId": 1,
656
       "setId": 1,
630
-      "iconIdx": 21
657
+      "iconIdx": 22
631
     },
658
     },
632
     {
659
     {
633
       "icon": {
660
       "icon": {
653
       },
680
       },
654
       "setIdx": 1,
681
       "setIdx": 1,
655
       "setId": 1,
682
       "setId": 1,
656
-      "iconIdx": 22
683
+      "iconIdx": 23
657
     },
684
     },
658
     {
685
     {
659
       "icon": {
686
       "icon": {
679
       },
706
       },
680
       "setIdx": 1,
707
       "setIdx": 1,
681
       "setId": 1,
708
       "setId": 1,
682
-      "iconIdx": 23
709
+      "iconIdx": 24
683
     },
710
     },
684
     {
711
     {
685
       "icon": {
712
       "icon": {
705
       },
732
       },
706
       "setIdx": 1,
733
       "setIdx": 1,
707
       "setId": 1,
734
       "setId": 1,
708
-      "iconIdx": 24
735
+      "iconIdx": 25
709
     },
736
     },
710
     {
737
     {
711
       "icon": {
738
       "icon": {
731
       },
758
       },
732
       "setIdx": 1,
759
       "setIdx": 1,
733
       "setId": 1,
760
       "setId": 1,
734
-      "iconIdx": 25
761
+      "iconIdx": 26
735
     },
762
     },
736
     {
763
     {
737
       "icon": {
764
       "icon": {
757
       },
784
       },
758
       "setIdx": 1,
785
       "setIdx": 1,
759
       "setId": 1,
786
       "setId": 1,
760
-      "iconIdx": 26
787
+      "iconIdx": 27
761
     },
788
     },
762
     {
789
     {
763
       "icon": {
790
       "icon": {
783
       },
810
       },
784
       "setIdx": 1,
811
       "setIdx": 1,
785
       "setId": 1,
812
       "setId": 1,
786
-      "iconIdx": 27
813
+      "iconIdx": 28
787
     },
814
     },
788
     {
815
     {
789
       "icon": {
816
       "icon": {
809
       },
836
       },
810
       "setIdx": 1,
837
       "setIdx": 1,
811
       "setId": 1,
838
       "setId": 1,
812
-      "iconIdx": 28
839
+      "iconIdx": 29
813
     },
840
     },
814
     {
841
     {
815
       "icon": {
842
       "icon": {
835
       },
862
       },
836
       "setIdx": 1,
863
       "setIdx": 1,
837
       "setId": 1,
864
       "setId": 1,
838
-      "iconIdx": 29
865
+      "iconIdx": 30
839
     },
866
     },
840
     {
867
     {
841
       "icon": {
868
       "icon": {
861
       },
888
       },
862
       "setIdx": 1,
889
       "setIdx": 1,
863
       "setId": 1,
890
       "setId": 1,
864
-      "iconIdx": 30
891
+      "iconIdx": 31
865
     },
892
     },
866
     {
893
     {
867
       "icon": {
894
       "icon": {
887
       },
914
       },
888
       "setIdx": 1,
915
       "setIdx": 1,
889
       "setId": 1,
916
       "setId": 1,
890
-      "iconIdx": 31
917
+      "iconIdx": 32
891
     },
918
     },
892
     {
919
     {
893
       "icon": {
920
       "icon": {
913
       },
940
       },
914
       "setIdx": 1,
941
       "setIdx": 1,
915
       "setId": 1,
942
       "setId": 1,
916
-      "iconIdx": 32
943
+      "iconIdx": 33
917
     },
944
     },
918
     {
945
     {
919
       "icon": {
946
       "icon": {
939
       },
966
       },
940
       "setIdx": 1,
967
       "setIdx": 1,
941
       "setId": 1,
968
       "setId": 1,
942
-      "iconIdx": 33
969
+      "iconIdx": 34
943
     },
970
     },
944
     {
971
     {
945
       "icon": {
972
       "icon": {
965
       },
992
       },
966
       "setIdx": 1,
993
       "setIdx": 1,
967
       "setId": 1,
994
       "setId": 1,
968
-      "iconIdx": 34
995
+      "iconIdx": 35
969
     },
996
     },
970
     {
997
     {
971
       "icon": {
998
       "icon": {
991
       },
1018
       },
992
       "setIdx": 1,
1019
       "setIdx": 1,
993
       "setId": 1,
1020
       "setId": 1,
994
-      "iconIdx": 35
1021
+      "iconIdx": 36
995
     },
1022
     },
996
     {
1023
     {
997
       "icon": {
1024
       "icon": {
1017
       },
1044
       },
1018
       "setIdx": 1,
1045
       "setIdx": 1,
1019
       "setId": 1,
1046
       "setId": 1,
1020
-      "iconIdx": 36
1047
+      "iconIdx": 37
1021
     },
1048
     },
1022
     {
1049
     {
1023
       "icon": {
1050
       "icon": {
1043
       },
1070
       },
1044
       "setIdx": 1,
1071
       "setIdx": 1,
1045
       "setId": 1,
1072
       "setId": 1,
1046
-      "iconIdx": 37
1073
+      "iconIdx": 38
1047
     },
1074
     },
1048
     {
1075
     {
1049
       "icon": {
1076
       "icon": {
1069
       },
1096
       },
1070
       "setIdx": 1,
1097
       "setIdx": 1,
1071
       "setId": 1,
1098
       "setId": 1,
1072
-      "iconIdx": 38
1099
+      "iconIdx": 39
1073
     },
1100
     },
1074
     {
1101
     {
1075
       "icon": {
1102
       "icon": {
1095
       },
1122
       },
1096
       "setIdx": 1,
1123
       "setIdx": 1,
1097
       "setId": 1,
1124
       "setId": 1,
1098
-      "iconIdx": 39
1125
+      "iconIdx": 40
1099
     },
1126
     },
1100
     {
1127
     {
1101
       "icon": {
1128
       "icon": {
1121
       },
1148
       },
1122
       "setIdx": 1,
1149
       "setIdx": 1,
1123
       "setId": 1,
1150
       "setId": 1,
1124
-      "iconIdx": 40
1151
+      "iconIdx": 41
1125
     },
1152
     },
1126
     {
1153
     {
1127
       "icon": {
1154
       "icon": {
1147
       },
1174
       },
1148
       "setIdx": 1,
1175
       "setIdx": 1,
1149
       "setId": 1,
1176
       "setId": 1,
1150
-      "iconIdx": 41
1177
+      "iconIdx": 42
1151
     },
1178
     },
1152
     {
1179
     {
1153
       "icon": {
1180
       "icon": {
1173
       },
1200
       },
1174
       "setIdx": 1,
1201
       "setIdx": 1,
1175
       "setId": 1,
1202
       "setId": 1,
1176
-      "iconIdx": 42
1203
+      "iconIdx": 43
1177
     },
1204
     },
1178
     {
1205
     {
1179
       "icon": {
1206
       "icon": {
1199
       },
1226
       },
1200
       "setIdx": 1,
1227
       "setIdx": 1,
1201
       "setId": 1,
1228
       "setId": 1,
1202
-      "iconIdx": 43
1229
+      "iconIdx": 44
1203
     },
1230
     },
1204
     {
1231
     {
1205
       "icon": {
1232
       "icon": {
1225
       },
1252
       },
1226
       "setIdx": 1,
1253
       "setIdx": 1,
1227
       "setId": 1,
1254
       "setId": 1,
1228
-      "iconIdx": 44
1255
+      "iconIdx": 45
1229
     },
1256
     },
1230
     {
1257
     {
1231
       "icon": {
1258
       "icon": {
1251
       },
1278
       },
1252
       "setIdx": 1,
1279
       "setIdx": 1,
1253
       "setId": 1,
1280
       "setId": 1,
1254
-      "iconIdx": 45
1281
+      "iconIdx": 46
1255
     },
1282
     },
1256
     {
1283
     {
1257
       "icon": {
1284
       "icon": {
1280
       },
1307
       },
1281
       "setIdx": 1,
1308
       "setIdx": 1,
1282
       "setId": 1,
1309
       "setId": 1,
1283
-      "iconIdx": 46
1310
+      "iconIdx": 47
1284
     },
1311
     },
1285
     {
1312
     {
1286
       "icon": {
1313
       "icon": {
1310
       },
1337
       },
1311
       "setIdx": 1,
1338
       "setIdx": 1,
1312
       "setId": 1,
1339
       "setId": 1,
1313
-      "iconIdx": 47
1340
+      "iconIdx": 48
1314
     },
1341
     },
1315
     {
1342
     {
1316
       "icon": {
1343
       "icon": {
1340
       },
1367
       },
1341
       "setIdx": 1,
1368
       "setIdx": 1,
1342
       "setId": 1,
1369
       "setId": 1,
1343
-      "iconIdx": 48
1370
+      "iconIdx": 49
1344
     },
1371
     },
1345
     {
1372
     {
1346
       "icon": {
1373
       "icon": {
1366
       },
1393
       },
1367
       "setIdx": 1,
1394
       "setIdx": 1,
1368
       "setId": 1,
1395
       "setId": 1,
1369
-      "iconIdx": 49
1396
+      "iconIdx": 50
1370
     },
1397
     },
1371
     {
1398
     {
1372
       "icon": {
1399
       "icon": {
1392
       },
1419
       },
1393
       "setIdx": 1,
1420
       "setIdx": 1,
1394
       "setId": 1,
1421
       "setId": 1,
1395
-      "iconIdx": 50
1422
+      "iconIdx": 51
1396
     },
1423
     },
1397
     {
1424
     {
1398
       "icon": {
1425
       "icon": {
1418
       },
1445
       },
1419
       "setIdx": 1,
1446
       "setIdx": 1,
1420
       "setId": 1,
1447
       "setId": 1,
1421
-      "iconIdx": 51
1448
+      "iconIdx": 52
1422
     }
1449
     }
1423
   ],
1450
   ],
1424
   "height": 1024,
1451
   "height": 1024,

+ 1
- 0
lang/main.json Näytä tiedosto

531
     "calendarSync": {
531
     "calendarSync": {
532
         "later": "Later",
532
         "later": "Later",
533
         "next": "Upcoming",
533
         "next": "Upcoming",
534
+        "nextMeeting": "next meeting",
534
         "now": "Now"
535
         "now": "Now"
535
     }
536
     }
536
 }
537
 }

+ 82
- 55
react/features/base/font-icons/jitsi.json Näytä tiedosto

1
 {
1
 {
2
   "IcoMoonType": "selection",
2
   "IcoMoonType": "selection",
3
   "icons": [
3
   "icons": [
4
+    {
5
+      "icon": {
6
+        "paths": [
7
+          "M426 256l256 256-256 256-60-60 196-196-196-196z"
8
+        ],
9
+        "attrs": [],
10
+        "isMulticolor": false,
11
+        "isMulticolor2": false,
12
+        "tags": [
13
+          "navigate_next"
14
+        ],
15
+        "defaultCode": 58377,
16
+        "grid": 24
17
+      },
18
+      "attrs": [],
19
+      "properties": {
20
+        "ligatures": "chevron_right, navigate_next",
21
+        "id": 153,
22
+        "order": 927,
23
+        "prevSize": 24,
24
+        "code": 58377,
25
+        "name": "navigate_next"
26
+      },
27
+      "setIdx": 0,
28
+      "setId": 2,
29
+      "iconIdx": 153
30
+    },
4
     {
31
     {
5
       "icon": {
32
       "icon": {
6
         "paths": [
33
         "paths": [
24
         "code": 58834,
51
         "code": 58834,
25
         "name": "menu"
52
         "name": "menu"
26
       },
53
       },
27
-      "setIdx": 0,
28
-      "setId": 2,
29
-      "iconIdx": 489
54
+      "setIdx": 1,
55
+      "setId": 1,
56
+      "iconIdx": 0
30
     },
57
     },
31
     {
58
     {
32
       "icon": {
59
       "icon": {
53
       },
80
       },
54
       "setIdx": 1,
81
       "setIdx": 1,
55
       "setId": 1,
82
       "setId": 1,
56
-      "iconIdx": 0
83
+      "iconIdx": 1
57
     },
84
     },
58
     {
85
     {
59
       "icon": {
86
       "icon": {
80
       },
107
       },
81
       "setIdx": 1,
108
       "setIdx": 1,
82
       "setId": 1,
109
       "setId": 1,
83
-      "iconIdx": 1
110
+      "iconIdx": 2
84
     },
111
     },
85
     {
112
     {
86
       "icon": {
113
       "icon": {
107
       },
134
       },
108
       "setIdx": 1,
135
       "setIdx": 1,
109
       "setId": 1,
136
       "setId": 1,
110
-      "iconIdx": 2
137
+      "iconIdx": 3
111
     },
138
     },
112
     {
139
     {
113
       "icon": {
140
       "icon": {
134
       },
161
       },
135
       "setIdx": 1,
162
       "setIdx": 1,
136
       "setId": 1,
163
       "setId": 1,
137
-      "iconIdx": 3
164
+      "iconIdx": 4
138
     },
165
     },
139
     {
166
     {
140
       "icon": {
167
       "icon": {
161
       },
188
       },
162
       "setIdx": 1,
189
       "setIdx": 1,
163
       "setId": 1,
190
       "setId": 1,
164
-      "iconIdx": 4
191
+      "iconIdx": 5
165
     },
192
     },
166
     {
193
     {
167
       "icon": {
194
       "icon": {
188
       },
215
       },
189
       "setIdx": 1,
216
       "setIdx": 1,
190
       "setId": 1,
217
       "setId": 1,
191
-      "iconIdx": 5
218
+      "iconIdx": 6
192
     },
219
     },
193
     {
220
     {
194
       "icon": {
221
       "icon": {
215
       },
242
       },
216
       "setIdx": 1,
243
       "setIdx": 1,
217
       "setId": 1,
244
       "setId": 1,
218
-      "iconIdx": 6
245
+      "iconIdx": 7
219
     },
246
     },
220
     {
247
     {
221
       "icon": {
248
       "icon": {
242
       },
269
       },
243
       "setIdx": 1,
270
       "setIdx": 1,
244
       "setId": 1,
271
       "setId": 1,
245
-      "iconIdx": 7
272
+      "iconIdx": 8
246
     },
273
     },
247
     {
274
     {
248
       "icon": {
275
       "icon": {
269
       },
296
       },
270
       "setIdx": 1,
297
       "setIdx": 1,
271
       "setId": 1,
298
       "setId": 1,
272
-      "iconIdx": 8
299
+      "iconIdx": 9
273
     },
300
     },
274
     {
301
     {
275
       "icon": {
302
       "icon": {
298
       },
325
       },
299
       "setIdx": 1,
326
       "setIdx": 1,
300
       "setId": 1,
327
       "setId": 1,
301
-      "iconIdx": 9
328
+      "iconIdx": 10
302
     },
329
     },
303
     {
330
     {
304
       "icon": {
331
       "icon": {
325
       },
352
       },
326
       "setIdx": 1,
353
       "setIdx": 1,
327
       "setId": 1,
354
       "setId": 1,
328
-      "iconIdx": 10
355
+      "iconIdx": 11
329
     },
356
     },
330
     {
357
     {
331
       "icon": {
358
       "icon": {
352
       },
379
       },
353
       "setIdx": 1,
380
       "setIdx": 1,
354
       "setId": 1,
381
       "setId": 1,
355
-      "iconIdx": 11
382
+      "iconIdx": 12
356
     },
383
     },
357
     {
384
     {
358
       "icon": {
385
       "icon": {
381
       },
408
       },
382
       "setIdx": 1,
409
       "setIdx": 1,
383
       "setId": 1,
410
       "setId": 1,
384
-      "iconIdx": 12
411
+      "iconIdx": 13
385
     },
412
     },
386
     {
413
     {
387
       "icon": {
414
       "icon": {
410
       },
437
       },
411
       "setIdx": 1,
438
       "setIdx": 1,
412
       "setId": 1,
439
       "setId": 1,
413
-      "iconIdx": 13
440
+      "iconIdx": 14
414
     },
441
     },
415
     {
442
     {
416
       "icon": {
443
       "icon": {
439
       },
466
       },
440
       "setIdx": 1,
467
       "setIdx": 1,
441
       "setId": 1,
468
       "setId": 1,
442
-      "iconIdx": 14
469
+      "iconIdx": 15
443
     },
470
     },
444
     {
471
     {
445
       "icon": {
472
       "icon": {
468
       },
495
       },
469
       "setIdx": 1,
496
       "setIdx": 1,
470
       "setId": 1,
497
       "setId": 1,
471
-      "iconIdx": 15
498
+      "iconIdx": 16
472
     },
499
     },
473
     {
500
     {
474
       "icon": {
501
       "icon": {
497
       },
524
       },
498
       "setIdx": 1,
525
       "setIdx": 1,
499
       "setId": 1,
526
       "setId": 1,
500
-      "iconIdx": 16
527
+      "iconIdx": 17
501
     },
528
     },
502
     {
529
     {
503
       "icon": {
530
       "icon": {
523
       },
550
       },
524
       "setIdx": 1,
551
       "setIdx": 1,
525
       "setId": 1,
552
       "setId": 1,
526
-      "iconIdx": 17
553
+      "iconIdx": 18
527
     },
554
     },
528
     {
555
     {
529
       "icon": {
556
       "icon": {
549
       },
576
       },
550
       "setIdx": 1,
577
       "setIdx": 1,
551
       "setId": 1,
578
       "setId": 1,
552
-      "iconIdx": 18
579
+      "iconIdx": 19
553
     },
580
     },
554
     {
581
     {
555
       "icon": {
582
       "icon": {
575
       },
602
       },
576
       "setIdx": 1,
603
       "setIdx": 1,
577
       "setId": 1,
604
       "setId": 1,
578
-      "iconIdx": 19
605
+      "iconIdx": 20
579
     },
606
     },
580
     {
607
     {
581
       "icon": {
608
       "icon": {
601
       },
628
       },
602
       "setIdx": 1,
629
       "setIdx": 1,
603
       "setId": 1,
630
       "setId": 1,
604
-      "iconIdx": 20
631
+      "iconIdx": 21
605
     },
632
     },
606
     {
633
     {
607
       "icon": {
634
       "icon": {
627
       },
654
       },
628
       "setIdx": 1,
655
       "setIdx": 1,
629
       "setId": 1,
656
       "setId": 1,
630
-      "iconIdx": 21
657
+      "iconIdx": 22
631
     },
658
     },
632
     {
659
     {
633
       "icon": {
660
       "icon": {
653
       },
680
       },
654
       "setIdx": 1,
681
       "setIdx": 1,
655
       "setId": 1,
682
       "setId": 1,
656
-      "iconIdx": 22
683
+      "iconIdx": 23
657
     },
684
     },
658
     {
685
     {
659
       "icon": {
686
       "icon": {
679
       },
706
       },
680
       "setIdx": 1,
707
       "setIdx": 1,
681
       "setId": 1,
708
       "setId": 1,
682
-      "iconIdx": 23
709
+      "iconIdx": 24
683
     },
710
     },
684
     {
711
     {
685
       "icon": {
712
       "icon": {
705
       },
732
       },
706
       "setIdx": 1,
733
       "setIdx": 1,
707
       "setId": 1,
734
       "setId": 1,
708
-      "iconIdx": 24
735
+      "iconIdx": 25
709
     },
736
     },
710
     {
737
     {
711
       "icon": {
738
       "icon": {
731
       },
758
       },
732
       "setIdx": 1,
759
       "setIdx": 1,
733
       "setId": 1,
760
       "setId": 1,
734
-      "iconIdx": 25
761
+      "iconIdx": 26
735
     },
762
     },
736
     {
763
     {
737
       "icon": {
764
       "icon": {
757
       },
784
       },
758
       "setIdx": 1,
785
       "setIdx": 1,
759
       "setId": 1,
786
       "setId": 1,
760
-      "iconIdx": 26
787
+      "iconIdx": 27
761
     },
788
     },
762
     {
789
     {
763
       "icon": {
790
       "icon": {
783
       },
810
       },
784
       "setIdx": 1,
811
       "setIdx": 1,
785
       "setId": 1,
812
       "setId": 1,
786
-      "iconIdx": 27
813
+      "iconIdx": 28
787
     },
814
     },
788
     {
815
     {
789
       "icon": {
816
       "icon": {
809
       },
836
       },
810
       "setIdx": 1,
837
       "setIdx": 1,
811
       "setId": 1,
838
       "setId": 1,
812
-      "iconIdx": 28
839
+      "iconIdx": 29
813
     },
840
     },
814
     {
841
     {
815
       "icon": {
842
       "icon": {
835
       },
862
       },
836
       "setIdx": 1,
863
       "setIdx": 1,
837
       "setId": 1,
864
       "setId": 1,
838
-      "iconIdx": 29
865
+      "iconIdx": 30
839
     },
866
     },
840
     {
867
     {
841
       "icon": {
868
       "icon": {
861
       },
888
       },
862
       "setIdx": 1,
889
       "setIdx": 1,
863
       "setId": 1,
890
       "setId": 1,
864
-      "iconIdx": 30
891
+      "iconIdx": 31
865
     },
892
     },
866
     {
893
     {
867
       "icon": {
894
       "icon": {
887
       },
914
       },
888
       "setIdx": 1,
915
       "setIdx": 1,
889
       "setId": 1,
916
       "setId": 1,
890
-      "iconIdx": 31
917
+      "iconIdx": 32
891
     },
918
     },
892
     {
919
     {
893
       "icon": {
920
       "icon": {
913
       },
940
       },
914
       "setIdx": 1,
941
       "setIdx": 1,
915
       "setId": 1,
942
       "setId": 1,
916
-      "iconIdx": 32
943
+      "iconIdx": 33
917
     },
944
     },
918
     {
945
     {
919
       "icon": {
946
       "icon": {
939
       },
966
       },
940
       "setIdx": 1,
967
       "setIdx": 1,
941
       "setId": 1,
968
       "setId": 1,
942
-      "iconIdx": 33
969
+      "iconIdx": 34
943
     },
970
     },
944
     {
971
     {
945
       "icon": {
972
       "icon": {
965
       },
992
       },
966
       "setIdx": 1,
993
       "setIdx": 1,
967
       "setId": 1,
994
       "setId": 1,
968
-      "iconIdx": 34
995
+      "iconIdx": 35
969
     },
996
     },
970
     {
997
     {
971
       "icon": {
998
       "icon": {
991
       },
1018
       },
992
       "setIdx": 1,
1019
       "setIdx": 1,
993
       "setId": 1,
1020
       "setId": 1,
994
-      "iconIdx": 35
1021
+      "iconIdx": 36
995
     },
1022
     },
996
     {
1023
     {
997
       "icon": {
1024
       "icon": {
1017
       },
1044
       },
1018
       "setIdx": 1,
1045
       "setIdx": 1,
1019
       "setId": 1,
1046
       "setId": 1,
1020
-      "iconIdx": 36
1047
+      "iconIdx": 37
1021
     },
1048
     },
1022
     {
1049
     {
1023
       "icon": {
1050
       "icon": {
1043
       },
1070
       },
1044
       "setIdx": 1,
1071
       "setIdx": 1,
1045
       "setId": 1,
1072
       "setId": 1,
1046
-      "iconIdx": 37
1073
+      "iconIdx": 38
1047
     },
1074
     },
1048
     {
1075
     {
1049
       "icon": {
1076
       "icon": {
1069
       },
1096
       },
1070
       "setIdx": 1,
1097
       "setIdx": 1,
1071
       "setId": 1,
1098
       "setId": 1,
1072
-      "iconIdx": 38
1099
+      "iconIdx": 39
1073
     },
1100
     },
1074
     {
1101
     {
1075
       "icon": {
1102
       "icon": {
1095
       },
1122
       },
1096
       "setIdx": 1,
1123
       "setIdx": 1,
1097
       "setId": 1,
1124
       "setId": 1,
1098
-      "iconIdx": 39
1125
+      "iconIdx": 40
1099
     },
1126
     },
1100
     {
1127
     {
1101
       "icon": {
1128
       "icon": {
1121
       },
1148
       },
1122
       "setIdx": 1,
1149
       "setIdx": 1,
1123
       "setId": 1,
1150
       "setId": 1,
1124
-      "iconIdx": 40
1151
+      "iconIdx": 41
1125
     },
1152
     },
1126
     {
1153
     {
1127
       "icon": {
1154
       "icon": {
1147
       },
1174
       },
1148
       "setIdx": 1,
1175
       "setIdx": 1,
1149
       "setId": 1,
1176
       "setId": 1,
1150
-      "iconIdx": 41
1177
+      "iconIdx": 42
1151
     },
1178
     },
1152
     {
1179
     {
1153
       "icon": {
1180
       "icon": {
1173
       },
1200
       },
1174
       "setIdx": 1,
1201
       "setIdx": 1,
1175
       "setId": 1,
1202
       "setId": 1,
1176
-      "iconIdx": 42
1203
+      "iconIdx": 43
1177
     },
1204
     },
1178
     {
1205
     {
1179
       "icon": {
1206
       "icon": {
1199
       },
1226
       },
1200
       "setIdx": 1,
1227
       "setIdx": 1,
1201
       "setId": 1,
1228
       "setId": 1,
1202
-      "iconIdx": 43
1229
+      "iconIdx": 44
1203
     },
1230
     },
1204
     {
1231
     {
1205
       "icon": {
1232
       "icon": {
1225
       },
1252
       },
1226
       "setIdx": 1,
1253
       "setIdx": 1,
1227
       "setId": 1,
1254
       "setId": 1,
1228
-      "iconIdx": 44
1255
+      "iconIdx": 45
1229
     },
1256
     },
1230
     {
1257
     {
1231
       "icon": {
1258
       "icon": {
1251
       },
1278
       },
1252
       "setIdx": 1,
1279
       "setIdx": 1,
1253
       "setId": 1,
1280
       "setId": 1,
1254
-      "iconIdx": 45
1281
+      "iconIdx": 46
1255
     },
1282
     },
1256
     {
1283
     {
1257
       "icon": {
1284
       "icon": {
1280
       },
1307
       },
1281
       "setIdx": 1,
1308
       "setIdx": 1,
1282
       "setId": 1,
1309
       "setId": 1,
1283
-      "iconIdx": 46
1310
+      "iconIdx": 47
1284
     },
1311
     },
1285
     {
1312
     {
1286
       "icon": {
1313
       "icon": {
1310
       },
1337
       },
1311
       "setIdx": 1,
1338
       "setIdx": 1,
1312
       "setId": 1,
1339
       "setId": 1,
1313
-      "iconIdx": 47
1340
+      "iconIdx": 48
1314
     },
1341
     },
1315
     {
1342
     {
1316
       "icon": {
1343
       "icon": {
1340
       },
1367
       },
1341
       "setIdx": 1,
1368
       "setIdx": 1,
1342
       "setId": 1,
1369
       "setId": 1,
1343
-      "iconIdx": 48
1370
+      "iconIdx": 49
1344
     },
1371
     },
1345
     {
1372
     {
1346
       "icon": {
1373
       "icon": {
1366
       },
1393
       },
1367
       "setIdx": 1,
1394
       "setIdx": 1,
1368
       "setId": 1,
1395
       "setId": 1,
1369
-      "iconIdx": 49
1396
+      "iconIdx": 50
1370
     },
1397
     },
1371
     {
1398
     {
1372
       "icon": {
1399
       "icon": {
1392
       },
1419
       },
1393
       "setIdx": 1,
1420
       "setIdx": 1,
1394
       "setId": 1,
1421
       "setId": 1,
1395
-      "iconIdx": 50
1422
+      "iconIdx": 51
1396
     },
1423
     },
1397
     {
1424
     {
1398
       "icon": {
1425
       "icon": {
1418
       },
1445
       },
1419
       "setIdx": 1,
1446
       "setIdx": 1,
1420
       "setId": 1,
1447
       "setId": 1,
1421
-      "iconIdx": 51
1448
+      "iconIdx": 52
1422
     }
1449
     }
1423
   ],
1450
   ],
1424
   "height": 1024,
1451
   "height": 1024,

+ 284
- 0
react/features/calendar-sync/components/ConferenceNotification.native.js Näytä tiedosto

1
+// @flow
2
+import React, { Component } from 'react';
3
+import {
4
+    Text,
5
+    TouchableOpacity,
6
+    View
7
+} from 'react-native';
8
+import { connect } from 'react-redux';
9
+
10
+import { appNavigate } from '../../app';
11
+import { getURLWithoutParams } from '../../base/connection';
12
+import { translate } from '../../base/i18n';
13
+import { Icon } from '../../base/font-icons';
14
+import { ASPECT_RATIO_NARROW } from '../../base/responsive-ui';
15
+import { getLocalizedDateFormatter } from '../../base/util';
16
+
17
+import styles from './styles';
18
+
19
+const ALERT_MILLISECONDS = 5 * 60 * 1000;
20
+
21
+type Props = {
22
+
23
+    /**
24
+     * The Redux dispatch function.
25
+     */
26
+    dispatch: Function,
27
+
28
+    /**
29
+     * The current aspect ratio of the screen.
30
+     */
31
+    _aspectRatio: Symbol,
32
+
33
+    /**
34
+     * The URL of the current conference without params.
35
+     */
36
+    _currentConferenceURL: string,
37
+
38
+    /**
39
+     * The calendar event list.
40
+     */
41
+    _eventList: Array<Object>,
42
+
43
+    /**
44
+     * The translate function.
45
+     */
46
+    t: Function
47
+};
48
+
49
+type State = {
50
+
51
+    /**
52
+     * The event object to display the notification for.
53
+     */
54
+    event?: Object
55
+};
56
+
57
+/**
58
+ * Component to display a permanent badge-like notification on the
59
+ * conference screen when another meeting is about to start.
60
+ */
61
+class ConferenceNotification extends Component<Props, State> {
62
+    updateIntervalId: number;
63
+
64
+    /**
65
+     * Constructor of the ConferenceNotification component.
66
+     *
67
+     * @inheritdoc
68
+     */
69
+    constructor(props) {
70
+        super(props);
71
+
72
+        this.state = {
73
+            event: undefined
74
+        };
75
+
76
+        this._getNotificationContentStyle
77
+            = this._getNotificationContentStyle.bind(this);
78
+        this._getNotificationPosition
79
+            = this._getNotificationPosition.bind(this);
80
+        this._maybeDisplayNotification
81
+            = this._maybeDisplayNotification.bind(this);
82
+        this._onGoToNext = this._onGoToNext.bind(this);
83
+    }
84
+
85
+    /**
86
+     * Implements React Component's componentDidMount.
87
+     *
88
+     * @inheritdoc
89
+     */
90
+    componentDidMount() {
91
+        this.updateIntervalId = setInterval(
92
+            this._maybeDisplayNotification,
93
+            10 * 1000
94
+        );
95
+    }
96
+
97
+    /**
98
+     * Implements React Component's componentWillUnmount.
99
+     *
100
+     * @inheritdoc
101
+     */
102
+    componentWillUnmount() {
103
+        clearTimeout(this.updateIntervalId);
104
+    }
105
+
106
+    /**
107
+     * Implements the React Components's render method.
108
+     *
109
+     * @inheritdoc
110
+     */
111
+    render() {
112
+        const { event } = this.state;
113
+        const { t } = this.props;
114
+
115
+        if (event) {
116
+            return (
117
+                <View
118
+                    style = { [
119
+                        styles.notificationContainer,
120
+                        this._getNotificationPosition()
121
+                    ] } >
122
+                    <View
123
+                        style = { this._getNotificationContentStyle() }>
124
+                        <TouchableOpacity
125
+                            onPress = { this._onGoToNext } >
126
+                            <View style = { styles.touchableView }>
127
+                                <View
128
+                                    style = {
129
+                                        styles.notificationTextContainer
130
+                                    }>
131
+                                    <Text style = { styles.notificationText }>
132
+                                        { t('calendarSync.nextMeeting') }
133
+                                    </Text>
134
+                                    <Text style = { styles.notificationText }>
135
+                                        {
136
+                                            getLocalizedDateFormatter(
137
+                                                event.startDate
138
+                                            ).fromNow()
139
+                                        }
140
+                                    </Text>
141
+                                </View>
142
+                                <View
143
+                                    style = {
144
+                                        styles.notificationIconContainer
145
+                                    }>
146
+                                    <Icon
147
+                                        name = 'navigate_next'
148
+                                        style = { styles.notificationIcon } />
149
+                                </View>
150
+                            </View>
151
+                        </TouchableOpacity>
152
+                    </View>
153
+                </View>
154
+            );
155
+        }
156
+
157
+        return null;
158
+    }
159
+
160
+    _getNotificationContentStyle: () => Array<Object>
161
+
162
+    /**
163
+     * Decides the color of the notification and some additional
164
+     * styles based on notificationPosition.
165
+     *
166
+     * @private
167
+     * @returns {Array<Object>}
168
+     */
169
+    _getNotificationContentStyle() {
170
+        const { event } = this.state;
171
+        const { _aspectRatio } = this.props;
172
+        const now = Date.now();
173
+        const style = [
174
+            styles.notificationContent
175
+        ];
176
+
177
+        if (event && event.startDate < now && event.endDate > now) {
178
+            style.push(styles.notificationContentPast);
179
+        } else {
180
+            style.push(styles.notificationContentNext);
181
+        }
182
+
183
+        if (_aspectRatio === ASPECT_RATIO_NARROW) {
184
+            style.push(styles.notificationContentSide);
185
+        } else {
186
+            style.push(styles.notificationContentTop);
187
+        }
188
+
189
+        return style;
190
+    }
191
+
192
+    _getNotificationPosition: () => Object;
193
+
194
+    /**
195
+     * Decides the position of the notification.
196
+     *
197
+     * @private
198
+     * @returns {Object}
199
+     */
200
+    _getNotificationPosition() {
201
+        const { _aspectRatio } = this.props;
202
+
203
+        if (_aspectRatio === ASPECT_RATIO_NARROW) {
204
+            return styles.notificationContainerSide;
205
+        }
206
+
207
+        return styles.notificationContainerTop;
208
+    }
209
+
210
+    _maybeDisplayNotification: () => void;
211
+
212
+    /**
213
+     * Periodically checks if there is an event in the calendar for which we
214
+     * need to show a notification.
215
+     *
216
+     * @private
217
+     * @returns {void}
218
+     */
219
+    _maybeDisplayNotification() {
220
+        const { _currentConferenceURL, _eventList } = this.props;
221
+        let eventToShow;
222
+
223
+        if (_eventList && _eventList.length) {
224
+            const now = Date.now();
225
+
226
+            for (const event of _eventList) {
227
+                if (event.url !== _currentConferenceURL) {
228
+                    if ((!eventToShow
229
+                        && event.startDate > now
230
+                        && event.startDate < now + ALERT_MILLISECONDS)
231
+                        || (event.startDate < now && event.endDate > now)
232
+                    ) {
233
+                        eventToShow = event;
234
+                    }
235
+                }
236
+            }
237
+        }
238
+
239
+        this.setState({
240
+            event: eventToShow
241
+        });
242
+    }
243
+
244
+    _onGoToNext: () => void;
245
+
246
+    /**
247
+     * Opens the meeting URL that the notification shows.
248
+     *
249
+     * @private
250
+     * @param {string} url - The URL to open.
251
+     * @returns {void}
252
+     */
253
+    _onGoToNext() {
254
+        const { event } = this.state;
255
+
256
+        if (event && event.url) {
257
+            this.props.dispatch(appNavigate(event.url));
258
+        }
259
+    }
260
+
261
+}
262
+
263
+/**
264
+ * Maps redux state to component props.
265
+ *
266
+ * @param {Object} state - The redux state.
267
+ * @returns {{
268
+ *      _aspectRatio: Symbol,
269
+ *      _currentConferenceURL: string,
270
+ *      _eventList: Array
271
+ * }}
272
+ */
273
+export function _mapStateToProps(state: Object) {
274
+    const { locationURL } = state['features/base/connection'];
275
+
276
+    return {
277
+        _aspectRatio: state['features/base/responsive-ui'].aspectRatio,
278
+        _currentConferenceURL:
279
+            locationURL ? getURLWithoutParams(locationURL)._url : '',
280
+        _eventList: state['features/calendar-sync'].events
281
+    };
282
+}
283
+
284
+export default translate(connect(_mapStateToProps)(ConferenceNotification));

+ 1
- 0
react/features/calendar-sync/components/index.js Näytä tiedosto

1
 export { default as MeetingList } from './MeetingList';
1
 export { default as MeetingList } from './MeetingList';
2
+export { default as ConferenceNotification } from './ConferenceNotification';

+ 104
- 2
react/features/calendar-sync/components/styles.js Näytä tiedosto

1
 import { createStyleSheet } from '../../base/styles';
1
 import { createStyleSheet } from '../../base/styles';
2
 
2
 
3
 const AVATAR_OPACITY = 0.4;
3
 const AVATAR_OPACITY = 0.4;
4
-
5
 const AVATAR_SIZE = 65;
4
 const AVATAR_SIZE = 65;
6
-
5
+const NOTIFICATION_SIZE = 55;
7
 const OVERLAY_FONT_COLOR = 'rgba(255, 255, 255, 0.6)';
6
 const OVERLAY_FONT_COLOR = 'rgba(255, 255, 255, 0.6)';
8
 
7
 
9
 export const UNDERLAY_COLOR = 'rgba(255, 255, 255, 0.2)';
8
 export const UNDERLAY_COLOR = 'rgba(255, 255, 255, 0.2)';
50
         textAlign: 'center'
49
         textAlign: 'center'
51
     },
50
     },
52
 
51
 
52
+    /**
53
+     * Style for the actual notification content.
54
+     */
55
+    notificationContainer: {
56
+        flexDirection: 'row',
57
+        justifyContent: 'center',
58
+        overflow: 'hidden',
59
+        position: 'absolute'
60
+    },
61
+
62
+    /**
63
+     * Additional style for the container when the notification is displayed
64
+     * on the side (narrow view).
65
+     */
66
+    notificationContainerSide: {
67
+        top: 100
68
+    },
69
+
70
+    /**
71
+     * Additional style for the container when the notification is displayed
72
+     * on the top (wide view).
73
+     */
74
+    notificationContainerTop: {
75
+        justifyContent: 'center',
76
+        left: 0,
77
+        right: 0,
78
+        top: 0
79
+    },
80
+
81
+    /**
82
+     * The top level container of the notification.
83
+     */
84
+    notificationContent: {
85
+        alignSelf: 'flex-start',
86
+        flexDirection: 'row',
87
+        height: NOTIFICATION_SIZE,
88
+        justifyContent: 'center',
89
+        paddingHorizontal: 10
90
+    },
91
+
92
+    /**
93
+     * Color for upcoming meeting notification.
94
+     */
95
+    notificationContentNext: {
96
+        backgroundColor: '#eeb231'
97
+    },
98
+
99
+    /**
100
+     * Color for already ongoing meeting notifications.
101
+     */
102
+    notificationContentPast: {
103
+        backgroundColor: 'red'
104
+    },
105
+
106
+    /**
107
+     * Additional style for the content when the notification is displayed
108
+     * on the side (narrow view).
109
+     */
110
+    notificationContentSide: {
111
+        borderBottomRightRadius: NOTIFICATION_SIZE,
112
+        borderTopRightRadius: NOTIFICATION_SIZE
113
+    },
114
+
115
+    /**
116
+     * Additional style for the content when the notification is displayed
117
+     * on the top (wide view).
118
+     */
119
+    notificationContentTop: {
120
+        borderBottomLeftRadius: NOTIFICATION_SIZE / 2,
121
+        borderBottomRightRadius: NOTIFICATION_SIZE / 2,
122
+        paddingHorizontal: 20
123
+    },
124
+
125
+    /**
126
+     * The icon of the notification.
127
+     */
128
+    notificationIcon: {
129
+        color: 'white',
130
+        fontSize: 25
131
+    },
132
+
133
+    notificationIconContainer: {
134
+        alignItems: 'center',
135
+        flexDirection: 'row',
136
+        height: NOTIFICATION_SIZE,
137
+        justifyContent: 'center'
138
+    },
139
+
140
+    notificationText: {
141
+        color: 'white',
142
+        fontSize: 13
143
+    },
144
+
145
+    notificationTextContainer: {
146
+        flexDirection: 'column',
147
+        height: NOTIFICATION_SIZE,
148
+        justifyContent: 'center'
149
+    },
150
+
53
     /**
151
     /**
54
      * The top level container style of the list.
152
      * The top level container style of the list.
55
      */
153
      */
105
         color: OVERLAY_FONT_COLOR,
203
         color: OVERLAY_FONT_COLOR,
106
         fontSize: 14,
204
         fontSize: 14,
107
         fontWeight: 'normal'
205
         fontWeight: 'normal'
206
+    },
207
+
208
+    touchableView: {
209
+        flexDirection: 'row'
108
     }
210
     }
109
 });
211
 });

+ 18
- 0
react/features/calendar-sync/middleware.js Näytä tiedosto

117
                 }
117
                 }
118
             }
118
             }
119
 
119
 
120
+            // TEST events to check notification popup.
121
+            // TODO: Remove this before a PR.
122
+            eventList.push({
123
+                endDate: Date.now() + (60 * 60 * 1000),
124
+                id: -1,
125
+                startDate: Date.now() + (80 * 1000),
126
+                title: 'ShipIt 41',
127
+                url: 'https://meet.jit.si/shipit41'
128
+            });
129
+
130
+            eventList.push({
131
+                endDate: Date.now() + (2 * 60 * 60 * 1000),
132
+                id: -2,
133
+                startDate: Date.now() + (60 * 60 * 1000),
134
+                title: 'ShipIt 41 demo',
135
+                url: 'https://meet.jit.si/shipit41'
136
+            });
137
+
120
             store.dispatch(updateCalendarEntryList(eventList.sort((a, b) =>
138
             store.dispatch(updateCalendarEntryList(eventList.sort((a, b) =>
121
                 a.startDate - b.startDate
139
                 a.startDate - b.startDate
122
             ).slice(0, MAX_LIST_LENGTH)));
140
             ).slice(0, MAX_LIST_LENGTH)));

+ 3
- 0
react/features/conference/components/Conference.native.js Näytä tiedosto

12
 import { CalleeInfoContainer } from '../../base/jwt';
12
 import { CalleeInfoContainer } from '../../base/jwt';
13
 import { Container, LoadingIndicator, TintedView } from '../../base/react';
13
 import { Container, LoadingIndicator, TintedView } from '../../base/react';
14
 import { createDesiredLocalTracks } from '../../base/tracks';
14
 import { createDesiredLocalTracks } from '../../base/tracks';
15
+import { ConferenceNotification } from '../../calendar-sync';
15
 import { Filmstrip } from '../../filmstrip';
16
 import { Filmstrip } from '../../filmstrip';
16
 import { LargeVideo } from '../../large-video';
17
 import { LargeVideo } from '../../large-video';
17
 import { setToolboxVisible, Toolbox } from '../../toolbox';
18
 import { setToolboxVisible, Toolbox } from '../../toolbox';
233
                     <Filmstrip />
234
                     <Filmstrip />
234
                 </View>
235
                 </View>
235
 
236
 
237
+                <ConferenceNotification />
238
+
236
                 {/*
239
                 {/*
237
                   * The dialogs are in the topmost stacking layers.
240
                   * The dialogs are in the topmost stacking layers.
238
                   */
241
                   */

+ 6
- 6
react/features/recent-list/components/AbstractRecentList.js Näytä tiedosto

13
     _recentList: Array<Object>,
13
     _recentList: Array<Object>,
14
 
14
 
15
     /**
15
     /**
16
-     * The redux store's {@code dispatch} function.
16
+     * Indicates if the list is disabled or not.
17
      */
17
      */
18
-    dispatch: Dispatch<*>,
18
+    disabled: boolean,
19
 
19
 
20
     /**
20
     /**
21
-     * Whether {@code AbstractRecentList} is enabled.
21
+     * The redux store's {@code dispatch} function.
22
      */
22
      */
23
-    enabled: boolean
23
+    dispatch: Dispatch<*>
24
 };
24
 };
25
 
25
 
26
 /**
26
 /**
40
      * @returns {void}
40
      * @returns {void}
41
      */
41
      */
42
     _onJoin(room) {
42
     _onJoin(room) {
43
-        const { dispatch, enabled } = this.props;
43
+        const { dispatch, disabled } = this.props;
44
 
44
 
45
-        enabled && room && dispatch(appNavigate(room));
45
+        !disabled && room && dispatch(appNavigate(room));
46
     }
46
     }
47
 
47
 
48
     /**
48
     /**

+ 2
- 2
react/features/recent-list/components/RecentList.native.js Näytä tiedosto

53
      * @returns {ReactElement}
53
      * @returns {ReactElement}
54
      */
54
      */
55
     render() {
55
     render() {
56
-        const { enabled, _recentList } = this.props;
56
+        const { disabled, _recentList } = this.props;
57
 
57
 
58
         if (!_recentList) {
58
         if (!_recentList) {
59
             return null;
59
             return null;
66
             <SafeAreaView
66
             <SafeAreaView
67
                 style = { [
67
                 style = { [
68
                     styles.container,
68
                     styles.container,
69
-                    enabled ? null : styles.containerDisabled
69
+                    disabled ? styles.containerDisabled : null
70
                 ] }>
70
                 ] }>
71
                 <ListView
71
                 <ListView
72
                     dataSource = { listViewDataSource }
72
                     dataSource = { listViewDataSource }

Loading…
Peruuta
Tallenna