From 98ca95749cb19f410f85feb929876ece18017724 Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Wed, 6 Feb 2019 17:40:10 -0500 Subject: [PATCH] Add local dir --- js/Disposable.ts | 16 ++++++++++++++++ js/actionCreators/milkdrop.ts | 6 ++++++ js/components/MilkdropWindow/PresetOverlay.tsx | 10 ++++++++++ 3 files changed, 32 insertions(+) diff --git a/js/Disposable.ts b/js/Disposable.ts index 9defcd1b..79b96a69 100644 --- a/js/Disposable.ts +++ b/js/Disposable.ts @@ -2,12 +2,27 @@ type Teardown = (() => void) | { dispose: () => void }; export default class Disposable { _teardowns: Teardown[] = []; + disposed: boolean; + + constructor() { + this.disposed = false; + } add(...teardowns: Teardown[]): void { + if (this.disposed) { + throw new Error( + "Attempted to add a new teardown to a disposed disposable." + ); + } this._teardowns.push(...teardowns); } dispose() { + if (this.disposed) { + throw new Error( + "Attempted to dispose disposable which is already disposed." + ); + } this._teardowns.forEach(teardown => { if (typeof teardown === "function") { teardown(); @@ -15,5 +30,6 @@ export default class Disposable { teardown.dispose(); } }); + this.disposed = true; } } diff --git a/js/actionCreators/milkdrop.ts b/js/actionCreators/milkdrop.ts index c23746a8..0cd84065 100644 --- a/js/actionCreators/milkdrop.ts +++ b/js/actionCreators/milkdrop.ts @@ -42,6 +42,12 @@ export function initializePresets(presetOptions: any): Dispatchable { }; } +export function appendPresetFileList(presets: FileList[]): Dispatchable { + return async dispatch => { + dispatch({ type: GOT_BUTTERCHURN_PRESETS, presets }); + }; +} + export function selectNextPreset(): Dispatchable { return (dispatch, getState) => { const state = getState(); diff --git a/js/components/MilkdropWindow/PresetOverlay.tsx b/js/components/MilkdropWindow/PresetOverlay.tsx index ba5e957a..acb9c872 100644 --- a/js/components/MilkdropWindow/PresetOverlay.tsx +++ b/js/components/MilkdropWindow/PresetOverlay.tsx @@ -161,6 +161,16 @@ class PresetOverlay extends React.Component { } }; + async loadLocalDir() { + const fileReferences = await promptForFileReferences({ directory: true }); + if (this._disposable.disposed) { + return; + } + // TODO: Technically there is a race condition here, since the component + // could get unmounted before the promise resolves. + this.props.loadPresets(fileReferences); + } + render() { const { height, width } = this.props; if (this.props.presetKeys == null) {