summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/actions/index.js9
-rw-r--r--client/components/Browser/Browser.jsx4
-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.jsx2
-rw-r--r--client/components/Tasks/Tasks.jsx17
-rw-r--r--client/components/UI/AudioPlayer.jsx35
-rw-r--r--client/components/UI/Header.jsx2
-rw-r--r--client/containers/audioPlayerContainer.js14
-rw-r--r--client/containers/fileLink.js23
-rw-r--r--client/reducers/audioPlayer.js20
-rw-r--r--client/reducers/currentTask.js16
-rw-r--r--client/reducers/index.js4
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