Où les composants frontaux peuvent être utilisés
Les composants frontaux peuvent s’afficher à deux emplacements au sein de Twenty :- Panneau latéral — Les composants frontaux non-headless s’ouvrent dans le panneau latéral droit. Il s’agit du comportement par défaut lorsqu’un composant frontal est déclenché depuis le menu de commande.
- Widgets (tableaux de bord et pages d’enregistrement) — Les composants frontaux peuvent être intégrés comme widgets dans les mises en page. Lors de la configuration d’un tableau de bord ou d’une page d’enregistrement, les utilisateurs peuvent ajouter un widget de composant frontal.
- L’associer à un élément de menu de commande — l’enregistre dans le menu de commande (Cmd+K) et, éventuellement, comme action rapide épinglée.
- L’intégrer comme widget dans une mise en page — le place sur la page de détails d’un enregistrement ou sur un tableau de bord.
Exemple de base
La façon la plus rapide de voir un composant frontal en action est de l’associer à undefineCommandMenuItem, afin qu’il apparaisse comme bouton d’action rapide dans le coin supérieur droit de la page :
src/front-components/hello-world.tsx
src/command-menu-items/hello-world.command-menu-item.ts
yarn twenty dev (ou en exécutant une seule fois yarn twenty dev --once), l’action rapide apparaît dans le coin supérieur droit de la page :

