Press n or j to go to the next uncovered block, b, p or k for the previous block.
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 | 1x 5x 4x 4x 4x 1x 3x 1x 1x 1x 1x 6x 6x 6x 6x 5x 1x 4x 1x 2x 1x 1x 1x 1x 1x 3x | import { createSlice } from "@reduxjs/toolkit"; import { createSelector } from "reselect"; import axios from "axios"; import { apiCallBegan } from "./api"; import moment from "moment"; const slice = createSlice({ name: "bugs", initialState: { list: [], loading: false, lastFetch: null }, reducers: { bugsRequested: (bugs, action) => { bugs.loading = true; }, bugsReceived: (bugs, action) => { bugs.list = action.payload; bugs.loading = false; bugs.lastFetch = Date.now(); }, bugsRequestFailed: (bugs, action) => { bugs.loading = false; }, bugAssignedToUser: (bugs, action) => { const { id: bugId, userId } = action.payload; const index = bugs.list.findIndex(bug => bug.id === bugId); bugs.list[index].userId = userId; }, // command - event // addBug - bugAdded bugAdded: (bugs, action) => { bugs.list.push(action.payload); }, // resolveBug (command) - bugResolved (event) bugResolved: (bugs, action) => { const index = bugs.list.findIndex(bug => bug.id === action.payload.id); bugs.list[index].resolved = true; } } }); export const { bugAdded, bugResolved, bugAssignedToUser, bugsReceived, bugsRequested, bugsRequestFailed } = slice.actions; export default slice.reducer; // Action Creators const url = "/bugs"; export const loadBugs = () => (dispatch, getState) => { const { lastFetch } = getState().entities.bugs; const diffInMinutes = moment().diff(moment(lastFetch), "minutes"); if (diffInMinutes < 10) return; return dispatch( apiCallBegan({ url, onStart: bugsRequested.type, onSuccess: bugsReceived.type, onError: bugsRequestFailed.type }) ); }; export const addBug = bug => apiCallBegan({ url, method: "post", data: bug, onSuccess: bugAdded.type }); export const resolveBug = id => apiCallBegan({ // /bugs // PATCH /bugs/1 url: url + "/" + id, method: "patch", data: { resolved: true }, onSuccess: bugResolved.type }); export const assignBugToUser = (bugId, userId) => apiCallBegan({ url: url + "/" + bugId, method: "patch", data: { userId }, onSuccess: bugAssignedToUser.type }); // Selector // Memoization // bugs => get unresolved bugs from the cache export const getBugsByUser = userId => createSelector( state => state.entities.bugs, bugs => bugs.filter(bug => bug.userId === userId) ); export const getUnresolvedBugs = createSelector( state => state.entities.bugs, state => state.entities.projects, (bugs, projects) => bugs.list.filter(bug => !bug.resolved) ); |