6 changed files with 119 additions and 2 deletions
@ -0,0 +1,5 @@ |
|||||
|
import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; |
||||
|
import type { RootState, AppDispatch } from './store/store'; |
||||
|
|
||||
|
export const useAppDispatch = () => useDispatch<AppDispatch>(); |
||||
|
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector; |
||||
@ -0,0 +1,92 @@ |
|||||
|
import { createApi } from "@reduxjs/toolkit/query/react"; |
||||
|
import { gql } from "graphql-request"; |
||||
|
import { graphqlRequestBaseQuery } from "@rtk-query/graphql-request-base-query"; |
||||
|
|
||||
|
export interface CovidData { |
||||
|
infected: number; |
||||
|
deceased: number; |
||||
|
recovered: number; |
||||
|
quarantined: number; |
||||
|
tested: number; |
||||
|
created_at: Date; |
||||
|
} |
||||
|
|
||||
|
export interface GetAllDataResponse { |
||||
|
allData: CovidData[]; |
||||
|
} |
||||
|
|
||||
|
export interface GetDataByDateResponse { |
||||
|
searchData: CovidData[]; |
||||
|
} |
||||
|
|
||||
|
export interface GetDataResponse { |
||||
|
data: CovidData; |
||||
|
} |
||||
|
|
||||
|
export const api = createApi({ |
||||
|
baseQuery: graphqlRequestBaseQuery({ |
||||
|
url: "/graphql", |
||||
|
}), |
||||
|
endpoints: (builder) => ({ |
||||
|
getAllData: builder.query<CovidData[], {}>({ |
||||
|
query: () => ({ |
||||
|
document: gql` |
||||
|
query GetAllData { |
||||
|
allData { |
||||
|
infected |
||||
|
deceased |
||||
|
recovered |
||||
|
quarantined |
||||
|
tested |
||||
|
created_at |
||||
|
} |
||||
|
} |
||||
|
`,
|
||||
|
}), |
||||
|
transformResponse: (response: GetAllDataResponse) => |
||||
|
response.allData, |
||||
|
}), |
||||
|
getData: builder.query<CovidData, string>({ |
||||
|
query: (id) => ({ |
||||
|
document: gql` |
||||
|
query GetData($id: ID!) { |
||||
|
data(id: ${id}) { |
||||
|
infected |
||||
|
deceased |
||||
|
recovered |
||||
|
quarantined |
||||
|
tested |
||||
|
created_at |
||||
|
} |
||||
|
} |
||||
|
`,
|
||||
|
}), |
||||
|
transformResponse: (response: GetDataResponse) => response.data, |
||||
|
}), |
||||
|
getDataByDate: builder.query< |
||||
|
CovidData[], |
||||
|
{ beginDate: Date; endDate?: Date } |
||||
|
>({ |
||||
|
query: ({ beginDate, endDate }) => ({ |
||||
|
document: gql` |
||||
|
query GetDataByDate($beginDate: Date!, $endDate: Date) { |
||||
|
searchData(beginDate: $beginDate, endDate: $endDate) { |
||||
|
infected |
||||
|
deceased |
||||
|
recovered |
||||
|
quarantined |
||||
|
tested |
||||
|
created_at |
||||
|
} |
||||
|
} |
||||
|
`,
|
||||
|
variables: { beginDate, endDate }, |
||||
|
}), |
||||
|
transformResponse: (response: GetDataByDateResponse) => |
||||
|
response.searchData, |
||||
|
}), |
||||
|
}), |
||||
|
}); |
||||
|
|
||||
|
export const { useGetAllDataQuery, useGetDataQuery, useGetDataByDateQuery } = |
||||
|
api; |
||||
@ -0,0 +1,15 @@ |
|||||
|
import { configureStore } from '@reduxjs/toolkit'; |
||||
|
import { api } from '../services/covidDataApi'; |
||||
|
|
||||
|
const store = configureStore({ |
||||
|
reducer: { |
||||
|
[api.reducerPath]: api.reducer |
||||
|
}, |
||||
|
middleware: (getDefaultMiddleware) => |
||||
|
getDefaultMiddleware().concat(api.middleware), |
||||
|
}); |
||||
|
|
||||
|
export default store; |
||||
|
|
||||
|
export type RootState = ReturnType<typeof store.getState>; |
||||
|
export type AppDispatch = typeof store.dispatch; |
||||
Loading…
Reference in new issue