De nombreux guides permettent de démarrer facilement une nouvelle application React JS ou Next JS, cet article va se concentrer uniquement sur le code lié aux appels à l’api Notion.
Sur la capture ci-dessus on voit que la page “A vos lunettes !!” est placée directement à la racine du Workspace, c’est la page principale, le point d’entrée du blog
C’est d’ailleurs sur cette page que nous avons activé la connexion avec l’intégration créée comme expliqué dans cet
L’ID figurant dans l’url xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx est notre HOMEPAGE_ID
DATABASE_ID : L’identifiant de la base de donnée des articles
Comme pour le HOMEPAGE_ID, il faut cliquer sur “copier le lien” au niveau du noeud “Article” sous la page “A vos lunettes !!” et extraire l’ID de l’url
Structure du projet
Notre projet est découpé de la façon suivante :
Dossier “lib”
Le dossier lib contient la logique pour appeler l’api Notion via le SDK.
Par défaut le SDK Notion n’utilise pas “
fetch
” pour faire les appels HTTP, pourtant côté NextJS il est intéressant de l’utiliser car cela donne accès à des fonctionnalités de mise en cache automatique.
Nous créons donc une méthode
fetchWrapper
qui va nous permettre de préciser au SDK Notion que l’on souhaite utiliser
fetch
:
Nous créons ensuite une méthode
getPageDetails
qui permet de récupérer les propriétés et le détail d’une page :
On note qu’à l’instanciation du client on fournit la méthode
fetch
en paramètre du constructeur
Nous créons également une méthode
getArticles
qui permet de récupérer les pages contenues dans la base de donnée des articles :
Dossier “classes” et “interfaces”
Quand le SDK Notion est appelé, il renvoie des objets “response” (PageObjectResponse, BlockObjectResponse…). Pour faciliter l’affichage des données, nous créons des classes TypeScript intermédiaires qui vont parcourir les objets “response” et exposer la donnée dans des propriétés exploitables facilement.
Exemple avec le titre d’une page
Le titre d’une page faire partie de la liste des “properties” de l’objet “PageObjectResponse”
Par défaut, quand la page est l’enfant d’une base de donnée, le titre est stocké dans la propriété qui se nomme “Name” sinon le titre est stocké dans la propriété qui se nomme “title”
Une fois la propriété contenant le titre identifiée, nous exploitons le champ “plain_text”
On note l’utilisation d’une interface ITitle, le SDK Notion ayant omis d’exporter un type qui correspond au titre, nous créons donc une interface par souci de propreté (pour éviter les Any…) :
Exemple avec la description de l’article
Pour afficher une description de l’article sur la page qui liste les articles, on va chercher le premier bloc de type “Paragraph” dans la page, ce qui donne :
Toutes les classes suivent une logique similaire en s’appuyant sur la documentation Notion.
Pour construire une page complète, nous n’avons plus qu’à instancier toutes nos classes Notion de la façon suivante :
Dossier “components”
La logique des composants est propre à chaque application et s’occupe du rendu des données.
A titre d’exemple, le composant Article.tsx qui affiche la tuile d’une article sur la vue liste fonctionne de la façon suivante :
Le composant prend en paramètre l’ID de la page et appelle la méthode
getPageDetails
détaillée plus haut pour extraire les détails de l’article
Fonctionnement des pages
La page qui liste les articles fonctionne de la façon suivante :
Le composant appelle la méthode
getArticles
détaillée plus haut qui liste les articles, et il boucle sur la liste des pages. (Une page = un article dans la base de donnée)
La page détail d’un article fonctionne de la façon suivante :
Le composant appelle la méthode
getPageDetails
pour l’ID qui a été cliqué, et il boucle sur la liste des blocs contenu dans la page afin d’afficher tout l’article.
La méthode getPageDetails est appelé plusieurs fois dans les composants, mais NextJs s’occupe de la mise en cache comme détaillé
L’api Notion et le SDK associé sont assez simple à utiliser mais la mise en place d’un blog complet est une tâche assez conséquente. Pourtant le jeu en vaut la chandelle car une fois la mécanique en place, vous profitez de la fluidité de l’outil Notion pour éditer vos articles sans avoir à vous connecter à un CMS dédié.