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)
);
|