UNPKG

@woleet/woleet-widgetv2

Version:

Woleet web widgets V2

176 lines (151 loc) 6.31 kB
import ConfigurationService from 'Common/services/configurator'; import VirtualDOMService from 'Common/services/virtual-dom'; import EventObserver from 'Common/patterns/event-observer'; import utils from 'Common/services/utils'; import styleCodes from './style-codes'; import styles from './index.scss'; import DropContainer from 'FileHasherWidget/components/drop-container'; import DownloadContainer from 'FileHasherWidget/components/download-container'; import PreviewContainer from 'FileHasherWidget/components/preview-container'; /** * Define a class of the widget */ class FileHasherWidget { constructor(configuration) { this.widgetId = configuration.widgetId; this.configurator = new ConfigurationService(); this.configuration = configuration; this.provenFileConfiguration = configuration.file; this.observers = {}; this.element = null; this.previewContainer = null; this.configurator.init(configuration); this.initializeObservers(); this.initializeExternalObservers(configuration); this.init(); } /** * Initialize the widget observers */ initializeObservers() { this.observers = { // Events: widget widgetResetObserver: new EventObserver(), // Events: modes downloadModeInitiatedObserver: new EventObserver(), uploadModeInitiatedObserver: new EventObserver(), // Events: file downloading downloadingProgressObserver: new EventObserver(), downloadingStartedObserver: new EventObserver(), downloadingFinishedObserver: new EventObserver(), downloadingCanceledObserver: new EventObserver(), downloadingFailedObserver: new EventObserver(), // Events: file hashing fileSelectedObserver: new EventObserver(), hashingProgressObserver: new EventObserver(), hashingStartedObserver: new EventObserver(), hashingFinishedObserver: new EventObserver(), hashingCanceledObserver: new EventObserver(), // Events: errors errorCaughtObserver: new EventObserver() }; // Reinitialize the widget if hashing process was canceled this.observers.hashingCanceledObserver.subscribe(() => { this.observers.uploadModeInitiatedObserver.broadcast(); }); // Reinitialize the widget if reset button was clicked this.observers.widgetResetObserver.subscribe(() => { this.observers.uploadModeInitiatedObserver.broadcast(); }); // If downloading is failed, raise an error this.observers.downloadingFailedObserver.subscribe((error) => { this.observers.errorCaughtObserver.broadcast(error); }); } /** * Link all external events * @param configuration */ initializeExternalObservers(configuration) { const self = this; if (configuration.observers) { const observerNames = Object.keys(configuration.observers); observerNames.forEach(observerName => { const observer = configuration.observers[observerName]; switch (observerName.toLowerCase()) { case 'downloadingstarted': this.observers.downloadingStartedObserver.subscribe((filename) => observer(self.widgetId, filename)); break; case 'downloadingcanceled': this.observers.downloadingCanceledObserver.subscribe(() => observer(self.widgetId)); break; case 'downloadingprogress': this.observers.downloadingProgressObserver.subscribe((progress) => observer(self.widgetId, progress)); break; case 'downloadingfinished': this.observers.downloadingFinishedObserver.subscribe(file => observer(self.widgetId, file)); this.observers.fileSelectedObserver.subscribe(file => observer(self.widgetId, file)); break; case 'downloadingfailed': this.observers.downloadingFailedObserver.subscribe((error, code, message) => observer(self.widgetId, error, code, message)); break; case 'hashingfinished': this.observers.hashingFinishedObserver.subscribe(({ hash, file }) => observer(self.widgetId, hash, file)); break; case 'hashingstarted': this.observers.hashingStartedObserver.subscribe((file, isPreviewable) => observer(self.widgetId, file, isPreviewable)); break; case 'hashingprogress': this.observers.hashingProgressObserver.subscribe((progress) => observer(self.widgetId, progress)); break; case 'hashingcanceled': this.observers.hashingCanceledObserver.subscribe(() => observer(self.widgetId)); break; case 'widgetreset': this.observers.widgetResetObserver.subscribe(() => observer(self.widgetId)); break; case 'errorcaught': this.observers.errorCaughtObserver.subscribe((error) => observer(self.widgetId, error)); break; default: break; } }); } } /** * Create and initialize all container elements */ init() { this.element = VirtualDOMService.createElement('div', { classes: utils.extractClasses(styles, styleCodes.code), hidden: utils.extractClasses(styles, styleCodes.widget.hidden), disabled: utils.extractClasses(styles, styleCodes.widget.disabled) }); // Container to drop and select user files this.element.dropContainer = (new DropContainer(this)).get(); // Container to preview all allowed files this.previewContainer = new PreviewContainer(this); this.element.previewContainer = this.previewContainer.get(); // Container to download file if it was listed in the configuration if (!!(this.provenFileConfiguration.url)) { this.element.downloadContainer = (new DownloadContainer(this)).get(); } // If the proven file was set, initialize the download mode if (!!(this.provenFileConfiguration.url)) { this.observers.downloadModeInitiatedObserver.broadcast(this.provenFileConfiguration); } this.element.attr('id', this.widgetId); } reset() { this.previewContainer.resetFile(); this.observers.widgetResetObserver.broadcast(); } render() { return this.element.render(); } } export default FileHasherWidget;