Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Implement Redux #229

Closed
wants to merge 92 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
e06fc26
Home page rendering with redux-saga
dignifiedquire Jan 28, 2016
5245c80
Fix typo in prop types
dignifiedquire Jan 28, 2016
bab1ff2
Cleanup peer
dignifiedquire Jan 29, 2016
9aa8b4d
Fix devtools
dignifiedquire Jan 29, 2016
2485f96
More ui work
dignifiedquire Jan 29, 2016
bca8a2f
Some more style tweaks
dignifiedquire Jan 29, 2016
032489a
fix header size
dignifiedquire Jan 29, 2016
125af78
test: Upgrade chai-enzyme
dignifiedquire Feb 1, 2016
f9d711f
Merge branch 'master' into redux
dignifiedquire Feb 1, 2016
39ce9fc
some refactoring
dignifiedquire Feb 2, 2016
a866580
test: Add tests for sagas
dignifiedquire Feb 2, 2016
963ae0e
Fix linting
dignifiedquire Feb 2, 2016
22b7826
Home page rendering with redux-saga
dignifiedquire Jan 28, 2016
eb16ce9
Fix typo in prop types
dignifiedquire Jan 28, 2016
c1e9bca
Cleanup peer
dignifiedquire Jan 29, 2016
a6535d7
Fix devtools
dignifiedquire Jan 29, 2016
f8492b2
More ui work
dignifiedquire Jan 29, 2016
c1b620f
Some more style tweaks
dignifiedquire Jan 29, 2016
3c0a0b7
fix header size
dignifiedquire Jan 29, 2016
6bf58c3
test: Upgrade chai-enzyme
dignifiedquire Feb 1, 2016
003a5fb
some refactoring
dignifiedquire Feb 2, 2016
9edb960
test: Add tests for sagas
dignifiedquire Feb 2, 2016
57e555b
Fix linting
dignifiedquire Feb 2, 2016
fa90cba
chore: Update dependencies
dignifiedquire Feb 5, 2016
187e486
test(reducers): Add tests
dignifiedquire Feb 5, 2016
6174cf9
Merge branch 'redux' of github.com:ipfs/webui into redux
dignifiedquire Feb 5, 2016
adc050a
Start work on log tailing
dignifiedquire Feb 6, 2016
82e9361
Basic logs are working
dignifiedquire Feb 6, 2016
76a3bcf
chore: Update dependencies
dignifiedquire Feb 9, 2016
34ca7a5
Improve log view
dignifiedquire Feb 9, 2016
b77a0d3
Add filtering capabilities and move all state to the store.
dignifiedquire Feb 9, 2016
4636901
Remove direct redux devtools integration
dignifiedquire Feb 9, 2016
cacc924
logs: Better details data
dignifiedquire Feb 9, 2016
94bb593
Add missing redux dependency
dignifiedquire Feb 9, 2016
2b4f26e
Improve log streaming
dignifiedquire Feb 15, 2016
bf9cd54
Fix tests for logs
dignifiedquire Feb 15, 2016
927f927
Deprecate pages and view folders
dignifiedquire Feb 15, 2016
dcd1c6d
Cleanup dependencies and upgrades
dignifiedquire Feb 15, 2016
2d6af80
Add /peers view
dignifiedquire Feb 15, 2016
29c3854
Initial support for the map
dignifiedquire Feb 16, 2016
f00b678
Peers page is working
dignifiedquire Feb 16, 2016
3746462
Start adding cache for locations
dignifiedquire Feb 17, 2016
5c55f6b
welcome component spec
Feb 22, 2016
9ea2162
Merge pull request #252 from suisha/welcome-spec
dignifiedquire Feb 22, 2016
c72a721
Merge branch 'redux' of github.com:ipfs/webui into redux
dignifiedquire Feb 22, 2016
a3aca9a
test: Fix sagas test
dignifiedquire Feb 22, 2016
c7ce14f
chore: Upgrade dependencies
dignifiedquire Feb 23, 2016
67ff76c
fix: Use ipfs-geoip for geolocation data
dignifiedquire Feb 23, 2016
e169271
feat: Add polling to the peers page
dignifiedquire Feb 23, 2016
2283945
world spec
Feb 23, 2016
308b7ed
Merge pull request #257 from suisha/world-spec-rebased
dignifiedquire Feb 24, 2016
cea31c9
peers-viewer spec
Feb 25, 2016
d4a2e15
flag spec
Feb 26, 2016
2e52464
Merge pull request #262 from suisha/flag-spec
dignifiedquire Feb 27, 2016
12d81bf
Merge pull request #261 from suisha/peers-viewer-spec
dignifiedquire Feb 27, 2016
4452431
Merge remote-tracking branch 'upstream/master' into redux
dignifiedquire Feb 27, 2016
b02749e
fix: Fix import path for react-virtualized styles
dignifiedquire Feb 27, 2016
704baba
Add basic files listing
dignifiedquire Feb 29, 2016
7b306d0
feat(files): Add inline folder creation.
dignifiedquire Feb 29, 2016
41d7c68
Refactor and cleanup for files folder creation
dignifiedquire Mar 3, 2016
fea019f
Fix world map rendering on coordinate changes
dignifiedquire Mar 3, 2016
56782c2
Use lodash-es instead of lodash
dignifiedquire Mar 3, 2016
b73fd18
Fix json formatting in babelrc
dignifiedquire Mar 3, 2016
0d96843
refactor: Improve file structure
dignifiedquire Mar 3, 2016
f8236a0
refactor: Split reducers into individual files
dignifiedquire Mar 4, 2016
6cd22f4
Use react-toastr to show errors
dignifiedquire Mar 5, 2016
33c5f6e
fix: Upgrade dependencies
dignifiedquire Mar 9, 2016
ddc4eee
implement config in redux
Mar 9, 2016
aec9cff
Merge pull request #272 from suisha/redux-config
dignifiedquire Mar 9, 2016
4beaa2c
chore: Update dependencies
dignifiedquire Mar 10, 2016
075fdf1
feat(files): Add selection of files and folders
dignifiedquire Mar 10, 2016
b9029f9
feat(files): Delete folders
dignifiedquire Mar 10, 2016
c2d06cb
feat(files): Dnd file upload
dignifiedquire Mar 10, 2016
343dda8
wip - files preview
dignifiedquire Mar 10, 2016
b18ae8b
wip use react-router-redux
dignifiedquire Mar 10, 2016
be12cc5
Image preview is working
dignifiedquire Mar 10, 2016
8e3dbca
feat(files): Basic text highlighting
dignifiedquire Mar 11, 2016
787781f
proptoype for video preview
dignifiedquire Mar 11, 2016
bfb3da5
wip
dignifiedquire Mar 14, 2016
45ad99c
More work
dignifiedquire Mar 14, 2016
c7f1053
Basics are working again
dignifiedquire Mar 14, 2016
8603f8d
More work for config
dignifiedquire Mar 14, 2016
f5faf1e
Video preview and config is working
dignifiedquire Mar 14, 2016
6fc6cac
start fixing tests
dignifiedquire Mar 14, 2016
e853a4c
Finish fixing saga tests
dignifiedquire Mar 17, 2016
7bf9f30
fix(peers): Style of peers on the map in Chrome 49
dignifiedquire Mar 17, 2016
c50a183
feat(files): Add context menu
dignifiedquire Mar 17, 2016
5ef3c3e
Trying something lighter
dignifiedquire Mar 17, 2016
e0147d5
fix build and freeze deps with yarn
dignifiedquire Mar 9, 2017
a59a528
fix lint happy
dignifiedquire Mar 9, 2017
a34b1ea
fix: its alive again
dignifiedquire Mar 9, 2017
63c23d1
fix: topojson dep
dignifiedquire Mar 13, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .babelrc
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"presets": ["react", "es2015", "stage-0"],
"presets": ["es2015", "stage-0", "react"],
"plugins": [
'transform-runtime'
"transform-runtime"
],
"env": {
"development": {
Expand Down
5 changes: 3 additions & 2 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
app/scripts/include/*.js
node_modules
versions
dist
dist
app/scripts/pages/*.js
app/scripts/views/*.js
1 change: 1 addition & 0 deletions app/data/world.json

Large diffs are not rendered by default.

Binary file added app/img/header.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed app/img/logo.png
Binary file not shown.
31 changes: 31 additions & 0 deletions app/scripts/actions/config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import {action, createRequestTypes} from './utils'

export const CONFIG = {
INITIALIZE_CONFIG: 'INITIALIZE_CONFIG',
SAVING_CONFIG: 'SAVING_CONFIG',
SAVE_CONFIG: 'SAVE_CONFIG',
SAVED_CONFIG: 'SAVED_CONFIG',
SAVE_CONFIG_CLICK: 'SAVE_CONFIG_CLICK',
SAVE_CONFIG_DRAFT: 'SAVE_CONFIG_DRAFT',
SAVE_CONFIG_FAILURE: 'SAVE_CONFIG_FAILURE',
RESET_CONFIG_DRAFT: 'RESET_CONFIG_DRAFT',
LOAD: createRequestTypes('CONFIG_LOAD')
}

export const config = {
initializeConfig: (config) => action(CONFIG.INITIALIZE_CONFIG, {config}),
save: (config) => action(CONFIG.SAVE_CONFIG, {config}),
markSaved: (saved) => action(CONFIG.SAVED_CONFIG, {saved}),
saveClick: (config) => action(CONFIG.SAVE_CONFIG_CLICK),
saveDraft: (draft) => action(CONFIG.SAVE_CONFIG_DRAFT, {draft}),
saving: (saving) => action(CONFIG.SAVING_CONFIG, {saving}),
resetDraft: (resetConfig) => action(CONFIG.RESET_CONFIG_DRAFT),

failure: (error) => action(CONFIG.SAVE_CONFIG_FAILURE, {error}),

load: {
request: () => action(CONFIG.LOAD.REQUEST),
success: (response) => action(CONFIG.LOAD.SUCCESS, {response}),
failure: (error) => action(CONFIG.LOAD.FAILURE, {error})
}
}
5 changes: 5 additions & 0 deletions app/scripts/actions/errors.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import {action} from './utils'

export const RESET_ERROR_MESSAGE = 'RESET_ERROR_MESSAGE'

export const resetErrorMessage = () => action(RESET_ERROR_MESSAGE)
61 changes: 61 additions & 0 deletions app/scripts/actions/files.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import {createRequestTypes, action} from './utils'

export const FILES_LIST = createRequestTypes('FILES_LIST')
export const FILES_MKDIR = createRequestTypes('FILES_MKDIR')
export const FILES_RMDIR = createRequestTypes('FILES_RMDIR')
export const FILES_CREATE_FILES = createRequestTypes('FILES_CREATE_FILES')

export const FILES = {
CANCEL: 'FILES_CANCEL',
SET_ROOT: 'FILES_SET_ROOT',
CREATE_TMP_DIR: 'FILES_CREATE_TMP_DIR',
RM_TMP_DIR: 'FILES_RM_TMP_DIR',
SET_TMP_DIR_NAME: 'FILES_SET_TMP_DIR_NAME',
CREATE_DIR: 'FILES_CREATE_DIR',
REMOVE_DIR: 'FILES_REMOVE_DIR',
SELECT_FILE: 'SELECT_FILE',
DESELECT_FILE: 'DESELECT_FILE',
DESELECT_ALL_FILE: 'DESELECT_ALL_FILE',
CREATE_FILES: 'CREATE_FILES'
}

export const filesList = {
request: () => action(FILES_LIST.REQUEST),
success: (response) => action(FILES_LIST.SUCCESS, {response}),
failure: (error) => action(FILES_LIST.FAILURE, {error})
}

export const filesMkdir = {
request: () => action(FILES_MKDIR.REQUEST),
success: () => action(FILES_MKDIR.SUCCESS),
failure: (error) => action(FILES_MKDIR.FAILURE, {error})
}

export const filesRmDir = {
request: () => action(FILES_RMDIR.REQUEST),
success: () => action(FILES_RMDIR.SUCCESS),
failure: (error) => action(FILES_RMDIR.FAILURE, {error})
}

export const createFiles = {
request: () => action(FILES_CREATE_FILES.REQUEST),
success: () => action(FILES_CREATE_FILES.SUCCESS),
failure: (error) => action(FILES_CREATE_FILES.FAILURE, {error})
}

export const files = {
cancel: () => action(FILES.CANCEL)
}

export const filesSetRoot = (root) => action(FILES.SET_ROOT, {root})
export const filesCreateTmpDir = (root) => action(FILES.CREATE_TMP_DIR, {root})
export const filesRmTmpDir = () => action(FILES.RM_TMP_DIR)
export const filesSetTmpDirName = (name) => action(FILES.SET_TMP_DIR_NAME, {name})
export const filesCreateDir = () => action(FILES.CREATE_DIR)
export const filesRemoveDir = () => action(FILES.REMOVE_DIR)

export const filesSelect = (file) => action(FILES.SELECT_FILE, {file})
export const filesDeselect = (file) => action(FILES.DESELECT_FILE, {file})
export const filesDeselectAll = () => action(FILES.DESELECT_ALL_FILE)

export const filesCreateFiles = (root, files) => action(FILES.CREATE_FILES, {root, files})
9 changes: 9 additions & 0 deletions app/scripts/actions/home.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import {action, createRequestTypes} from './utils'

export const ID = createRequestTypes('ID')

export const id = {
request: () => action(ID.REQUEST),
success: (response) => action(ID.SUCCESS, {response}),
failure: (error) => action(ID.FAILURE, {error})
}
32 changes: 32 additions & 0 deletions app/scripts/actions/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Broken because of https://phabricator.babeljs.io/T2877
// export * from './pages'
// export * from './errors'

// export * from './home'
// export * from './peers'
// export * from './files'
// export * from './preview'
// export * from './logs'

// Workaround

import * as pages from './pages'
import * as errors from './errors'
import * as router from './router'

import * as home from './home'
import * as peers from './peers'
import * as files from './files'
import * as preview from './preview'
import * as logs from './logs'
import * as config from './config'

export {pages}
export {errors}
export {router}
export {home}
export {peers}
export {files}
export {preview}
export {logs}
export {config}
15 changes: 15 additions & 0 deletions app/scripts/actions/logs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import {action} from './utils'

export const LOGS = {
RECEIVE: 'LOGS_RECEIVE',
CANCEL: 'LOGS_CANCEL',
TOGGLE_TAIL: 'TOGGLE_TAIL',
SELECT_SYSTEM: 'SELECT_SYSTEM'
}

export const logs = {
receive: (response) => action(LOGS.RECEIVE, {response}),
cancel: () => action(LOGS.CANCEL),
toggleTail: () => action(LOGS.TOGGLE_TAIL),
selectSystem: (system) => action(LOGS.SELECT_SYSTEM, {system})
}
8 changes: 8 additions & 0 deletions app/scripts/actions/pages.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import {createPage} from './utils'

export const {HOME, home} = createPage('home')
export const {FILES, files} = createPage('files')
export const {PREVIEW, preview} = createPage('preview')
export const {LOGS, logs} = createPage('logs')
export const {PEERS, peers} = createPage('peers')
export const {CONFIG, config} = createPage('config')
31 changes: 31 additions & 0 deletions app/scripts/actions/peers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import {createRequestTypes, action} from './utils'

export const PEERS = {
CANCEL: 'PEERS_CANCEL'
}

export const PEER_IDS = createRequestTypes('PEER_IDS')
export const PEER_DETAILS = createRequestTypes('PEER_DETAILS')
export const PEER_LOCATIONS = createRequestTypes('PEER_LOCATIONS')

export const peers = {
cancel: () => action(PEERS.CANCEL)
}

export const peerIds = {
request: () => action(PEER_IDS.REQUEST),
success: (response) => action(PEER_IDS.SUCCESS, {response}),
failure: (error) => action(PEER_IDS.FAILURE, {error})
}

export const peerDetails = {
request: () => action(PEER_DETAILS.REQUEST),
success: (response) => action(PEER_DETAILS.SUCCESS, {response}),
failure: (error) => action(PEER_DETAILS.FAILURE, {error})
}

export const peerLocations = {
request: () => action(PEER_LOCATIONS.REQUEST),
success: (response) => action(PEER_LOCATIONS.SUCCESS, {response}),
failure: (error) => action(PEER_LOCATIONS.FAILURE, {error})
}
26 changes: 26 additions & 0 deletions app/scripts/actions/preview.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import {createRequestTypes, action} from './utils'

export const requests = {
PREVIEW_STAT: createRequestTypes('PREVIEW_STAT'),
PREVIEW_READ: createRequestTypes('PREVIEW_READ'),
stat: {
request: () => action(requests.PREVIEW_STAT.REQUEST),
success: (response) => action(requests.PREVIEW_STAT.SUCCESS, {response}),
failure: (error) => action(requests.PREVIEW_STAT.FAILURE, {error})
},
read: {
request: () => action(requests.PREVIEW_READ.REQUEST),
success: (response) => action(requests.PREVIEW_READ.SUCCESS, {response}),
failure: (error) => action(requests.PREVIEW_READ.FAILURE, {error})
}
}

export const PREVIEW = {
STAT: 'PREVIEW.STAT',
READ: 'PREVIEW.READ',
CLEAR: 'PREVIEW.CLEAR'
}

export const stat = (name) => action(PREVIEW.STAT, {name})
export const read = (name) => action(PREVIEW.READ, {name})
export const clear = () => action(PREVIEW.CLEAR)
3 changes: 3 additions & 0 deletions app/scripts/actions/router.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import {push, replace, go, goBack, goForward} from 'react-router-redux'

export {push, replace, go, goBack, goForward}
39 changes: 39 additions & 0 deletions app/scripts/actions/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
const REQUEST = 'REQUEST'
const SUCCESS = 'SUCCESS'
const FAILURE = 'FAILURE'

export function createRequestTypes (base) {
const res = {}
const types = [REQUEST, SUCCESS, FAILURE]
types.forEach((type) => {
res[type] = `${base}_${type}`
})

return res
}

export function action (type, payload = {}) {
return {type, ...payload}
}

function createPageConstants (name) {
return {
LOAD: `LOAD_${name.toUpperCase()}_PAGE`,
LEAVE: `LEAVE_${name.toUpperCase()}_PAGE`
}
}

function createPageActions (name, consts) {
return {
load: () => action(consts.LOAD),
leave: () => action(consts.LEAVE)
}
}

export function createPage (name) {
const consts = createPageConstants(name)
return {
[name.toUpperCase()]: consts,
[name]: createPageActions(name, consts)
}
}
16 changes: 0 additions & 16 deletions app/scripts/app.js

This file was deleted.

46 changes: 46 additions & 0 deletions app/scripts/components/config-buttons.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import React, {Component} from 'react'
import i18n from '../utils/i18n.js'
import classNames from 'classnames'

export
default class ConfigButtons extends Component {
static displayName = 'ConfigButtons'

static propTypes = {
// Dispatch
resetDraft: React.PropTypes.func.isRequired,
saveClick: React.PropTypes.func.isRequired,
// State
saving: React.PropTypes.bool.isRequired,
saved: React.PropTypes.bool.isRequired
}

render () {
const buttonClass = classNames(
'btn',
'btn-success',
'pull-right', {
disabled: this.props.saving || this.props.saved
}
)

const iconClass = classNames('fa', {
'fa-check': this.props.saved,
'fa-save': !this.props.saved
})

return (
<div className='controls'>
<button className={buttonClass} onClick={this.props.saveClick}>
<i className={iconClass} />&nbsp;
{this.props.saving ? i18n.t('Saving...') : this.props.saved ? i18n.t('Saved') : i18n.t('Save')}
</button>
<button className='btn btn-primary pull-right' onClick={this.props.resetDraft}>
<i className='fa fa-recycle' />&nbsp;
{i18n.t('Reset')}
</button>
<div className='clear' />
</div>
)
}
}
38 changes: 38 additions & 0 deletions app/scripts/components/config-text.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import React, {Component} from 'react'
import TextArea from 'react-textarea-autosize'

export
default class ConfigText extends Component {
static displayName = 'ConfigText';

static propTypes = {
// Dispatch
saveDraft: React.PropTypes.func.isRequired,
markSaved: React.PropTypes.func.isRequired,
// State
draft: React.PropTypes.string.isRequired,
saved: React.PropTypes.bool.isRequired
};

handleChange = (event) => {
const body = event.target.value
this.props.saveDraft(body)

if (this.props.saved) {
this.props.markSaved(false)
}
}

render () {
return (
<div className='textarea-panel panel panel-default padded'>
<TextArea
className='panel-inner'
spellCheck='false'
onChange={this.handleChange}
value={this.props.draft}
/>
</div>
)
}
}
Loading