diff --git a/.eslintignore b/.eslintignore index 9c30e8e44376c66e72229082fd69fd971524aa06..465054d8cb71842d55437e2fbdab15b12b3e0558 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,4 +4,5 @@ # Auto generated by React serviceWorker.* -setupTests.* \ No newline at end of file +setupTests.* +setupProxy.* \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index fa2b8b6f56e084cbc2819d3c6385790ab2b843cc..1809a4e2106aef7b676b8dd119da39e14f77a134 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2940,6 +2940,14 @@ "hoist-non-react-statics": "^3.3.0" } }, + "@types/http-proxy": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", + "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", + "requires": { + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -8563,14 +8571,55 @@ } }, "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.5.tgz", + "integrity": "sha512-CKzML7u4RdGob8wuKI//H8Ein6wNTEQR7yjVEzPbhBLGdOfkfvgTnp2HLnniKBDP9QW4eG10/724iTWLBeER3g==", "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "@types/http-proxy": "^1.17.4", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.19", + "micromatch": "^4.0.2" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } } }, "http-signature": { @@ -16914,6 +16963,17 @@ } } }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, "is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", diff --git a/package.json b/package.json index 2204cce9fba948b65c7b531ee9c3bb929f15f717..337d77d817d78cf3920f2b1503b53dbf8d31c583 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "dependencies": { "@material-ui/core": "^4.11.0", "axios": "^0.20.0", + "http-proxy-middleware": "^1.0.5", "react": "^16.13.1", "react-dom": "^16.13.1", "react-hook-form": "^6.5.3", @@ -82,6 +83,5 @@ "prettier-plugin-organize-imports": "^1.1.1", "prettier-plugin-packagejson": "^2.2.5", "prettier-plugin-sh": "^0.5.0" - }, - "proxy": "http://localhost:8000" + } } diff --git a/src/core/App.tsx b/src/core/App.tsx index dfb1d8d6f70452bd905829aa157d751f5e7429bb..f77574f07bfc0c9e1ecd48ba9a8dcebbb27b78d9 100644 --- a/src/core/App.tsx +++ b/src/core/App.tsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react'; import { BrowserRouter as Router } from 'react-router-dom'; import styled from 'styled-components'; -import useGetNewsList from '../hooks/useGetNewsList'; +import useAddNews from '../hooks/useAddNews'; import Footer from './components/Footer'; import Header from './components/Header'; import MainRouting from './components/MainRouting'; @@ -18,15 +18,15 @@ const MainContent = styled.div` `; function App() { - const [response, getNewsList] = useGetNewsList(); + const [response, addNews] = useAddNews(); useEffect(() => { - getNewsList(); - }, [getNewsList]); + addNews({ body: { title: 'Testing', text: 'Test Test TEST' } }); + }, [addNews]); useEffect(() => { if (response.data) { - console.log(response.data[0].text); + console.log(response.data.text); } }, [response.data]); diff --git a/src/hooks/types.ts b/src/hooks/types.ts index 4eafda4a634214a954938d97ebafbfeb230a8e3f..d639a344b70e94866b43d4923f40304dcbb6421c 100644 --- a/src/hooks/types.ts +++ b/src/hooks/types.ts @@ -17,6 +17,7 @@ export interface RequestParams { params?: any; args?: any; } + export type ApiRequest<T> = (params: RequestParams) => AxiosPromise<T>; export type Refetch = (params?: RequestParams) => void; diff --git a/src/hooks/useAddNews.ts b/src/hooks/useAddNews.ts new file mode 100644 index 0000000000000000000000000000000000000000..0afeea1a19ca924ff4bee70407b2c9e92f41a9ff --- /dev/null +++ b/src/hooks/useAddNews.ts @@ -0,0 +1,12 @@ +import { INews } from './types'; +import useRequest from './useRequest'; +import userRestQueries from './useRestQueries'; + +const useAddNews = () => { + const { post } = userRestQueries(); + const request = post<INews>('/api/v1/news'); + + return useRequest<INews>({ request }); +}; + +export default useAddNews; diff --git a/src/hooks/useRequest.ts b/src/hooks/useRequest.ts index 04963c44cb754f94d83b6ade0496ceb55260e6e5..6e41e58f6add946cf3015c953537ab50a9879353 100644 --- a/src/hooks/useRequest.ts +++ b/src/hooks/useRequest.ts @@ -1,16 +1,12 @@ import { useCallback, useEffect, useState } from 'react'; import { Refetch, RequestArgs, ResponseData } from './types'; -function useRequest<T = any>({ - request, - initialData, - initialParams, -}: RequestArgs<T>): [ResponseData<T>, Refetch] { +function useRequest<T = any>({ request, initialData }: RequestArgs<T>): [ResponseData<T>, Refetch] { const [data, setData] = useState(initialData); const [isLoading, setIsLoading] = useState(false); const [isError, setIsError] = useState(false); const [fetching, setFetching] = useState(false); - const [requestParams, setRequestParams] = useState(initialParams ?? {}); + const [requestParams, setRequestParams] = useState({}); const refetch = useCallback((newParams?) => { setRequestParams(newParams ?? {}); diff --git a/src/setupProxy.js b/src/setupProxy.js new file mode 100644 index 0000000000000000000000000000000000000000..a4b1c75f070cdcf2248b8bdef529c9b826bc4cb3 --- /dev/null +++ b/src/setupProxy.js @@ -0,0 +1,11 @@ +const { createProxyMiddleware } = require('http-proxy-middleware'); + +module.exports = function (app) { + app.use( + '/api/v1', + createProxyMiddleware({ + target: 'http://localhost:8000', + changeOrigin: true, + }), + ); +};