users.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. let mergedState = concatUnique(state, action.items.map(hydrateUser));
  54. return mergedState.sort(function(a, b) {
  55. if (a.username < b.username) {
  56. return -1;
  57. } else if (a.username > b.username) {
  58. return 1;
  59. } else {
  60. return 0;
  61. }
  62. });
  63. case HYDRATE_USERS:
  64. return action.items.map(hydrateUser);
  65. case UPDATE_AVATAR:
  66. return state.map(function(item) {
  67. item = Object.assign({}, item);
  68. if (item.id === action.userId) {
  69. item.avatars = action.avatars;
  70. }
  71. return item;
  72. });
  73. default:
  74. return state;
  75. }
  76. }