users.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import moment from 'moment';
  2. import concatUnique from 'misago/utils/concat-unique';
  3. export const APPEND_USERS = 'APPEND_USERS';
  4. export const HYDRATE_USERS = 'HYDRATE_USERS';
  5. export const UPDATE_AVATAR = 'UPDATE_AVATAR';
  6. export const UPDATE_USERNAME = 'UPDATE_USERNAME';
  7. export function append(items) {
  8. return {
  9. type: APPEND_USERS,
  10. items
  11. };
  12. }
  13. export function hydrate(items) {
  14. return {
  15. type: HYDRATE_USERS,
  16. items
  17. };
  18. }
  19. export function hydrateStatus(status) {
  20. if (status) {
  21. return Object.assign({}, status, {
  22. last_click: status.last_click ? moment(status.last_click) : null,
  23. banned_until: status.banned_until ? moment(status.banned_until) : null
  24. });
  25. } else {
  26. return null;
  27. }
  28. }
  29. export function hydrateUser(user) {
  30. return Object.assign({}, user, {
  31. joined_on: moment(user.joined_on),
  32. status: hydrateStatus(user.status)
  33. });
  34. }
  35. export function updateAvatar(user, avatars) {
  36. return {
  37. type: UPDATE_AVATAR,
  38. userId: user.id,
  39. avatars
  40. };
  41. }
  42. export function updateUsername(user, username, slug) {
  43. return {
  44. type: UPDATE_USERNAME,
  45. userId: user.id,
  46. username,
  47. slug
  48. };
  49. }
  50. export default function user(state=[], action=null) {
  51. switch (action.type) {
  52. case APPEND_USERS:
  53. return concatUnique(state, action.items.map(hydrateUser));
  54. case HYDRATE_USERS:
  55. return action.items.map(hydrateUser);
  56. case UPDATE_AVATAR:
  57. return state.map(function(item) {
  58. item = Object.assign({}, item);
  59. if (item.id === action.userId) {
  60. item.avatars = action.avatars;
  61. }
  62. return item;
  63. });
  64. default:
  65. return state;
  66. }
  67. }