From 5edf5e70696cf8f1dec8c1a7e8e3b6092d710077 Mon Sep 17 00:00:00 2001 From: Divlo Date: Fri, 20 Mar 2020 18:26:55 +0100 Subject: [PATCH] frontend: Affichage dynamique des fonctions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TODO: Rendre fonctionnel la rechercher et le tri par catégorie --- .../components/FunctionCard/FunctionCard.css | 3 + frontend/config/api.js | 11 ++ frontend/config/config.js | 1 + frontend/package-lock.json | 31 +++++ frontend/package.json | 1 + frontend/pages/functions.js | 112 ++++++++++++------ frontend/public/css/general.css | 19 +++ .../images/functions/weatherRequest.png | Bin 16375 -> 0 bytes 8 files changed, 141 insertions(+), 37 deletions(-) create mode 100644 frontend/config/api.js create mode 100644 frontend/config/config.js delete mode 100644 frontend/public/images/functions/weatherRequest.png diff --git a/frontend/components/FunctionCard/FunctionCard.css b/frontend/components/FunctionCard/FunctionCard.css index 63c6d9d..939fb21 100644 --- a/frontend/components/FunctionCard/FunctionCard.css +++ b/frontend/components/FunctionCard/FunctionCard.css @@ -27,6 +27,9 @@ } } +.FunctionCard__image { + width: 150px; +} .FunctionCard__title { font-size: 1.4em; margin: 0; diff --git a/frontend/config/api.js b/frontend/config/api.js new file mode 100644 index 0000000..81b78c3 --- /dev/null +++ b/frontend/config/api.js @@ -0,0 +1,11 @@ +import axios from 'axios'; +import { API_URL } from './config'; + +const api = axios.create({ + baseURL: API_URL, + headers: { + 'Content-Type': 'application/json' + } +}); + +export default api; \ No newline at end of file diff --git a/frontend/config/config.js b/frontend/config/config.js new file mode 100644 index 0000000..f334f3c --- /dev/null +++ b/frontend/config/config.js @@ -0,0 +1 @@ +export const API_URL = "http://localhost:8080"; \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 775e687..225a12e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1796,6 +1796,37 @@ "postcss-value-parser": "^4.0.2" } }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 4f962ae..b2f8f14 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,6 +9,7 @@ }, "dependencies": { "@zeit/next-css": "^1.0.1", + "axios": "^0.19.2", "next": "9.3.1", "next-fonts": "^1.0.3", "react": "16.13.0", diff --git a/frontend/pages/functions.js b/frontend/pages/functions.js index 324adb7..c8654c2 100644 --- a/frontend/pages/functions.js +++ b/frontend/pages/functions.js @@ -1,48 +1,86 @@ -import { Fragment } from 'react'; +import { Fragment, useState, useEffect } from 'react'; import HeadTag from '../components/HeadTag'; import FunctionCard from '../components/FunctionCard/FunctionCard'; import '../public/css/pages/functions.css'; +import { API_URL } from '../config/config'; +import api from '../config/api'; -const Functions = () => ( - - +const Functions = () => { + + const [categories, setCategories] = useState([]); + + const [functions, setFunctions] = useState([]); + const [isLoadingFunctions, setLoadingFunctions] = useState(true); + const [pageFunctions, setPageFunctions] = useState(1); + const [hasMoreFunctions, sethasMoreFunctions] = useState(false); + + // Récupère les catégories + useEffect(() => { + api.get('/categories') + .then((result) => { + setCategories(result.data); + }) + .catch((error) => console.error(error)); + }, []); -
+ // Récupère les fonctions + useEffect(() => { + api.get(`/functions?page=${pageFunctions}&limit=10`) + .then((result) => { + setLoadingFunctions(false); + sethasMoreFunctions(result.data.hasMore); + setFunctions([...functions, ...result.data.rows]); + }) + .catch((error) => console.error(error)); + }, [pageFunctions]); -
-

Fonctions

-
+ const loadMore = () => { + setLoadingFunctions(true); + setPageFunctions(pageFunctions + 1); + } -
- - -
+ return ( + + + +
+
+

Fonctions

+
+ +
+ + +
+ +
-
- {/* TODO: API Call to fetch data */} - - - - - - - - - - - - + {functions.map((f) => ( + + ))} + + { + !isLoadingFunctions && hasMoreFunctions + ? + + : !hasMoreFunctions ? + null + : +

Chargement...

+ } +
-
-
-); + + ); +} export default Functions; \ No newline at end of file diff --git a/frontend/public/css/general.css b/frontend/public/css/general.css index 738cfae..4591285 100644 --- a/frontend/public/css/general.css +++ b/frontend/public/css/general.css @@ -72,4 +72,23 @@ a, .important { background-clip: padding-box; border: 1px solid #ced4da; border-radius: .5em; +} +.btn { + cursor: pointer; + border: 1px solid transparent; + padding: .375rem .75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: .25rem; + transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; +} +.btn-dark:hover { + color: #fff; + background-color: #23272b; + border-color: #1d2124; +} +.btn-dark { + color: #fff; + background-color: #343a40; + border-color: #343a40; } \ No newline at end of file diff --git a/frontend/public/images/functions/weatherRequest.png b/frontend/public/images/functions/weatherRequest.png deleted file mode 100644 index 06530db089b2894d1ae24890f974ab6d15a531e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16375 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 FV1hXOd%*wz