import Component from '@ember/component'; import { assert } from '@ember/debug'; import { CommentTypes } from 'wherehows-web/constants'; import { StringUnionKeyToValue } from 'wherehows-web/typings/generic'; import { DatasetStreamActionsUnion } from 'wherehows-web/constants'; import noop from 'wherehows-web/utils/noop'; const StreamActions: StringUnionKeyToValue = { add: 'add', modify: 'modify', destroy: 'destroy' }; export default Component.extend({ classNames: ['dataset-comments'], /** * Mapping of available dataset stream action * @type {StringUnionKeyToValue} */ streamActions: StreamActions, /** * Comments on the parent dataset * @type Array */ comments: [], /** * List of available comment types * @type ReadonlyArray */ commentTypes: CommentTypes, /** * Default no-op function to add a dataset comment * @type {Function} */ addDatasetComment: noop, /** * Default no-op function to delete a dataset comment * @type {Function} */ deleteDatasetComment: noop, /** * Default no-op function to update a dataset comment * @type {Function} */ updateDatasetComment: noop, actions: { /** * Handles the action for adding | modifying | destroying a dataset comment * invokes handler passed in from parent: controller * @return {Promise} */ handleStreamAction(strategy: DatasetStreamActionsUnion): Promise { const [, ...args] = [...Array.from(arguments)]; // assert that handler is in CommentAction needed since we are calling from component template // TS currently has no jurisdiction there assert(`Expected action to be one of ${Object.keys(StreamActions)}`, strategy in StreamActions); return { add: (): Promise => this.addDatasetComment(...args), destroy: (): Promise => this.deleteDatasetComment(...args), modify: (): Promise => this.updateDatasetComment(...args) }[strategy](); } } });