diff --git a/browser/main/Components/PlanetSettingModal.jsx b/browser/main/Components/PlanetSettingModal.jsx
index 1c44e7af..24f4dfa8 100644
--- a/browser/main/Components/PlanetSettingModal.jsx
+++ b/browser/main/Components/PlanetSettingModal.jsx
@@ -14,7 +14,9 @@ module.exports = React.createClass({
planet: React.PropTypes.shape({
name: React.PropTypes.string,
public: React.PropTypes.bool,
- userName: React.PropTypes.string
+ Owner: React.PropTypes.shape({
+ name: React.PropTypes.string
+ })
})
},
getInitialState: function () {
@@ -59,7 +61,7 @@ module.exports = React.createClass({
var planet = this.props.planet
this.setState({profileFormStatus: 'sending', profileFormError: null}, function () {
- Hq.updatePlanet(planet.userName, planet.name, this.state.planet)
+ Hq.updatePlanet(planet.Owner.name, planet.name, this.state.planet)
.then(function (res) {
var planet = res.body
console.log(planet)
@@ -103,7 +105,7 @@ module.exports = React.createClass({
var planet = this.props.planet
this.setState({deleteSubmitStatus: 'sending'}, function () {
- Hq.destroyPlanet(planet.userName, planet.name)
+ Hq.destroyPlanet(planet.Owner.name, planet.name)
.then(function (res) {
var planet = res.body
@@ -166,12 +168,12 @@ module.exports = React.createClass({
)
},
renderPlanetDeleteTab: function () {
- var disabled = !this.state.deleteConfirmation.match(new RegExp('^' + this.props.planet.userName + '/' + this.props.planet.name + '$'))
+ var disabled = !this.state.deleteConfirmation.match(new RegExp('^' + this.props.planet.Owner.name + '/' + this.props.planet.name + '$'))
return (
-
Are you sure to destroy '{this.props.planet.userName + '/' + this.props.planet.name}' ?
-
If you are sure, write '{this.props.planet.userName + '/' + this.props.planet.name}' to input below and click '{this.state.randomDeleteText}' button.
+
Are you sure to destroy '{this.props.planet.Owner.name + '/' + this.props.planet.name}' ?
+
If you are sure, write '{this.props.planet.Owner.name + '/' + this.props.planet.name}' to input below and click '{this.state.randomDeleteText}' button.
{this.state.randomDeleteText}
diff --git a/browser/main/Components/TeamCreateModal.jsx b/browser/main/Components/TeamCreateModal.jsx
index 97b55fdb..d4b99857 100644
--- a/browser/main/Components/TeamCreateModal.jsx
+++ b/browser/main/Components/TeamCreateModal.jsx
@@ -3,6 +3,7 @@
var React = require('react/addons')
var Hq = require('../Services/Hq')
+var socket = require('../Services/socket')
var LinkedState = require('../Mixins/LinkedState')
var KeyCaster = require('../Mixins/KeyCaster')
@@ -48,6 +49,7 @@ module.exports = React.createClass({
currentUser.Teams.push(team)
localStorage.setItem('currentUser', JSON.stringify(currentUser))
+ socket.reconnect(currentUser)
UserStore.Actions.update(currentUser)
if (this.props.transitionTo != null) {
diff --git a/browser/main/Components/TeamSettingsModal.jsx b/browser/main/Components/TeamSettingsModal.jsx
index b11f3d12..0261e749 100644
--- a/browser/main/Components/TeamSettingsModal.jsx
+++ b/browser/main/Components/TeamSettingsModal.jsx
@@ -43,12 +43,9 @@ module.exports = React.createClass({
close: React.PropTypes.func
},
getInitialState: function () {
- var team = this.props.team
return {
currentTab: 'teamInfo',
- team: {
- profileName: team.profileName
- },
+ team: this.props.team,
userSubmitStatus: null,
member: {
name: '',
@@ -65,17 +62,10 @@ module.exports = React.createClass({
}
},
onUserChange: function (res) {
- var member
switch (res.status) {
- case 'memberAdded':
- member = res.data
- if (member.TeamMember.TeamId === this.props.team.id) {
- this.forceUpdate()
- }
- break
- case 'memberRemoved':
- member = res.data
- if (member.TeamMember.TeamId === this.props.team.id) {
+ case 'userUpdated':
+ var user = res.data
+ if (user.id === this.props.team.id) {
this.forceUpdate()
}
break
@@ -116,8 +106,7 @@ module.exports = React.createClass({
role: this.state.member.role
})
.then(function (res) {
- UserStore.Actions.addMember(res.body)
- this.setState({updatingMember: false})
+ this.setState({updatingMember: false, team: res.body})
}.bind(this))
.catch(function (err) {
console.error(err)
@@ -135,8 +124,7 @@ module.exports = React.createClass({
role: role
})
.then(function (res) {
- UserStore.Actions.addMember(res.body)
- this.setState({updatingMember: false})
+ this.setState({updatingMember: false, team: res.body})
}.bind(this))
.catch(function (err) {
console.error(err)
@@ -153,8 +141,7 @@ module.exports = React.createClass({
userName: memberName
})
.then(function (res) {
- UserStore.Actions.removeMember(res.body)
- this.setState({updatingMember: false})
+ this.setState({updatingMember: false, team: res.body})
}.bind(this))
.catch(function (err) {
console.error(err)
@@ -212,7 +199,7 @@ module.exports = React.createClass({
renderMembersTab: function () {
var currentUser = JSON.parse(localStorage.getItem('currentUser'))
- var members = this.props.team.Members.map(function (member) {
+ var members = this.state.team.Members.map(function (member) {
var isCurrentUser = currentUser.id === member.id
return (
diff --git a/browser/main/Containers/LoginContainer.jsx b/browser/main/Containers/LoginContainer.jsx
index b2cde41f..a1c01a1e 100644
--- a/browser/main/Containers/LoginContainer.jsx
+++ b/browser/main/Containers/LoginContainer.jsx
@@ -6,6 +6,7 @@ var Link = ReactRouter.Link
var AuthFilter = require('../Mixins/AuthFilter')
var LinkedState = require('../Mixins/LinkedState')
var Hq = require('../Services/Hq')
+var socket = require('../Services/socket')
module.exports = React.createClass({
mixins: [LinkedState, ReactRouter.Navigation, AuthFilter.OnlyGuest],
@@ -47,6 +48,7 @@ module.exports = React.createClass({
.then(function (res) {
localStorage.setItem('token', res.body.token)
localStorage.setItem('currentUser', JSON.stringify(res.body.user))
+ socket.reconnect()
this.transitionTo('userHome', {userName: res.body.user.name})
}.bind(this))
diff --git a/browser/main/Containers/MainContainer.jsx b/browser/main/Containers/MainContainer.jsx
index 58efb015..544c8173 100644
--- a/browser/main/Containers/MainContainer.jsx
+++ b/browser/main/Containers/MainContainer.jsx
@@ -9,6 +9,7 @@ var Navigation = ReactRouter.Navigation
var State = ReactRouter.State
var Hq = require('../Services/Hq')
+var socket = require('../Services/socket')
var Modal = require('../Mixins/Modal')
@@ -17,7 +18,7 @@ var UserStore = require('../Stores/UserStore')
var ContactModal = require('../Components/ContactModal')
function fetchPlanet (userName, planetName) {
- Hq.fetchPlanet(userName, planetName)
+ return Hq.fetchPlanet(userName, planetName)
.then(function (res) {
var planet = res.body
@@ -29,8 +30,9 @@ function fetchPlanet (userName, planetName) {
note.type = 'note'
})
- console.log('planet-' + planet.id + ' fetched!')
localStorage.setItem('planet-' + planet.id, JSON.stringify(planet))
+
+ return planet
})
.catch(function (err) {
console.error(err)
@@ -61,15 +63,14 @@ module.exports = React.createClass({
Hq.getUser()
.then(function (res) {
var user = res.body
- localStorage.setItem('currentUser', JSON.stringify(user))
UserStore.Actions.update(user)
user.Planets.forEach(function (planet) {
- fetchPlanet(planet.userName, planet.name)
+ fetchPlanet(user.name, planet.name)
})
user.Teams.forEach(function (team) {
team.Planets.forEach(function (planet) {
- fetchPlanet(planet.userName, planet.name)
+ fetchPlanet(team.name, planet.name)
})
})
})
diff --git a/browser/main/Containers/PlanetContainer.jsx b/browser/main/Containers/PlanetContainer.jsx
index 3e9bc095..8abc9a73 100644
--- a/browser/main/Containers/PlanetContainer.jsx
+++ b/browser/main/Containers/PlanetContainer.jsx
@@ -41,10 +41,10 @@ module.exports = React.createClass({
var planet = this.state.planet
switch (article.type) {
case 'code':
- this.transitionTo('codes', {userName: planet.userName, planetName: planet.name, localId: article.localId})
+ this.transitionTo('codes', {userName: planet.Owner.name, planetName: planet.name, localId: article.localId})
break
case 'note':
- this.transitionTo('notes', {userName: planet.userName, planetName: planet.name, localId: article.localId})
+ this.transitionTo('notes', {userName: planet.Owner.name, planetName: planet.name, localId: article.localId})
break
}
}
@@ -55,7 +55,7 @@ module.exports = React.createClass({
return
}
- if (nextProps.params.userName !== this.state.planet.userName || nextProps.params.planetName !== this.state.planet.name) {
+ if (nextProps.params.userName !== this.state.planet.Owner.name || nextProps.params.planetName !== this.state.planet.name) {
this.setState({
planet: null
}, function () {
@@ -96,14 +96,14 @@ module.exports = React.createClass({
if (this.state.planet.name === planet.name) {
this.setState({planet: planet})
} else {
- this.transitionTo('planetHome', {userName: planet.userName, planetName: planet.name})
+ this.transitionTo('planetHome', {userName: planet.Owner.name, planetName: planet.name})
}
}
break
case 'destroyed':
planet = res.data
if (this.state.planet.id === planet.id) {
- this.transitionTo('userHome', {userName: this.state.planet.userName})
+ this.transitionTo('userHome', {userName: this.state.planet.Owner.name})
}
break
case 'codeUpdated':
diff --git a/browser/main/Containers/SignupContainer.jsx b/browser/main/Containers/SignupContainer.jsx
index fc6f5dd2..114dbc27 100644
--- a/browser/main/Containers/SignupContainer.jsx
+++ b/browser/main/Containers/SignupContainer.jsx
@@ -8,6 +8,7 @@ var AuthFilter = require('../Mixins/AuthFilter')
var LinkedState = require('../Mixins/LinkedState')
var ExternalLink = require('../Mixins/ExternalLink')
var Hq = require('../Services/Hq')
+var socket = require('../Services/socket')
module.exports = React.createClass({
mixins: [LinkedState, ReactRouter.Navigation, AuthFilter.OnlyGuest, ExternalLink],
@@ -33,6 +34,7 @@ module.exports = React.createClass({
.then(function (res) {
localStorage.setItem('token', res.body.token)
localStorage.setItem('currentUser', JSON.stringify(res.body.user))
+ socket.reconnect()
this.transitionTo('userHome', {userName: res.body.user.name})
}.bind(this))
diff --git a/browser/main/Containers/UserContainer.jsx b/browser/main/Containers/UserContainer.jsx
index d8064041..c0ef398b 100644
--- a/browser/main/Containers/UserContainer.jsx
+++ b/browser/main/Containers/UserContainer.jsx
@@ -230,7 +230,7 @@ module.exports = React.createClass({
var userPlanets = user.Planets.map(function (planet) {
return (
- {planet.userName}/{planet.name}
+ {user.name}/{planet.name}
{!planet.public ? ( ) : null}
)
@@ -288,7 +288,7 @@ module.exports = React.createClass({
var userPlanets = user.Planets.map(function (planet) {
return (
- {planet.userName}/{planet.name}
+ {user.name}/{planet.name}
{!planet.public ? ( ) : null}
)
@@ -311,7 +311,7 @@ module.exports = React.createClass({
var planets = (team.Planets == null ? [] : team.Planets).map(function (planet) {
return (
- {planet.userName}/{planet.name}
+ {team.name}/{planet.name}
{!planet.public ? ( ) : null}
)
diff --git a/browser/main/Services/socket.js b/browser/main/Services/socket.js
new file mode 100644
index 00000000..39d65f0d
--- /dev/null
+++ b/browser/main/Services/socket.js
@@ -0,0 +1,64 @@
+/* global localStorage */
+
+var config = require('../../../config')
+var UserStore = require('../Stores/UserStore')
+var PlanetStore = require('../Stores/PlanetStore')
+
+var io = require('socket.io-client')(config.apiUrl)
+
+io.on('connected', function (data) {
+ console.log('connected by WS')
+ reconnect()
+})
+
+io.on('userUpdated', function (data) {
+ console.log('userUpdated')
+ UserStore.Actions.update(data)
+})
+
+// Planet
+io.on('planetUpdated', function (data) {
+ console.log('planetUpdated')
+ PlanetStore.Actions.update(data)
+})
+
+io.on('planetDestroyed', function (data) {
+ console.log('planetDestroyed')
+ PlanetStore.Actions.destroy(data)
+})
+
+// Article
+io.on('codeUpdated', function (data) {
+ console.log('codeUpdated')
+ PlanetStore.Actions.updateCode(data)
+})
+io.on('codeDestroyed', function (data) {
+ console.log('codeDestroyed')
+ PlanetStore.Actions.destroyCode(data)
+})
+io.on('noteUpdated', function (data) {
+ console.log('noteUpdated')
+ PlanetStore.Actions.updateNote(data)
+})
+io.on('noteDestroyed', function (data) {
+ console.log('noteDestroyed')
+ PlanetStore.Actions.destroyNote(data)
+})
+
+var reconnect = function (currentUser) {
+ if (currentUser == null) currentUser = JSON.parse(localStorage.getItem('currentUser'))
+ if (currentUser != null) {
+ var rooms = ['user:' + currentUser.id].concat(currentUser.Teams.map(function (team) {
+ return 'user:' + team.id
+ }))
+
+ io.emit('room:sync', {rooms: rooms})
+ } else {
+ io.emit('room:sync', {rooms: []})
+ }
+}
+
+module.exports = {
+ io: io,
+ reconnect: reconnect
+}
diff --git a/browser/main/Stores/PlanetStore.js b/browser/main/Stores/PlanetStore.js
index a1232b6f..6b33cdcf 100644
--- a/browser/main/Stores/PlanetStore.js
+++ b/browser/main/Stores/PlanetStore.js
@@ -19,39 +19,51 @@ module.exports = Reflux.createStore({
mixins: [Helper],
listenables: [actions],
Actions: actions,
+ /*
+ Planet must be updated like below
+ Planet
+ Codes
+ Tags
+ User
+ Notes
+ Tags
+ User
+ Owner
+ */
onUpdate: function (planet) {
// Copy the planet object
var aPlanet = Object.assign({}, planet)
delete aPlanet.Codes
delete aPlanet.Notes
+ delete aPlanet.Owner
// Check if the planet should be updated to currentUser
var currentUser = JSON.parse(localStorage.getItem('currentUser'))
- var ownedByCurrentUser = currentUser.id === aPlanet.OwnerId
+ var currentUserMustBeUpdated = false
+ var ownedByCurrentUser = currentUser.id === aPlanet.OwnerId
if (ownedByCurrentUser) {
currentUser.Planets = this.updateItemToTargetArray(aPlanet, currentUser.Planets)
- }
-
- if (!ownedByCurrentUser) {
+ currentUserMustBeUpdated = true
+ } else {
var team = null
- currentUser.Teams.some(function (_team) {
+ if (currentUser.Teams.some(function (_team) {
if (_team.id === aPlanet.OwnerId) {
team = _team
return true
}
- return
- })
-
- if (team) {
+ return false
+ })) {
team.Planets = this.updateItemToTargetArray(aPlanet, team.Planets)
+ currentUserMustBeUpdated = true
}
}
// Update currentUser
- localStorage.setItem('currentUser', JSON.stringify(currentUser))
- UserStore.Actions.update(currentUser)
+ if (currentUserMustBeUpdated) {
+ UserStore.Actions.update(currentUser)
+ }
planet.Codes.forEach(function (code) {
code.type = 'code'
diff --git a/browser/main/Stores/UserStore.js b/browser/main/Stores/UserStore.js
index de8a74e5..0fd92fdd 100644
--- a/browser/main/Stores/UserStore.js
+++ b/browser/main/Stores/UserStore.js
@@ -4,18 +4,19 @@ var Reflux = require('reflux')
var actions = Reflux.createActions([
'update',
- 'destroy',
- 'addMember',
- 'removeMember'
+ 'destroy'
])
module.exports = Reflux.createStore({
listenables: [actions],
onUpdate: function (user) {
- var currentUser = JSON.parse(localStorage.getItem('currentUser'))
+ if (this.socket == null) this.socket = require('../Services/socket')
+ var currentUser = JSON.parse(localStorage.getItem('currentUser'))
if (currentUser.id === user.id) {
localStorage.setItem('currentUser', JSON.stringify(user))
+
+ this.socket.reconnect(user)
}
if (user.userType === 'team') {
@@ -53,17 +54,5 @@ module.exports = Reflux.createStore({
data: user
})
},
- onAddMember: function (member) {
- this.trigger({
- status: 'memberAdded',
- data: member
- })
- },
- onRemoveMember: function (member) {
- this.trigger({
- status: 'memberRemoved',
- data: member
- })
- },
Actions: actions
})
diff --git a/browser/styles/mixins/marked.styl b/browser/styles/mixins/marked.styl
index ac4a13af..acc4e7f0 100644
--- a/browser/styles/mixins/marked.styl
+++ b/browser/styles/mixins/marked.styl
@@ -6,7 +6,7 @@ marked()
h1
font-size 2em
border-bottom solid 2px borderColor
- margin 0.67 auto
+ margin 0.67em auto
h2
font-size 1.5em
margin 0.83em auto
@@ -27,7 +27,7 @@ marked()
line-height 1.8em
p
line-height 1.8em
- margin-bottom 15px
+ margin-bottom 25px
img
max-width 100%
strong
@@ -43,6 +43,7 @@ marked()
ul
list-style-type disc
padding-left 35px
+ margin-bottom 25px
li
display list-item
margin 15px 0
@@ -53,6 +54,7 @@ marked()
ol
list-style-type decimal
padding-left 35px
+ margin-bottom 25px
li
display list-item
margin 15px 0
@@ -70,7 +72,7 @@ marked()
border solid 1px borderColor
border-radius 5px
overflow-x auto
- margin-bottom 15px
+ margin-bottom 25px
background-color #F6F6F6
&>code
padding 0
diff --git a/config.js b/config.js
index 1a29ee52..0ce393d9 100644
--- a/config.js
+++ b/config.js
@@ -1,4 +1,5 @@
module.exports = {
- apiUrl: 'https://api.b00st.io/'
+ // apiUrl: 'https://api.b00st.io/'
+ apiUrl: 'https://api2.b00st.io/'
// apiUrl: 'http://localhost:8000/'
}
diff --git a/package.json b/package.json
index 4ff615c1..636d1111 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "boost",
- "version": "0.2.10",
+ "version": "0.3.0",
"description": "Boost App",
"main": "main.js",
"scripts": {