songPlayer.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { Map } from "immutable";
  2. import {
  3. CHANGE_SONG,
  4. SET_TIME_ELAPSED,
  5. UPDATE_TIME_PAUSED,
  6. RECEIVED_RATINGS,
  7. RECEIVED_OWN_RATINGS,
  8. } from "actions/songPlayer";
  9. const initialState = Map({
  10. simple: true,
  11. exists: false,
  12. title: "",
  13. artists: [],
  14. duration: 0,
  15. skipDuration: 0,
  16. songId: "",
  17. dislikes: 0,
  18. disliked: false,
  19. likes: 0,
  20. liked: false,
  21. startedAt: 0,
  22. timePaused: 0,
  23. timeElapsed: 0,
  24. });
  25. const actionsMap = {
  26. [CHANGE_SONG]: (state, action) => {
  27. let obj = {};
  28. let exists = !!action.song;
  29. obj.simple = (exists) ? (action.song.likes === -1 && action.song.dislikes === -1) : true;
  30. obj.exists = exists;
  31. if (exists) {
  32. obj.title = action.song.title;
  33. obj.artists = action.song.artists;
  34. obj.duration = action.song.duration;
  35. obj.skipDuration = action.song.skipDuration;
  36. obj.songId = action.song.songId;
  37. obj.dislikes = action.song.dislikes;
  38. obj.disliked = false;
  39. obj.likes = action.song.likes;
  40. obj.liked = false;
  41. obj.startedAt = action.song.startedAt;
  42. obj.timePaused = action.song.timePaused;
  43. obj.timeElapsed = 0;
  44. } else {
  45. obj = initialState;
  46. }
  47. return state.merge(obj);
  48. },
  49. [SET_TIME_ELAPSED]: (state, action) => {
  50. let timePausedNow = 0;
  51. if (action.paused) timePausedNow = Date.now() - action.pausedAt;
  52. return state.merge({
  53. timeElapsed: (Date.now() - state.get("startedAt") - state.get("timePaused") - timePausedNow) / 1000,
  54. });
  55. },
  56. [UPDATE_TIME_PAUSED]: (state, action) => {
  57. return state.merge({
  58. timePaused: action.timePaused,
  59. });
  60. },
  61. [RECEIVED_RATINGS]: (state, action) => {
  62. return state.merge({
  63. likes: action.likes,
  64. dislikes: action.dislikes,
  65. });
  66. },
  67. [RECEIVED_OWN_RATINGS]: (state, action) => {
  68. return state.merge({
  69. liked: action.liked,
  70. disliked: action.disliked,
  71. });
  72. },
  73. };
  74. export default function reducer(state = initialState, action = {}) {
  75. const fn = actionsMap[action.type];
  76. return fn ? fn(state, action) : state;
  77. }