People.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import React, {useState, useEffect} from 'react';
  2. import { useParams } from 'react-router';
  3. import {
  4. HashRouter as Router,
  5. Switch,
  6. Route,
  7. Link
  8. } from "react-router-dom";
  9. const People = () => {
  10. const [people, setPeople] = useState([]);
  11. const [loading, setLoading] = useState(true);
  12. const [error, setError] = useState('');
  13. const get_people = () => {
  14. return fetch('http://localhost:8000/person')
  15. .then(response => {
  16. if (response.ok) {
  17. return response;
  18. } else {
  19. return response.text()
  20. .then((text) => {
  21. throw new Error(text);
  22. });
  23. }
  24. })
  25. .then(response => {
  26. return response.json();
  27. })
  28. .catch(err => {
  29. console.log(err.message);
  30. });
  31. };
  32. const add_person = (nom, prenom) => {
  33. return fetch("http://localhost:8000/person",
  34. {
  35. method:"POST",
  36. body: JSON.stringify({lastname: nom, firstname: prenom}),
  37. headers: {
  38. 'Content-Type': 'application/json'
  39. }
  40. })
  41. .then(response => {
  42. if (response.ok) {
  43. return response;
  44. } else {
  45. return response.text()
  46. .then((text) => {
  47. throw new Error(text);
  48. });
  49. }
  50. })
  51. .then(response => {
  52. return response.json();
  53. })
  54. .catch(err => {
  55. console.log(err.message);
  56. });
  57. }
  58. const remove_person = (id) => {
  59. return fetch("http://localhost:8000/person/"+id,
  60. {
  61. method:"DELETE"
  62. })
  63. .then(response => {
  64. if (response.ok) {
  65. return response;
  66. } else {
  67. return response.text()
  68. .then((text) => {
  69. throw new Error(text);
  70. });
  71. }
  72. })
  73. .then(response => {
  74. setPeople(people => people.filter((i) => i.id != id));
  75. return response.json();
  76. })
  77. .catch(err => {
  78. console.log(err.message);
  79. });
  80. }
  81. const get_mails = (id) => {
  82. return fetch('http://localhost:8000/person/'+id+'/mailAddress')
  83. .then(response => {
  84. if (response.ok) {
  85. return response;
  86. } else {
  87. return response.text()
  88. .then((text) => {
  89. throw new Error(text);
  90. });
  91. }
  92. })
  93. .then(response => {
  94. return response.json();
  95. })
  96. .catch(err => {
  97. console.log(err.message);
  98. });
  99. }
  100. const get_phones = (id) => {
  101. return fetch('http://localhost:8000/person/'+id+'/phone')
  102. .then(response => {
  103. if (response.ok) {
  104. return response;
  105. } else {
  106. return response.text()
  107. .then((text) => {
  108. throw new Error(text);
  109. });
  110. }
  111. })
  112. .then(response => {
  113. return response.json();
  114. })
  115. .catch(err => {
  116. console.log(err.message);
  117. });
  118. }
  119. const Details = () => {
  120. const {id} = useParams();
  121. console.log("qs");
  122. const [phones, setPhones] = useState([]);
  123. const [mails, setMails] = useState([]);
  124. useEffect( () => {
  125. Promise.all([get_mails(id), get_phones(id)])
  126. .then(values => {
  127. setMails(values[0]);
  128. setPhones(values[1]);
  129. });
  130. },[id])
  131. return <>
  132. <h1> Courriels </h1>
  133. <ul>
  134. {
  135. mails.map(mail =>
  136. <li key={mail.id}>
  137. {mail.address} ({mail.type})
  138. </li>
  139. )}
  140. </ul>
  141. <h1> Téléphones </h1>
  142. <ul>
  143. {
  144. phones.map(phone =>
  145. <li key={phone.id}>
  146. {phone.number} ({phone.type})
  147. </li>
  148. )}
  149. </ul>
  150. </>
  151. };
  152. useEffect(() => {
  153. get_people()
  154. .then(data => {
  155. setPeople(data);
  156. setLoading(false);
  157. })
  158. .catch(err => {
  159. setError(err.message);
  160. setLoading(false);
  161. });
  162. }, []);
  163. const AddPeopleForm = ({add_person}) => {
  164. const [nom, setNom] = useState();
  165. const [prenom, setPrenom] = useState();
  166. const handleSubmit = (e) => {
  167. e.preventDefault();
  168. add_person(nom, prenom)
  169. .then(data => {
  170. setPeople( p => [... p, data]);
  171. }) .catch (e => {console.log(e.message)});
  172. }
  173. return (
  174. <form onSubmit={handleSubmit}>
  175. Prénom : <input type="text" value={prenom} onChange={e => setPrenom(e.target.value)}></input>
  176. Nom : <input type="text" value={nom} onChange={e => setNom(e.target.value)}></input>
  177. <button>Ajouter</button>
  178. </form>
  179. );
  180. }
  181. return <div>
  182. <h3>People</h3>
  183. <Route path="/people">
  184. <AddPeopleForm add_person={add_person}/>
  185. {
  186. loading ?
  187. 'Chargement...' :
  188. error ?
  189. 'Error d: ' + error :
  190. <ul>
  191. {people.map(p => <li>
  192. {p.firstname} {p.lastname} <button onClick={() => remove_person(p.id)}>Supprimer</button> <Link to={`/people/${p.id}`}>Détails</Link>
  193. </li>)}
  194. </ul>
  195. }</Route>
  196. <Route path="/people/:id">
  197. <hr />
  198. <Link to ="/people">Close</Link>
  199. <Details />
  200. </Route>
  201. </div>;
  202. };
  203. export default People;