diff --git a/.eslintrc.yaml b/.eslintrc.yaml index d599b582c61..68bddf372e0 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -68,6 +68,18 @@ rules: no-plusplus: off no-nested-ternary: off + # We prefer `let foo = undefined;` over `let foo;`, not vice versa. + # + # Sadly there doesn't seem to be a rule to say what we want, but at least + # turn off the one that says the opposite. + # + # This rule is dubious to begin with, because explicit is better than + # implicit. Then for us, the overriding reason we definitely don't + # want it is that plain `let foo;` can trigger a Flow bug: + # https://github.com/facebook/flow/issues/8526 + # while `let foo = undefined;` makes Flow handle the logic smoothly. + no-undef-init: off + # Allow multiple classes per file. # # It's best to have just one class per file, but there are cases diff --git a/src/caughtup/caughtUpReducer.js b/src/caughtup/caughtUpReducer.js index 762ed435c8a..0f0df076c6c 100644 --- a/src/caughtup/caughtUpReducer.js +++ b/src/caughtup/caughtUpReducer.js @@ -90,7 +90,7 @@ export default (state: CaughtUpState = initialState, action: Action): CaughtUpSt return state; } const key = JSON.stringify(action.narrow); - let caughtUp; + let caughtUp = undefined; if (action.foundNewest !== undefined && action.foundOldest !== undefined) { /* This should always be the case for Zulip Server v1.8 or newer. */ caughtUp = { older: action.foundOldest, newer: action.foundNewest }; diff --git a/src/compose/ComposeMenu.js b/src/compose/ComposeMenu.js index dcc9109100c..c9eec8a0ea7 100644 --- a/src/compose/ComposeMenu.js +++ b/src/compose/ComposeMenu.js @@ -123,7 +123,7 @@ class ComposeMenu extends PureComponent { // from this library when in the test environment. const DocumentPicker = (await import('react-native-document-picker')).default; - let response; + let response = undefined; try { response = (await DocumentPicker.pick({ type: [DocumentPicker.types.allFiles], diff --git a/src/message/renderMessages.js b/src/message/renderMessages.js index f8b764411ca..bffe8157497 100644 --- a/src/message/renderMessages.js +++ b/src/message/renderMessages.js @@ -10,7 +10,6 @@ export default ( ): RenderedSectionDescriptor[] => { const showHeader = !isPrivateOrGroupNarrow(narrow) && !isTopicNarrow(narrow); - // eslint-disable-next-line no-undef-init let prevItem = undefined; const sections = [{ key: 0, data: [], message: {} }]; messages.forEach(item => { diff --git a/src/webview/js/generatedEs3.js b/src/webview/js/generatedEs3.js index 8184cccb96b..712dcad8e21 100644 --- a/src/webview/js/generatedEs3.js +++ b/src/webview/js/generatedEs3.js @@ -545,7 +545,7 @@ var compiledWebviewJs = (function (exports) { var scrollEventsDisabled = true; var hasLongPressed = false; - var longPressTimeout; + var longPressTimeout = undefined; var lastTouchPositionX = -1; var lastTouchPositionY = -1; diff --git a/src/webview/js/js.js b/src/webview/js/js.js index 1ee630f893b..fee0b6f43e6 100644 --- a/src/webview/js/js.js +++ b/src/webview/js/js.js @@ -431,7 +431,7 @@ const sendScrollMessageIfListShort = () => { let scrollEventsDisabled = true; let hasLongPressed = false; -let longPressTimeout; +let longPressTimeout = undefined; let lastTouchPositionX = -1; let lastTouchPositionY = -1;