# Exercices: Promises, async/await, Axios :::warning **FIRST OF ALL** Installez Axios :) `npm install axios` or `yarn add axios` -- **La documentation de Axios ici** https://github.com/axios/axios ::: ### Exercice 1: Promises #### 1.1 --- **Étape 1:** Créez un composant `RoomIsClean` qui: * Aura une prop `isClean` qui sera un boolean * Contiendra un `useState` qui sera une `String` * Affichera le `Text` suivant: "Room is {votre state}" ``` html <RoomIsClean isClean={false} /> ``` **Étape 2:** Dans le même fichier créez une fonction `isMyRoomClean` qui: * Prendra en paramètre un boolean `isClean` (celui venu des props) * Retournera une `Promise` résolue par `"clean"` si le boolean est vrai, rejeté par `"not clean"` s'il est faux * **À l'intérieur** de cette `Promise` simuler la latence en imbriquant votre code dans un `setTimeout` de 3 secondes ``` javascript const isMyRoomClean = (isClean) => {...} ``` **Étape 3:** Dans votre composant appelez votre fonction `isMyRoomClean` à l'intérieur d'un `useEffect`, puis faites le nécessaire pour afficher le message quand la promesse est résolue ou rejeté ``` javascript useEffect(() => { isMyRoomClean().then(res => { ... }).catch(err => { ... }) }, [props.isClean]) ``` | Props isClean| `true` | `false` | |---| -------- | -------- | | `<RoomIsClean>`| ![](https://i.imgur.com/7pAqp4n.gif)| ![](https://i.imgur.com/0qSDriV.gif) | #### 1.2 --- Reprenez l'exercice 1.1, dans le `useEffect` déclarez une fonction `fetchData` et utilisez la notation **async/await**, **try/catch** pour faire appel à votre promesse `isMyRoomClean` Si vous aviez utilisez cette notation dans l'exercice, utilisez la notation classique **then/catch** --- ### Exercice 2: Axios, Requête API ::: warning Au cours des prochains exercices nous allons utiliser l'API externe de test, JSON Placholder. -- **La documentation ici** https://jsonplaceholder.typicode.com/ ::: #### 2.0 --- Dans cet exercice 2 nous allons créer un composant `PostDetails` qui affichera les détails complet d'un post. **Étape 1:** * Créez ce composant `PostDetails`, il affichera un titre et une description * Stylez votre composant rapidement. **Étape 2:** * Créez un `useState` `post` initialisé à un objet vide pour le moment. * De même créez un `useEffect` vide avec un tableau vide comme dépendance ::: spoiler Voici le style pour créer l'ombre autour de la `<View>` ``` shadowOpacity: 0.2, shadowRadius: 10, shadowOffset: { height: 0, width: 0, }, backgroundColor: 'white', ``` ::: ![](https://i.imgur.com/yX3U9g9.png) #### 2.1 --- Requête GET Dans cette exercice nous allons récupérer le détail d'un post via son id. Pour cela nous allons utiliser la route `/posts/1` de JSON placeholder. Comme **spécifié dans la doc** cette route retourne comme résultat: ``` json { "userId": 1, "id": 1, "title": "...", "body": "..." } ``` **Étape 1:** * Importez axios dans votre fichier * Dans votre `useEffect` créez une fonction `fetchData` comme réalisé dans l'exercice 1. * Cette fonction fera appel à `axios.get()` avec la requête complète qui utilisera donc la route mentionnée plus haut. ::: danger N'oubliez pas la requête doit être une URL complète ! **Ex:** `https://....` Vous pouvez vous aidez de **la doc** mais aussi du diaporama ::: **Étape 2** * Si la requête est résolue, faites appel à `setPost` (qui viens de votre useState) avec pour paramètres `result.data` * Si elle est rejeté, afficher l'erreur dans la console et utilisez le mot clé `throw` avec l'erreur. * Enfin, dans votre titre et votre description affichez, `title` et `body` contenu alors dans votre state `post` `result` viens de: ``` javascript const result = await axios.get(...) ``` **ou** ``` javascript axios.get(...).then(result => {...}) ``` ![](https://i.imgur.com/FeajuDA.png) #### 2.2 --- Dans cet exercice, envoyez à votre composant une prop `id` qui sera l'id du post. Changez la route `/posts/1` par l'id que vous récupérez depuis les props pour obtenir un détail d'article différent. #### 2.3 --- En vous servant du composant créé jusqu'ici, afficher la liste de tout les posts. **Étape 1** * Replacez la prop `id` par une prop `item`. Cette item sera l'objet qui représente un post. * Vous pouvez désormais commenter/supprimer le useEffect qui récupère le détail d'un post via son id dans votre composant. * Votre constante `post` deviendra l'item passé en props. ::: spoiler ``` const post = {...props.item} ``` ::: <br /> **Étape 2** * Créez un composant `PostList` qui contiendra un `useState` nommé `posts` * De la même manière que dans l'exercice **2.1, étape 1** créez un `useEffect` et faites appel à la route `/posts` (cette route vous retourne un tableau de post) * Affichez cette liste en utilisant pour chaque itération votre composant `PostDetails` en lui passant comme propriété l'item du tableau courant. :::info Pour afficher la list vous pouvez utiliser la manière classique `array.map(...)` ou le composant `<FlatList>` de react-native ::: ![](https://i.imgur.com/YEj2Prk.gif) --- ### Exercice 3: Experimentations requête POST #### 3.1 --- ::: danger :warning: **Attention** :warning: Dans cette exercice nous allons utiliser la méthode POST pour notre requête. **Cependant** *JSONPlaceholder* étant une API publique, il n'est pas concrètement possible de créer une ressource, celle-ci sera cependant "falsifié" comme si elle avait été. ::: **Étape 1** * Créez une fonction `createNewPost` vide pour le moment * Dans le composant `PostList`, en dessous de votre liste, créez un bouton "New Post" qui appellera la fonction **Étape 2** * Dans la fonction, faite appelle à la route `/posts` **cette fois-ci avec la méthode POST** de axios. * Si cette promise est rejeté afficher en console l'erreur. * Si cette promise est résolue, afficher le retour de la réponse puis ajouter ce nouvelle élément comme premier élément de votre tableau `posts` ![](https://i.imgur.com/3JPFjFW.gif)