import * as types from 'app/types' import { store } from 'app/store' import actions from 'app/actions' // import { session } from 'app/session' import throttle from 'lodash.throttle' import debounce from 'lodash.debounce' import { api } from 'app/utils' import { URLS } from 'app/constants' import { ZOOM_STEPS } from 'app/constants' import { timestampToSeconds, post } from 'app/utils' import { cutFirstSentence } from 'app/utils/align.utils' import { annotationFadeTimings } from 'app/utils/annotation.utils' /* scrolling the view */ export const setScrollPosition = start_ts => dispatch => ( dispatch({ type: types.align.set_display_setting, key: 'start_ts', value: start_ts }) ) export const setZoom = zoom => dispatch => { if (0 <= zoom && zoom < ZOOM_STEPS.length) { dispatch({ type: types.align.set_display_setting, key: 'zoom', value: zoom }) } } export const throttledSetZoom = throttle(zoom => dispatch => { setZoom(zoom)(dispatch) }, 250, { leading: true }) /* cursor */ export const setCursor = cursor_ts => dispatch => ( dispatch({ type: types.align.set_display_setting, key: 'cursor_ts', value: cursor_ts }) ) export const setCursorRegion = (a_ts, b_ts) => dispatch => ( dispatch({ type: types.align.set_display_setting, key: 'cursor_region', value: { a_ts, b_ts } }) ) export const clearCursorRegion = () => dispatch => ( dispatch({ type: types.align.set_display_setting, key: 'cursor_region', value: null }) ) /* selecting annotations in the list */ export const setSelectedAnnotation = annotation => dispatch => { debouncedUpdateAnnotation.flush() dispatch({ type: types.align.set_selected_annotation, data: annotation }) } export const clearSelectedAnnotation = () => dispatch => { debouncedUpdateAnnotation.flush() dispatch({ type: types.align.clear_selected_annotation }) } export const updateSelectedAnnotation = annotation => dispatch => { debouncedUpdateAnnotation(annotation) dispatch({ type: types.align.set_selected_annotation, data: { ...annotation } }) } export const debouncedUpdateAnnotation = debounce(annotation => { console.log('updating annotation', annotation) actions.annotation.update(annotation) }, 2000, { leading: false, trailing: true }) export const cloneSelectedAnnotation = annotation => dispatch => { const newAnnotation = { ...annotation } delete newAnnotation.id if (annotation.settings.fullscreen) { const { fadeInDuration, fadeOutDuration, duration, start_ts, end_ts, fade_in_end_ts, fade_out_start_ts, } = annotationFadeTimings(annotation) newAnnotation.start_ts += duration - fadeOutDuration - fadeInDuration } else { newAnnotation.start_ts += 1 } actions.annotation.create(newAnnotation) .then(res => { console.log('cloned annotation', res.res) setSelectedParagraph(res.res) }) } /* paragraph management */ export const setSelectedParagraph = paragraph_id => dispatch => { dispatch({ type: types.align.set_display_setting, key: 'selected_paragraph_id', value: paragraph_id }) } export const clearSelectedParagraph = () => dispatch => { dispatch({ type: types.align.set_display_setting, key: 'selected_paragraph_id', value: -1 }) } /* annotation form - show / hide / update */ export const showNewAnnotationForm = (start_ts, text) => dispatch => { const state = store.getState() let croppedText = state.align.annotation.start_ts ? state.align.annotation.text : cutFirstSentence(text) // console.log(croppedText) dispatch({ type: types.align.set_temporary_annotation, data: { id: 'new', episode_id: state.site.episode.id, start_ts, end_ts: 0.0, text: croppedText, type: 'sentence', settings: {}, } }) } export const showEditAnnotationForm = (annotation) => dispatch => { dispatch({ type: types.align.set_temporary_annotation, data: annotation, }) } export const updateAnnotationForm = (key, value) => dispatch => { dispatch({ type: types.align.update_temporary_annotation, key, value }) } export const updateAnnotationSettings = (key, value) => dispatch => { dispatch({ type: types.align.update_temporary_annotation_settings, key, value }) } export const hideAnnotationForm = () => dispatch => { dispatch({ type: types.align.set_temporary_annotation, data: {} }) } /* insert / removing time */ export const spliceTime = start_ts => dispatch => { const state = store.getState() let duration = timestampToSeconds(prompt("How many seconds to add or remove? Enter a positive / negative number")) if (!duration) { return } console.log(start_ts, duration) const data = { start_ts, duration, episode_id: state.site.episode.id, } post(dispatch, types.api, 'splice', '/api/v1/annotation/splice', data) .then(res => { console.log(res) alert(res.count + ' records updated!') actions.annotation.index() }) } /* peaks */ export const loadPeaks = (episode) => dispatch => ( episode.settings.peaks ? api(dispatch, types.peaks, 'peaks', episode.settings.peaks.url) : null ) /* longform text */ // export const loadText = (episode) => dispatch => ( // api(dispatch, types.text, 'text', URLS.text) // ) export const updateText = text => dispatch => ( dispatch({ type: types.text.loaded, data: text }) )