Champs de configuration
| Champ | Obligatoire | Description |
|---|---|---|
universalIdentifier | Oui | ID unique et stable pour ce composant |
component | Oui | Une fonction de composant React |
name | Non | Nom d’affichage |
description | Non | Description de ce que fait le composant |
isHeadless | Non | Définir sur true si le composant n’a pas d’interface visible (voir ci-dessous) |
Placer un composant frontal sur une page
Au-delà des commandes, vous pouvez intégrer un composant frontal directement dans une page d’enregistrement en l’ajoutant comme widget dans une mise en page. Voir mises en page pour plus de détails.Headless vs non-headless
Les composants frontaux existent en deux modes de rendu contrôlés par l’optionisHeadless :
Non-headless (par défaut) — Le composant affiche une interface visible. Lorsqu’il est déclenché depuis le menu de commande, il s’ouvre dans le panneau latéral. Il s’agit du comportement par défaut lorsque isHeadless est false ou omis.
Headless (isHeadless: true) — Le composant se monte de façon invisible en arrière-plan. Il n’ouvre pas le panneau latéral. Les composants headless sont conçus pour des actions qui exécutent une logique puis se démontent — par exemple, lancer une tâche asynchrone, naviguer vers une page ou afficher une fenêtre modale de confirmation. Ils s’associent naturellement aux composants Command du SDK décrits ci-dessous.
src/front-components/sync-tracker.tsx
null, Twenty n’affiche pas de conteneur pour celui-ci — aucun espace vide n’apparaît dans la mise en page. Le composant a toujours accès à tous les hooks et à l’API de communication de l’hôte.
Composants Command du SDK
Le packagetwenty-sdk fournit quatre composants utilitaires Command conçus pour les composants frontaux headless. Chaque composant exécute une action au montage, gère les erreurs en affichant une notification snackbar et démonte automatiquement le composant frontal une fois terminé.
Importez-les depuis twenty-sdk/command :
Command— Exécute un callback asynchrone via la propexecute.CommandLink— Navigue vers un chemin d’application. Props :to,params,queryParams,options.CommandModal— Ouvre une fenêtre modale de confirmation. Si l’utilisateur confirme, exécute le callbackexecute. Props :title,subtitle,execute,confirmButtonText,confirmButtonAccent.CommandOpenSidePanelPage— Ouvre une page spécifique du panneau latéral. Props :page,pageTitle,pageIcon.
Command pour exécuter une action depuis le menu de commande :
src/front-components/run-action.tsx
src/command-menu-items/run-action.command-menu-item.ts
CommandModal pour demander une confirmation avant l’exécution :
src/front-components/delete-draft.tsx
Appel d’une fonction logique
Les composants front s’exécutent côté navigateur dans un Web Worker isolé (sandboxed), tandis que les fonctions logiques s’exécutent côté serveur. Il n’y a aucun appel intra-processus direct entre les deux — à la place, un composant front appelle une fonction logique via HTTP. Une fonction logique déclarée avechttpRouteTriggerSettings est exposée sous le point de terminaison /s/ à ${TWENTY_API_URL}/s\<path>. Votre composant front appelle cette route avec le RestApiClient de twenty-client-sdk/rest, qui s’authentifie avec le TWENTY_APP_ACCESS_TOKEN que Twenty injecte dans le worker.
Le RestApiClient est conçu exactement pour cela. Il lit TWENTY_API_URL et TWENTY_APP_ACCESS_TOKEN depuis l’environnement du worker, ajoute l’en-tête Authorization: Bearer, sérialise et analyse le JSON, et déclenche une RestApiClientError lorsque le jeton ou l’URL est manquant ou que la réponse n’est pas de type 2xx — afin que vous n’ayez pas à réimplémenter ce boilerplate dans chaque composant.
Un composant front sans interface (headless) peut effectuer l’appel au montage via le composant Command, puis se démonter automatiquement :
src/front-components/sync-prs.tsx
httpRouteTriggerSettings.path de la fonction logique, préfixée par /s. Conservez isAuthRequired: true ; le client fournit le jeton d’accès de l’application que Twenty émet pour votre composant :
src/logic-functions/fetch-prs.logic-function.ts
TWENTY_API_URL et TWENTY_APP_ACCESS_TOKEN sont injectés automatiquement — voir Variables d’application. Comme les variables d’application secrètes ne sont jamais exposées aux composants front, conservez les clés d’API et les autres éléments sensibles dans la fonction logique, et non dans le composant front.Référence de RestApiClient
Importez RestApiClient depuis twenty-client-sdk/rest. Il appartient à la même famille de clients que CoreApiClient et MetadataApiClient, mais cible les routes HTTP de votre application au lieu de l’API GraphQL.
| Méthode | Description |
|---|---|
get(path, options?) | Envoie une requête GET |
post(path, body?, options?) | Envoie une requête POST |
put(path, body?, options?) | Envoie une requête PUT |
patch(path, body?, options?) | Envoie une requête PATCH |
delete(path, options?) | Envoie une requête DELETE |
request(method, path, options?) | Requête générique avec n’importe quelle méthode HTTP |
options accepte headers, query (un enregistrement de paramètres de chaîne de requête ; les valeurs nullish sont ignorées), et un AbortSignal via signal. Un objet body qui n’est pas de type FormData est automatiquement sérialisé en JSON. Sur un 401, le client actualise une fois le jeton d’accès via l’hôte puis retente la requête.
Par défaut, l’URL de base et le jeton sont résolus à partir de l’environnement. Passez des valeurs de remplacement (overrides) au constructeur lorsque nécessaire — par exemple dans les tests :
RestApiClientError exposant status, statusText, url et le body analysé :
Accéder au contexte d’exécution
Dans votre composant, utilisez les hooks du SDK pour accéder à l’utilisateur actuel, à l’enregistrement et à l’instance du composant :src/front-components/record-info.tsx
| Hook | Renvoie | Description |
|---|---|---|
useUserId() | string ou null | L’ID de l’utilisateur actuel |
useSelectedRecordIds() | string[] | Tous les ID des enregistrements sélectionnés (tableau vide si aucun n’est sélectionné) |
useRecordId() | string ou null | Obsolète. Utilisez useSelectedRecordIds() à la place |
useFrontComponentId() | string | L’ID de cette instance de composant |
useColorScheme() | 'light' ou 'dark' | Schéma de couleur actif de l’interface hôte (System est déjà résolu) |
useFrontComponentExecutionContext(selector) | variable | Accédez au contexte d’exécution complet avec une fonction sélecteur |
Variables d’application
Les variables d’application définies dansdefineApplication() avec isSecret: false sont disponibles dans les composants front via l’utilitaire getApplicationVariable :
src/front-components/greeting.tsx
process.env :
| Variable | Description |
|---|---|
TWENTY_API_URL | URL de base de l’API Twenty |
TWENTY_APP_ACCESS_TOKEN | Jeton de courte durée limité au rôle de votre application |
API de communication de l’hôte
Les composants frontaux peuvent déclencher la navigation, des modales et des notifications en utilisant des fonctions detwenty-sdk :
| Fonction | Description |
|---|---|
navigate(to, params?, queryParams?, options?) | Naviguer vers une page de l’application |
openSidePanelPage(params) | Ouvrir un panneau latéral |
closeSidePanel() | Fermer le panneau latéral |
openCommandConfirmationModal(params) | Afficher une boîte de dialogue de confirmation |
enqueueSnackbar(params) | Afficher une notification toast |
unmountFrontComponent() | Démonter le composant |
updateProgress(progress) | Mettre à jour un indicateur de progression |
src/front-components/archive-record.tsx
Travailler avec plusieurs enregistrements
UtilisezuseSelectedRecordIds() pour gérer plusieurs enregistrements sélectionnés. C’est utile pour les opérations groupées :
src/front-components/bulk-export.tsx
Ressources publiques
Les composants frontaux peuvent accéder aux fichiers du répertoirepublic/ de l’application à l’aide de getPublicAssetUrl :
Stylisation
Les composants frontaux prennent en charge plusieurs approches de stylisation. Vous pouvez utiliser :- Styles en ligne —
style={{ color: 'red' }} - Composants Twenty UI — à importer depuis
twenty-sdk/ui(Button, Tag, Status, Chip, Avatar, etc.) - Emotion — CSS-in-JS avec
@emotion/react - Styled-components — modèles
styled.div - Tailwind CSS — classes utilitaires
- Toute bibliothèque CSS-in-JS compatible avec React