瀏覽代碼

flow: tame the beast

🔥🔥🔥
master
Saúl Ibarra Corretgé 6 年之前
父節點
當前提交
c025c7e132
共有 100 個檔案被更改,包括 356 行新增251 行删除
  1. 6
    6
      react/features/app/actions.js
  2. 6
    4
      react/features/authentication/actions.js
  3. 2
    1
      react/features/authentication/components/LoginDialog.native.js
  4. 2
    1
      react/features/authentication/components/WaitForOwnerDialog.native.js
  5. 3
    1
      react/features/authentication/middleware.js
  6. 3
    1
      react/features/base/app/actions.js
  7. 4
    1
      react/features/base/color-scheme/ColorSchemeRegistry.js
  8. 6
    6
      react/features/base/conference/actions.js
  9. 2
    2
      react/features/base/config/actions.js
  10. 2
    2
      react/features/base/connection/actions.native.js
  11. 1
    1
      react/features/base/connection/actions.web.js
  12. 4
    2
      react/features/base/dialog/actions.js
  13. 3
    3
      react/features/base/dialog/components/AbstractDialog.js
  14. 1
    2
      react/features/base/dialog/components/native/BaseDialog.js
  15. 2
    3
      react/features/base/dialog/components/native/BaseSubmitDialog.js
  16. 1
    0
      react/features/base/dialog/components/native/BottomSheet.js
  17. 1
    2
      react/features/base/dialog/components/native/ConfirmDialog.js
  18. 1
    0
      react/features/base/dialog/components/native/CustomDialog.js
  19. 1
    3
      react/features/base/dialog/components/native/CustomSubmitDialog.js
  20. 1
    2
      react/features/base/dialog/components/native/InputDialog.js
  21. 4
    3
      react/features/base/dialog/components/web/Dialog.js
  22. 7
    7
      react/features/base/dialog/constants.js
  23. 2
    2
      react/features/base/lib-jitsi-meet/actions.js
  24. 1
    1
      react/features/base/media/actions.js
  25. 2
    1
      react/features/base/media/components/AbstractVideoTrack.js
  26. 1
    0
      react/features/base/media/components/native/VideoTrack.js
  27. 6
    3
      react/features/base/media/components/native/VideoTransform.js
  28. 2
    2
      react/features/base/media/components/web/VideoTrack.js
  29. 1
    1
      react/features/base/react/Types.js
  30. 1
    1
      react/features/base/react/components/AbstractContainer.js
  31. 42
    26
      react/features/base/react/components/native/AvatarListItem.js
  32. 1
    0
      react/features/base/react/components/native/BackButton.js
  33. 1
    0
      react/features/base/react/components/native/Header.js
  34. 1
    0
      react/features/base/react/components/native/PagedList.js
  35. 1
    0
      react/features/base/react/components/web/Watermarks.js
  36. 2
    8
      react/features/base/redux/MiddlewareRegistry.js
  37. 1
    0
      react/features/base/redux/ReducerRegistry.js
  38. 10
    4
      react/features/base/redux/StateListenerRegistry.js
  39. 2
    2
      react/features/base/responsive-ui/actions.js
  40. 2
    1
      react/features/base/responsive-ui/components/AspectRatioDetector.js
  41. 2
    1
      react/features/base/responsive-ui/components/ReducedUIDetector.js
  42. 1
    0
      react/features/base/sounds/components/SoundCollection.js
  43. 1
    1
      react/features/base/styles/functions.js
  44. 3
    2
      react/features/base/testing/components/TestConnectionInfo.js
  45. 1
    0
      react/features/base/testing/components/TestHint.ios.js
  46. 1
    0
      react/features/base/toolbox/components/AbstractToolboxItem.js
  47. 3
    1
      react/features/calendar-sync/actions.native.js
  48. 4
    3
      react/features/calendar-sync/actions.web.js
  49. 3
    2
      react/features/calendar-sync/components/AddMeetingUrlButton.web.js
  50. 1
    1
      react/features/calendar-sync/components/CalendarListContent.native.js
  51. 4
    2
      react/features/calendar-sync/components/CalendarListContent.web.js
  52. 5
    4
      react/features/calendar-sync/functions.native.js
  53. 3
    3
      react/features/calendar-sync/functions.web.js
  54. 8
    6
      react/features/calendar-sync/web/googleCalendar.js
  55. 64
    63
      react/features/calendar-sync/web/microsoftCalendar.js
  56. 3
    2
      react/features/chat/components/AbstractChat.js
  57. 1
    0
      react/features/chat/components/native/ChatButton.js
  58. 1
    0
      react/features/chat/components/web/ChatCounter.js
  59. 3
    1
      react/features/chat/components/web/ChatInput.js
  60. 2
    1
      react/features/chat/components/web/DisplayNameForm.js
  61. 1
    0
      react/features/conference/components/native/DisplayNameLabel.js
  62. 1
    0
      react/features/conference/components/native/Labels.js
  63. 1
    0
      react/features/conference/components/native/NavigationBar.js
  64. 1
    0
      react/features/conference/components/web/Conference.js
  65. 2
    1
      react/features/conference/components/web/Labels.js
  66. 2
    0
      react/features/conference/components/web/Subject.js
  67. 4
    2
      react/features/deep-linking/actions.js
  68. 3
    2
      react/features/deep-linking/components/DeepLinkingDesktopPage.web.js
  69. 2
    1
      react/features/desktop-picker/components/DesktopPicker.js
  70. 2
    1
      react/features/display-name/components/AbstractDisplayNamePrompt.js
  71. 2
    1
      react/features/display-name/components/DisplayName.web.js
  72. 1
    0
      react/features/display-name/components/DisplayNamePrompt.native.js
  73. 3
    1
      react/features/feedback/actions.js
  74. 3
    2
      react/features/feedback/components/FeedbackDialog.web.js
  75. 1
    0
      react/features/filmstrip/components/native/Filmstrip.js
  76. 1
    0
      react/features/filmstrip/components/native/LocalThumbnail.js
  77. 3
    1
      react/features/filmstrip/components/native/Thumbnail.js
  78. 3
    1
      react/features/filmstrip/components/native/TileView.js
  79. 3
    1
      react/features/filmstrip/components/web/Filmstrip.js
  80. 1
    0
      react/features/filmstrip/components/web/Toolbar.js
  81. 14
    11
      react/features/google-api/actions.js
  82. 4
    2
      react/features/invite/actions.js
  83. 2
    1
      react/features/invite/components/InfoDialogButton.web.js
  84. 1
    1
      react/features/invite/components/InviteButton.native.js
  85. 1
    1
      react/features/invite/components/add-people-dialog/AbstractAddPeopleDialog.js
  86. 9
    7
      react/features/invite/components/add-people-dialog/native/AddPeopleDialog.js
  87. 3
    2
      react/features/invite/components/add-people-dialog/web/AddPeopleDialog.js
  88. 1
    0
      react/features/invite/components/callee-info/CalleeInfo.js
  89. 1
    0
      react/features/invite/components/callee-info/CalleeInfoContainer.js
  90. 2
    1
      react/features/invite/components/info-dialog/InfoDialog.web.js
  91. 4
    2
      react/features/large-video/actions.js
  92. 2
    1
      react/features/large-video/components/LargeVideo.native.js
  93. 3
    2
      react/features/local-recording/components/LocalRecordingInfoDialog.js
  94. 3
    3
      react/features/local-recording/recording/flac/flacEncodeWorker.js
  95. 4
    2
      react/features/mobile/background/actions.js
  96. 1
    1
      react/features/mobile/background/middleware.js
  97. 2
    1
      react/features/mobile/network-activity/components/NetworkActivityIndicator.js
  98. 2
    1
      react/features/mobile/picture-in-picture/actions.js
  99. 1
    0
      react/features/notifications/components/NotificationsContainer.web.js
  100. 0
    0
      react/features/overlay/components/AbstractPageReloadOverlay.js

+ 6
- 6
react/features/app/actions.js 查看文件

@@ -31,7 +31,7 @@ declare var APP: Object;
31 31
  * @returns {Function}
32 32
  */
33 33
 export function appNavigate(uri: ?string) {
34
-    return (dispatch: Dispatch<*>, getState: Function) =>
34
+    return (dispatch: Dispatch<any>, getState: Function) =>
35 35
         _appNavigateToOptionalLocation(dispatch, getState, parseURIString(uri));
36 36
 }
37 37
 
