diff options
Diffstat (limited to 'app/assets/javascripts')
3 files changed, 35 insertions, 14 deletions
diff --git a/app/assets/javascripts/components/actions/timelines.jsx b/app/assets/javascripts/components/actions/timelines.jsx index 91f06511a..1fabe5d2c 100644 --- a/app/assets/javascripts/components/actions/timelines.jsx +++ b/app/assets/javascripts/components/actions/timelines.jsx @@ -1,6 +1,6 @@ export const TIMELINE_SET = 'TIMELINE_SET'; export const TIMELINE_UPDATE = 'TIMELINE_UPDATE'; - +export const TIMELINE_DELETE = 'TIMELINE_DELETE'; export function setTimeline(timeline, statuses) { return { @@ -17,3 +17,10 @@ export function updateTimeline(timeline, status) { status: status }; } + +export function deleteFromTimeline(id) { + return { + type: TIMELINE_DELETE, + id: id + }; +} diff --git a/app/assets/javascripts/components/containers/root.jsx b/app/assets/javascripts/components/containers/root.jsx index e1fc31d55..ed53aee80 100644 --- a/app/assets/javascripts/components/containers/root.jsx +++ b/app/assets/javascripts/components/containers/root.jsx @@ -1,9 +1,9 @@ -import { Provider } from 'react-redux'; -import configureStore from '../store/configureStore'; -import Frontend from '../components/frontend'; -import { setTimeline, updateTimeline } from '../actions/timelines'; -import { setAccessToken } from '../actions/meta'; -import PureRenderMixin from 'react-addons-pure-render-mixin'; +import { Provider } from 'react-redux'; +import configureStore from '../store/configureStore'; +import Frontend from '../components/frontend'; +import { setTimeline, updateTimeline, deleteFromTimelines } from '../actions/timelines'; +import { setAccessToken } from '../actions/meta'; +import PureRenderMixin from 'react-addons-pure-render-mixin'; const store = configureStore(); @@ -32,7 +32,11 @@ const Root = React.createClass({ disconnected: function() {}, received: function(data) { - return store.dispatch(updateTimeline(data.timeline, JSON.parse(data.message))); + if (data.type === 'update') { + return store.dispatch(updateTimeline(data.timeline, JSON.parse(data.message))); + } else if (data.type === 'delete') { + return store.dispatch(deleteFromTimelines(data.id)); + } } }); } diff --git a/app/assets/javascripts/components/reducers/timelines.jsx b/app/assets/javascripts/components/reducers/timelines.jsx index 9900489df..fb990ef54 100644 --- a/app/assets/javascripts/components/reducers/timelines.jsx +++ b/app/assets/javascripts/components/reducers/timelines.jsx @@ -1,10 +1,10 @@ -import { TIMELINE_SET, TIMELINE_UPDATE } from '../actions/timelines'; -import { REBLOG_SUCCESS, FAVOURITE_SUCCESS } from '../actions/interactions'; -import Immutable from 'immutable'; +import { TIMELINE_SET, TIMELINE_UPDATE, TIMELINE_DELETE } from '../actions/timelines'; +import { REBLOG_SUCCESS, FAVOURITE_SUCCESS } from '../actions/interactions'; +import Immutable from 'immutable'; const initialState = Immutable.Map({ - home: Immutable.List(), - mentions: Immutable.List(), + home: Immutable.List([]), + mentions: Immutable.List([]), statuses: Immutable.Map(), accounts: Immutable.Map() }); @@ -44,12 +44,22 @@ function updateTimelineWithMaps(state, timeline, status) { return state; }; +function deleteStatus(state, id) { + ['home', 'mentions'].forEach(function (timeline) { + state = state.update(timeline, list => list.filterNot(item => item === id)); + }); + + return state.deleteIn(['statuses', id]); +}; + export default function timelines(state = initialState, action) { switch(action.type) { case TIMELINE_SET: return timelineToMaps(state, action.timeline, Immutable.fromJS(action.statuses)); case TIMELINE_UPDATE: - return updateTimelineWithMaps(state, action.timeline,Immutable.fromJS(action.status)); + return updateTimelineWithMaps(state, action.timeline, Immutable.fromJS(action.status)); + case TIMELINE_DELETE: + return deleteStatus(state, action.id); case REBLOG_SUCCESS: case FAVOURITE_SUCCESS: return statusToMaps(state, Immutable.fromJS(action.response)); |