1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-11-19 20:31:46 +02:00

Added no-floating-promises eslint rule

This commit is contained in:
Laurent Cozic 2020-11-25 14:40:25 +00:00
parent a37f84e988
commit 9b64c1fbdb
45 changed files with 116 additions and 104 deletions

View File

@ -126,6 +126,10 @@ module.exports = {
{ {
// enable the rule specifically for TypeScript files // enable the rule specifically for TypeScript files
'files': ['*.ts', '*.tsx'], 'files': ['*.ts', '*.tsx'],
'parserOptions': {
// Required for @typescript-eslint/no-floating-promises
'project': './tsconfig.eslint.json',
},
'rules': { 'rules': {
// Warn only because it would make it difficult to convert JS classes to TypeScript, unless we // Warn only because it would make it difficult to convert JS classes to TypeScript, unless we
// make everything public which is not great. New code however should specify member accessibility. // make everything public which is not great. New code however should specify member accessibility.
@ -152,6 +156,7 @@ module.exports = {
'requireLast': false, 'requireLast': false,
}, },
}], }],
'@typescript-eslint/no-floating-promises': ['error'],
}, },
}, },
], ],

View File

@ -156,7 +156,7 @@ export default class InteropServiceHelper {
if (Array.isArray(path)) path = path[0]; if (Array.isArray(path)) path = path[0];
CommandService.instance().execute('showModalMessage', _('Exporting to "%s" as "%s" format. Please wait...', path, module.format)); void CommandService.instance().execute('showModalMessage', _('Exporting to "%s" as "%s" format. Please wait...', path, module.format));
const exportOptions: ExportOptions = {}; const exportOptions: ExportOptions = {};
exportOptions.path = path; exportOptions.path = path;
@ -177,7 +177,7 @@ export default class InteropServiceHelper {
bridge().showErrorMessageBox(_('Could not export notes: %s', error.message)); bridge().showErrorMessageBox(_('Could not export notes: %s', error.message));
} }
CommandService.instance().execute('hideModalMessage'); void CommandService.instance().execute('hideModalMessage');
} }
} }

View File

