2
0

songPlayer.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. thumbnail: "",
  18. dislikes: 0,
  19. disliked: false,
  20. likes: 0,
  21. liked: false,
  22. startedAt: 0,
  23. timePaused: 0,
  24. timeElapsed: 0,
  25. });
  26. const actionsMap = {
  27. [CHANGE_SONG]: (state, action) => {
  28. let obj = {};
  29. let exists = !!action.song;
  30. obj.simple = (exists) ? (action.song.likes === -1 && action.song.dislikes === -1) : true;
  31. obj.exists = exists;
  32. console.log(action.song);
  33. if (exists) {
  34. obj.title = action.song.title;
  35. obj.artists = action.song.artists;
  36. obj.duration = action.song.duration;
  37. obj.skipDuration = action.song.skipDuration;
  38. obj.songId = action.song.songId;
  39. obj.thumbnail = action.song.thumbnail;
  40. obj.dislikes = action.song.dislikes;
  41. obj.disliked = false;
  42. obj.likes = action.song.likes;
  43. obj.liked = false;
  44. obj.startedAt = action.song.startedAt;
  45. obj.timePaused = action.song.timePaused;
  46. obj.timeElapsed = 0;
  47. } else {
  48. obj = initialState;
  49. }
  50. return state.merge(obj);
  51. },
  52. [SET_TIME_ELAPSED]: (state, action) => {
  53. let timePausedNow = 0;
  54. if (action.paused) timePausedNow = Date.now() - action.pausedAt;
  55. return state.merge({
  56. timeElapsed: (Date.now() - state.get("startedAt") - state.get("timePaused") - timePausedNow) / 1000,
  57. });
  58. },
  59. [UPDATE_TIME_PAUSED]: (state, action) => {
  60. return state.merge({
  61. timePaused: action.timePaused,
  62. });
  63. },
  64. [RECEIVED_RATINGS]: (state, action) => {
  65. return state.merge({
  66. likes: action.likes,
  67. dislikes: action.dislikes,
  68. });
  69. },
  70. [RECEIVED_OWN_RATINGS]: (state, action) => {
  71. return state.merge({
  72. liked: action.liked,
  73. disliked: action.disliked,
  74. });
  75. },
  76. };
  77. export default function reducer(state = initialState, action = {}) {
  78. const fn = actionsMap[action.type];
  79. return fn ? fn(state, action) : state;
  80. }