This repository has been archived by the owner on Oct 1, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 5
/
users.js
129 lines (99 loc) · 3.49 KB
/
users.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
This file is a part of libertysoil.org website
Copyright (C) 2016 Loki Education (Social Enterprise)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import i from 'immutable';
import _ from 'lodash';
import * as a from '../actions';
const initialState = i.Map({});
const cleanUser = user => {
const users = {};
if (!user) {
return users;
}
if (user.following) {
for (const followed_user of user.following) {
users[followed_user.id] = followed_user;
}
user = _.cloneDeep(user);
delete user.following;
}
if (user.followers) {
for (const follower of user.followers) {
users[follower.id] = follower;
}
user = _.cloneDeep(user);
delete user.following;
}
users[user.id] = user;
return users;
};
export default function reducer(state = initialState, action) {
switch (action.type) {
case a.users.ADD_USER:
case a.users.SET_CURRENT_USER: {
state = state.mergeDeep(i.fromJS(cleanUser(action.user)));
if (action.user) {
if (action.user.more && action.user.more.roles) {
state = state.setIn([action.user.id, 'more', 'roles'], i.fromJS(action.user.more.roles));
}
}
break;
}
case a.users.ADD_USERS: {
const usersById = action.users.reduce((acc, user) => acc[user.id] = cleanUser(user), {});
state = state.mergeDeep(i.fromJS(usersById));
break;
}
case a.posts.ADD_POST:
case a.river.ADD_POST_TO_RIVER: {
const user = action.post.user;
if (!user) {
// the post hasn't been found; adding a fake
break;
}
const comment_authors = action.post.post_comments.map(comment => comment.user);
const users = _.keyBy(_.uniqBy([user, ...comment_authors], 'id'), 'id');
state = state.mergeDeep(i.fromJS(users));
break;
}
case a.river.SET_POSTS_TO_RIVER:
case a.river.SET_POSTS_TO_LIKES_RIVER:
case a.river.SET_POSTS_TO_FAVOURITES_RIVER:
case a.schools.SET_SCHOOL_POSTS:
case a.hashtags.SET_HASHTAG_POSTS:
case a.geotags.SET_GEOTAG_POSTS: {
const authors = action.posts.map(post => post.user);
const comment_authors = _.flatten(action.posts.map(post => post.post_comments.map(comment => comment.user)));
const users = _.keyBy(_.uniqBy([...authors, ...comment_authors], 'id'), 'id');
state = state.mergeDeep(i.fromJS(users));
break;
}
case a.comments.SET_POST_COMMENTS: {
const users = _.keyBy(_.map(action.comments, comment => comment.user), 'id');
state = state.mergeDeep(i.fromJS(users));
break;
}
case a.posts.SET_RELATED_POSTS: {
const users = _.keyBy(action.posts.map(post => post.user), 'id');
state = state.mergeDeep(i.fromJS(users));
break;
}
case a.tools.TOOLS__SET_FOLLOWED_USERS: {
const users = _.keyBy(action.users, 'id');
state = state.mergeDeep(i.fromJS(users));
break;
}
}
return state;
}