Onde os componentes de front-end podem ser usados
Os componentes de front-end podem ser renderizados em dois locais dentro do Twenty:- Painel lateral — Componentes de front-end não headless abrem no painel lateral direito. Este é o comportamento padrão quando um componente de front-end é acionado pelo menu de comandos.
- Widgets (painéis e páginas de registro) — Componentes de front-end podem ser incorporados como widgets dentro de layouts de página. Ao configurar um painel ou o layout de uma página de registro, os usuários podem adicionar um widget de componente de front-end.
- Associe-o a um item do menu de comandos — registra-o no menu de comandos (Cmd+K) e, opcionalmente, como uma ação rápida fixada.
- Incorpore-o como um widget em um layout de página — posiciona-o na página de detalhes de um registro ou em um painel.
Exemplo básico
A maneira mais rápida de ver um componente de front-end em ação é associá-lo a umdefineCommandMenuItem, para que ele apareça como um botão de ação rápida no canto superior direito da página:
src/front-components/hello-world.tsx
src/command-menu-items/hello-world.command-menu-item.ts
yarn twenty dev (ou executando uma única vez o yarn twenty dev --once), a ação rápida aparece no canto superior direito da página:

Campos de configuração
| Campo | Obrigatório | Descrição |
|---|---|---|
universalIdentifier | Sim | ID único e estável para este componente |
component | Sim | Uma função de componente React |
name | Não | Nome de Exibição |
description | Não | Descrição do que o componente faz |
isHeadless | Não | Defina como true se o componente não tiver interface visível (veja abaixo) |
Colocando um componente de front-end em uma página
Além de comandos, você pode incorporar um componente de front-end diretamente em uma página de registro adicionando-o como um widget em um layout de página. Veja Layouts de página para detalhes.Headless vs não headless
Os componentes de front-end têm dois modos de renderização controlados pela opçãoisHeadless:
Não headless (padrão) — O componente renderiza uma interface visível. Quando acionado pelo menu de comandos, ele é aberto no painel lateral. Este é o comportamento padrão quando isHeadless é false ou omitido.
Headless (isHeadless: true) — O componente é montado de forma invisível em segundo plano. Ele não abre o painel lateral. Componentes headless são projetados para ações que executam lógica e, em seguida, se desmontam — por exemplo, executar uma tarefa assíncrona, navegar para uma página ou exibir um modal de confirmação. Eles se combinam naturalmente com os componentes Command do SDK descritos abaixo.
src/front-components/sync-tracker.tsx
null, o Twenty ignora renderizar um contêiner para ele — nenhum espaço vazio aparece no layout. O componente ainda tem acesso a todos os hooks e à API de comunicação do host.
Componentes Command do SDK
O pacotetwenty-sdk fornece quatro componentes auxiliares Command projetados para componentes de front-end headless. Cada componente executa uma ação ao montar, trata erros exibindo uma notificação de snackbar e desmonta automaticamente o componente de front-end ao concluir.
Importe-os de twenty-sdk/command:
Command— Executa um callback assíncrono via a propexecute.CommandLink— Navega para um caminho do app. Props:to,params,queryParams,options.CommandModal— Abre um modal de confirmação. Se o usuário confirmar, executa o callbackexecute. Props:title,subtitle,execute,confirmButtonText,confirmButtonAccent.CommandOpenSidePanelPage— Abre uma página específica do painel lateral. Props:page,pageTitle,pageIcon.
Command para executar uma ação a partir do menu de comandos:
src/front-components/run-action.tsx
src/command-menu-items/run-action.command-menu-item.ts
CommandModal para solicitar confirmação antes de executar:
src/front-components/delete-draft.tsx
Chamando uma função lógica
Os componentes de front são executados no navegador em um Web Worker isolado, enquanto as funções lógicas são executadas no servidor. Não há chamada direta no mesmo processo entre os dois — em vez disso, um componente de front acessa uma função lógica via HTTP. Uma função lógica declarada comhttpRouteTriggerSettings é exposta sob o endpoint /s/ em ${TWENTY_API_URL}/s\<path>. Seu componente de front chama essa rota com o RestApiClient de twenty-client-sdk/rest, que autentica com o TWENTY_APP_ACCESS_TOKEN que a Twenty injeta no worker.
O RestApiClient foi criado exatamente para isso. Ele lê TWENTY_API_URL e TWENTY_APP_ACCESS_TOKEN do ambiente do worker, adiciona o cabeçalho Authorization: Bearer, serializa e analisa JSON e lança um RestApiClientError quando o token ou a URL estão ausentes ou a resposta não é 2xx — para que você não precise reimplementar esse boilerplate em todos os componentes.
Um componente de front headless pode executar a chamada ao montar via o componente Command e, em seguida, desmontar automaticamente:
src/front-components/sync-prs.tsx
httpRouteTriggerSettings.path da função de lógica, prefixado com /s. Mantenha isAuthRequired: true; o cliente fornece o token de acesso do app que o Twenty emite para o seu componente:
src/logic-functions/fetch-prs.logic-function.ts
TWENTY_API_URL e TWENTY_APP_ACCESS_TOKEN são injetados automaticamente — consulte Variáveis de aplicação. Como as variáveis de aplicação secretas nunca são expostas aos componentes de front, mantenha as chaves de API e outra lógica sensível na função lógica, não no componente de front.Referência do RestApiClient
Importe RestApiClient de twenty-client-sdk/rest. Ele pertence à mesma família de clientes que CoreApiClient e MetadataApiClient, mas tem como alvo as rotas HTTP do seu app em vez da API GraphQL.
| Método | Descrição |
|---|---|
get(path, options?) | Envia uma requisição GET |
post(path, body?, options?) | Envia uma requisição POST |
put(path, body?, options?) | Envia uma requisição PUT |
patch(path, body?, options?) | Envia uma requisição PATCH |
delete(path, options?) | Envia uma requisição DELETE |
request(method, path, options?) | Requisição genérica com qualquer método HTTP |
options aceita headers, query (um registro de parâmetros de query string; valores nulos ou indefinidos são ignorados) e um AbortSignal via signal. Um objeto body que não seja FormData é serializado em JSON automaticamente. Em um 401, o cliente atualiza o access token uma vez por meio do host e tenta a requisição novamente.
A URL base e o token são resolvidos do ambiente por padrão. Passe substituições (overrides) para o construtor quando necessário — por exemplo, em testes:
RestApiClientError que expõe status, statusText, url e o body analisado:
Acessando o contexto de execução
Dentro do seu componente, use hooks do SDK para acessar o usuário atual, o registro e a instância do componente:src/front-components/record-info.tsx
| Hook | Retorna | Descrição |
|---|---|---|
useUserId() | string ou null | O ID do usuário atual |
useSelectedRecordIds() | string[] | Todos os IDs dos registros selecionados (array vazio se nenhum estiver selecionado) |
useRecordId() | string ou null | Obsoleto. Use useSelectedRecordIds() em vez disso |
useFrontComponentId() | string | O ID desta instância do componente |
useColorScheme() | 'light' ou 'dark' | O esquema de cores ativo da interface do host (System já está resolvido) |
useFrontComponentExecutionContext(selector) | varia | Acesse o contexto de execução completo com uma função seletora |
Variáveis de aplicação
Variáveis de aplicação definidas emdefineApplication() com isSecret: false estão disponíveis nos componentes de front por meio do utilitário getApplicationVariable:
src/front-components/greeting.tsx
process.env:
| Variável | Descrição |
|---|---|
TWENTY_API_URL | URL base da API da Twenty |
TWENTY_APP_ACCESS_TOKEN | Token de curta duração limitado ao escopo do papel do seu app |
API de comunicação do host
Componentes de front-end podem acionar navegação, modais e notificações usando funções detwenty-sdk:
| Função | Descrição |
|---|---|
navigate(to, params?, queryParams?, options?) | Navegar para uma página no app |
openSidePanelPage(params) | Abrir um painel lateral |
closeSidePanel() | Fechar o painel lateral |
openCommandConfirmationModal(params) | Mostrar um diálogo de confirmação |
enqueueSnackbar(params) | Mostrar uma notificação do tipo toast |
unmountFrontComponent() | Desmontar o componente |
updateProgress(progress) | Atualizar um indicador de progresso |
src/front-components/archive-record.tsx
Trabalhando com vários registros
UseuseSelectedRecordIds() para lidar com vários registros selecionados. Isso é útil para operações em lote:
src/front-components/bulk-export.tsx
Recursos públicos
Componentes de front-end podem acessar arquivos do diretóriopublic/ do app usando getPublicAssetUrl:
Estilização
Componentes de front-end suportam várias abordagens de estilização. Você pode usar:- Estilos inline —
style={{ color: 'red' }} - Componentes de UI do Twenty — importe de
twenty-sdk/ui(Button, Tag, Status, Chip, Avatar e mais) - Emotion — CSS-in-JS com
@emotion/react - Styled-components — padrões
styled.div - Tailwind CSS — classes utilitárias
- Qualquer biblioteca CSS-in-JS compatível com React