Adds gSheet specific entity read

This commit is contained in:
forceoranj
2021-11-14 01:44:11 +01:00
parent 193f51b54d
commit c33b9d8f79
43 changed files with 546 additions and 418 deletions

View File

@@ -13,7 +13,7 @@ jest.mock("axios")
const mockData = {
"5": {
jeuId: 5,
id: 5,
titre: "6 qui prend!",
auteur: "Wolfgang Kramer",
editeur: "(uncredited) , Design Edge , B",

View File

@@ -1,41 +1,49 @@
import axios from "axios"
import mockStore from "../../utils/mockStore"
import userData, {
import membre, {
getRequesting,
getSuccess,
getFailure,
fetchUserData,
fetchMembreData,
initialState,
} from "../userData"
} from "../membre"
jest.mock("axios")
const mockData = {
membreId: 1,
name: "PeL",
phone: "+886 0970...",
email: "forceoranj@gmail.com",
website: "https://www.parisestludique.fr",
id: 1,
nom: "Aupeix",
prenom: "Amélie",
mail: "pakouille.lakouille@yahoo.fr",
telephone: "0675650392",
photo: "images/membres/$taille/amélie_aupeix.jpg",
alimentation: "Végétarien",
majeur: 1,
privilege: 0,
actif: 0,
commentaire: "",
horodatage: "0000-00-00",
passe: "$2y$10$fSxY9AIuxSiEjwF.J3eXGubIxUPlobkyRrNIal8ASimSjNj4SR.9O",
}
const { membreId } = mockData
const { id } = mockData
const mockError = "Oops! Something went wrong."
describe("userData reducer", () => {
describe("membre reducer", () => {
it("should handle initial state correctly", () => {
// @ts-expect-error
expect(userData(undefined, {})).toEqual(initialState)
expect(membre(undefined, {})).toEqual(initialState)
})
it("should handle requesting correctly", () => {
expect(userData(undefined, { type: getRequesting.type, payload: membreId })).toEqual({
expect(membre(undefined, { type: getRequesting.type, payload: id })).toEqual({
readyStatus: "request",
})
})
it("should handle success correctly", () => {
expect(
userData(undefined, {
membre(undefined, {
type: getSuccess.type,
payload: mockData,
})
@@ -44,7 +52,7 @@ describe("userData reducer", () => {
it("should handle failure correctly", () => {
expect(
userData(undefined, {
membre(undefined, {
type: getFailure.type,
payload: mockError,
})
@@ -52,8 +60,8 @@ describe("userData reducer", () => {
})
})
describe("userData action", () => {
it("fetches user data successful", async () => {
describe("membre action", () => {
it("fetches membre data successful", async () => {
const { dispatch, getActions } = mockStore()
const expectedActions = [
{ type: getRequesting.type },
@@ -63,11 +71,11 @@ describe("userData action", () => {
// @ts-expect-error
axios.get.mockResolvedValue({ data: mockData })
await dispatch(fetchUserData(membreId))
await dispatch(fetchMembreData(id))
expect(getActions()).toEqual(expectedActions)
})
it("fetches user data failed", async () => {
it("fetches membre data failed", async () => {
const { dispatch, getActions } = mockStore()
const expectedActions = [
{ type: getRequesting.type },
@@ -77,7 +85,7 @@ describe("userData action", () => {
// @ts-expect-error
axios.get.mockRejectedValue({ message: mockError })
await dispatch(fetchUserData(membreId))
await dispatch(fetchMembreData(id))
expect(getActions()).toEqual(expectedActions)
})
})

View File

@@ -1,35 +1,43 @@
import axios from "axios"
import mockStore from "../../utils/mockStore"
import userList, {
import membreList, {
initialState,
getRequesting,
getSuccess,
getFailure,
fetchUserList,
} from "../userList"
fetchMembreList,
} from "../membreList"
jest.mock("axios")
const mockData = {
"1": {
membreId: 1,
name: "PeL",
phone: "+886 0970...",
email: "forceoranj@gmail.com",
website: "https://www.parisestludique.fr",
id: 1,
nom: "Aupeix",
prenom: "Amélie",
mail: "pakouille.lakouille@yahoo.fr",
telephone: "0675650392",
photo: "images/membres/$taille/amélie_aupeix.jpg",
alimentation: "Végétarien",
majeur: 1,
privilege: 0,
actif: 0,
commentaire: "",
horodatage: "0000-00-00",
passe: "$2y$10$fSxY9AIuxSiEjwF.J3eXGubIxUPlobkyRrNIal8ASimSjNj4SR.9O",
},
}
const mockError = "Oops! Something went wrong."
describe("userList reducer", () => {
describe("membreList reducer", () => {
it("should handle initial state", () => {
// @ts-expect-error
expect(userList(undefined, {})).toEqual(initialState)
expect(membreList(undefined, {})).toEqual(initialState)
})
it("should handle requesting correctly", () => {
expect(userList(undefined, { type: getRequesting.type })).toEqual({
expect(membreList(undefined, { type: getRequesting.type })).toEqual({
readyStatus: "request",
ids: [],
entities: {},
@@ -37,7 +45,7 @@ describe("userList reducer", () => {
})
it("should handle success correctly", () => {
expect(userList(undefined, { type: getSuccess.type, payload: mockData })).toEqual({
expect(membreList(undefined, { type: getSuccess.type, payload: mockData })).toEqual({
...initialState,
readyStatus: "success",
ids: [1],
@@ -46,7 +54,7 @@ describe("userList reducer", () => {
})
it("should handle failure correctly", () => {
expect(userList(undefined, { type: getFailure.type, payload: mockError })).toEqual({
expect(membreList(undefined, { type: getFailure.type, payload: mockError })).toEqual({
...initialState,
readyStatus: "failure",
error: mockError,
@@ -54,8 +62,8 @@ describe("userList reducer", () => {
})
})
describe("userList action", () => {
it("fetches user list successful", async () => {
describe("membreList action", () => {
it("fetches membre list successful", async () => {
const { dispatch, getActions } = mockStore()
const expectedActions = [
{ type: getRequesting.type },
@@ -65,11 +73,11 @@ describe("userList action", () => {
// @ts-expect-error
axios.get.mockResolvedValue({ data: mockData })
await dispatch(fetchUserList())
await dispatch(fetchMembreList())
expect(getActions()).toEqual(expectedActions)
})
it("fetches user list failed", async () => {
it("fetches membre list failed", async () => {
const { dispatch, getActions } = mockStore()
const expectedActions = [
{ type: getRequesting.type },
@@ -79,7 +87,7 @@ describe("userList action", () => {
// @ts-expect-error
axios.get.mockRejectedValue({ message: mockError })
await dispatch(fetchUserList())
await dispatch(fetchMembreList())
expect(getActions()).toEqual(expectedActions)
})
})

View File

@@ -6,7 +6,7 @@ import { Envie, EnvieWithoutId, addEnvie } from "../services/envies"
import { AppThunk } from "."
const envieAdapter = createEntityAdapter<Envie>({
selectId: (envie) => envie.envieId,
selectId: (envie) => envie.id,
})
const envieAdd = createSlice({

View File

@@ -6,7 +6,7 @@ import { Envie, getEnvieList } from "../services/envies"
import { AppThunk, AppState } from "."
const envieAdapter = createEntityAdapter<Envie>({
selectId: (envie) => envie.envieId,
selectId: (envie) => envie.id,
})
const envieList = createSlice({

View File

@@ -6,7 +6,7 @@ import { JeuJav, getJeuJavList } from "../services/jeuJav"
import { AppThunk, AppState } from "."
const jeuJavAdapter = createEntityAdapter<JeuJav>({
selectId: (jeuJav) => jeuJav.jeuId,
selectId: (jeuJav) => jeuJav.id,
})
export const initialState = jeuJavAdapter.getInitialState({

View File

@@ -2,23 +2,23 @@ import { PayloadAction, createSlice } from "@reduxjs/toolkit"
import { toast } from "react-toastify"
import { StateRequest } from "./utils"
import { User, getUserData } from "../services/jsonPlaceholder"
import { Membre, getMembre } from "../services/membres"
import { AppThunk, AppState } from "."
type StateUser = { entity?: User } & StateRequest
type StateMembre = { entity?: Membre } & StateRequest
export const initialState: StateUser = {
export const initialState: StateMembre = {
readyStatus: "idle",
}
const userData = createSlice({
name: "userData",
const membre = createSlice({
name: "membre",
initialState,
reducers: {
getRequesting: (_) => ({
readyStatus: "request",
}),
getSuccess: (_, { payload }: PayloadAction<User>) => ({
getSuccess: (_, { payload }: PayloadAction<Membre>) => ({
readyStatus: "success",
entity: payload,
}),
@@ -29,19 +29,19 @@ const userData = createSlice({
},
})
export default userData.reducer
export const { getRequesting, getSuccess, getFailure } = userData.actions
export default membre.reducer
export const { getRequesting, getSuccess, getFailure } = membre.actions
export const fetchUserData =
export const fetchMembreData =
(id: number): AppThunk =>
async (dispatch) => {
dispatch(getRequesting())
const { error, data } = await getUserData(id)
const { error, data } = await getMembre(id)
if (error) {
dispatch(getFailure(error.message))
toast.error(`Erreur lors du chargement de l'utilisateur ${id}: ${error.message}`, {
toast.error(`Erreur lors du chargement du membre ${id}: ${error.message}`, {
position: "top-center",
autoClose: 6000,
hideProgressBar: true,
@@ -51,18 +51,17 @@ export const fetchUserData =
progress: undefined,
})
} else {
dispatch(getSuccess(data as User))
dispatch(getSuccess(data as Membre))
}
}
const shouldFetchUserData = (state: AppState, id: number) =>
state.userData.readyStatus !== "success" ||
(state.userData.entity && state.userData.entity.membreId !== id)
const shouldFetchMembreData = (state: AppState, id: number) =>
state.membre.readyStatus !== "success" || (state.membre.entity && state.membre.entity.id !== id)
export const fetchUserDataIfNeed =
export const fetchMembreDataIfNeed =
(id: number): AppThunk =>
(dispatch, getState) => {
if (shouldFetchUserData(getState(), id)) return dispatch(fetchUserData(id))
if (shouldFetchMembreData(getState(), id)) return dispatch(fetchMembreData(id))
return null
}

View File

@@ -2,27 +2,25 @@ import { PayloadAction, createSlice, createEntityAdapter } from "@reduxjs/toolki
import { toast } from "react-toastify"
import { StateRequest } from "./utils"
import { User, getUserList } from "../services/jsonPlaceholder"
import { Membre, getMembreList } from "../services/membres"
import { AppThunk, AppState } from "."
const userAdapter = createEntityAdapter<User>({
selectId: (user) => user.membreId,
})
const membreAdapter = createEntityAdapter<Membre>()
export const initialState = userAdapter.getInitialState({
export const initialState = membreAdapter.getInitialState({
readyStatus: "idle",
} as StateRequest)
const userList = createSlice({
name: "userList",
const membreList = createSlice({
name: "membreList",
initialState,
reducers: {
getRequesting: (state) => {
state.readyStatus = "request"
},
getSuccess: (state, { payload }: PayloadAction<User[]>) => {
getSuccess: (state, { payload }: PayloadAction<Membre[]>) => {
state.readyStatus = "success"
userAdapter.setAll(state, payload)
membreAdapter.setAll(state, payload)
},
getFailure: (state, { payload }: PayloadAction<string>) => {
state.readyStatus = "failure"
@@ -31,13 +29,13 @@ const userList = createSlice({
},
})
export default userList.reducer
export const { getRequesting, getSuccess, getFailure } = userList.actions
export default membreList.reducer
export const { getRequesting, getSuccess, getFailure } = membreList.actions
export const fetchUserList = (): AppThunk => async (dispatch) => {
export const fetchMembreList = (): AppThunk => async (dispatch) => {
dispatch(getRequesting())
const { error, data } = await getUserList()
const { error, data } = await getMembreList()
if (error) {
dispatch(getFailure(error.message))
@@ -51,14 +49,14 @@ export const fetchUserList = (): AppThunk => async (dispatch) => {
progress: undefined,
})
} else {
dispatch(getSuccess(data as User[]))
dispatch(getSuccess(data as Membre[]))
}
}
const shouldFetchUserList = (state: AppState) => state.userList.readyStatus !== "success"
const shouldFetchMembreList = (state: AppState) => state.membreList.readyStatus !== "success"
export const fetchUserListIfNeed = (): AppThunk => (dispatch, getState) => {
if (shouldFetchUserList(getState())) return dispatch(fetchUserList())
export const fetchMembreListIfNeed = (): AppThunk => (dispatch, getState) => {
if (shouldFetchMembreList(getState())) return dispatch(fetchMembreList())
return null
}

View File

@@ -1,16 +1,16 @@
import { History } from "history"
import { connectRouter } from "connected-react-router"
import userList from "./userList"
import userData from "./userData"
import membreList from "./membreList"
import membre from "./membre"
import jeuJavList from "./jeuJavList"
import envieList from "./envieList"
// Use inferred return type for making correctly Redux types
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
export default (history: History) => ({
userList,
userData,
membreList,
membre,
jeuJavList,
envieList,
router: connectRouter(history) as any,