@@ -50,7 +50,7 @@ export function appNavigate(uri: ?string) {
50 50
  * @returns {Promise<void>}
51 51
  */
52 52
 function _appNavigateToMandatoryLocation(
53
-        dispatch: Dispatch<*>, getState: Function,
53
+        dispatch: Dispatch<any>, getState: Function,
54 54
         newLocation: Object
55 55
 ): Promise<void> {
56 56
     const { room } = newLocation;
@@ -111,7 +111,7 @@ function _appNavigateToMandatoryLocation(
111 111
  * @returns {void}
112 112
  */
113 113
 function _appNavigateToOptionalLocation(
114
-        dispatch: Dispatch<*>, getState: Function,
114
+        dispatch: Dispatch<any>, getState: Function,
115 115
         location: Object) {
116 116
     // If the specified location (URI) does not identify a host, use the app's
117 117
     // default.
@@ -150,7 +150,7 @@ function _appNavigateToOptionalLocation(
150 150
  * @returns {Promise<Object>}
151 151
  */
152 152
 function _loadConfig(
153
-        dispatch: Dispatch<*>,
153
+        dispatch: Dispatch<any>,
154 154
         getState: Function,
155 155
         { contextRoot, host, protocol, room }) {
156 156
     // XXX As the mobile/React Native app does not employ config on the
@@ -211,7 +211,7 @@ function _loadConfig(
211 211
  * @returns {Function}
212 212
  */
213 213
 export function redirectWithStoredParams(pathname: string) {
214
-    return (dispatch: Dispatch<*>, getState: Function) => {
214
+    return (dispatch: Dispatch<any>, getState: Function) => {
215 215
         const { locationURL } = getState()['features/base/connection'];
216 216
         const newLocationURL = new URL(locationURL.href);
217 217
 
@@ -248,7 +248,7 @@ export function reloadNow() {
248 248
  * @returns {Function}
249 249
  */
250 250
 export function reloadWithStoredParams() {
251
-    return (dispatch: Dispatch<*>, getState: Function) => {
251
+    return (dispatch: Dispatch<any>, getState: Function) => {
252 252
         const { locationURL } = getState()['features/base/connection'];
253 253
         const windowLocation = window.location;
254 254
         const oldSearchString = windowLocation.search;

+ 6
- 4
react/features/authentication/actions.js 查看文件

@@ -1,5 +1,7 @@
1 1
 // @flow
2 2
 
3
+import type { Dispatch } from 'redux';
4
+
3 5
 import { appNavigate } from '../app';
4 6
 import { checkIfCanJoin, conferenceLeft } from '../base/conference';
5 7
 import { connectionFailed } from '../base/connection';
@@ -33,7 +35,7 @@ export function authenticateAndUpgradeRole(
33 35
         id: string,
34 36
         password: string,
35 37
         conference: Object) {
36
-    return (dispatch: Dispatch, getState: Function) => {
38
+    return (dispatch: Dispatch<any>, getState: Function) => {
37 39
         const { password: roomPassword }
38 40
             = getState()['features/base/conference'];
39 41
         const process
@@ -73,7 +75,7 @@ export function authenticateAndUpgradeRole(
73 75
  * }}
74 76
  */
75 77
 export function cancelLogin() {
76
-    return (dispatch: Dispatch<*>, getState: Function) => {
78
+    return (dispatch: Dispatch<any>, getState: Function) => {
77 79
         dispatch({ type: CANCEL_LOGIN });
78 80
 
79 81
         // XXX The error associated with CONNECTION_FAILED was marked as
@@ -100,7 +102,7 @@ export function cancelLogin() {
100 102
  * @returns {Function}
101 103
  */
102 104
 export function cancelWaitForOwner() {
103
-    return (dispatch: Dispatch<*>, getState: Function) => {
105
+    return (dispatch: Dispatch<any>, getState: Function) => {
104 106
         dispatch(stopWaitForOwner());
105 107
 
106 108
         // XXX The error associated with CONFERENCE_FAILED was marked as
@@ -228,7 +230,7 @@ function _upgradeRoleStarted(thenableWithCancel) {
228 230
  * @returns {Function}
229 231
  */
230 232
 export function waitForOwner() {
231
-    return (dispatch: Dispatch) =>
233
+    return (dispatch: Dispatch<any>) =>
232 234
         dispatch({
233 235
             type: WAIT_FOR_OWNER,
234 236
             handler: () => dispatch(checkIfCanJoin()),

+ 2
- 1
react/features/authentication/components/LoginDialog.native.js 查看文件

@@ -3,6 +3,7 @@
3 3
 import React, { Component } from 'react';
4 4
 import { Text, TextInput, View } from 'react-native';
5 5
 import { connect as reduxConnect } from 'react-redux';
6
+import type { Dispatch } from 'redux';
6 7
 
7 8
 import { connect, toJid } from '../../base/connection';
8 9
 import {
@@ -59,7 +60,7 @@ type Props = {
59 60
     /**
60 61
      * Redux store dispatch method.
61 62
      */
62
-    dispatch: Dispatch<*>,
63
+    dispatch: Dispatch<any>,
63 64
 
64 65
     /**
65 66
      * Invoked to obtain translated strings.

+ 2
- 1
react/features/authentication/components/WaitForOwnerDialog.native.js 查看文件

@@ -2,6 +2,7 @@
2 2
 
3 3
 import React, { Component } from 'react';
4 4
 import { connect } from 'react-redux';
5
+import type { Dispatch } from 'redux';
5 6
 
6 7
 import { ConfirmDialog } from '../../base/dialog';
7 8
 import { translate } from '../../base/i18n';
@@ -21,7 +22,7 @@ type Props = {
21 22
     /**
22 23
      * Redux store dispatch function.
23 24
      */
24
-    dispatch: Dispatch<*>,
25
+    dispatch: Dispatch<any>,
25 26
 
26 27
     /**
27 28
      * Invoked to obtain translated strings.

+ 3
- 1
react/features/authentication/middleware.js 查看文件

@@ -1,5 +1,7 @@
1 1
 // @flow
2 2
 
3
+import type { Dispatch } from 'redux';
4
+
3 5
 import { appNavigate } from '../app';
4 6
 import {
5 7
     CONFERENCE_FAILED,
@@ -160,7 +162,7 @@ function _clearExistingWaitForOwnerTimeout(
160 162
  * @param {Object} store - The redux store.
161 163
  * @returns {void}
162 164
  */
163
-function _hideLoginDialog({ dispatch }: { dispatch: Dispatch<*> }) {
165
+function _hideLoginDialog({ dispatch }: { dispatch: Dispatch<any> }) {
164 166
     dispatch(hideDialog(LoginDialog));
165 167
 }
166 168
 

+ 3
- 1
react/features/base/app/actions.js 查看文件

@@ -1,5 +1,7 @@
1 1
 // @flow
2 2
 
3
+import type { Dispatch } from 'redux';
4
+
3 5
 import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from './actionTypes';
4 6
 
5 7
 declare var APP;
@@ -14,7 +16,7 @@ declare var APP;
14 16
  * }}
15 17
  */
16 18
 export function appWillMount(app: Object) {
17
-    return (dispatch: Dispatch<*>) => {
19
+    return (dispatch: Dispatch<any>) => {
18 20
         dispatch({
19 21
             type: APP_WILL_MOUNT,
20 22
             app

+ 4
- 1
react/features/base/color-scheme/ColorSchemeRegistry.js 查看文件

@@ -122,8 +122,11 @@ class ColorSchemeRegistry {
122 122
                 } else if (typeof styleValue === 'function') {
123 123
                     // The value is a function, which indicates that it's a
124 124
                     // dynamic, schemed color we need to resolve.
125
+                    // $FlowExpectedError
126
+                    const value = styleValue();
127
+
125 128
                     schemedStyle[styleName]
126
-                        = this._getColor(stateful, componentName, styleValue());
129
+                        = this._getColor(stateful, componentName, value);
127 130
                 }
128 131
 
129 132
             }

+ 6
- 6
react/features/base/conference/actions.js 查看文件

@@ -299,7 +299,7 @@ export function conferenceSubjectChanged(subject: string) {
299 299
  * @returns {Function}
300 300
  */
301 301
 function _conferenceWillJoin(conference: Object) {
302
-    return (dispatch: Dispatch<*>, getState: Function) => {
302
+    return (dispatch: Dispatch<any>, getState: Function) => {
303 303
         const localTracks
304 304
             = getLocalTracks(getState()['features/base/tracks'])
305 305
                 .map(t => t.jitsiTrack);
@@ -565,7 +565,7 @@ export function setFollowMe(enabled: boolean) {
565 565
  * @returns {Function}
566 566
  */
567 567
 export function setLastN(lastN: ?number) {
568
-    return (dispatch: Dispatch<*>, getState: Function) => {
568
+    return (dispatch: Dispatch<any>, getState: Function) => {
569 569
         if (typeof lastN === 'undefined') {
570 570
             const config = getState()['features/base/config'];
571 571
 
@@ -618,7 +618,7 @@ export function setPassword(
618 618
         conference: Object,
619 619
         method: Function,
620 620
         password: string) {
621
-    return (dispatch: Dispatch<*>, getState: Function): ?Promise<void> => {
621
+    return (dispatch: Dispatch<any>, getState: Function): ?Promise<void> => {
622 622
         switch (method) {
623 623
         case conference.join: {
624 624
             let state = getState()['features/base/conference'];
@@ -721,7 +721,7 @@ export function setRoom(room: ?string) {
721 721
  */
722 722
 export function setStartMutedPolicy(
723 723
         startAudioMuted: boolean, startVideoMuted: boolean) {
724
-    return (dispatch: Dispatch<*>, getState: Function) => {
724
+    return (dispatch: Dispatch<any>, getState: Function) => {
725 725
         const conference = getCurrentConference(getState());
726 726
 
727 727
         conference && conference.setStartMutedPolicy({
@@ -740,7 +740,7 @@ export function setStartMutedPolicy(
740 740
  * @returns {Function}
741 741
  */
742 742
 export function toggleAudioOnly() {
743
-    return (dispatch: Dispatch<*>, getState: Function) => {
743
+    return (dispatch: Dispatch<any>, getState: Function) => {
744 744
         const { audioOnly } = getState()['features/base/conference'];
745 745
 
746 746
         return dispatch(setAudioOnly(!audioOnly, true));
@@ -754,7 +754,7 @@ export function toggleAudioOnly() {
754 754
  * @returns {void}
755 755
  */
756 756
 export function setSubject(subject: string = '') {
757
-    return (dispatch: Dispatch<*>, getState: Function) => {
757
+    return (dispatch: Dispatch<any>, getState: Function) => {
758 758
         const { conference } = getState()['features/base/conference'];
759 759
 
760 760
         if (conference) {

+ 2
- 2
react/features/base/config/actions.js 查看文件

@@ -59,7 +59,7 @@ export function loadConfigError(error: Error, locationURL: URL) {
59 59
  * @returns {Function}
60 60
  */
61 61
 export function setConfig(config: Object = {}) {
62
-    return (dispatch: Dispatch<*>, getState: Function) => {
62
+    return (dispatch: Dispatch<any>, getState: Function) => {
63 63
         const { locationURL } = getState()['features/base/connection'];
64 64
 
65 65
         // Now that the loading of the config was successful override the values
@@ -99,7 +99,7 @@ export function setConfig(config: Object = {}) {
99 99
  * @returns {Function}
100 100
  */
101 101
 export function storeConfig(baseURL: string, config: Object) {
102
-    return (dispatch: Dispatch<*>) => {
102
+    return (dispatch: Dispatch<any>) => {
103 103
         // Try to store the configuration in localStorage. If the deployment
104 104
         // specified 'getroom' as a function, for example, it does not make
105 105
         // sense to and it will not be stored.

+ 2
- 2
react/features/base/connection/actions.native.js 查看文件

@@ -76,7 +76,7 @@ export type ConnectionFailedError = {
76 76
  * @returns {Function}
77 77
  */
78 78
 export function connect(id: ?string, password: ?string) {
79
-    return (dispatch: Dispatch<*>, getState: Function) => {
79
+    return (dispatch: Dispatch<any>, getState: Function) => {
80 80
         const state = getState();
81 81
         const options = _constructOptions(state);
82 82
         const { issuer, jwt } = state['features/base/jwt'];
@@ -322,7 +322,7 @@ function _constructOptions(state) {
322 322
  * @returns {Function}
323 323
  */
324 324
 export function disconnect() {
325
-    return (dispatch: Dispatch<*>, getState: Function): Promise<void> => {
325
+    return (dispatch: Dispatch<any>, getState: Function): Promise<void> => {
326 326
         const state = getState();
327 327
 
328 328
         // The conference we have already joined or are joining.

+ 1
- 1
react/features/base/connection/actions.web.js 查看文件

@@ -19,7 +19,7 @@ export {
19 19
  * @returns {Promise<JitsiConnection>}
20 20
  */
21 21
 export function connect() {
22
-    return (dispatch: Dispatch<*>, getState: Function) => {
22
+    return (dispatch: Dispatch<any>, getState: Function) => {
23 23
         // XXX Lib-jitsi-meet does not accept uppercase letters.
24 24
         const room = getState()['features/base/conference'].room.toLowerCase();
25 25
 

+ 4
- 2
react/features/base/dialog/actions.js 查看文件

@@ -1,4 +1,6 @@
1
-/* @flow */
1
+// @flow
2
+
3
+import type { Dispatch } from 'redux';
2 4
 
3 5
 import { HIDE_DIALOG, OPEN_DIALOG } from './actionTypes';
4 6
 import { isDialogOpen } from './functions';
@@ -53,7 +55,7 @@ export function openDialog(component: Object, componentProps: ?Object) {
53 55
  * @returns {Function}
54 56
  */
55 57
 export function toggleDialog(component: Object, componentProps: ?Object) {
56
-    return (dispatch: Dispatch, getState: Function) => {
58
+    return (dispatch: Dispatch<any>, getState: Function) => {
57 59
         if (isDialogOpen(getState, component)) {
58 60
             dispatch(hideDialog(component));
59 61
         } else {

+ 3
- 3
react/features/base/dialog/components/AbstractDialog.js 查看文件

@@ -1,6 +1,7 @@
1 1
 // @flow
2 2
 
3 3
 import { Component } from 'react';
4
+import type { Dispatch } from 'redux';
4 5
 
5 6
 import { hideDialog } from '../actions';
6 7
 import type { DialogProps } from '../constants';
@@ -8,13 +9,12 @@ import type { DialogProps } from '../constants';
8 9
 /**
9 10
  * The type of the React {@code Component} props of {@link AbstractDialog}.
10 11
  */
11
-export type Props = {
12
-    ...DialogProps,
12
+export type Props = DialogProps & {
13 13
 
14 14
     /**
15 15
      * Used to show/hide the dialog on cancel.
16 16
      */
17
-    dispatch: Dispatch<*>
17
+    dispatch: Dispatch<any>
18 18
 };
19 19
 
20 20
 /**

+ 1
- 2
react/features/base/dialog/components/native/BaseDialog.js 查看文件

@@ -16,8 +16,7 @@ import AbstractDialog, {
16 16
 } from '../AbstractDialog';
17 17
 import { brandedDialog as styles } from './styles';
18 18
 
19
-export type Props = {
20
-    ...AbstractProps,
19
+export type Props = AbstractProps & {
21 20
 
22 21
     /**
23 22
      * The color-schemed stylesheet of the feature.

+ 2
- 3
react/features/base/dialog/components/native/BaseSubmitDialog.js 查看文件

@@ -10,8 +10,7 @@ import {
10 10
     brandedDialog
11 11
 } from './styles';
12 12
 
13
-type Props = {
14
-    ...BaseProps,
13
+type Props = BaseProps & {
15 14
 
16 15
     /**
17 16
      * The color-schemed stylesheet of the feature.
@@ -83,7 +82,7 @@ class BaseSubmitDialog<P: Props, S: *> extends BaseDialog<P, S> {
83 82
 
84 83
     _onCancel: () => void;
85 84
 
86
-    _onSubmit: ?string => boolean;
85
+    _onSubmit: () => boolean;
87 86
 
88 87
     _renderHTML: string => Object | string
89 88
 

+ 1
- 0
react/features/base/dialog/components/native/BottomSheet.js 查看文件

@@ -107,4 +107,5 @@ function _mapStateToProps(state) {
107 107
     };
108 108
 }
109 109
 
110
+// $FlowExpectedError
110 111
 export default connect(_mapStateToProps)(BottomSheet);

+ 1
- 2
react/features/base/dialog/components/native/ConfirmDialog.js 查看文件

@@ -13,8 +13,7 @@ import { type Props as BaseProps } from './BaseDialog';
13 13
 import BaseSubmitDialog from './BaseSubmitDialog';
14 14
 import { brandedDialog } from './styles';
15 15
 
16
-type Props = {
17
-    ...BaseProps,
16
+type Props = BaseProps & {
18 17
 
19 18
     /**
20 19
      * The color-schemed stylesheet of the feature.

+ 1
- 0
react/features/base/dialog/components/native/CustomDialog.js 查看文件

@@ -21,4 +21,5 @@ class CustomDialog extends BaseDialog<Props, *> {
21 21
     }
22 22
 }
23 23
 
24
+// $FlowExpectedError
24 25
 export default connect(_abstractMapStateToProps)(CustomDialog);

+ 1
- 3
react/features/base/dialog/components/native/CustomSubmitDialog.js 查看文件

@@ -9,9 +9,7 @@ import { _abstractMapStateToProps } from '../../functions';
9 9
 import { type Props as BaseProps } from './BaseDialog';
10 10
 import BaseSubmitDialog from './BaseSubmitDialog';
11 11
 
12
-type Props = {
13
-    ...BaseProps,
14
-
12
+type Props = BaseProps & {
15 13
     t: Function
16 14
 }
17 15
 

+ 1
- 2
react/features/base/dialog/components/native/InputDialog.js 查看文件

@@ -18,8 +18,7 @@ import {
18 18
     inputDialog as styles
19 19
 } from './styles';
20 20
 
21
-type Props = {
22
-    ...BaseProps,
21
+type Props = BaseProps & {
23 22
 
24 23
     /**
25 24
      * The color-schemed stylesheet of the feature.

+ 4
- 3
react/features/base/dialog/components/web/Dialog.js 查看文件

@@ -10,8 +10,7 @@ import StatelessDialog from './StatelessDialog';
10 10
 /**
11 11
  * The type of the React {@code Component} props of {@link Dialog}.
12 12
  */
13
-type Props = {
14
-    ...AbstractDialogProps,
13
+type Props = AbstractDialogProps & {
15 14
 
16 15
     /**
17 16
      * Whether the dialog is modal. This means clicking on the blanket will
@@ -44,7 +43,7 @@ class Dialog extends AbstractDialog<Props, State> {
44 43
      * @param {Object} props - The read-only properties with which the new
45 44
      * instance is to be initialized.
46 45
      */
47
-    constructor(props) {
46
+    constructor(props: Props) {
48 47
         super(props);
49 48
 
50 49
         // Bind event handlers so they are only bound once per instance.
@@ -65,6 +64,7 @@ class Dialog extends AbstractDialog<Props, State> {
65 64
             onSubmit: this._onSubmit
66 65
         };
67 66
 
67
+        // $FlowExpectedError
68 68
         delete props.dispatch;
69 69
 
70 70
         return <StatelessDialog { ...props } />;
@@ -84,4 +84,5 @@ class Dialog extends AbstractDialog<Props, State> {
84 84
     _onSubmit: (?string) => void;
85 85
 }
86 86
 
87
+// $FlowExpectedError
87 88
 export default connect()(Dialog);

+ 7
- 7
react/features/base/dialog/constants.js 查看文件

@@ -5,27 +5,27 @@ export type DialogProps = {
5 5
     /**
6 6
      * Whether cancel button is disabled. Enabled by default.
7 7
      */
8
-    cancelDisabled: boolean,
8
+    cancelDisabled: ?boolean,
9 9
 
10 10
     /**
11 11
      * Optional i18n key to change the cancel button title.
12 12
      */
13
-    cancelKey: string,
13
+    cancelKey: ?string,
14 14
 
15 15
     /**
16 16
      * The React {@code Component} children which represents the dialog's body.
17 17
      */
18
-    children: React$Node,
18
+    children: ?React$Node,
19 19
 
20 20
     /**
21 21
      * Is ok button enabled/disabled. Enabled by default.
22 22
      */
23
-    okDisabled: boolean,
23
+    okDisabled: ?boolean,
24 24
 
25 25
     /**
26 26
      * Optional i18n key to change the ok button title.
27 27
      */
28
-    okKey: string,
28
+    okKey: ?string,
29 29
 
30 30
     /**
31 31
      * The handler for onCancel event.
@@ -47,14 +47,14 @@ export type DialogProps = {
47 47
     /**
48 48
      * Key to use for showing a title.
49 49
      */
50
-    titleKey: string,
50
+    titleKey: ?string,
51 51
 
52 52
     /**
53 53
      * The string to use as a title instead of {@code titleKey}. If a truthy
54 54
      * value is specified, it takes precedence over {@code titleKey} i.e.
55 55
      * the latter is unused.
56 56
      */
57
-    titleString: string
57
+    titleString: ?string
58 58
 };
59 59
 
60 60
 /**

+ 2
- 2
react/features/base/lib-jitsi-meet/actions.js 查看文件

@@ -20,7 +20,7 @@ declare var APP: Object;
20 20
  * @returns {Function}
21 21
  */
22 22
 export function disposeLib() {
23
-    return (dispatch: Dispatch<*>) => {
23
+    return (dispatch: Dispatch<any>) => {
24 24
         dispatch({ type: LIB_WILL_DISPOSE });
25 25
 
26 26
         // TODO Currently, lib-jitsi-meet doesn't have the functionality to
@@ -36,7 +36,7 @@ export function disposeLib() {
36 36
  * @returns {Function}
37 37
  */
38 38
 export function initLib() {
39
-    return (dispatch: Dispatch<*>, getState: Function): void => {
39
+    return (dispatch: Dispatch<any>, getState: Function): void => {
40 40
         const config = getState()['features/base/config'];
41 41
 
42 42
         if (!config) {

+ 1
- 1
react/features/base/media/actions.js 查看文件

@@ -99,7 +99,7 @@ export function setVideoMuted(
99 99
         muted: boolean,
100 100
         authority: number = VIDEO_MUTISM_AUTHORITY.USER,
101 101
         ensureTrack: boolean = false) {
102
-    return (dispatch: Dispatch<*>, getState: Function) => {
102
+    return (dispatch: Dispatch<any>, getState: Function) => {
103 103
         const oldValue = getState()['features/base/media'].video.muted;
104 104
 
105 105
         // eslint-disable-next-line no-bitwise

+ 2
- 1
react/features/base/media/components/AbstractVideoTrack.js 查看文件

@@ -1,6 +1,7 @@
1 1
 /* @flow */
2 2
 
3 3
 import React, { Component } from 'react';
4
+import type { Dispatch } from 'redux';
4 5
 
5 6
 import { trackVideoStarted } from '../../tracks';
6 7
 
@@ -15,7 +16,7 @@ export type Props = {
15 16
     /**
16 17
      * The Redux dispatch function.
17 18
      */
18
-    dispatch: Dispatch<*>,
19
+    dispatch: Dispatch<any>,
19 20
 
20 21
     /**
21 22
      * Callback to invoke when the {@link Video} of {@code AbstractVideoTrack}

+ 1
- 0
react/features/base/media/components/native/VideoTrack.js 查看文件

@@ -29,4 +29,5 @@ class VideoTrack extends AbstractVideoTrack<Props> {
29 29
     }
30 30
 }
31 31
 
32
+// $FlowExpectedError
32 33
 export default connect()(VideoTrack);

+ 6
- 3
react/features/base/media/components/native/VideoTransform.js 查看文件

@@ -5,6 +5,8 @@ import { PanResponder, PixelRatio, View } from 'react-native';
5 5
 import { connect } from 'react-redux';
6 6
 import { type Dispatch } from 'redux';
7 7
 
8
+import type { PanResponderInstance } from 'PanResponder';
9
+
8 10
 import { storeVideoTransform } from '../../actions';
9 11
 import styles from './styles';
10 12
 
@@ -117,7 +119,7 @@ class VideoTransform extends Component<Props, State> {
117 119
     /**
118 120
      * The gesture handler object.
119 121
      */
120
-    gestureHandlers: PanResponder;
122
+    gestureHandlers: PanResponderInstance;
121 123
 
122 124
     /**
123 125
      * The initial distance of the fingers on pinch start.
@@ -190,7 +192,7 @@ class VideoTransform extends Component<Props, State> {
190 192
      *
191 193
      * @inheritdoc
192 194
      */
193
-    componentDidUpdate(prevProps, prevState) {
195
+    componentDidUpdate(prevProps: Props, prevState: State) {
194 196
         if (prevProps.streamId !== this.props.streamId) {
195 197
             this._storeTransform(prevProps.streamId, prevState.transform);
196 198
             this._restoreTransform(this.props.streamId);
@@ -687,7 +689,7 @@ class VideoTransform extends Component<Props, State> {
687 689
  *     _onUnmount: Function
688 690
  * }}
689 691
  */
690
-function _mapDispatchToProps(dispatch: Dispatch<*>) {
692
+function _mapDispatchToProps(dispatch: Dispatch<any>) {
691 693
     return {
692 694
         /**
693 695
          * Dispatches actions to store the last applied transform to a video.
@@ -725,4 +727,5 @@ function _mapStateToProps(state) {
725 727
     };
726 728
 }
727 729
 
730
+// $FlowExpectedError
728 731
 export default connect(_mapStateToProps, _mapDispatchToProps)(VideoTransform);

+ 2
- 2
react/features/base/media/components/web/VideoTrack.js 查看文件

@@ -11,8 +11,7 @@ import Video from './Video';
11 11
 /**
12 12
  * The type of the React {@code Component} props of {@link VideoTrack}.
13 13
  */
14
-type Props = {
15
-    ...AbstractVideoTrackProps,
14
+type Props = AbstractVideoTrackProps & {
16 15
 
17 16
     /**
18 17
      * CSS classes to add to the video element.
@@ -64,4 +63,5 @@ class VideoTrack extends AbstractVideoTrack<Props> {
64 63
     _onVideoPlaying: () => void;
65 64
 }
66 65
 
66
+// $FlowExpectedError
67 67
 export default connect()(VideoTrack);

+ 1
- 1
react/features/base/react/Types.js 查看文件

@@ -20,7 +20,7 @@ export type Item = {
20 20
     /**
21 21
      * An optional react element to append to the end of the Item.
22 22
      */
23
-    elementAfter?: ?ComponentType<any>,
23
+    elementAfter?: ?React$Node,
24 24
 
25 25
     /**
26 26
      * Unique ID of the item.

+ 1
- 1
react/features/base/react/components/AbstractContainer.js 查看文件

@@ -20,7 +20,7 @@ export type Props = {
20 20
     /**
21 21
      * React Elements to display within the component.
22 22
      */
23
-    children: React$Node | Object,
23
+    children: React$Node,
24 24
 
25 25
     /**
26 26
      * The event handler/listener to be invoked when this

+ 42
- 26
react/features/base/react/components/native/AvatarListItem.js 查看文件

@@ -32,7 +32,7 @@ type Props = {
32 32
     /**
33 33
      * Children of the component.
34 34
      */
35
-    children?: ?React$Element<*>,
35
+    children?: React$Node,
36 36
 
37 37
     /**
38 38
      * item containing data to be rendered
@@ -70,6 +70,44 @@ export default class AvatarListItem extends Component<Props> {
70 70
         this._renderItemLine = this._renderItemLine.bind(this);
71 71
     }
72 72
 
73
+    /**
74
+     * Helper function to render the content in the avatar container.
75
+     *
76
+     * @returns {React$Element}
77
+     */
78
+    _getAvatarContent() {
79
+        const {
80
+            avatarSize = AVATAR_SIZE,
81
+            avatarTextStyle
82
+        } = this.props;
83
+        const { avatar, title } = this.props.item;
84
+        const isAvatarURL = Boolean(avatar && avatar.match(/^http[s]*:\/\//i));
85
+
86
+        if (isAvatarURL) {
87
+            return (
88
+                <Avatar
89
+                    size = { avatarSize }
90
+                    uri = { avatar } />
91
+            );
92
+        }
93
+
94
+        if (avatar && !isAvatarURL) {
95
+            return (
96
+                <Icon name = { avatar } />
97
+            );
98
+        }
99
+
100
+        return (
101
+            <Text
102
+                style = { [
103
+                    styles.avatarContent,
104
+                    avatarTextStyle
105
+                ] }>
106
+                { title.substr(0, 1).toUpperCase() }
107
+            </Text>
108
+        );
109
+    }
110
+
73 111
     /**
74 112
      * Implements {@code Component#render}.
75 113
      *
@@ -78,10 +116,9 @@ export default class AvatarListItem extends Component<Props> {
78 116
     render() {
79 117
         const {
80 118
             avatarSize = AVATAR_SIZE,
81
-            avatarStyle,
82
-            avatarTextStyle
119
+            avatarStyle
83 120
         } = this.props;
84
-        const { avatar, colorBase, lines, title } = this.props.item;
121
+        const { colorBase, lines, title } = this.props.item;
85 122
         const avatarStyles = {
86 123
             ...styles.avatar,
87 124
             ...this._getAvatarColor(colorBase),
@@ -91,8 +128,6 @@ export default class AvatarListItem extends Component<Props> {
91 128
             width: avatarSize
92 129
         };
93 130
 
94
-        const isAvatarURL = Boolean(avatar && avatar.match(/^http[s]*:\/\//i));
95
-
96 131
         return (
97 132
             <Container
98 133
                 onClick = { this.props.onPress }
@@ -100,26 +135,7 @@ export default class AvatarListItem extends Component<Props> {
100 135
                 underlayColor = { UNDERLAY_COLOR }>
101 136
                 <Container style = { styles.avatarContainer }>
102 137
                     <Container style = { avatarStyles }>
103
-                        {
104
-                            isAvatarURL && <Avatar
105
-                                size = { avatarSize }
106
-                                uri = { avatar } />
107
-                        }
108
-
109
-                        {
110
-                            Boolean(avatar && !isAvatarURL) && <Icon
111
-                                name = { avatar } />
112
-                        }
113
-
114
-                        {
115
-                            !avatar && <Text
116
-                                style = { [
117
-                                    styles.avatarContent,
118
-                                    avatarTextStyle
119
-                                ] }>
120
-                                { title.substr(0, 1).toUpperCase() }
121
-                            </Text>
122
-                        }
138
+                        { this._getAvatarContent() }
123 139
                     </Container>
124 140
                 </Container>
125 141
                 <Container style = { styles.listItemDetails }>

+ 1
- 0
react/features/base/react/components/native/BackButton.js 查看文件

@@ -68,4 +68,5 @@ function _mapStateToProps(state) {
68 68
     };
69 69
 }
70 70
 
71
+// $FlowExpectedError
71 72
 export default connect(_mapStateToProps)(BackButton);

+ 1
- 0
react/features/base/react/components/native/Header.js 查看文件

@@ -165,4 +165,5 @@ function _mapStateToProps(state) {
165 165
     };
166 166
 }
167 167
 
168
+// $FlowExpectedError
168 169
 export default connect(_mapStateToProps)(Header);

+ 1
- 0
react/features/base/react/components/native/PagedList.js 查看文件

@@ -283,4 +283,5 @@ class PagedList extends Component<Props, State> {
283 283
     }
284 284
 }
285 285
 
286
+// $FlowExpectedError
286 287
 export default connect()(PagedList);

+ 1
- 0
react/features/base/react/components/web/Watermarks.js 查看文件

@@ -242,4 +242,5 @@ function _mapStateToProps(state) {
242 242
     };
243 243
 }
244 244
 
245
+// $FlowExpectedError
245 246
 export default connect(_mapStateToProps)(translate(Watermarks));

+ 2
- 8
react/features/base/redux/MiddlewareRegistry.js 查看文件

@@ -32,14 +32,8 @@ class MiddlewareRegistry {
32 32
      * @returns {Middleware}
33 33
      */
34 34
     applyMiddleware(...additional: Array<Middleware<*, *>>) {
35
-        // XXX The explicit definition of the local variable middlewares is to
36
-        // satisfy flow.
37
-        const middlewares = [
38
-            ...this._elements,
39
-            ...additional
40
-        ];
41
-
42
-        return applyMiddleware(...middlewares);
35
+        // $FlowExpectedError
36
+        return applyMiddleware(...this._elements, ...additional);
43 37
     }
44 38
 
45 39
     /**

+ 1
- 0
react/features/base/redux/ReducerRegistry.js 查看文件

@@ -38,6 +38,7 @@ class ReducerRegistry {
38 38
      * @returns {Function}
39 39
      */
40 40
     combineReducers(additional: NameReducerMap<*, *> = {}) {
41
+        // $FlowExpectedError
41 42
         return combineReducers({
42 43
             ...this._elements,
43 44
             ...additional

+ 10
- 4
react/features/base/redux/StateListenerRegistry.js 查看文件

@@ -1,5 +1,7 @@
1 1
 // @flow
2 2
 
3
+import type { Store } from 'redux';
4
+
3 5
 const logger = require('jitsi-meet-logger').getLogger(__filename);
4 6
 
5 7
 /**
@@ -16,7 +18,8 @@ const logger = require('jitsi-meet-logger').getLogger(__filename);
16 18
  * invoked only if {@code prevSelection} and {@code selection} are different.
17 19
  * Immutable!
18 20
  */
19
-type Listener = (selection: any, store: Store, prevSelection: any) => void;
21
+type Listener
22
+    = (selection: any, store: Store<*, *>, prevSelection: any) => void;
20 23
 
21 24
 /**
22 25
  * The type selector supported for registration with
@@ -65,7 +68,10 @@ class StateListenerRegistry {
65 68
      */
66 69
     _selectorListeners: Set<SelectorListener> = new Set();
67 70
 
68
-    _listener: (Store) => void;
71
+    _listener: ({
72
+        prevSelections: Map<SelectorListener, any>,
73
+        store: Store<*, *>
74
+    }) => void;
69 75
 
70 76
     /**
71 77
      * Invoked by a specific redux store any time an action is dispatched, and
@@ -78,7 +84,7 @@ class StateListenerRegistry {
78 84
      */
79 85
     _listener({ prevSelections, store }: {
80 86
             prevSelections: Map<SelectorListener, any>,
81
-            store: Store
87
+            store: Store<*, *>
82 88
     }) {
83 89
         for (const selectorListener of this._selectorListeners) {
84 90
             const prevSelection = prevSelections.get(selectorListener);
@@ -129,7 +135,7 @@ class StateListenerRegistry {
129 135
      * {@code StateListenerRegistry} is to {@code subscribe}.
130 136
      * @returns {void}
131 137
      */
132
-    subscribe(store: Store) {
138
+    subscribe(store: Store<*, *>) {
133 139
         // XXX If StateListenerRegistry is not utilized by the app to listen to
134 140
         // state changes, do not bother subscribing to the store at all.
135 141
         if (this._selectorListeners.size) {

+ 2
- 2
react/features/base/responsive-ui/actions.js 查看文件

@@ -30,7 +30,7 @@ const REDUCED_UI_THRESHOLD = 300;
30 30
  * }}
31 31
  */
32 32
 export function setAspectRatio(width: number, height: number): Function {
33
-    return (dispatch: Dispatch<*>, getState: Function) => {
33
+    return (dispatch: Dispatch<any>, getState: Function) => {
34 34
         // Don't change the aspect ratio if width and height are the same, that
35 35
         // is, if we transition to a 1:1 aspect ratio.
36 36
         if (width !== height) {
@@ -60,7 +60,7 @@ export function setAspectRatio(width: number, height: number): Function {
60 60
  * }}
61 61
  */
62 62
 export function setReducedUI(width: number, height: number): Function {
63
-    return (dispatch: Dispatch<*>, getState: Function) => {
63
+    return (dispatch: Dispatch<any>, getState: Function) => {
64 64
         const reducedUI = Math.min(width, height) < REDUCED_UI_THRESHOLD;
65 65
 
66 66
         if (reducedUI !== getState()['features/base/responsive-ui'].reducedUI) {

+ 2
- 1
react/features/base/responsive-ui/components/AspectRatioDetector.js 查看文件

@@ -52,7 +52,7 @@ class AspectRatioDetector extends Component<Props> {
52 52
  *     _onDimensionsChanged: Function
53 53
  * }}
54 54
  */
55
-function _mapDispatchToProps(dispatch: Dispatch<*>) {
55
+function _mapDispatchToProps(dispatch: Dispatch<any>) {
56 56
     return {
57 57
         /**
58 58
          * Handles the "on dimensions changed" event and dispatches aspect ratio
@@ -69,4 +69,5 @@ function _mapDispatchToProps(dispatch: Dispatch<*>) {
69 69
     };
70 70
 }
71 71
 
72
+// $FlowExpectedError
72 73
 export default connect(undefined, _mapDispatchToProps)(AspectRatioDetector);

+ 2
- 1
react/features/base/responsive-ui/components/ReducedUIDetector.js 查看文件

@@ -53,7 +53,7 @@ class ReducedUIDetector extends Component<Props> {
53 53
  *     _onDimensionsChanged: Function
54 54
  * }}
55 55
  */
56
-function _mapDispatchToProps(dispatch: Dispatch<*>) {
56
+function _mapDispatchToProps(dispatch: Dispatch<any>) {
57 57
     return {
58 58
         /**
59 59
          * Handles the "on dimensions changed" event and dispatches the
@@ -70,4 +70,5 @@ function _mapDispatchToProps(dispatch: Dispatch<*>) {
70 70
     };
71 71
 }
72 72
 
73
+// $FlowExpectedError
73 74
 export default connect(undefined, _mapDispatchToProps)(ReducedUIDetector);

+ 1
- 0
react/features/base/sounds/components/SoundCollection.js 查看文件

@@ -153,4 +153,5 @@ export function _mapDispatchToProps(dispatch: Function) {
153 153
     };
154 154
 }
155 155
 
156
+// $FlowExpectedError
156 157
 export default connect(_mapStateToProps, _mapDispatchToProps)(SoundCollection);

+ 1
- 1
react/features/base/styles/functions.js 查看文件

@@ -46,7 +46,7 @@ const _WELL_KNOWN_NUMBER_PROPERTIES = [ 'height', 'width' ];
46 46
  * @returns {StyleType} - The merged styles.
47 47
  */
48 48
 export function combineStyles(a: StyleType, b: StyleType): StyleType {
49
-    const result = [];
49
+    const result: Array<StyleSheet> = [];
50 50
 
51 51
     if (a) {
52 52
         if (Array.isArray(a)) {

+ 3
- 2
react/features/base/testing/components/TestConnectionInfo.js 查看文件

@@ -89,7 +89,7 @@ class TestConnectionInfo extends Component<Props, State> {
89 89
      * @param {Object} props - The read-only properties with which the new
90 90
      * instance is to be initialized.
91 91
      */
92
-    constructor(props: Object) {
92
+    constructor(props: Props) {
93 93
         super(props);
94 94
 
95 95
         this._onStatsUpdated = this._onStatsUpdated.bind(this);
@@ -142,7 +142,7 @@ class TestConnectionInfo extends Component<Props, State> {
142 142
      * @inheritdoc
143 143
      * returns {void}
144 144
      */
145
-    componentDidUpdate(prevProps) {
145
+    componentDidUpdate(prevProps: Props) {
146 146
         if (prevProps._localUserId !== this.props._localUserId) {
147 147
             statsEmitter.unsubscribeToClientStats(
148 148
                 prevProps._localUserId, this._onStatsUpdated);
@@ -215,4 +215,5 @@ function _mapStateToProps(state) {
215 215
     };
216 216
 }
217 217
 
218
+// $FlowExpectedError
218 219
 export default connect(_mapStateToProps)(TestConnectionInfo);

+ 1
- 0
react/features/base/testing/components/TestHint.ios.js 查看文件

@@ -34,4 +34,5 @@ class TestHint extends Component<TestHintProps> {
34 34
     }
35 35
 }
36 36
 
37
+// $FlowExpectedError
37 38
 export default connect(_mapStateToProps)(TestHint);

+ 1
- 0
react/features/base/toolbox/components/AbstractToolboxItem.js 查看文件

@@ -201,6 +201,7 @@ export default class AbstractToolboxItem<P : Props> extends Component<P> {
201 201
      */
202 202
     _renderItem() {
203 203
         // To be implemented by a subclass.
204
+        return null;
204 205
     }
205 206
 
206 207
     /**

+ 3
- 1
react/features/calendar-sync/actions.native.js 查看文件

@@ -1,6 +1,8 @@
1 1
 // @flow
2 2
 import { generateRoomWithoutSeparator } from 'js-utils/random';
3 3
 
4
+import type { Dispatch } from 'redux';
5
+
4 6
 import { getDefaultURL } from '../app';
5 7
 import { openDialog } from '../base/dialog';
6 8
 
@@ -35,7 +37,7 @@ export function openUpdateCalendarEventDialog(eventId: string) {
35 37
  * @returns {Function}
36 38
  */
37 39
 export function updateCalendarEvent(eventId: string) {
38
-    return (dispatch: Dispatch<*>, getState: Function) => {
40
+    return (dispatch: Dispatch<any>, getState: Function) => {
39 41
         const defaultUrl = getDefaultURL(getState);
40 42
         const roomName = generateRoomWithoutSeparator();
41 43
 

+ 4
- 3
react/features/calendar-sync/actions.web.js 查看文件

@@ -1,6 +1,7 @@
1 1
 // @flow
2 2
 
3 3
 import { generateRoomWithoutSeparator } from 'js-utils/random';
4
+import type { Dispatch } from 'redux';
4 5
 
5 6
 import { loadGoogleAPI } from '../google-api';
6 7
 
@@ -197,7 +198,7 @@ export function setIntegrationReady(integrationType: string) {
197 198
  * @returns {Function}
198 199
  */
199 200
 export function signIn(calendarType: string): Function {
200
-    return (dispatch: Dispatch<*>) => {
201
+    return (dispatch: Dispatch<any>) => {
201 202
         const integration = _getCalendarIntegration(calendarType);
202 203
 
203 204
         if (!integration) {
@@ -229,7 +230,7 @@ export function signIn(calendarType: string): Function {
229 230
  * @returns {Function}
230 231
  */
231 232
 export function updateCalendarEvent(id: string, calendarId: string): Function {
232
-    return (dispatch: Dispatch<*>, getState: Function) => {
233
+    return (dispatch: Dispatch<any>, getState: Function) => {
233 234
 
234 235
         const { integrationType } = getState()['features/calendar-sync'];
235 236
         const integration = _getCalendarIntegration(integrationType);
@@ -276,7 +277,7 @@ export function updateCalendarEvent(id: string, calendarId: string): Function {
276 277
  * @returns {Function}
277 278
  */
278 279
 export function updateProfile(calendarType: string): Function {
279
-    return (dispatch: Dispatch<*>) => {
280
+    return (dispatch: Dispatch<any>) => {
280 281
         const integration = _getCalendarIntegration(calendarType);
281 282
 
282 283
         if (!integration) {

+ 3
- 2
react/features/calendar-sync/components/AddMeetingUrlButton.web.js 查看文件

@@ -1,8 +1,9 @@
1 1
 // @flow
2 2
 
3
+import Tooltip from '@atlaskit/tooltip';
3 4
 import React, { Component } from 'react';
4 5
 import { connect } from 'react-redux';
5
-import Tooltip from '@atlaskit/tooltip';
6
+import type { Dispatch } from 'redux';
6 7
 
7 8
 import {
8 9
     createCalendarClickedEvent,
@@ -25,7 +26,7 @@ type Props = {
25 26
     /**
26 27
      * Invoked to add a meeting URL to a calendar event.
27 28
      */
28
-    dispatch: Dispatch<*>,
29
+    dispatch: Dispatch<any>,
29 30
 
30 31
     /**
31 32
      * The ID of the calendar event that will have a meeting URL added on click.

+ 1
- 1
react/features/calendar-sync/components/CalendarListContent.native.js 查看文件

@@ -108,7 +108,7 @@ class CalendarListContent extends Component<Props> {
108 108
         );
109 109
     }
110 110
 
111
-    _onPress: (string, string) => Function;
111
+    _onPress: (string, ?string) => Function;
112 112
 
113 113
     /**
114 114
      * Handles the list's navigate action.

+ 4
- 2
react/features/calendar-sync/components/CalendarListContent.web.js 查看文件

@@ -59,7 +59,7 @@ class CalendarListContent extends Component<Props> {
59 59
      *
60 60
      * @inheritdoc
61 61
      */
62
-    constructor(props) {
62
+    constructor(props: Props) {
63 63
         super(props);
64 64
 
65 65
         // Bind event handlers so they are only bound once per instance.
@@ -114,7 +114,7 @@ class CalendarListContent extends Component<Props> {
114 114
         this._onPress(url, 'calendar.meeting.join');
115 115
     }
116 116
 
117
-    _onPress: (string, string) => Function;
117
+    _onPress: (string, ?string) => Function;
118 118
 
119 119
     /**
120 120
      * Handles the list's navigate action.
@@ -173,5 +173,7 @@ function _mapStateToProps(state: Object) {
173 173
 }
174 174
 
175 175
 export default isCalendarEnabled()
176
+
177
+    // $FlowExpectedError
176 178
     ? connect(_mapStateToProps)(CalendarListContent)
177 179
     : undefined;

+ 5
- 4
react/features/calendar-sync/functions.native.js 查看文件

@@ -2,6 +2,7 @@
2 2
 
3 3
 import { NativeModules, Platform } from 'react-native';
4 4
 import RNCalendarEvents from 'react-native-calendar-events';
5
+import type { Store } from 'redux';
5 6
 
6 7
 import { getShareInfoText } from '../invite';
7 8
 
@@ -22,7 +23,7 @@ const logger = require('jitsi-meet-logger').getLogger(__filename);
22 23
  * @returns {Promise<*>}
23 24
  */
24 25
 export function addLinkToCalendarEntry(
25
-        state: Object, id: string, link: string) {
26
+        state: Object, id: string, link: string): Promise<any> {
26 27
     return new Promise((resolve, reject) => {
27 28
         getShareInfoText(state, link, true).then(shareInfoText => {
28 29
             RNCalendarEvents.findEventById(id).then(event => {
@@ -76,9 +77,9 @@ export function isCalendarEnabled() {
76 77
  * @returns {void}
77 78
  */
78 79
 export function _fetchCalendarEntries(
79
-        store,
80
-        maybePromptForPermission,
81
-        forcePermission) {
80
+        store: Store<*, *>,
81
+        maybePromptForPermission: boolean,
82
+        forcePermission: ?boolean) {
82 83
     const { dispatch, getState } = store;
83 84
     const promptForPermission
84 85
         = (maybePromptForPermission

+ 3
- 3
react/features/calendar-sync/functions.web.js 查看文件

@@ -47,9 +47,9 @@ export function isCalendarEnabled() {
47 47
  * @returns {void}
48 48
  */
49 49
 export function _fetchCalendarEntries(
50
-        store,
51
-        maybePromptForPermission,
52
-        forcePermission) {
50
+        store: Object,
51
+        maybePromptForPermission: boolean,
52
+        forcePermission: ?boolean) {
53 53
     /* eslint-enable no-unused-vars */
54 54
     const { dispatch, getState } = store;
55 55
 

+ 8
- 6
react/features/calendar-sync/web/googleCalendar.js 查看文件

@@ -1,4 +1,6 @@
1
-/* @flow */
1
+// @flow
2
+
3
+import type { Dispatch } from 'redux';
2 4
 
3 5
 import {
4 6
     getCalendarEntries,
@@ -29,7 +31,7 @@ export const googleCalendarApi = {
29 31
     /**
30 32
      * Returns the email address for the currently logged in user.
31 33
      *
32
-     * @returns {function(Dispatch<*>): Promise<string|never>}
34
+     * @returns {function(Dispatch<any>): Promise<string|never>}
33 35
      */
34 36
     getCurrentEmail() {
35 37
         return updateProfile();
@@ -38,10 +40,10 @@ export const googleCalendarApi = {
38 40
     /**
39 41
      * Initializes the google api if needed.
40 42
      *
41
-     * @returns {function(Dispatch<*>, Function): Promise<void>}
43
+     * @returns {function(Dispatch<any>, Function): Promise<void>}
42 44
      */
43 45
     load() {
44
-        return (dispatch: Dispatch<*>, getState: Function) => {
46
+        return (dispatch: Dispatch<any>, getState: Function) => {
45 47
             const { googleApiApplicationClientID }
46 48
                 = getState()['features/base/config'];
47 49
 
@@ -52,7 +54,7 @@ export const googleCalendarApi = {
52 54
     /**
53 55
      * Prompts the participant to sign in to the Google API Client Library.
54 56
      *
55
-     * @returns {function(Dispatch<*>): Promise<string|never>}
57
+     * @returns {function(Dispatch<any>): Promise<string|never>}
56 58
      */
57 59
     signIn,
58 60
 
@@ -72,7 +74,7 @@ export const googleCalendarApi = {
72 74
      * @param {string} id - The event id.
73 75
      * @param {string} calendarId - The id of the calendar to use.
74 76
      * @param {string} location - The location to save to the event.
75
-     * @returns {function(Dispatch<*>): Promise<string|never>}
77
+     * @returns {function(Dispatch<any>): Promise<string|never>}
76 78
      */
77 79
     updateCalendarEvent
78 80
 };

+ 64
- 63
react/features/calendar-sync/web/microsoftCalendar.js 查看文件

@@ -1,7 +1,8 @@
1
-/* @flow */
1
+// @flow
2 2
 
3 3
 import { Client } from '@microsoft/microsoft-graph-client';
4 4
 import rs from 'jsrsasign';
5
+import type { Dispatch } from 'redux';
5 6
 
6 7
 import { createDeferred } from '../../../../modules/util/helpers';
7 8
 
@@ -77,10 +78,10 @@ export const microsoftCalendarApi = {
77 78
      * @param {number} fetchStartDays - The number of days to go back
78 79
      * when fetching.
79 80
      * @param {number} fetchEndDays - The number of days to fetch.
80
-     * @returns {function(Dispatch<*>, Function): Promise<CalendarEntries>}
81
+     * @returns {function(Dispatch<any>, Function): Promise<CalendarEntries>}
81 82
      */
82 83
     getCalendarEntries(fetchStartDays: ?number, fetchEndDays: ?number) {
83
-        return (dispatch: Dispatch<*>, getState: Function): Promise<*> => {
84
+        return (dispatch: Dispatch<any>, getState: Function): Promise<*> => {
84 85
             const state = getState()['features/calendar-sync'] || {};
85 86
             const token = state.msAuthState && state.msAuthState.accessToken;
86 87
 
@@ -118,7 +119,7 @@ export const microsoftCalendarApi = {
118 119
      * @returns {function(Dispatch<*, Function>): Promise<string>}
119 120
      */
120 121
     getCurrentEmail(): Function {
121
-        return (dispatch: Dispatch<*>, getState: Function) => {
122
+        return (dispatch: Dispatch<any>, getState: Function) => {
122 123
             const { msAuthState = {} }
123 124
                 = getState()['features/calendar-sync'] || {};
124 125
             const email = msAuthState.userSigninName || '';
@@ -139,10 +140,10 @@ export const microsoftCalendarApi = {
139 140
     /**
140 141
      * Prompts the participant to sign in to the Microsoft API Client Library.
141 142
      *
142
-     * @returns {function(Dispatch<*>, Function): Promise<void>}
143
+     * @returns {function(Dispatch<any>, Function): Promise<void>}
143 144
      */
144 145
     signIn(): Function {
145
-        return (dispatch: Dispatch<*>, getState: Function) => {
146
+        return (dispatch: Dispatch<any>, getState: Function) => {
146 147
             // Ensure only one popup window at a time.
147 148
             if (popupAuthWindow) {
148 149
                 popupAuthWindow.focus();
@@ -238,10 +239,10 @@ export const microsoftCalendarApi = {
238 239
     /**
239 240
      * Returns whether or not the user is currently signed in.
240 241
      *
241
-     * @returns {function(Dispatch<*>, Function): Promise<boolean>}
242
+     * @returns {function(Dispatch<any>, Function): Promise<boolean>}
242 243
      */
243 244
     _isSignedIn(): Function {
244
-        return (dispatch: Dispatch<*>, getState: Function) => {
245
+        return (dispatch: Dispatch<any>, getState: Function) => {
245 246
             const now = new Date().getTime();
246 247
             const state
247 248
                 = getState()['features/calendar-sync'].msAuthState || {};
@@ -250,7 +251,7 @@ export const microsoftCalendarApi = {
250 251
 
251 252
             if (state.accessToken && isExpired) {
252 253
                 // token expired, let's refresh it
253
-                return dispatch(this._refreshAuthToken())
254
+                return dispatch(refreshAuthToken())
254 255
                     .then(() => true)
255 256
                     .catch(() => false);
256 257
             }
@@ -259,58 +260,6 @@ export const microsoftCalendarApi = {
259 260
         };
260 261
     },
261 262
 
262
-    /**
263
-     * Renews an existing auth token so it can continue to be used.
264
-     *
265
-     * @private
266
-     * @returns {function(Dispatch<*>, Function): Promise<void>}
267
-     */
268
-    _refreshAuthToken(): Function {
269
-        return (dispatch: Dispatch<*>, getState: Function) => {
270
-            const { microsoftApiApplicationClientID }
271
-                = getState()['features/base/config'];
272
-            const { msAuthState = {} }
273
-                = getState()['features/calendar-sync'] || {};
274
-
275
-            const refreshAuthUrl = getAuthRefreshUrl(
276
-                microsoftApiApplicationClientID,
277
-                msAuthState.userDomainType,
278
-                msAuthState.userSigninName);
279
-
280
-            const iframe = document.createElement('iframe');
281
-
282
-            iframe.setAttribute('id', 'auth-iframe');
283
-            iframe.setAttribute('name', 'auth-iframe');
284
-            iframe.setAttribute('style', 'display: none');
285
-            iframe.setAttribute('src', refreshAuthUrl);
286
-
287
-            const signInPromise = new Promise(resolve => {
288
-                iframe.onload = () => {
289
-                    resolve(iframe.contentWindow.location.hash);
290
-                };
291
-            });
292
-
293
-            // The check for body existence is done for flow, which also runs
294
-            // against native where document.body may not be defined.
295
-            if (!document.body) {
296
-                return Promise.reject(
297
-                    'Cannot refresh auth token in this environment');
298
-            }
299
-
300
-            document.body.appendChild(iframe);
301
-
302
-            return signInPromise.then(hash => {
303
-                const params = getParamsFromHash(hash);
304
-
305
-                dispatch(setCalendarAPIAuthState({
306
-                    accessToken: params.access_token,
307
-                    idToken: params.id_token,
308
-                    tokenExpires: params.tokenExpires
309
-                }));
310
-            });
311
-        };
312
-    },
313
-
314 263
     /**
315 264
      * Updates calendar event by generating new invite URL and editing the event
316 265
      * adding some descriptive text and location.
@@ -318,10 +267,10 @@ export const microsoftCalendarApi = {
318 267
      * @param {string} id - The event id.
319 268
      * @param {string} calendarId - The id of the calendar to use.
320 269
      * @param {string} location - The location to save to the event.
321
-     * @returns {function(Dispatch<*>): Promise<string|never>}
270
+     * @returns {function(Dispatch<any>): Promise<string|never>}
322 271
      */
323 272
     updateCalendarEvent(id: string, calendarId: string, location: string) {
324
-        return (dispatch: Dispatch<*>, getState: Function): Promise<*> => {
273
+        return (dispatch: Dispatch<any>, getState: Function): Promise<*> => {
325 274
             const state = getState()['features/calendar-sync'] || {};
326 275
             const token = state.msAuthState && state.msAuthState.accessToken;
327 276
 
@@ -533,6 +482,58 @@ function getValidatedTokenParts(tokenInfo, guids, appId) {
533 482
     };
534 483
 }
535 484
 
485
+/**
486
+ * Renews an existing auth token so it can continue to be used.
487
+ *
488
+ * @private
489
+ * @returns {function(Dispatch<any>, Function): Promise<void>}
490
+ */
491
+function refreshAuthToken(): Function {
492
+    return (dispatch: Dispatch<any>, getState: Function) => {
493
+        const { microsoftApiApplicationClientID }
494
+            = getState()['features/base/config'];
495
+        const { msAuthState = {} }
496
+            = getState()['features/calendar-sync'] || {};
497
+
498
+        const refreshAuthUrl = getAuthRefreshUrl(
499
+            microsoftApiApplicationClientID,
500
+            msAuthState.userDomainType,
501
+            msAuthState.userSigninName);
502
+
503
+        const iframe = document.createElement('iframe');
504
+
505
+        iframe.setAttribute('id', 'auth-iframe');
506
+        iframe.setAttribute('name', 'auth-iframe');
507
+        iframe.setAttribute('style', 'display: none');
508
+        iframe.setAttribute('src', refreshAuthUrl);
509
+
510
+        const signInPromise = new Promise(resolve => {
511
+            iframe.onload = () => {
512
+                resolve(iframe.contentWindow.location.hash);
513
+            };
514
+        });
515
+
516
+        // The check for body existence is done for flow, which also runs
517
+        // against native where document.body may not be defined.
518
+        if (!document.body) {
519
+            return Promise.reject(
520
+                'Cannot refresh auth token in this environment');
521
+        }
522
+
523
+        document.body.appendChild(iframe);
524
+
525
+        return signInPromise.then(hash => {
526
+            const params = getParamsFromHash(hash);
527
+
528
+            dispatch(setCalendarAPIAuthState({
529
+                accessToken: params.access_token,
530
+                idToken: params.id_token,
531
+                tokenExpires: params.tokenExpires
532
+            }));
533
+        });
534
+    };
535
+}
536
+
536 537
 /**
537 538
  * Retrieves calendar entries from a specific calendar.
538 539
  *

+ 3
- 2
react/features/chat/components/AbstractChat.js 查看文件

@@ -1,6 +1,7 @@
1 1
 // @flow
2 2
 
3 3
 import { Component } from 'react';
4
+import type { Dispatch } from 'redux';
4 5
 
5 6
 import { getLocalParticipant } from '../../base/participants';
6 7
 
@@ -41,7 +42,7 @@ export type Props = {
41 42
     /**
42 43
      * The Redux dispatch function.
43 44
      */
44
-    dispatch: Dispatch<*>,
45
+    dispatch: Dispatch<any>,
45 46
 
46 47
     /**
47 48
      * Function to be used to translate i18n labels.
@@ -64,7 +65,7 @@ export default class AbstractChat<P: Props> extends Component<P> {}
64 65
  * }}
65 66
  * @private
66 67
  */
67
-export function _mapDispatchToProps(dispatch: Dispatch<*>) {
68
+export function _mapDispatchToProps(dispatch: Dispatch<any>) {
68 69
     return {
69 70
         /**
70 71
          * Toggles the chat window.

+ 1
- 0
react/features/chat/components/native/ChatButton.js 查看文件

@@ -126,4 +126,5 @@ function _mapStateToProps(state) {
126 126
     };
127 127
 }
128 128
 
129
+// $FlowExpectedError
129 130
 export default connect(_mapStateToProps, _mapDispatchToProps)(ChatButton);

+ 1
- 0
react/features/chat/components/web/ChatCounter.js 查看文件

@@ -57,4 +57,5 @@ function _mapStateToProps(state) {
57 57
     };
58 58
 }
59 59
 
60
+// $FlowExpectedError
60 61
 export default connect(_mapStateToProps)(ChatCounter);

+ 3
- 1
react/features/chat/components/web/ChatInput.js 查看文件

@@ -3,6 +3,7 @@
3 3
 import React, { Component } from 'react';
4 4
 import { connect } from 'react-redux';
5 5
 import Emoji from 'react-emoji-render';
6
+import type { Dispatch } from 'redux';
6 7
 
7 8
 import { sendMessage } from '../../actions';
8 9
 
@@ -16,7 +17,7 @@ type Props = {
16 17
     /**
17 18
      * Invoked to send chat messages.
18 19
      */
19
-    dispatch: Dispatch<*>,
20
+    dispatch: Dispatch<any>,
20 21
 
21 22
     /**
22 23
      * Optional callback to get a reference to the chat input element.
@@ -231,4 +232,5 @@ class ChatInput extends Component<Props, State> {
231 232
     }
232 233
 }
233 234
 
235
+// $FlowExpectedError
234 236
 export default connect()(ChatInput);

+ 2
- 1
react/features/chat/components/web/DisplayNameForm.js 查看文件

@@ -3,6 +3,7 @@
3 3
 import { FieldTextStateless } from '@atlaskit/field-text';
4 4
 import React, { Component } from 'react';
5 5
 import { connect } from 'react-redux';
6
+import type { Dispatch } from 'redux';
6 7
 
7 8
 import { translate } from '../../../base/i18n';
8 9
 import { updateSettings } from '../../../base/settings';
@@ -15,7 +16,7 @@ type Props = {
15 16
     /**
16 17
      * Invoked to set the local participant display name.
17 18
      */
18
-    dispatch: Dispatch<*>,
19
+    dispatch: Dispatch<any>,
19 20
 
20 21
     /**
21 22
      * Invoked to obtain translated strings.

+ 1
- 0
react/features/conference/components/native/DisplayNameLabel.js 查看文件

@@ -76,4 +76,5 @@ function _mapStateToProps(state: Object) {
76 76
     };
77 77
 }
78 78
 
79
+// $FlowExpectedError
79 80
 export default connect(_mapStateToProps)(DisplayNameLabel);

+ 1
- 0
react/features/conference/components/native/Labels.js 查看文件

@@ -367,4 +367,5 @@ function _mapStateToProps(state) {
367 367
     };
368 368
 }
369 369
 
370
+// $FlowExpectedError
370 371
 export default connect(_mapStateToProps)(makeAspectRatioAware(Labels));

+ 1
- 0
react/features/conference/components/native/NavigationBar.js 查看文件

@@ -93,4 +93,5 @@ function _mapStateToProps(state) {
93 93
     };
94 94
 }
95 95
 
96
+// $FlowExpectedError
96 97
 export default connect(_mapStateToProps)(NavigationBar);

+ 1
- 0
react/features/conference/components/web/Conference.js 查看文件

@@ -308,4 +308,5 @@ function _mapStateToProps(state) {
308 308
     };
309 309
 }
310 310
 
311
+// $FlowExpectedError
311 312
 export default reactReduxConnect(_mapStateToProps)(translate(Conference));

+ 2
- 1
react/features/conference/components/web/Labels.js 查看文件

@@ -38,7 +38,7 @@ class Labels extends AbstractLabels<Props, State> {
38 38
      *
39 39
      * @inheritdoc
40 40
      */
41
-    static getDerivedStateFromProps(props, prevState) {
41
+    static getDerivedStateFromProps(props: Props, prevState: State) {
42 42
         return {
43 43
             filmstripBecomingVisible: !prevState.filmstripBecomingVisible
44 44
                 && props._filmstripVisible
@@ -105,4 +105,5 @@ class Labels extends AbstractLabels<Props, State> {
105 105
     _renderVideoQualityLabel: () => React$Element<*>;
106 106
 }
107 107
 
108
+// $FlowExpectedError
108 109
 export default connect(_mapStateToProps)(Labels);

+ 2
- 0
react/features/conference/components/web/Subject.js 查看文件

@@ -64,4 +64,6 @@ function _mapStateToProps(state) {
64 64
         _visible: isToolboxVisible(state)
65 65
     };
66 66
 }
67
+
68
+// $FlowExpectedError
67 69
 export default connect(_mapStateToProps)(Subject);

+ 4
- 2
react/features/deep-linking/actions.js 查看文件

@@ -1,4 +1,6 @@
1
-/* @flow */
1
+// @flow
2
+
3
+import type { Dispatch } from 'redux';
2 4
 
3 5
 import { appNavigate } from '../app';
4 6
 
@@ -10,7 +12,7 @@ import { OPEN_DESKTOP_APP, OPEN_WEB_APP } from './actionTypes';
10 12
  * @returns {Function}
11 13
  */
12 14
 export function openWebApp() {
13
-    return (dispatch: Dispatch<*>) => {
15
+    return (dispatch: Dispatch<any>) => {
14 16
         // In order to go to the web app we need to skip the deep linking
15 17
         // interceptor. OPEN_WEB_APP action should set launchInWeb to true in
16 18
         // the redux store. After this when appNavigate() is called the

+ 3
- 2
react/features/deep-linking/components/DeepLinkingDesktopPage.web.js 查看文件

@@ -1,9 +1,10 @@
1
-/* @flow */
1
+// @flow
2 2
 
3 3
 import Button, { ButtonGroup } from '@atlaskit/button';
4 4
 import { AtlasKitThemeProvider } from '@atlaskit/theme';
5 5
 import React, { Component } from 'react';
6 6
 import { connect } from 'react-redux';
7
+import type { Dispatch } from 'redux';
7 8
 
8 9
 import { createDeepLinkingPageEvent, sendAnalytics } from '../../analytics';
9 10
 import { translate } from '../../base/i18n';
@@ -25,7 +26,7 @@ declare var interfaceConfig: Object;
25 26
     /**
26 27
      * Used to dispatch actions from the buttons.
27 28
      */
28
-    dispatch: Dispatch<*>,
29
+    dispatch: Dispatch<any>,
29 30
 
30 31
     /**
31 32
      * Used to obtain translations.

+ 2
- 1
react/features/desktop-picker/components/DesktopPicker.js 查看文件

@@ -3,6 +3,7 @@
3 3
 import Tabs from '@atlaskit/tabs';
4 4
 import React, { PureComponent } from 'react';
5 5
 import { connect } from 'react-redux';
6
+import type { Dispatch } from 'redux';
6 7
 
7 8
 import { Dialog, hideDialog } from '../../base/dialog';
8 9
 import { translate } from '../../base/i18n';
@@ -54,7 +55,7 @@ type Props = {
54 55
     /**
55 56
      * Used to request DesktopCapturerSources.
56 57
      */
57
-    dispatch: Dispatch<*>,
58
+    dispatch: Dispatch<any>,
58 59
 
59 60
     /**
60 61
      * The callback to be invoked when the component is closed or when a

+ 2
- 1
react/features/display-name/components/AbstractDisplayNamePrompt.js 查看文件

@@ -1,6 +1,7 @@
1 1
 // @flow
2 2
 
3 3
 import { Component } from 'react';
4
+import type { Dispatch } from 'redux';
4 5
 
5 6
 import { updateSettings } from '../../base/settings';
6 7
 
@@ -13,7 +14,7 @@ export type Props = {
13 14
     /**
14 15
      * Invoked to update the local participant's display name.
15 16
      */
16
-    dispatch: Dispatch<*>,
17
+    dispatch: Dispatch<any>,
17 18
 
18 19
     /**
19 20
      * Function to be invoked after a successful display name change.

+ 2
- 1
react/features/display-name/components/DisplayName.web.js 查看文件

@@ -2,6 +2,7 @@
2 2
 
3 3
 import React, { Component } from 'react';
4 4
 import { connect } from 'react-redux';
5
+import type { Dispatch } from 'redux';
5 6
 
6 7
 import { appendSuffix } from '../functions';
7 8
 
@@ -29,7 +30,7 @@ type Props = {
29 30
     /**
30 31
      * Invoked to update the participant's display name.
31 32
      */
32
-    dispatch: Dispatch<*>,
33
+    dispatch: Dispatch<any>,
33 34
 
34 35
     /**
35 36
      * A string to append to the displayName, if provided.

+ 1
- 0
react/features/display-name/components/DisplayNamePrompt.native.js 查看文件

@@ -27,4 +27,5 @@ class DisplayNamePrompt extends AbstractDisplayNamePrompt<*> {
27 27
     _onSetDisplayName: string => boolean;
28 28
 }
29 29
 
30
+// $FlowExpectedError
30 31
 export default connect()(DisplayNamePrompt);

+ 3
- 1
react/features/feedback/actions.js 查看文件

@@ -1,5 +1,7 @@
1 1
 // @flow
2 2
 
3
+import type { Dispatch } from 'redux';
4
+
3 5
 import { openDialog } from '../base/dialog';
4 6
 import { FEEDBACK_REQUEST_IN_PROGRESS } from '../../../modules/UI/UIErrors';
5 7
 
@@ -46,7 +48,7 @@ export function maybeOpenFeedbackDialog(conference: Object) {
46 48
         showThankYou: boolean
47 49
     };
48 50
 
49
-    return (dispatch: Dispatch<*>, getState: Function): Promise<R> => {
51
+    return (dispatch: Dispatch<any>, getState: Function): Promise<R> => {
50 52
         const state = getState();
51 53
 
52 54
         if (interfaceConfig.filmStripOnly || config.iAmRecorder) {

+ 3
- 2
react/features/feedback/components/FeedbackDialog.web.js 查看文件

@@ -1,10 +1,11 @@
1
-/* @flow */
1
+// @flow
2 2
 
3 3
 import { FieldTextAreaStateless } from '@atlaskit/field-text-area';
4 4
 import StarIcon from '@atlaskit/icon/glyph/star';
5 5
 import StarFilledIcon from '@atlaskit/icon/glyph/star-filled';
6 6
 import React, { Component } from 'react';
7 7
 import { connect } from 'react-redux';
8
+import type { Dispatch } from 'redux';
8 9
 
9 10
 import {
10 11
     createFeedbackOpenEvent,
@@ -62,7 +63,7 @@ type Props = {
62 63
     /**
63 64
      * Invoked to signal feedback submission or canceling.
64 65
      */
65
-    dispatch: Dispatch<*>,
66
+    dispatch: Dispatch<any>,
66 67
 
67 68
     /**
68 69
      * Callback invoked when {@code FeedbackDialog} is unmounted.

+ 1
- 0
react/features/filmstrip/components/native/Filmstrip.js 查看文件

@@ -219,4 +219,5 @@ function _mapStateToProps(state) {
219 219
     };
220 220
 }
221 221
 
222
+// $FlowExpectedError
222 223
 export default connect(_mapStateToProps)(makeAspectRatioAware(Filmstrip));

+ 1
- 0
react/features/filmstrip/components/native/LocalThumbnail.js 查看文件

@@ -60,4 +60,5 @@ function _mapStateToProps(state) {
60 60
     };
61 61
 }
62 62
 
63
+// $FlowExpectedError
63 64
 export default connect(_mapStateToProps)(LocalThumbnail);

+ 3
- 1
react/features/filmstrip/components/native/Thumbnail.js 查看文件

@@ -2,6 +2,7 @@
2 2
 
3 3
 import React, { Component } from 'react';
4 4
 import { connect } from 'react-redux';
5
+import type { Dispatch } from 'redux';
5 6
 
6 7
 import { ColorSchemeRegistry } from '../../../base/color-scheme';
7 8
 import { openDialog } from '../../../base/dialog';
@@ -81,7 +82,7 @@ type Props = {
81 82
     /**
82 83
      * Invoked to trigger state changes in Redux.
83 84
      */
84
-    dispatch: Dispatch<*>,
85
+    dispatch: Dispatch<any>,
85 86
 
86 87
     /**
87 88
      * The Redux representation of the participant to display.
@@ -254,4 +255,5 @@ function _mapStateToProps(state, ownProps) {
254 255
     };
255 256
 }
256 257
 
258
+// $FlowExpectedError
257 259
 export default connect(_mapStateToProps, _mapDispatchToProps)(Thumbnail);

+ 3
- 1
react/features/filmstrip/components/native/TileView.js 查看文件

@@ -7,6 +7,7 @@ import {
7 7
     View
8 8
 } from 'react-native';
9 9
 import { connect } from 'react-redux';
10
+import type { Dispatch } from 'redux';
10 11
 
11 12
 import {
12 13
     getNearestReceiverVideoQualityLevel,
@@ -34,7 +35,7 @@ type Props = {
34 35
     /**
35 36
      * Invoked to update the receiver video quality.
36 37
      */
37
-    dispatch: Dispatch<*>,
38
+    dispatch: Dispatch<any>,
38 39
 
39 40
     /**
40 41
      * Callback to invoke when tile view is tapped.
@@ -334,4 +335,5 @@ function _mapStateToProps(state) {
334 335
     };
335 336
 }
336 337
 
338
+// $FlowExpectedError
337 339
 export default connect(_mapStateToProps)(makeAspectRatioAware(TileView));

+ 3
- 1
react/features/filmstrip/components/web/Filmstrip.js 查看文件

@@ -3,6 +3,7 @@
3 3
 import _ from 'lodash';
4 4
 import React, { Component } from 'react';
5 5
 import { connect } from 'react-redux';
6
+import type { Dispatch } from 'redux';
6 7
 
7 8
 import {
8 9
     createShortcutEvent,
@@ -53,7 +54,7 @@ type Props = {
53 54
     /**
54 55
      * The redux {@code dispatch} function.
55 56
      */
56
-    dispatch: Dispatch<*>
57
+    dispatch: Dispatch<any>
57 58
 };
58 59
 
59 60
 /**
@@ -318,4 +319,5 @@ function _mapStateToProps(state) {
318 319
     };
319 320
 }
320 321
 
322
+// $FlowExpectedError
321 323
 export default connect(_mapStateToProps)(Filmstrip);

+ 1
- 0
react/features/filmstrip/components/web/Toolbar.js 查看文件

@@ -90,4 +90,5 @@ function _mapStateToProps(state): Object { // eslint-disable-line no-unused-vars
90 90
     };
91 91
 }
92 92
 
93
+// $FlowExpectedError
93 94
 export default connect(_mapStateToProps)(Toolbar);

+ 14
- 11
react/features/google-api/actions.js 查看文件

@@ -1,4 +1,7 @@
1
-/* @flow */
1
+// @flow
2
+
3
+import type { Dispatch } from 'redux';
4
+
2 5
 import { getShareInfoText } from '../invite';
3 6
 
4 7
 import {
@@ -13,7 +16,7 @@ import googleApi from './googleApi';
13 16
  *
14 17
  * @param {number} fetchStartDays - The number of days to go back when fetching.
15 18
  * @param {number} fetchEndDays - The number of days to fetch.
16
- * @returns {function(Dispatch<*>): Promise<CalendarEntries>}
19
+ * @returns {function(Dispatch<any>): Promise<CalendarEntries>}
17 20
  */
18 21
 export function getCalendarEntries(
19 22
         fetchStartDays: ?number, fetchEndDays: ?number) {
@@ -30,7 +33,7 @@ export function getCalendarEntries(
30 33
  * @returns {Function}
31 34
  */
32 35
 export function loadGoogleAPI(clientId: string) {
33
-    return (dispatch: Dispatch<*>, getState: Function) =>
36
+    return (dispatch: Dispatch<any>, getState: Function) =>
34 37
         googleApi.get()
35 38
         .then(() => {
36 39
             if (getState()['features/google-api'].googleAPIState
@@ -146,10 +149,10 @@ export function showAccountSelection() {
146 149
 /**
147 150
  * Prompts the participant to sign in to the Google API Client Library.
148 151
  *
149
- * @returns {function(Dispatch<*>): Promise<string | never>}
152
+ * @returns {function(Dispatch<any>): Promise<string | never>}
150 153
  */
151 154
 export function signIn() {
152
-    return (dispatch: Dispatch<*>) => googleApi.get()
155
+    return (dispatch: Dispatch<any>) => googleApi.get()
153 156
             .then(() => googleApi.signInIfNotSignedIn())
154 157
             .then(() => dispatch({
155 158
                 type: SET_GOOGLE_API_STATE,
@@ -160,10 +163,10 @@ export function signIn() {
160 163
 /**
161 164
  * Logs out the user.
162 165
  *
163
- * @returns {function(Dispatch<*>): Promise<string | never>}
166
+ * @returns {function(Dispatch<any>): Promise<string | never>}
164 167
  */
165 168
 export function signOut() {
166
-    return (dispatch: Dispatch<*>) =>
169
+    return (dispatch: Dispatch<any>) =>
167 170
         googleApi.get()
168 171
             .then(() => googleApi.signOut())
169 172
             .then(() => {
@@ -181,10 +184,10 @@ export function signOut() {
181 184
 /**
182 185
  * Updates the profile data that is currently used.
183 186
  *
184
- * @returns {function(Dispatch<*>): Promise<string | never>}
187
+ * @returns {function(Dispatch<any>): Promise<string | never>}
185 188
  */
186 189
 export function updateProfile() {
187
-    return (dispatch: Dispatch<*>) => googleApi.get()
190
+    return (dispatch: Dispatch<any>) => googleApi.get()
188 191
         .then(() => googleApi.signInIfNotSignedIn())
189 192
         .then(() => dispatch({
190 193
             type: SET_GOOGLE_API_STATE,
@@ -207,11 +210,11 @@ export function updateProfile() {
207 210
  * @param {string} id - The event id to update.
208 211
  * @param {string} calendarId - The calendar id to use.
209 212
  * @param {string} location - The location to add to the event.
210
- * @returns {function(Dispatch<*>): Promise<string | never>}
213
+ * @returns {function(Dispatch<any>): Promise<string | never>}
211 214
  */
212 215
 export function updateCalendarEvent(
213 216
         id: string, calendarId: string, location: string) {
214
-    return (dispatch: Dispatch<*>, getState: Function) =>
217
+    return (dispatch: Dispatch<any>, getState: Function) =>
215 218
         getShareInfoText(getState(), location)
216 219
             .then(text =>
217 220
                 googleApi._updateCalendarEntry(id, calendarId, location, text));

+ 4
- 2
react/features/invite/actions.js 查看文件

@@ -1,5 +1,7 @@
1 1
 // @flow
2 2
 
3
+import type { Dispatch } from 'redux';
4
+
3 5
 import { getInviteURL } from '../base/connection';
4 6
 import { inviteVideoRooms } from '../videosipgw';
5 7
 import { getParticipants } from '../base/participants';
@@ -51,7 +53,7 @@ export function invite(
51 53
         invitees: Array<Object>,
52 54
         showCalleeInfo: boolean = false) {
53 55
     return (
54
-            dispatch: Dispatch<*>,
56
+            dispatch: Dispatch<any>,
55 57
             getState: Function): Promise<Array<Object>> => {
56 58
         const state = getState();
57 59
         const participants = getParticipants(state);
@@ -161,7 +163,7 @@ export function invite(
161 163
  * @returns {Function}
162 164
  */
163 165
 export function updateDialInNumbers() {
164
-    return (dispatch: Dispatch<*>, getState: Function) => {
166
+    return (dispatch: Dispatch<any>, getState: Function) => {
165 167
         const state = getState();
166 168
         const { dialInConfCodeUrl, dialInNumbersUrl, hosts }
167 169
             = state['features/base/config'];

+ 2
- 1
react/features/invite/components/InfoDialogButton.web.js 查看文件

@@ -3,6 +3,7 @@
3 3
 import InlineDialog from '@atlaskit/inline-dialog';
4 4
 import React, { Component } from 'react';
5 5
 import { connect } from 'react-redux';
6
+import type { Dispatch } from 'redux';
6 7
 
7 8
 import { createToolbarEvent, sendAnalytics } from '../../analytics';
8 9
 import { openDialog } from '../../base/dialog';
@@ -58,7 +59,7 @@ type Props = {
58 59
     /**
59 60
      * Invoked to toggle display of the info dialog.
60 61
      */
61
-    dispatch: Dispatch<*>,
62
+    dispatch: Dispatch<any>,
62 63
 
63 64
     /**
64 65
      * Whether to show the label or not.

+ 1
- 1
react/features/invite/components/InviteButton.native.js 查看文件

@@ -71,7 +71,7 @@ class InviteButton extends AbstractButton<Props, *> {
71 71
  * }}
72 72
  * @private
73 73
  */
74
-function _mapDispatchToProps(dispatch: Dispatch<*>) {
74
+function _mapDispatchToProps(dispatch: Dispatch<any>) {
75 75
     return {
76 76
 
77 77
         /**

+ 1
- 1
react/features/invite/components/add-people-dialog/AbstractAddPeopleDialog.js 查看文件

@@ -158,7 +158,7 @@ export default class AbstractAddPeopleDialog<P: Props, S: State>
158 158
             || this.state.addToCallInProgress;
159 159
     }
160 160
 
161
-    _query: (string) => Promise<Array<Object>>;
161
+    _query: (?string) => Promise<Array<Object>>;
162 162
 
163 163
     /**
164 164
      * Performs a people and phone number search request.

+ 9
- 7
react/features/invite/components/add-people-dialog/native/AddPeopleDialog.js 查看文件

@@ -268,9 +268,11 @@ class AddPeopleDialog extends AbstractAddPeopleDialog<Props, State> {
268 268
                 });
269 269
             } else {
270 270
                 // Item is not selected yet, need to add to the list.
271
+                const items: Array<*> = inviteItems.concat(item);
272
+
271 273
                 this.setState({
272
-                    inviteItems: _.orderBy(
273
-                        inviteItems.concat(item), [ 'name' ], [ 'asc' ])
274
+                    // $FlowExpectedError
275
+                    inviteItems: _.orderBy(items, [ 'name' ], [ 'asc' ])
274 276
                 });
275 277
             }
276 278
         };
@@ -320,10 +322,10 @@ class AddPeopleDialog extends AbstractAddPeopleDialog<Props, State> {
320 322
                 }
321 323
             });
322 324
 
323
-            selectableItems
324
-                = _.orderBy(
325
-                    this.state.inviteItems.concat(selectableItems),
326
-                    [ 'name' ], [ 'asc' ]);
325
+            const items = this.state.inviteItems.concat(selectableItems);
326
+
327
+            // $FlowExpectedError
328
+            selectableItems = _.orderBy(items, [ 'name' ], [ 'asc' ]);
327 329
 
328 330
             this.setState({
329 331
                 selectableItems
@@ -402,7 +404,7 @@ class AddPeopleDialog extends AbstractAddPeopleDialog<Props, State> {
402 404
         );
403 405
     }
404 406
 
405
-    _renderSeparator: () => ?React$Element<*>
407
+    _renderSeparator: () => React$Element<*> | null
406 408
 
407 409
     /**
408 410
      * Renders the item separator.

+ 3
- 2
react/features/invite/components/add-people-dialog/web/AddPeopleDialog.js 查看文件

@@ -4,6 +4,7 @@ import Avatar from '@atlaskit/avatar';
4 4
 import InlineMessage from '@atlaskit/inline-message';
5 5
 import React from 'react';
6 6
 import { connect } from 'react-redux';
7
+import type { Dispatch } from 'redux';
7 8
 
8 9
 import { createInviteDialogEvent, sendAnalytics } from '../../../../analytics';
9 10
 import { Dialog, hideDialog } from '../../../../base/dialog';
@@ -38,7 +39,7 @@ type Props = AbstractProps & {
38 39
     /**
39 40
      * The redux {@code dispatch} function.
40 41
      */
41
-    dispatch: Dispatch<*>,
42
+    dispatch: Dispatch<any>,
42 43
 
43 44
     /**
44 45
      * Invoked to obtain translated strings.
@@ -267,7 +268,7 @@ class AddPeopleDialog extends AbstractAddPeopleDialog<Props, State> {
267 268
             });
268 269
     }
269 270
 
270
-    _parseQueryResults: (Array<Object>, string) => Array<Object>;
271
+    _parseQueryResults: (?Array<Object>) => Array<Object>;
271 272
 
272 273
     /**
273 274
      * Processes results from requesting available numbers and people by munging

+ 1
- 0
react/features/invite/components/callee-info/CalleeInfo.js 查看文件

@@ -158,4 +158,5 @@ function _mapStateToProps(state) {
158 158
     };
159 159
 }
160 160
 
161
+// $FlowExpectedError
161 162
 export default connect(_mapStateToProps)(CalleeInfo);

+ 1
- 0
react/features/invite/components/callee-info/CalleeInfoContainer.js 查看文件

@@ -61,4 +61,5 @@ function _mapStateToProps(state: Object): Object {
61 61
     };
62 62
 }
63 63
 
64
+// $FlowExpectedError
64 65
 export default connect(_mapStateToProps)(CalleeInfoContainer);

+ 2
- 1
react/features/invite/components/info-dialog/InfoDialog.web.js 查看文件

@@ -2,6 +2,7 @@
2 2
 
3 3
 import React, { Component } from 'react';
4 4
 import { connect } from 'react-redux';
5
+import type { Dispatch } from 'redux';
5 6
 
6 7
 import { setPassword } from '../../../base/conference';
7 8
 import { getInviteURL } from '../../../base/connection';
@@ -65,7 +66,7 @@ type Props = {
65 66
     /**
66 67
      * Invoked to open a dialog for adding participants to the conference.
67 68
      */
68
-    dispatch: Dispatch<*>,
69
+    dispatch: Dispatch<any>,
69 70
 
70 71
     /**
71 72
      * Whether is Atlaskit InlineDialog or a normal dialog.

+ 4
- 2
react/features/large-video/actions.js 查看文件

@@ -1,5 +1,7 @@
1 1
 // @flow
2 2
 
3
+import type { Dispatch } from 'redux';
4
+
3 5
 import {
4 6
     createSelectParticipantFailedEvent,
5 7
     sendAnalytics
@@ -23,7 +25,7 @@ declare var APP: Object;
23 25
  * @returns {Function}
24 26
  */
25 27
 export function selectParticipant() {
26
-    return (dispatch: Dispatch<*>, getState: Function) => {
28
+    return (dispatch: Dispatch<any>, getState: Function) => {
27 29
         const state = getState();
28 30
         const { conference } = state['features/base/conference'];
29 31
 
@@ -54,7 +56,7 @@ export function selectParticipant() {
54 56
  * @returns {Function}
55 57
  */
56 58
 export function selectParticipantInLargeVideo() {
57
-    return (dispatch: Dispatch<*>, getState: Function) => {
59
+    return (dispatch: Dispatch<any>, getState: Function) => {
58 60
         const state = getState();
59 61
         const participantId = _electParticipantInLargeVideo(state);
60 62
         const largeVideo = state['features/large-video'];

+ 2
- 1
react/features/large-video/components/LargeVideo.native.js 查看文件

@@ -72,7 +72,7 @@ class LargeVideo extends Component<Props, State> {
72 72
      * @param {Object} props - The read-only properties with which the new
73 73
      * instance is to be initialized.
74 74
      */
75
-    constructor(props) {
75
+    constructor(props: Props) {
76 76
         super(props);
77 77
 
78 78
         // Bind event handlers so they are only bound once per instance.
@@ -159,4 +159,5 @@ function _mapStateToProps(state) {
159 159
     };
160 160
 }
161 161
 
162
+// $FlowExpectedError
162 163
 export default connect(_mapStateToProps)(LargeVideo);

+ 3
- 2
react/features/local-recording/components/LocalRecordingInfoDialog.js 查看文件

@@ -1,8 +1,9 @@
1
-/* @flow */
1
+// @flow
2 2
 
3 3
 import moment from 'moment';
4 4
 import React, { Component } from 'react';
5 5
 import { connect } from 'react-redux';
6
+import type { Dispatch } from 'redux';
6 7
 
7 8
 import { Dialog } from '../../base/dialog';
8 9
 import { translate } from '../../base/i18n';
@@ -24,7 +25,7 @@ type Props = {
24 25
     /**
25 26
      * Redux store dispatch function.
26 27
      */
27
-    dispatch: Dispatch<*>,
28
+    dispatch: Dispatch<any>,
28 29
 
29 30
     /**
30 31
      * Current encoding format.

+ 3
- 3
react/features/local-recording/recording/flac/flacEncodeWorker.js 查看文件

@@ -69,17 +69,17 @@ const EncoderState = Object.freeze({
69 69
     /**
70 70
      * Initial state, when libflac.js is not initialized.
71 71
      */
72
-    UNINTIALIZED: Symbol('uninitialized'),
72
+    UNINTIALIZED: 'uninitialized',
73 73
 
74 74
     /**
75 75
      * Actively encoding new audio bits.
76 76
      */
77
-    WORKING: Symbol('working'),
77
+    WORKING: 'working',
78 78
 
79 79
     /**
80 80
      * Encoding has finished and encoded bits are available.
81 81
      */
82
-    FINISHED: Symbol('finished')
82
+    FINISHED: 'finished'
83 83
 });
84 84
 
85 85
 /**

+ 4
- 2
react/features/mobile/background/actions.js 查看文件

@@ -1,4 +1,6 @@
1
-/* @flow */
1
+// @flow
2
+
3
+import type { Dispatch } from 'redux';
2 4
 
3 5
 import {
4 6
     createTrackMutedEvent,
@@ -37,7 +39,7 @@ export function _setAppStateListener(listener: ?Function) {
37 39
  * @returns {Function}
38 40
  */
39 41
 export function _setBackgroundVideoMuted(muted: boolean) {
40
-    return (dispatch: Dispatch<*>, getState: Function) => {
42
+    return (dispatch: Dispatch<any>, getState: Function) => {
41 43
         // Disable remote video when we mute by setting lastN to 0. Skip it if
42 44
         // the conference is in audio-only mode, as it's already configured to
43 45
         // have no video. Leave it as undefined when unmuting, the default value

+ 1
- 1
react/features/mobile/background/middleware.js 查看文件

@@ -91,7 +91,7 @@ function _appStateChanged(dispatch: Function, appState: string) {
91 91
  * @private
92 92
  * @returns {void}
93 93
  */
94
-function _onAppStateChange(dispatch: Dispatch<*>, appState: string) {
94
+function _onAppStateChange(dispatch: Dispatch<any>, appState: string) {
95 95
     dispatch(appStateChanged(appState));
96 96
 }
97 97
 

+ 2
- 1
react/features/mobile/network-activity/components/NetworkActivityIndicator.js 查看文件

@@ -1,4 +1,4 @@
1
-/* @flow */
1
+// @flow
2 2
 
3 3
 import React, { Component } from 'react';
4 4
 import { connect } from 'react-redux';
@@ -52,4 +52,5 @@ function _mapStateToProps(state) {
52 52
     };
53 53
 }
54 54
 
55
+// $FlowExpectedError
55 56
 export default connect(_mapStateToProps)(NetworkActivityIndicator);

+ 2
- 1
react/features/mobile/picture-in-picture/actions.js 查看文件

@@ -1,6 +1,7 @@
1 1
 // @flow
2 2
 
3 3
 import { NativeModules } from 'react-native';
4
+import type { Dispatch } from 'redux';
4 5
 
5 6
 import { getAppProp } from '../../base/app';
6 7
 import { Platform } from '../../base/react';
@@ -20,7 +21,7 @@ const logger = require('jitsi-meet-logger').getLogger(__filename);
20 21
  * @returns {Function}
21 22
  */
22 23
 export function enterPictureInPicture() {
23
-    return (dispatch: Dispatch, getState: Function) => {
24
+    return (dispatch: Dispatch<any>, getState: Function) => {
24 25
         // XXX At the time of this writing this action can only be dispatched by
25 26
         // the button which is on the conference view, which means that it's
26 27
         // fine to enter PiP mode.

+ 1
- 0
react/features/notifications/components/NotificationsContainer.web.js 查看文件

@@ -63,4 +63,5 @@ class NotificationsContainer extends AbstractNotificationsContainer<Props> {
63 63
     }
64 64
 }
65 65
 
66
+// $FlowExpectedError
66 67
 export default connect(_mapStateToProps)(NotificationsContainer);

+ 0
- 0
react/features/overlay/components/AbstractPageReloadOverlay.js 查看文件


部分文件因文件數量過多而無法顯示

Loading…
取消
儲存