@ -424,7 +424,7 @@ class Application extends BaseApplication {
const contextMenu = Menu.buildFromTemplate([ const contextMenu = Menu.buildFromTemplate([
{ label: _('Open %s', app.electronApp().name), click: () => { app.window().show(); } }, { label: _('Open %s', app.electronApp().name), click: () => { app.window().show(); } },
{ type: 'separator' }, { type: 'separator' },
{ label: _('Quit'), click: () => { app.quit(); } }, { label: _('Quit'), click: () => { void app.quit(); } },
]); ]);
app.createTray(contextMenu); app.createTray(contextMenu);
} }
@ -664,7 +664,7 @@ class Application extends BaseApplication {
this.updateTray(); this.updateTray();
shim.setTimeout(() => { shim.setTimeout(() => {
AlarmService.garbageCollect(); void AlarmService.garbageCollect();
}, 1000 * 60 * 60); }, 1000 * 60 * 60);
if (Setting.value('startMinimized') && Setting.value('showTrayIcon')) { if (Setting.value('startMinimized') && Setting.value('showTrayIcon')) {
@ -676,12 +676,12 @@ class Application extends BaseApplication {
ResourceService.runInBackground(); ResourceService.runInBackground();
if (Setting.value('env') === 'dev') { if (Setting.value('env') === 'dev') {
AlarmService.updateAllNotifications(); void AlarmService.updateAllNotifications();
} else { } else {
reg.scheduleSync(1000).then(() => { reg.scheduleSync(1000).then(() => {
// Wait for the first sync before updating the notifications, since synchronisation // Wait for the first sync before updating the notifications, since synchronisation
// might change the notifications. // might change the notifications.
AlarmService.updateAllNotifications(); void AlarmService.updateAllNotifications();
DecryptionWorker.instance().scheduleStart(); DecryptionWorker.instance().scheduleStart();
}); });

View File

@ -11,7 +11,7 @@ export const declaration: CommandDeclaration = {
export const runtime = (): CommandRuntime => { export const runtime = (): CommandRuntime => {
return { return {
execute: async () => { execute: async () => {
bridge().openItem(Setting.value('profileDir')); void bridge().openItem(Setting.value('profileDir'));
}, },
}; };
}; };

View File

@ -18,7 +18,7 @@ export const runtime = (): CommandRuntime => {
try { try {
const note = await Note.load(noteId); const note = await Note.load(noteId);
ExternalEditWatcher.instance().openAndWatch(note); void ExternalEditWatcher.instance().openAndWatch(note);
} catch (error) { } catch (error) {
bridge().showErrorMessageBox(_('Error opening note in editor: %s', error.message)); bridge().showErrorMessageBox(_('Error opening note in editor: %s', error.message));
} }

View File

@ -13,7 +13,7 @@ export const runtime = (): CommandRuntime => {
return { return {
execute: async (context: CommandContext, noteId: string = null) => { execute: async (context: CommandContext, noteId: string = null) => {
noteId = noteId || stateUtils.selectedNoteId(context.state); noteId = noteId || stateUtils.selectedNoteId(context.state);
ExternalEditWatcher.instance().stopWatching(noteId); void ExternalEditWatcher.instance().stopWatching(noteId);
}, },
enabledCondition: 'oneNoteSelected', enabledCondition: 'oneNoteSelected',
}; };

View File

@ -17,9 +17,9 @@ export const runtime = (): CommandRuntime => {
if (!noteId) return; if (!noteId) return;
if (context.state.watchedNoteFiles.includes(noteId)) { if (context.state.watchedNoteFiles.includes(noteId)) {
CommandService.instance().execute('stopExternalEditing', noteId); void CommandService.instance().execute('stopExternalEditing', noteId);
} else { } else {
CommandService.instance().execute('startExternalEditing', noteId); void CommandService.instance().execute('startExternalEditing', noteId);
} }
}, },
enabledCondition: 'oneNoteSelected', enabledCondition: 'oneNoteSelected',

View File

@ -696,7 +696,7 @@ class ConfigScreenComponent extends React.Component<any, any> {
const needRestartComp: any = this.state.needRestart ? ( const needRestartComp: any = this.state.needRestart ? (
<div style={{ ...theme.textStyle, padding: 10, paddingLeft: 24, backgroundColor: theme.warningBackgroundColor, color: theme.color }}> <div style={{ ...theme.textStyle, padding: 10, paddingLeft: 24, backgroundColor: theme.warningBackgroundColor, color: theme.color }}>
{this.restartMessage()} {this.restartMessage()}
<a style={{ ...theme.urlStyle, marginLeft: 10 }} href="#" onClick={() => { this.restartApp(); }}>{_('Restart now')}</a> <a style={{ ...theme.urlStyle, marginLeft: 10 }} href="#" onClick={() => { void this.restartApp(); }}>{_('Restart now')}</a>
</div> </div>
) : null; ) : null;

View File

@ -86,7 +86,7 @@ const useKeymap = (): [
} }
} }
saveKeymap(); void saveKeymap();
}, [keymapItems, mustSave]); }, [keymapItems, mustSave]);
return [keymapItems, keymapError, overrideKeymapItems, setAccelerator, resetAccelerator]; return [keymapItems, keymapError, overrideKeymapItems, setAccelerator, resetAccelerator];

View File

@ -330,7 +330,7 @@ class MainScreenComponent extends React.Component<Props, State> {
layoutModeListenerKeyDown(event: any) { layoutModeListenerKeyDown(event: any) {
if (event.key !== 'Escape') return; if (event.key !== 'Escape') return;
if (!this.props.layoutMoveMode) return; if (!this.props.layoutMoveMode) return;
CommandService.instance().execute('toggleLayoutMoveMode'); void CommandService.instance().execute('toggleLayoutMoveMode');
} }
componentDidMount() { componentDidMount() {

View File

@ -18,9 +18,9 @@ export const runtime = (comp: any): CommandRuntime => {
onClose: async (answer: any) => { onClose: async (answer: any) => {
if (answer) { if (answer) {
if (noteType === 'note' || noteType === 'todo') { if (noteType === 'note' || noteType === 'todo') {
CommandService.instance().execute('newNote', answer.value, noteType === 'todo'); void CommandService.instance().execute('newNote', answer.value, noteType === 'todo');
} else { } else {
CommandService.instance().execute('insertText', TemplateUtils.render(answer.value)); void CommandService.instance().execute('insertText', TemplateUtils.render(answer.value));
} }
} }

View File

@ -18,7 +18,7 @@ export const runtime = (comp: any): CommandRuntime => {
noteId: noteId, noteId: noteId,
visible: true, visible: true,
onRevisionLinkClick: () => { onRevisionLinkClick: () => {
CommandService.instance().execute('showRevisions'); void CommandService.instance().execute('showRevisions');
}, },
}, },
}); });

View File

@ -112,7 +112,7 @@ function useMenu(props: Props) {
const [modulesLastChangeTime, setModulesLastChangeTime] = useState(Date.now()); const [modulesLastChangeTime, setModulesLastChangeTime] = useState(Date.now());
const onMenuItemClick = useCallback((commandName: string) => { const onMenuItemClick = useCallback((commandName: string) => {
CommandService.instance().execute(commandName); void CommandService.instance().execute(commandName);
}, []); }, []);
const onImportModuleClick = useCallback(async (module: Module, moduleSource: string) => { const onImportModuleClick = useCallback(async (module: Module, moduleSource: string) => {
@ -134,7 +134,7 @@ function useMenu(props: Props) {
const modalMessage = _('Importing from "%s" as "%s" format. Please wait...', path, module.format); const modalMessage = _('Importing from "%s" as "%s" format. Please wait...', path, module.format);
CommandService.instance().execute('showModalMessage', modalMessage); void CommandService.instance().execute('showModalMessage', modalMessage);
const importOptions = { const importOptions = {
path, path,
@ -145,7 +145,7 @@ function useMenu(props: Props) {
return `${key}: ${status[key]}`; return `${key}: ${status[key]}`;
}); });
CommandService.instance().execute('showModalMessage', `${modalMessage}\n\n${statusStrings.join('\n')}`); void CommandService.instance().execute('showModalMessage', `${modalMessage}\n\n${statusStrings.join('\n')}`);
}, },
onError: console.warn, onError: console.warn,
destinationFolderId: !module.isNoteArchive && moduleSource === 'file' ? props.selectedFolderId : null, destinationFolderId: !module.isNoteArchive && moduleSource === 'file' ? props.selectedFolderId : null,
@ -159,7 +159,7 @@ function useMenu(props: Props) {
bridge().showErrorMessageBox(error.message); bridge().showErrorMessageBox(error.message);
} }
CommandService.instance().execute('hideModalMessage'); void CommandService.instance().execute('hideModalMessage');
}, [props.selectedFolderId]); }, [props.selectedFolderId]);
const onMenuItemClickRef = useRef(null); const onMenuItemClickRef = useRef(null);
@ -177,7 +177,7 @@ function useMenu(props: Props) {
const quitMenuItem = { const quitMenuItem = {
label: _('Quit'), label: _('Quit'),
accelerator: keymapService.getAccelerator('quit'), accelerator: keymapService.getAccelerator('quit'),
click: () => { bridge().electronApp().quit(); }, click: () => { void bridge().electronApp().quit(); },
}; };
const sortNoteFolderItems = (type: string) => { const sortNoteFolderItems = (type: string) => {
@ -284,23 +284,23 @@ function useMenu(props: Props) {
templateItems.push({ templateItems.push({
label: _('Create note from template'), label: _('Create note from template'),
click: () => { click: () => {
CommandService.instance().execute('selectTemplate', 'note'); void CommandService.instance().execute('selectTemplate', 'note');
}, },
}, { }, {
label: _('Create to-do from template'), label: _('Create to-do from template'),
click: () => { click: () => {
CommandService.instance().execute('selectTemplate', 'todo'); void CommandService.instance().execute('selectTemplate', 'todo');
}, },
}, { }, {
label: _('Insert template'), label: _('Insert template'),
accelerator: keymapService.getAccelerator('insertTemplate'), accelerator: keymapService.getAccelerator('insertTemplate'),
click: () => { click: () => {
CommandService.instance().execute('selectTemplate'); void CommandService.instance().execute('selectTemplate');
}, },
}, { }, {
label: _('Open template directory'), label: _('Open template directory'),
click: () => { click: () => {
bridge().openItem(Setting.value('templateDir')); void bridge().openItem(Setting.value('templateDir'));
}, },
}, { }, {
label: _('Refresh templates'), label: _('Refresh templates'),

View File

@ -323,7 +323,7 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
} }
} }
loadScripts(); void loadScripts();
return () => { return () => {
cancelled = true; cancelled = true;
@ -630,7 +630,7 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
editorPasteText(); editorPasteText();
} else { } else {
// To handle pasting images // To handle pasting images
onEditorPaste(); void onEditorPaste();
} }
}, },
}) })

