From 28bdef87320412776ff0db071f8ab89a51834cac Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Thu, 23 Jul 2020 19:18:31 +0200 Subject: arrows and tmp volume icon --- animism-align/frontend/app/constants.js | 5 ++ animism-align/frontend/app/types.js | 2 +- .../components/player/playButton.component.js | 12 +-- .../frontend/app/views/audio/audio.actions.js | 8 ++ .../frontend/app/views/audio/audio.reducer.js | 6 ++ .../frontend/app/views/viewer/nav/viewer.icons.js | 97 ++++++++++++++++++++++ .../frontend/app/views/viewer/nav/viewer.nav.js | 20 ++++- .../viewer/transcript/transcript.container.js | 5 +- .../app/views/viewer/transcript/transcript.css | 15 +++- .../frontend/app/views/viewer/viewer.container.js | 6 +- .../frontend/app/views/viewer/viewer.nav.css | 93 +++++++++++++++++++++ 11 files changed, 251 insertions(+), 18 deletions(-) create mode 100644 animism-align/frontend/app/views/viewer/nav/viewer.icons.js (limited to 'animism-align/frontend') diff --git a/animism-align/frontend/app/constants.js b/animism-align/frontend/app/constants.js index cf504d3..9643b5f 100644 --- a/animism-align/frontend/app/constants.js +++ b/animism-align/frontend/app/constants.js @@ -32,3 +32,8 @@ export const ZOOM_TICK_STEPS = [ export const HEADER_MARGIN = 50 export const INNER_HEIGHT = window.innerHeight - HEADER_MARGIN + +export const ROMAN_NUMERALS = [ + 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', + 'XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI', 'XVII', 'XVIII', 'XIX', 'XX', +] \ No newline at end of file diff --git a/animism-align/frontend/app/types.js b/animism-align/frontend/app/types.js index 7e4b9f1..296b3fd 100644 --- a/animism-align/frontend/app/types.js +++ b/animism-align/frontend/app/types.js @@ -19,7 +19,7 @@ export const align = crud_type('align', [ ]) export const audio = with_type('audio', [ - 'play', 'pause', 'update_time', + 'play', 'pause', 'update_time', 'toggle_muted', ]) export const viewer = with_type('viewer', [ diff --git a/animism-align/frontend/app/views/align/components/player/playButton.component.js b/animism-align/frontend/app/views/align/components/player/playButton.component.js index c6a8487..03603ce 100644 --- a/animism-align/frontend/app/views/align/components/player/playButton.component.js +++ b/animism-align/frontend/app/views/align/components/player/playButton.component.js @@ -1,13 +1,7 @@ import React, { Component } from 'react' -// import { Link } from 'react-router-dom' -import { bindActionCreators } from 'redux' import { connect } from 'react-redux' import actions from 'app/actions' -// import * as alignActions from '../align.actions' - -import { ZOOM_STEPS } from 'app/constants' -import { clamp } from 'app/utils' const PlayButton = ({ audio }) => { return ( @@ -24,8 +18,4 @@ const mapStateToProps = state => ({ audio: state.audio, }) -const mapDispatchToProps = dispatch => ({ - // alignActions: bindActionCreators({ ...alignActions }, dispatch), -}) - -export default connect(mapStateToProps, mapDispatchToProps)(PlayButton) +export default connect(mapStateToProps)(PlayButton) diff --git a/animism-align/frontend/app/views/audio/audio.actions.js b/animism-align/frontend/app/views/audio/audio.actions.js index bd256a4..c12f7ee 100644 --- a/animism-align/frontend/app/views/audio/audio.actions.js +++ b/animism-align/frontend/app/views/audio/audio.actions.js @@ -38,3 +38,11 @@ export const toggle = () => dispatch => { play()(dispatch) } } +export const toggleMuted = () => dispatch => { + if (store.getState().audio.muted) { + audioPlayer.muted = false + } else { + audioPlayer.muted = true + } + dispatch({ type: types.audio.toggle_muted }) +} diff --git a/animism-align/frontend/app/views/audio/audio.reducer.js b/animism-align/frontend/app/views/audio/audio.reducer.js index 6149ca6..09ce6ce 100644 --- a/animism-align/frontend/app/views/audio/audio.reducer.js +++ b/animism-align/frontend/app/views/audio/audio.reducer.js @@ -4,6 +4,7 @@ import { session, getDefault, getDefaultInt } from 'app/session' const initialState = { playing: false, play_ts: 0, + muted: false, } export default function alignReducer(state = initialState, action) { @@ -24,6 +25,11 @@ export default function alignReducer(state = initialState, action) { ...state, play_ts: action.play_ts, } + case types.audio.toggle_muted: + return { + ...state, + muted: !state.muted, + } default: return state } diff --git a/animism-align/frontend/app/views/viewer/nav/viewer.icons.js b/animism-align/frontend/app/views/viewer/nav/viewer.icons.js new file mode 100644 index 0000000..c65c2e6 --- /dev/null +++ b/animism-align/frontend/app/views/viewer/nav/viewer.icons.js @@ -0,0 +1,97 @@ +import React from 'react' +import { connect } from 'react-redux' + +import actions from 'app/actions' +import { timestamp } from 'app/utils' + +// arrows + +const arrows = { + down: ( + + + + ), + up: ( + + + + ), + right: ( + + + + ), + left: ( + + + + ), +} + +export const Arrow = React.memo(({ type }) => ( +
+ {arrows[type]} +
+)) + + +// volume toggle + +const VolumeIcon = React.memo(({ muted }) => ( +
actions.audio.toggleMuted()}> + + + +
+)) + +export const VolumeControl = connect(state => ({ + muted: state.audio.muted, +}))(VolumeIcon) + + +// play / pause button + +const PlayIcon = ( + + + +) +const PauseIcon = ( + + + +) + +const PlayButtonIcon = ({ playing }) => { + return ( +
playing ? actions.audio.pause() : actions.audio.play()} + > + {playing ? PauseIcon : PlayIcon} +
+ ) +} + +export const PlayButton = connect(state => ({ + playing: state.audio.playing, +}))(PlayButtonIcon) + + +// player current time + +const PlayerTimeSpan = ({ play_ts, duration }) => ( + + {timestamp(play_ts)} + {' / '} + {timestamp(duration)} + +) + +export const PlayerTime = connect(state => ({ + play_ts: state.audio.play_ts, + duration: state.align.timeline.duration, +}))(PlayerTimeSpan) diff --git a/animism-align/frontend/app/views/viewer/nav/viewer.nav.js b/animism-align/frontend/app/views/viewer/nav/viewer.nav.js index 7b5a4c7..4200b03 100644 --- a/animism-align/frontend/app/views/viewer/nav/viewer.nav.js +++ b/animism-align/frontend/app/views/viewer/nav/viewer.nav.js @@ -3,6 +3,8 @@ import React, { Component } from 'react' import { connect } from 'react-redux' import actions from 'app/actions' +import { ROMAN_NUMERALS } from 'app/constants' +import { Arrow, VolumeControl, PlayButton, PlayerTime } from './viewer.icons' class ViewerNav extends Component { componentDidMount() { @@ -12,7 +14,23 @@ class ViewerNav extends Component { const { } = this.props return (
- Viewer nav +
+
+ + {ROMAN_NUMERALS[0]} + {'. '} + {'Introduction'} +
+
+ + + +
+
+ Next + +
+
) } diff --git a/animism-align/frontend/app/views/viewer/transcript/transcript.container.js b/animism-align/frontend/app/views/viewer/transcript/transcript.container.js index e6d7d09..d3d3e9f 100644 --- a/animism-align/frontend/app/views/viewer/transcript/transcript.container.js +++ b/animism-align/frontend/app/views/viewer/transcript/transcript.container.js @@ -27,7 +27,7 @@ class Transcript extends Component { render() { const { viewer } = this.props return ( -
+
+ + Download PDF +
) } diff --git a/animism-align/frontend/app/views/viewer/transcript/transcript.css b/animism-align/frontend/app/views/viewer/transcript/transcript.css index 38af9f5..a42615d 100644 --- a/animism-align/frontend/app/views/viewer/transcript/transcript.css +++ b/animism-align/frontend/app/views/viewer/transcript/transcript.css @@ -18,11 +18,22 @@ pointer-events: none; user-select: none; } -.transcript.visible { +.transcript-open .transcript { pointer-events: auto; user-select: auto; transform: translateZ(0) translateX(0); } +.transcript .footer { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + background: black; + color: white; + display: flex; + justify-content: center; + align-items: center; +} /* general paragraph styles */ @@ -34,7 +45,7 @@ padding: 1.5rem 2rem 6rem 1.5rem; position: relative; } -.transcript.visible .content { +.transcript-open .transcript .content { overflow-y: scroll; } diff --git a/animism-align/frontend/app/views/viewer/viewer.container.js b/animism-align/frontend/app/views/viewer/viewer.container.js index 080925f..b5d9721 100644 --- a/animism-align/frontend/app/views/viewer/viewer.container.js +++ b/animism-align/frontend/app/views/viewer/viewer.container.js @@ -55,13 +55,15 @@ class ViewerContainer extends Component { if (!loaded) { return
} + let className = 'viewer-container' + if (viewer.transcript) className += 'transcript-open' return (
-
+
-
+ diff --git a/animism-align/frontend/app/views/viewer/viewer.nav.css b/animism-align/frontend/app/views/viewer/viewer.nav.css index 809f2af..3797619 100644 --- a/animism-align/frontend/app/views/viewer/viewer.nav.css +++ b/animism-align/frontend/app/views/viewer/viewer.nav.css @@ -3,4 +3,97 @@ bottom: 0; left: 0; width: 100%; + font-size: 18px; +} + +/* The main nav row */ + +.viewer-nav > .nav-row { + width: 100%; + padding: 0.25rem 0 0.25rem 0; + display: flex; + justify-content: space-between; + align-items: center; +} +.viewer-nav > .nav-row > div { + display: flex; + justify-content: center; + align-items: center; + width: 32%; +} +.viewer-nav > .nav-row > div:nth-child(1) { + justify-content: flex-start; + align-items: center; +} +.viewer-nav > .nav-row > div:nth-child(2) { + justify-content: center; + align-items: center; +} +.viewer-nav > .nav-row > div:nth-child(3) { + justify-content: flex-end; + align-items: center; +} + +/* Arrows */ + +.viewer-nav .arrow { + width: 2.5rem; + height: 2.5rem; + display: flex; + justify-content: center; + align-items: center; +} +.viewer-nav .arrow.left, +.viewer-nav .arrow.right { + width: 1.25rem; +} +.viewer-nav .arrow svg { + width: 100%; + height: 100%; +} + +/* Volume button */ + +.volume { + cursor: pointer; + width: 2.5rem; + height: 2.5rem; +} +.volume path { + fill: #000; +} +.volume.muted path { + fill: #fff; + stroke: #000; + stroke-width: 0.5; +} +.nav-open .volume path { + fill: #fff; +} +.nav-open .volume.muted path { + fill: #000; + stroke: #fff; +} + +/* Play button */ + +.playToggle { + cursor: pointer; + width: 2.5rem; + height: 2.5rem; +} +.playToggle path, +.playToggle polygon { + fill: #000; +} +.nav-open .playToggle path, +.nav-open .playToggle polygon { + fill: #fff; +} + +/* Player time */ + +.playerTime { + margin-left: 0.5rem; + margin-right: 0.75rem; } -- cgit v1.2.3-70-g09d2