page
Un plugin peut ajouter sa propre entrée dans la page Réglages de Hodi. Cette entrée ouvre une page que le plugin dessine lui-même. Le plugin y met ce que chaque profil du foyer règle ou consulte pour lui-même : ses notes, ses statistiques, ses préférences pour le plugin.
Où dans Hodi
Dans Hodi, chaque profil a sa page Réglages. La page Réglages liste des entrées, rangées en six groupes : Lecture, Sujets, Toi, Foyer, Cet appareil et Hodi. Chaque entrée ouvre une page.
Un plugin peut ajouter sa propre entrée à cette liste. L'entrée du plugin porte le nom du plugin. Un clic sur l'entrée du plugin ouvre la page du plugin, que le plugin dessine lui-même.
Deux fichiers du plugin servent à cette entrée et à cette page :
plugin.jsondit où placer l'entrée du plugin, avec le champmenu.web/index.tsxdit ce que la page du plugin affiche, avec la clépagededefinePlugin.
Placer l'entrée
L'entrée du plugin se range dans l'un des six groupes de la page Réglages. Le champ menu de plugin.json choisit ce groupe, avec group. Le champ menu peut aussi choisir, avec after, l'entrée de Hodi après laquelle l'entrée du plugin se place.
"menu": {
"group": "you",
"after": "stats"
}Avec cet exemple, l'entrée du plugin va dans le groupe Toi, juste après l'entrée Statistiques.
Sans after, l'entrée du plugin va à la fin de son groupe. Sans menu, ou avec un groupe que Hodi ne connaît pas, l'entrée du plugin va à la fin du groupe Foyer.
Voici les six valeurs possibles de group. Pour chaque valeur, le nom du groupe dans la page Réglages, et les entrées de Hodi que ce groupe contient déjà, avec la valeur à donner à after pour placer l'entrée du plugin après l'une d'elles :
readingLe groupe Lecture. Ce groupe contient Lecture et affichage (reading), Thèmes (themes), Sources (sources) et Historique (history).
subjectsLe groupe Sujets. Ce groupe contient Sujets suivis (followed) et Sujets masqués (muted).
youLe groupe Toi. Ce groupe contient Mon profil (me), Statistiques (stats), Compte et données (account) et Partage (sharing).
householdLe groupe Foyer. Ce groupe contient Foyer (household), Profils (profiles) et IA et crédits (ai). C'est le groupe par défaut.
deviceLe groupe Cet appareil. Ce groupe contient Notifications (notifications) et Raccourcis clavier (shortcuts).
aboutLe groupe Hodi. Ce groupe contient Serveur (server) et À propos (about).
Dessiner la page
La page du plugin est un composant React, écrit dans la partie web du plugin (web/index.tsx). Le plugin donne ce composant à Hodi avec la clé page de definePlugin. Sans la clé page, la page Réglages n'affiche aucune entrée pour le plugin, même avec un champ menu dans plugin.json.
Pour que la page du plugin ressemble aux pages de Hodi, la page du plugin se construit avec les mêmes composants que Hodi :
SectionPagedessine la page, avec son titre et sa ligne d'introduction.SettingsCarddessine une carte, dans la page.SettingRowdessine une ligne, dans une carte.
import { SectionPage, SettingRow, SettingsCard, definePlugin } from 'hodi:sdk'
import { NotebookPen } from 'lucide-react'
const NotesPage = ({ layout }) => (
<SectionPage
title="Mes notes"
intro="Les notes prises en lisant."
layout={layout}
>
<SettingsCard>
<SettingRow label="Notes enregistrées" value="12" />
</SettingsCard>
</SectionPage>
)
definePlugin({
page: NotesPage,
menuIcon: NotebookPen
})Avec cet exemple, la page Réglages affiche une entrée pour le plugin, avec une icône de carnet. Un clic sur cette entrée ouvre la page Mes notes. La page Mes notes contient une carte, et cette carte contient une ligne Notes enregistrées : 12.
Les props
Hodi donne une seule prop au composant de la page du plugin : layout.
Sur un ordinateur, la page Réglages s'affiche en colonnes : la liste des entrées à gauche, la page ouverte à droite. Sur une tablette ou un téléphone, la page Réglages s'affiche page par page. La prop layout dit dans lequel de ces deux cas se trouve la page du plugin.
Le composant de la page n'a rien à faire de layout lui-même : il suffit de passer layout tel quel à SectionPage, qui s'occupe de la mise en page.
layout'desktop' | 'phone''desktop' quand la page Réglages s'affiche en colonnes, 'phone' quand la page Réglages s'affiche page par page. À passer tel quel à SectionPage.
L'icône et la ligne grise
Dans la liste de la page Réglages, chaque entrée a une icône à gauche de son nom, et une ligne grise sous son nom. Le nom de l'entrée du plugin est toujours le nom du plugin. L'icône et la ligne grise de l'entrée du plugin se choisissent avec deux autres clés de definePlugin, toutes les deux facultatives.
Voici les trois clés de definePlugin qui servent à la page Réglages :
pageComponentType<{ layout }>Le composant de la page du plugin, décrit plus haut. Sans cette clé, la page Réglages n'a pas d'entrée pour le plugin.
menuIcon?ComponentTypeL'icône à gauche du nom de l'entrée, une icône Lucide. Sans cette clé, Hodi affiche une pièce de puzzle.
menuHint?ComponentTypeLa ligne grise sous le nom de l'entrée, par exemple 12 notes. Sans cette clé, Hodi affiche la description du plugin.
menuHint est un composant, et pas un simple texte : le composant menuHint peut donc lire des données, par exemple le nombre de notes, et afficher ce nombre.
À savoir
- Qui voit l'entrée du plugin : les profils prévus par
audiencedansplugin.json. - Avec
audience: "admin": seul l'admin du foyer voit l'entrée du plugin et sa page. - Le titre de la page du plugin : le plugin le donne, avec
SectionPage. - Si la page du plugin plante : Hodi affiche un message à la place de cette page.