View File

@ -5,7 +5,7 @@ import shim from '@joplin/lib/shim';
export default function useKeymap(CodeMirror: any) { export default function useKeymap(CodeMirror: any) {
function save() { function save() {
CommandService.instance().execute('synchronize'); void CommandService.instance().execute('synchronize');
} }
function setupEmacs() { function setupEmacs() {

View File

@ -371,7 +371,7 @@ const TinyMCE = (props: NoteBodyEditorProps, ref: any) => {
setScriptLoaded(true); setScriptLoaded(true);
} }
loadScripts(); void loadScripts();
return () => { return () => {
cancelled = true; cancelled = true;
@ -661,7 +661,7 @@ const TinyMCE = (props: NoteBodyEditorProps, ref: any) => {
tooltip: _('Insert Date Time'), tooltip: _('Insert Date Time'),
icon: 'insert-time', icon: 'insert-time',
onAction: function() { onAction: function() {
CommandService.instance().execute('insertDateTime'); void CommandService.instance().execute('insertDateTime');
}, },
}); });
@ -670,7 +670,7 @@ const TinyMCE = (props: NoteBodyEditorProps, ref: any) => {
tooltip: CommandService.instance().label(pluginCommandName), tooltip: CommandService.instance().label(pluginCommandName),
icon: CommandService.instance().iconName(pluginCommandName, 'tinymce'), icon: CommandService.instance().iconName(pluginCommandName, 'tinymce'),
onAction: function() { onAction: function() {
CommandService.instance().execute(pluginCommandName); void CommandService.instance().execute(pluginCommandName);
}, },
}); });
} }
@ -708,7 +708,7 @@ const TinyMCE = (props: NoteBodyEditorProps, ref: any) => {
setEditor(editors[0]); setEditor(editors[0]);
}; };
loadEditor(); void loadEditor();
}, [scriptLoaded]); }, [scriptLoaded]);
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
@ -832,7 +832,7 @@ const TinyMCE = (props: NoteBodyEditorProps, ref: any) => {
dispatchDidUpdate(editor); dispatchDidUpdate(editor);
}; };
loadContent(); void loadContent();
return () => { return () => {
cancelled = true; cancelled = true;
@ -914,7 +914,7 @@ const TinyMCE = (props: NoteBodyEditorProps, ref: any) => {
// the note. // the note.
useEffect(() => { useEffect(() => {
return () => { return () => {
execOnChangeEvent(); void execOnChangeEvent();
}; };
}, []); }, []);
@ -942,7 +942,7 @@ const TinyMCE = (props: NoteBodyEditorProps, ref: any) => {
onChangeHandlerTimeoutRef.current = shim.setTimeout(async () => { onChangeHandlerTimeoutRef.current = shim.setTimeout(async () => {
onChangeHandlerTimeoutRef.current = null; onChangeHandlerTimeoutRef.current = null;
execOnChangeEvent(); void execOnChangeEvent();
}, 1000); }, 1000);
} }

View File

@ -113,7 +113,7 @@ function NoteEditor(props: NoteEditorProps) {
return { ...prev, user_updated_time: savedNote.user_updated_time }; return { ...prev, user_updated_time: savedNote.user_updated_time };
}); });
ExternalEditWatcher.instance().updateNoteFile(savedNote); void ExternalEditWatcher.instance().updateNoteFile(savedNote);
props.dispatch({ props.dispatch({
type: 'EDITOR_NOTE_STATUS_REMOVE', type: 'EDITOR_NOTE_STATUS_REMOVE',
@ -141,7 +141,7 @@ function NoteEditor(props: NoteEditorProps) {
} }
async function saveNoteAndWait(formNote: FormNote) { async function saveNoteAndWait(formNote: FormNote) {
saveNoteIfWillChange(formNote); await saveNoteIfWillChange(formNote);
return formNote.saveActionQueue.waitForAllDone(); return formNote.saveActionQueue.waitForAllDone();
} }
@ -184,7 +184,7 @@ function NoteEditor(props: NoteEditorProps) {
value: props.selectedNoteHash ? props.selectedNoteHash : props.lastEditorScrollPercents[props.noteId] || 0, value: props.selectedNoteHash ? props.selectedNoteHash : props.lastEditorScrollPercents[props.noteId] || 0,
}); });
ResourceEditWatcher.instance().stopWatchingAll(); void ResourceEditWatcher.instance().stopWatchingAll();
}, [formNote.id, previousNoteId]); }, [formNote.id, previousNoteId]);
const onFieldChange = useCallback((field: string, value: any, changeId = 0) => { const onFieldChange = useCallback((field: string, value: any, changeId = 0) => {
@ -365,7 +365,7 @@ function NoteEditor(props: NoteEditorProps) {
function renderTagBar() { function renderTagBar() {
const theme = themeStyle(props.themeId); const theme = themeStyle(props.themeId);
const noteIds = [formNote.id]; const noteIds = [formNote.id];
const instructions = <span onClick={() => { CommandService.instance().execute('setTags', noteIds); }} style={{ ...theme.clickableTextStyle, whiteSpace: 'nowrap' }}>Click to add tags...</span>; const instructions = <span onClick={() => { void CommandService.instance().execute('setTags', noteIds); }} style={{ ...theme.clickableTextStyle, whiteSpace: 'nowrap' }}>Click to add tags...</span>;
const tagList = props.selectedNoteTags.length ? <TagList items={props.selectedNoteTags} /> : null; const tagList = props.selectedNoteTags.length ? <TagList items={props.selectedNoteTags} /> : null;
return ( return (

View File

@ -82,9 +82,9 @@ export default function NoteTitleBar(props: Props) {
event.preventDefault(); event.preventDefault();
if (event.shiftKey) { if (event.shiftKey) {
CommandService.instance().execute('focusElement', 'noteList'); void CommandService.instance().execute('focusElement', 'noteList');
} else { } else {
CommandService.instance().execute('focusElement', 'noteBody'); void CommandService.instance().execute('focusElement', 'noteBody');
} }
} }
}, []); }, []);

View File

@ -18,7 +18,7 @@ export default function(dependencies: HookDependencies) {
setFolder(f); setFolder(f);
} }
loadFolder(); void loadFolder();
return function() { return function() {
cancelled = true; cancelled = true;

View File

@ -133,7 +133,7 @@ export default function useFormNote(dependencies: HookDependencies) {
await initNoteState(n); await initNoteState(n);
}; };
loadNote(); void loadNote();
return () => { return () => {
cancelled = true; cancelled = true;
@ -183,7 +183,7 @@ export default function useFormNote(dependencies: HookDependencies) {
handleAutoFocus(!!n.is_todo); handleAutoFocus(!!n.is_todo);
} }
loadNote(); void loadNote();
return () => { return () => {
cancelled = true; cancelled = true;
@ -207,7 +207,7 @@ export default function useFormNote(dependencies: HookDependencies) {
useEffect(() => { useEffect(() => {
if (previousNoteId !== formNote.id) { if (previousNoteId !== formNote.id) {
onResourceChange(); void onResourceChange();
} }
}, [previousNoteId, formNote.id, onResourceChange]); }, [previousNoteId, formNote.id, onResourceChange]);
@ -222,7 +222,7 @@ export default function useFormNote(dependencies: HookDependencies) {
}); });
} }
runEffect(); void runEffect();
return () => { return () => {
cancelled = true; cancelled = true;

View File

@ -389,9 +389,9 @@ class NoteListComponent extends React.Component {
event.preventDefault(); event.preventDefault();
if (event.shiftKey) { if (event.shiftKey) {
CommandService.instance().execute('focusElement', 'sideBar'); void CommandService.instance().execute('focusElement', 'sideBar');
} else { } else {
CommandService.instance().execute('focusElement', 'noteTitle'); void CommandService.instance().execute('focusElement', 'noteTitle');
} }
} }

View File

@ -41,11 +41,11 @@ export default function NoteListControls(props: Props) {
}, []); }, []);
function onNewTodoButtonClick() { function onNewTodoButtonClick() {
CommandService.instance().execute('newTodo'); void CommandService.instance().execute('newTodo');
} }
function onNewNoteButtonClick() { function onNewNoteButtonClick() {
CommandService.instance().execute('newNote'); void CommandService.instance().execute('newNote');
} }
function renderNewNoteButtons() { function renderNewNoteButtons() {

View File

@ -161,7 +161,7 @@ class ResourceScreenComponent extends React.Component<Props, State> {
} }
componentDidMount() { componentDidMount() {
this.reloadResources(this.state.sorting); void this.reloadResources(this.state.sorting);
} }
onResourceDelete(resource: InnerResource) { onResourceDelete(resource: InnerResource) {
@ -177,7 +177,7 @@ class ResourceScreenComponent extends React.Component<Props, State> {
bridge().showErrorMessageBox(error.message); bridge().showErrorMessageBox(error.message);
}) })
.finally(() => { .finally(() => {
this.reloadResources(this.state.sorting); void this.reloadResources(this.state.sorting);
}); });
} }
@ -200,7 +200,7 @@ class ResourceScreenComponent extends React.Component<Props, State> {
}; };
} }
this.setState({ sorting: newSorting }); this.setState({ sorting: newSorting });
this.reloadResources(newSorting); void this.reloadResources(newSorting);
} }
render() { render() {

View File

@ -103,17 +103,17 @@ function SearchBar(props: Props) {
const onKeyDown = useCallback((event: any) => { const onKeyDown = useCallback((event: any) => {
if (event.key === 'Escape') { if (event.key === 'Escape') {
if (document.activeElement) (document.activeElement as any).blur(); if (document.activeElement) (document.activeElement as any).blur();
onExitSearch(); void onExitSearch();
} }
}, [onExitSearch]); }, [onExitSearch]);
const onSearchButtonClick = useCallback(() => { const onSearchButtonClick = useCallback(() => {
onExitSearch(); void onExitSearch();
}, [onExitSearch]); }, [onExitSearch]);
useEffect(() => { useEffect(() => {
if (props.notesParentType !== 'Search') { if (props.notesParentType !== 'Search') {
onExitSearch(false); void onExitSearch(false);
} }
}, [props.notesParentType, onExitSearch]); }, [props.notesParentType, onExitSearch]);

View File

@ -79,7 +79,7 @@ export default function ShareNoteDialog(props: ShareNoteDialogProps) {
setNotes(result); setNotes(result);
} }
fetchNotes(); void fetchNotes();
}, [props.noteIds]); }, [props.noteIds]);
const appApi = async () => { const appApi = async () => {

View File

@ -510,9 +510,9 @@ class SideBarComponent extends React.Component<Props, State> {
event.preventDefault(); event.preventDefault();
if (event.shiftKey) { if (event.shiftKey) {
CommandService.instance().execute('focusElement', 'noteBody'); void CommandService.instance().execute('focusElement', 'noteBody');
} else { } else {
CommandService.instance().execute('focusElement', 'noteList'); void CommandService.instance().execute('focusElement', 'noteList');
} }
} }
@ -559,14 +559,14 @@ class SideBarComponent extends React.Component<Props, State> {
iconAnimation={iconAnimation} iconAnimation={iconAnimation}
title={label} title={label}
onClick={() => { onClick={() => {
CommandService.instance().execute('synchronize', type !== 'sync'); void CommandService.instance().execute('synchronize', type !== 'sync');
}} }}
/> />
); );
} }
onAddFolderButtonClick() { onAddFolderButtonClick() {
CommandService.instance().execute('newFolder'); void CommandService.instance().execute('newFolder');
} }
// componentDidUpdate(prevProps:any, prevState:any) { // componentDidUpdate(prevProps:any, prevState:any) {

