diff options
Diffstat (limited to 'client')
| -rw-r--r-- | client/actions/index.js | 9 | ||||
| -rw-r--r-- | client/components/Browser/Browser.jsx | 4 | ||||
| -rw-r--r-- | client/components/Browser/Folder/Files.jsx (renamed from client/components/Browser/Folder/Folder.jsx) | 20 | ||||
| -rw-r--r-- | client/components/Tasks/TaskFormView.jsx | 2 | ||||
| -rw-r--r-- | client/components/Tasks/Tasks.jsx | 17 | ||||
| -rw-r--r-- | client/components/UI/AudioPlayer.jsx | 35 | ||||
| -rw-r--r-- | client/components/UI/Header.jsx | 2 | ||||
| -rw-r--r-- | client/containers/audioPlayerContainer.js | 14 | ||||
| -rw-r--r-- | client/containers/fileLink.js | 23 | ||||
| -rw-r--r-- | client/reducers/audioPlayer.js | 20 | ||||
| -rw-r--r-- | client/reducers/currentTask.js | 16 | ||||
| -rw-r--r-- | client/reducers/index.js | 4 |
12 files changed, 144 insertions, 22 deletions
diff --git a/client/actions/index.js b/client/actions/index.js index ddbf9ee..0a163ae 100644 --- a/client/actions/index.js +++ b/client/actions/index.js @@ -1,3 +1,12 @@ +export const audioPlayFile = (file) => ({ + type: 'AUDIO_PLAY_FILE', + file: file +}) + +export const audioPause = () => ({ + type: 'AUDIO_PAUSE', +}) + export const setContent = (content) => ({ type: 'SET_CONTENT', file: content diff --git a/client/components/Browser/Browser.jsx b/client/components/Browser/Browser.jsx index 10b86c3..a7731f1 100644 --- a/client/components/Browser/Browser.jsx +++ b/client/components/Browser/Browser.jsx @@ -1,7 +1,7 @@ import { h, Component } from 'preact' import Folders from './Folders/Folders.jsx' -import Folder from './Folder/Folder.jsx' +import Files from './Folder/Files.jsx' import client from '../../client' @@ -36,7 +36,7 @@ class Browser extends Component { if (! folder_list.length) return const folder = folder_list[0] return ( - <Folder + <Files folder={folder} onClose={() => this.closeFolder(folder)} /> diff --git a/client/components/Browser/Folder/Folder.jsx b/client/components/Browser/Folder/Files.jsx index a3588f1..7d439c5 100644 --- a/client/components/Browser/Folder/Folder.jsx +++ b/client/components/Browser/Folder/Files.jsx @@ -1,22 +1,25 @@ import { h, Component } from 'preact' +import { audioPlayFile } fromĀ '../../../actions' + import client from '../../../client.js' import FileUploadButton from './FileUploadButton.jsx' +import FileLink from '../../../containers/fileLink.js' import TaskContentLink from '../../../containers/taskContentLink.js' import TaskStyleLink from '../../../containers/taskStyleLink.js' -export default class Folder extends Component { +export default class Files extends Component { constructor(props) { super() this.state = { files: props.folder.files || [], + selected: null, } this.addFiles = this.addFiles.bind(this) if (! props.folder.files) { client.file.index({ folder_id: props.folder.id }).then( files => this.setState({ files }) ) } - this.audio = document.createElement('audio') } addFiles(newFiles) { if (! newFiles) return @@ -25,21 +28,22 @@ export default class Folder extends Component { } handleClick(file) { if (file.type === 'audio') { - this.audio.setAttribute('src', mp3path(file)) - this.audio.play() + audioPlayFile(file) document.body.style.backgroundImage = 'url(' + pngpath(file) + ')' } + this.setState({ selected: file }) } render() { const files = (this.state.files).map(toFilenamePair).sort(sortByFilename).map(fromPair).map( (file, i) => { if (! file) return return ( - <div key={i}> - <span class='name' onClick={() => this.handleClick(file)}>{file.name}</span> + <div key={i} class={this.state.selected === file ? 'selected' : ''}> + <span class='name'><FileLink file={file}>{file.name}</FileLink></span> <span class='mime'>{file.mime}</span> + <span class='duration'>{file.duration.toFixed(1) + 's'}</span> <span class='actions'> - <TaskContentLink file={file}> content </TaskContentLink> - <TaskStyleLink file={file}> style </TaskStyleLink> + <TaskContentLink file={file}>content</TaskContentLink> + <TaskStyleLink file={file}>style</TaskStyleLink> </span> </div> ) diff --git a/client/components/Tasks/TaskFormView.jsx b/client/components/Tasks/TaskFormView.jsx index 36660de..e296a66 100644 --- a/client/components/Tasks/TaskFormView.jsx +++ b/client/components/Tasks/TaskFormView.jsx @@ -4,7 +4,7 @@ import { Link } from 'react-router-dom' import client from '../../client.js' export default function TaskFormView (props) { - console.log(props) + // console.log(props) return ( <div class='form'> <div> diff --git a/client/components/Tasks/Tasks.jsx b/client/components/Tasks/Tasks.jsx index a107acf..263e669 100644 --- a/client/components/Tasks/Tasks.jsx +++ b/client/components/Tasks/Tasks.jsx @@ -10,14 +10,20 @@ export default class Tasks extends Component { super() this.state = { adding: false, + tasks: [], } client.task.index().then( tasks => this.setState({ tasks }) ) } render() { - const tasks = (this.props.tasks || []).map( (task, i) => { +// <span class='name'>{task.result_file.name}</span> + const tasks = (this.state.tasks || []).map( (task, i) => { return ( <div key={i} onClick={() => this.toggle(task)}> - <span class='name'>{task.name}</span> + <span>{task.id}</span> + <span>{task.created_at}</span> + <span class='name'>{task.content_file.name}</span> + <span class='name'>{task.style_file.name}</span> + <span>{task.alpha}</span> </div> ) }) @@ -25,9 +31,14 @@ export default class Tasks extends Component { <div class='column'> <div class='window'> <div class='heading'> - <b>tasks</b> + <b>create task</b> </div> <TaskForm /> + </div> + <div class='window'> + <div class='heading'> + <b>recent tasks</b> + </div> <div class='list'> {tasks} </div> diff --git a/client/components/UI/AudioPlayer.jsx b/client/components/UI/AudioPlayer.jsx new file mode 100644 index 0000000..de6502c --- /dev/null +++ b/client/components/UI/AudioPlayer.jsx @@ -0,0 +1,35 @@ +import { h, Component } from 'preact' + +const audio = document.createElement('audio') + +export default function AudioPlayer (props) { + if (props.file) { + audio.src = mp3path(props.file) + audio.play() + return ( + <div> + Playing {props.file.name} + </div> + ) + } + else { + return ( + <div> + Not Playing + </div> + ) + } +} + +function filepath (file) { + return '/data/' + file.folder_id + '/' + encodeURIComponent(file.name) +} +function mp3path (file) { + if (file.mime !== 'audio/mp3') { + return filepath(file) + '.mp3' + } + return filepath(file) +} +function pngpath (file) { + return filepath(file) + '.png' +} diff --git a/client/components/UI/Header.jsx b/client/components/UI/Header.jsx index 1727f7a..55dd25f 100644 --- a/client/components/UI/Header.jsx +++ b/client/components/UI/Header.jsx @@ -1,5 +1,6 @@ import { h, Component } from 'preact' // import { Link } from 'react-router-dom' +import AudioPlayerContainer from '../../containers/audioPlayerContainer.js' export default class Header extends Component { constructor(props) { @@ -11,6 +12,7 @@ export default class Header extends Component { return ( <div class='header'> <b>spawn cortex</b> + <AudioPlayerContainer /> </div> ) } diff --git a/client/containers/audioPlayerContainer.js b/client/containers/audioPlayerContainer.js new file mode 100644 index 0000000..69516cc --- /dev/null +++ b/client/containers/audioPlayerContainer.js @@ -0,0 +1,14 @@ +import { connect } from 'react-redux' +import AudioPlayer from '../components/UI/AudioPlayer.jsx' + +const mapStateToProps = state => state.audioPlayer + +const mapDispatchToProps = (dispatch, ownProps) => ({ +}) + +const AudioPlayerContainer = connect( + mapStateToProps, + mapDispatchToProps +)( AudioPlayer ) + +export default AudioPlayerContainer diff --git a/client/containers/fileLink.js b/client/containers/fileLink.js new file mode 100644 index 0000000..cb55c1c --- /dev/null +++ b/client/containers/fileLink.js @@ -0,0 +1,23 @@ +import { connect } from 'react-redux' +import { audioPlayFile } from '../actions' +import Link from '../components/UI/Link.jsx' + +const mapStateToProps = (state, ownProps) => ({ +}) + +const mapDispatchToProps = (dispatch, ownProps) => ({ + onClick: () => { + switch (ownProps.file.type) { + case 'audio': + dispatch(audioPlayFile(ownProps.file)) + break + } + } +}) + +const FileLink = connect( + mapStateToProps, + mapDispatchToProps +)(Link) + +export default FileLink diff --git a/client/reducers/audioPlayer.js b/client/reducers/audioPlayer.js new file mode 100644 index 0000000..6ad4022 --- /dev/null +++ b/client/reducers/audioPlayer.js @@ -0,0 +1,20 @@ +import client from '../client' + +const audioPlayer = (state = {}, action) => { + switch (action.type) { + case 'AUDIO_PLAY_FILE': + return { + ...state, + file: action.file + } + case 'AUDIO_PAUSE': + return { + ...state, + paused: ! state.paused, + } + default: + return state + } +} + +export default audioPlayer
\ No newline at end of file diff --git a/client/reducers/currentTask.js b/client/reducers/currentTask.js index 3f9233e..e760fba 100644 --- a/client/reducers/currentTask.js +++ b/client/reducers/currentTask.js @@ -2,7 +2,6 @@ import { addTask } from '../actions' import client from '../client' const currentTask = (state = {}, action) => { - console.log(action.type) switch (action.type) { case 'SET_CONTENT': return { @@ -20,15 +19,18 @@ const currentTask = (state = {}, action) => { alpha: action.alpha } case 'CREATE_TASK': - client.task.create( state ).then( (data) => { + const record = { + content_file_id: state.content.id, + style_file_id: state.style.id, + alpha: state.alpha || '0.001', + command: 'nsatf.py', + completed: false, + } + client.task.create( record ).then( (data) => { addTask( data ) }) - return { - content: null, - style: null, - alpha: state.alpha, - } + return state // case 'ADD_TASK': // return { // ...state diff --git a/client/reducers/index.js b/client/reducers/index.js index ed59b60..0dee19c 100644 --- a/client/reducers/index.js +++ b/client/reducers/index.js @@ -1,9 +1,11 @@ import { combineReducers } from 'redux' import currentTask from './currentTask' +import audioPlayer from './audioPlayer' const cortexApp = combineReducers({ - currentTask + currentTask, + audioPlayer, }) export default cortexApp |