View File

@ -41,7 +41,7 @@ function StatusScreen(props: Props) {
} }
useEffect(() => { useEffect(() => {
resfreshScreen(); void resfreshScreen();
}, []); }, []);
const theme = themeStyle(props.themeId); const theme = themeStyle(props.themeId);
@ -91,7 +91,7 @@ function StatusScreen(props: Props) {
if (item.canRetry) { if (item.canRetry) {
const onClick = async () => { const onClick = async () => {
await item.retryHandler(); await item.retryHandler();
resfreshScreen(); void resfreshScreen();
}; };
retryLink = ( retryLink = (

View File

@ -381,7 +381,7 @@ class Dialog extends React.PureComponent<Props, State> {
}); });
if (item.type === BaseModel.TYPE_COMMAND) { if (item.type === BaseModel.TYPE_COMMAND) {
CommandService.instance().execute(item.id); void CommandService.instance().execute(item.id);
return; return;
} }
@ -423,7 +423,7 @@ class Dialog extends React.PureComponent<Props, State> {
const parentId = event.currentTarget.getAttribute('data-parent-id'); const parentId = event.currentTarget.getAttribute('data-parent-id');
const itemType = Number(event.currentTarget.getAttribute('data-type')); const itemType = Number(event.currentTarget.getAttribute('data-type'));
this.gotoItem({ void this.gotoItem({
id: itemId, id: itemId,
parent_id: parentId, parent_id: parentId,
type: itemType, type: itemType,
@ -496,7 +496,7 @@ class Dialog extends React.PureComponent<Props, State> {
const item = this.selectedItem(); const item = this.selectedItem();
if (!item) return; if (!item) return;
this.gotoItem(item); void this.gotoItem(item);
} }
} }

View File

@ -49,7 +49,7 @@ export default function useThemeCss(dep: HookDependencies) {
setCssFilePath(filePath); setCssFilePath(filePath);
} }
createThemeStyleSheet(); void createThemeStyleSheet();
return () => { return () => {
cancelled = true; cancelled = true;

View File

@ -186,7 +186,7 @@ export default function useSource(noteBody: string, noteMarkupLanguage: number,
setSource(undefined); setSource(undefined);
setInjectedJs([]); setInjectedJs([]);
} else { } else {
renderNote(); void renderNote();
} }
return () => { return () => {

View File

@ -259,11 +259,11 @@ class NoteScreenComponent extends BaseScreenComponent {
} }
screenHeader_undoButtonPress() { screenHeader_undoButtonPress() {
this.undoRedo('undo'); void this.undoRedo('undo');
} }
screenHeader_redoButtonPress() { screenHeader_redoButtonPress() {
this.undoRedo('redo'); void this.undoRedo('redo');
} }
styles() { styles() {
@ -404,7 +404,7 @@ class NoteScreenComponent extends BaseScreenComponent {
// Although it is async, we don't wait for the answer so that if permission // Although it is async, we don't wait for the answer so that if permission
// has already been granted, it doesn't slow down opening the note. If it hasn't // has already been granted, it doesn't slow down opening the note. If it hasn't
// been granted, the popup will open anyway. // been granted, the popup will open anyway.
this.requestGeoLocationPermissions(); void this.requestGeoLocationPermissions();
} }
onMarkForDownload(event: any) { onMarkForDownload(event: any) {
@ -703,7 +703,7 @@ class NoteScreenComponent extends BaseScreenComponent {
} }
cameraView_onPhoto(data: any) { cameraView_onPhoto(data: any) {
this.attachFile( void this.attachFile(
{ {
uri: data.uri, uri: data.uri,
didCancel: false, didCancel: false,
@ -810,14 +810,14 @@ class NoteScreenComponent extends BaseScreenComponent {
output.push({ output.push({
title: _('View on map'), title: _('View on map'),
onPress: () => { onPress: () => {
this.showOnMap_onPress(); void this.showOnMap_onPress();
}, },
}); });
if (note.source_url) { if (note.source_url) {
output.push({ output.push({
title: _('Go to source URL'), title: _('Go to source URL'),
onPress: () => { onPress: () => {
this.showSource_onPress(); void this.showSource_onPress();
}, },
}); });
} }
@ -866,8 +866,8 @@ class NoteScreenComponent extends BaseScreenComponent {
const buttonId = await dialogs.pop(this, _('Choose an option'), buttons); const buttonId = await dialogs.pop(this, _('Choose an option'), buttons);
if (buttonId === 'takePhoto') this.takePhoto_onPress(); if (buttonId === 'takePhoto') this.takePhoto_onPress();
if (buttonId === 'attachFile') this.attachFile_onPress(); if (buttonId === 'attachFile') void this.attachFile_onPress();
if (buttonId === 'attachPhoto') this.attachPhoto_onPress(); if (buttonId === 'attachPhoto') void this.attachPhoto_onPress();
}, },
}); });
} }
@ -884,7 +884,7 @@ class NoteScreenComponent extends BaseScreenComponent {
output.push({ output.push({
title: _('Share'), title: _('Share'),
onPress: () => { onPress: () => {
this.share_onPress(); void this.share_onPress();
}, },
}); });
if (isSaved) { if (isSaved) {
@ -918,7 +918,7 @@ class NoteScreenComponent extends BaseScreenComponent {
output.push({ output.push({
title: _('Delete'), title: _('Delete'),
onPress: () => { onPress: () => {
this.deleteNote_onPress(); void this.deleteNote_onPress();
}, },
}); });
@ -1010,7 +1010,7 @@ class NoteScreenComponent extends BaseScreenComponent {
} }
onBodyViewerCheckboxChange(newBody: string) { onBodyViewerCheckboxChange(newBody: string) {
this.saveOneProperty('body', newBody); void this.saveOneProperty('body', newBody);
} }
render() { render() {

View File

@ -54,7 +54,7 @@ export default class AsyncActionQueue {
this.scheduleProcessingIID_ = shim.setTimeout(() => { this.scheduleProcessingIID_ = shim.setTimeout(() => {
this.scheduleProcessingIID_ = null; this.scheduleProcessingIID_ = null;
this.processQueue(); void this.processQueue();
}, interval); }, interval);
} }

View File

@ -354,7 +354,7 @@ export default class Synchronizer {
this.lockHandler().startAutoLockRefresh(syncLock, (error: any) => { this.lockHandler().startAutoLockRefresh(syncLock, (error: any) => {
this.logger().warn('Could not refresh lock - cancelling sync. Error was:', error); this.logger().warn('Could not refresh lock - cancelling sync. Error was:', error);
this.syncTargetIsLocked_ = true; this.syncTargetIsLocked_ = true;
this.cancel(); void this.cancel();
}); });
// ======================================================================== // ========================================================================

View File

@ -37,13 +37,13 @@ export default class AlarmServiceDriverNode {
return id in this.notifications_; return id in this.notifications_;
} }
async clearNotification(id: number) { clearNotification(id: number) {
if (!this.notificationIsSet(id)) return; if (!this.notificationIsSet(id)) return;
shim.clearTimeout(this.notifications_[id].timeoutId); shim.clearTimeout(this.notifications_[id].timeoutId);
delete this.notifications_[id]; delete this.notifications_[id];
} }
async scheduleNotification(notification: Notification) { scheduleNotification(notification: Notification) {
const now = Date.now(); const now = Date.now();
const interval = notification.date.getTime() - now; const interval = notification.date.getTime() - now;
if (interval < 0) return; if (interval < 0) return;

View File

@ -232,7 +232,7 @@ export default class CommandService extends BaseService {
public scheduleExecute(commandName: string, args: any) { public scheduleExecute(commandName: string, args: any) {
shim.setTimeout(() => { shim.setTimeout(() => {
this.execute(commandName, args); void this.execute(commandName, args);
}, 10); }, 10);
} }

View File

@ -100,7 +100,7 @@ export default class ExternalEditWatcher {
if (!note) { if (!note) {
this.logger().warn(`ExternalEditWatcher: Watched note has been deleted: ${id}`); this.logger().warn(`ExternalEditWatcher: Watched note has been deleted: ${id}`);
this.stopWatching(id); void this.stopWatching(id);
return; return;
} }
@ -339,7 +339,7 @@ export default class ExternalEditWatcher {
// avoid update loops. We only want to listen to file changes made by the user. // avoid update loops. We only want to listen to file changes made by the user.
this.skipNextChangeEvent_[note.id] = true; this.skipNextChangeEvent_[note.id] = true;
this.writeNoteToFile_(note); await this.writeNoteToFile_(note);
} }
async writeNoteToFile_(note: NoteEntity) { async writeNoteToFile_(note: NoteEntity) {

View File

@ -157,7 +157,7 @@ export default class ResourceEditWatcher {
if (!this.watcher_) { if (!this.watcher_) {
this.watcher_ = this.chokidar_.watch(fileToWatch); this.watcher_ = this.chokidar_.watch(fileToWatch);
this.watcher_.on('all', async (event: any, path: string) => { this.watcher_.on('all', (event: any, path: string) => {
path = toSystemSlashes(path, 'linux'); path = toSystemSlashes(path, 'linux');
this.logger().info(`ResourceEditWatcher: Event: ${event}: ${path}`); this.logger().info(`ResourceEditWatcher: Event: ${event}: ${path}`);
@ -170,7 +170,7 @@ export default class ResourceEditWatcher {
// See: https://github.com/laurent22/joplin/issues/710#issuecomment-420997167 // See: https://github.com/laurent22/joplin/issues/710#issuecomment-420997167
// this.watcher_.unwatch(path); // this.watcher_.unwatch(path);
} else if (event === 'change') { } else if (event === 'change') {
handleChangeEvent(path); void handleChangeEvent(path);
} else if (event === 'error') { } else if (event === 'error') {
this.logger().error('ResourceEditWatcher: error'); this.logger().error('ResourceEditWatcher: error');
} }
@ -185,14 +185,14 @@ export default class ResourceEditWatcher {
// https://github.com/laurent22/joplin/issues/3407 // https://github.com/laurent22/joplin/issues/3407
// //
// @ts-ignore Leave unused path variable // @ts-ignore Leave unused path variable
this.watcher_.on('raw', async (event: string, path: string, options: any) => { this.watcher_.on('raw', (event: string, path: string, options: any) => {
const watchedPath = toSystemSlashes(options.watchedPath, 'linux'); const watchedPath = toSystemSlashes(options.watchedPath, 'linux');
this.logger().debug(`ResourceEditWatcher: Raw event: ${event}: ${watchedPath}`); this.logger().debug(`ResourceEditWatcher: Raw event: ${event}: ${watchedPath}`);
if (event === 'rename') { if (event === 'rename') {
this.watcher_.unwatch(watchedPath); this.watcher_.unwatch(watchedPath);
this.watcher_.add(watchedPath); this.watcher_.add(watchedPath);
handleChangeEvent(watchedPath); void handleChangeEvent(watchedPath);
} }
}); });
} else { } else {

View File

@ -154,11 +154,11 @@ export default class ResourceService extends BaseService {
const service = this.instance(); const service = this.instance();
service.maintenanceTimer1_ = shim.setTimeout(() => { service.maintenanceTimer1_ = shim.setTimeout(() => {
service.maintenance(); void service.maintenance();
}, 1000 * 30); }, 1000 * 30);
service.maintenanceTimer2_ = shim.setInterval(() => { service.maintenanceTimer2_ = shim.setInterval(() => {
service.maintenance(); void service.maintenance();
}, 1000 * 60 * 60 * 4); }, 1000 * 60 * 60 * 4);
} }

View File

@ -52,8 +52,8 @@ export default class ToolbarButtonUtils {
tooltip: this.service.label(commandName), tooltip: this.service.label(commandName),
iconName: command.declaration.iconName, iconName: command.declaration.iconName,
enabled: newEnabled, enabled: newEnabled,
onClick: async () => { onClick: () => {
this.service.execute(commandName); void this.service.execute(commandName);
}, },
title: newTitle, title: newTitle,
}; };

View File

@ -27,7 +27,7 @@ export default class InteropService_Importer_Md extends InteropService_Importer_
parentFolderId = this.options_.destinationFolder.id; parentFolderId = this.options_.destinationFolder.id;
} }
this.importDirectory(sourcePath, parentFolderId); await this.importDirectory(sourcePath, parentFolderId);
} else { } else {
if (!this.options_.destinationFolder) throw new Error(_('Please specify the notebook where the notes should be imported to.')); if (!this.options_.destinationFolder) throw new Error(_('Please specify the notebook where the notes should be imported to.'));
parentFolderId = this.options_.destinationFolder.id; parentFolderId = this.options_.destinationFolder.id;
@ -52,9 +52,9 @@ export default class InteropService_Importer_Md extends InteropService_Importer_
if (stat.isDirectory()) { if (stat.isDirectory()) {
const folderTitle = await Folder.findUniqueItemTitle(basename(stat.path)); const folderTitle = await Folder.findUniqueItemTitle(basename(stat.path));
const folder = await Folder.save({ title: folderTitle, parent_id: parentFolderId }); const folder = await Folder.save({ title: folderTitle, parent_id: parentFolderId });
this.importDirectory(`${dirPath}/${basename(stat.path)}`, folder.id); await this.importDirectory(`${dirPath}/${basename(stat.path)}`, folder.id);
} else if (supportedFileExtension.indexOf(fileExtension(stat.path).toLowerCase()) >= 0) { } else if (supportedFileExtension.indexOf(fileExtension(stat.path).toLowerCase()) >= 0) {
this.importFile(`${dirPath}/${stat.path}`, parentFolderId); await this.importFile(`${dirPath}/${stat.path}`, parentFolderId);
} }
} }
} }

View File

@ -103,7 +103,7 @@ export default class WebviewController extends ViewController {
}); });
} }
public async close() { public close() {
this.setStoreProp('opened', false); this.setStoreProp('opened', false);
} }

View File

@ -36,7 +36,7 @@ export default class JoplinPlugins {
// We don't use `await` when calling onStart because the plugin might be awaiting // We don't use `await` when calling onStart because the plugin might be awaiting
// in that call too (for example, when opening a dialog on startup) so we don't // in that call too (for example, when opening a dialog on startup) so we don't
// want to get stuck here. // want to get stuck here.
script.onStart({}).catch((error: any) => { void script.onStart({}).catch((error: any) => {
// For some reason, error thrown from the executed script do not have the type "Error" // For some reason, error thrown from the executed script do not have the type "Error"
// but are instead plain object. So recreate the Error object here so that it can // but are instead plain object. So recreate the Error object here so that it can
// be handled correctly by loggers, etc. // be handled correctly by loggers, etc.

View File

@ -66,7 +66,7 @@ export default class SpellCheckerService {
public setLanguage(language: string) { public setLanguage(language: string) {
Setting.setValue('spellChecker.language', language); Setting.setValue('spellChecker.language', language);
this.applyStateToDriver(); this.applyStateToDriver();
this.addLatestSelectedLanguage(language); void this.addLatestSelectedLanguage(language);
} }
public get language(): string { public get language(): string {
@ -98,7 +98,7 @@ export default class SpellCheckerService {
output.push({ output.push({
label: suggestion, label: suggestion,
click: () => { click: () => {
CommandService.instance().execute('replaceSelection', suggestion); void CommandService.instance().execute('replaceSelection', suggestion);
}, },
}); });
} }
@ -115,7 +115,7 @@ export default class SpellCheckerService {
output.push({ output.push({
label: _('Add to dictionary'), label: _('Add to dictionary'),
click: () => { click: () => {
this.addToDictionary(this.language, misspelledWord); void this.addToDictionary(this.language, misspelledWord);
}, },
}); });

View File

@ -51,7 +51,7 @@ export default function useSyncTargetUpgrade(): SyncTargetUpgradeResult {
} }
useEffect(function() { useEffect(function() {
upgradeSyncTarget(); void upgradeSyncTarget();
}, []); }, []);
return upgradeResult; return upgradeResult;

7
tsconfig.eslint.json Normal file
View File

@ -0,0 +1,7 @@
{
"extends": "./tsconfig.json",
"include": [
"**/*.ts",
"**/*.tsx",
],
}