@tmf/service-desk-front (9.15.0)
Installation
@tmf:registry=npm install @tmf/service-desk-front@9.15.0"@tmf/service-desk-front": "9.15.0"About this package
@tmf/service-desk-front
UI React do módulo Service Desk da plataforma TMF (atendimento, tickets, kanban/lista/chat,
comentários, anexos, respostas prontas, fluxos/bot, métricas, inbox e configurações). Segue o
Modelo A dos pacotes de plataforma: componentes desacoplados que recebem o contrato canônico
(AppContract do @tmf/platform-core) + um SDApiClient. Adoção por configuração, não por código —
o produto host (Hub, TMF9) só instala o pacote, fornece o contrato/cliente e renderiza <ServiceDeskApp>.
A regra de negócio e os dados vivem no backend montado no host (tmf-service-desk-back,
rotas /api/service/* e /api/service-desk/*; ver ../back/INTEGRATION.md).
Versão: fonte única é o
package.json(e o exportPACKAGE_VERSION). Não escreva a versão à mão aqui.
1. Pré-requisitos
O pacote empacota @tmf/platform-core e @tmf/flow-ui no próprio bundle (tsup noExternal) —
o consumidor não os instala. Peer dependencies reais (package.json):
| peer | versão | observação |
|---|---|---|
react / react-dom |
>=18.0.0 |
obrigatório (singleton) |
@tiptap/react, @tiptap/starter-kit, @tiptap/pm, @tiptap/extension-mention, @tiptap/extension-image |
>=3.0.0 |
editor do composer; o host também declara @tiptap/suggestion (v3) — ver INTEGRATION.md §2 |
@tanstack/react-query, @xyflow/react, dompurify, lucide-react e sonner são dependencies
normais (o npm as instala junto). Se usar o editor de fluxos, importar @xyflow/react/dist/style.css.
2. Registry + instalação
O pacote é publicado no registry npm do Forgejo da TMF. No frontend do host, garanta o .npmrc:
# frontend/.npmrc
@tmf:registry=https://git.trademarketingforce.com/api/packages/TMF/npm/
legacy-peer-deps=true
Auth para instalar (NUNCA commitar o token — use env/CI):
//git.trademarketingforce.com/api/packages/TMF/npm/:_authToken=${FORGEJO_NPM_TOKEN}
Instalar (o pacote + os peers do tiptap):
npm i @tmf/service-desk-front
# peers do editor (tiptap v3) + @tiptap/suggestion — ver INTEGRATION.md §2
3. Como alcança o backend
O Service Desk roda no host, montado em memória a partir do tmf-service-desk-back. O front
consome os endpoints /api/service/* (tickets e vizinhos) — mais rotas em /api/service-desk/*
(ex.: mailboxes, import jobs) e outras famílias na raiz /api. Cada família traz o próprio
prefixo: ../back/INTEGRATION.md §4.4.
host frontend ─► <baseUrl>/api/service/* (createHttpClient do @tmf/platform-core)
│ injeta Authorization (Bearer via getToken) + X-Client-Code (multi-tenant)
▼
host /api/service/* (escopo do cliente → isolamento por tenant)
- O
baseUrle o token vêm doAppContract+getToken, ambos resolvidos peloServiceDeskProvider/ModuleProviderdo@tmf/platform-core. O client default (createDefaultServiceDeskClient;createHubServiceDeskClienté alias@deprecated) lêcontract.services[key="service-desk"].baseUrl(fallback/api/service) e injetaX-Client-Codequandocontract.tenant.isMultiTenant. - O
baseUrlé o prefixo onde a API responde naquele host (direto ou atrás de proxy); o pacote é o mesmo — só muda o contrato. Modo plug-and-play semAppContract:INTEGRATION.md§4 (Modo 1).
import { useAppContract } from '@tmf/platform-core'
import { ServiceDeskApp, createDefaultServiceDeskClient } from '@tmf/service-desk-front'
export function ServiceDeskPage() {
const { contract, loading } = useAppContract({
baseUrl: window.location.origin,
getToken: () => getAccessToken() ?? '',
})
if (loading || !contract) return <Loader />
return (
<ServiceDeskApp
contract={contract}
apiClient={createDefaultServiceDeskClient(contract, () => getAccessToken() ?? '')}
tenantMode="multi" // ou "single"
getToken={() => getAccessToken() ?? ''}
sections={['metricas', 'inbox', 'flows', 'settings', 'respostas']}
/>
)
}
Pré-requisitos no app host:
- Não é preciso
QueryClientProvider: o Provider monta um interno (propqueryClientpara compartilhar o do host). - Se usar o editor de fluxos, importar
import '@xyflow/react/dist/style.css'.
4. Adapter próprio (opcional)
O host pode mapear para a própria camada de API implementando a interface SDApiClient e injetando
via prop apiClient (ou client no ServiceDeskProvider):
import type { SDApiClient } from '@tmf/service-desk-front'
const myClient: SDApiClient = {
listTickets: (p) => myApi.tickets.list(p),
getTicket: (id) => myApi.tickets.get(id),
// … apenas os métodos que o produto usa
}
<ServiceDeskApp contract={contract} apiClient={myClient} tenantMode="single" />
5. Componentes exportados
- Top-level:
ServiceDeskApp,ServiceDeskProvider,useServiceDeskContext,useSDUI,useSDToast - Vistas de atendimento (complex):
ServiceDeskList,ServiceDeskKanban,ServiceDeskChat,TicketDetailModal,TicketTimeline,AttachmentList,TicketKBPanel - Composição:
TicketComposer,TicketSidebar,ViewModeToggle,SLACard,ImageLightbox - Visão de agente:
AgentStatusTabBar,AgentPriorityFilter,AgentChannelFilter,AgentKanbanCard,AgentSLABadge,SDMetricsDashboard,SDCannedResponseManager - Seções:
SDChannelsConfig,SDImportJobs,SDExportPanel - Configurações:
SDSettingsPanel,CategoriesSettings,TagsSettings,ReasonsSettings,PersonSourcesSettings,createDefaultSDSettingsGroups - Fluxos:
ServiceFlows,ServiceFlowEditor,FlowCanvas,FlowNodePalette,FlowToolbar,FlowPropertiesPanel,FlowTestPanel, nós (TriggerNode,AIAnalysisNode,ConditionNode,ResponseNode,ActionNode,WaitNode,HandoffNode,BusinessHoursNode,EndNode)- Somente leitura (TMFP-70362):
<ServiceFlowEditor readOnly />e<ServiceFlows readOnly />(padrãofalse). O editor esconde Testar/Salvar/Publicar/Despublicar e a paleta, trava nome, cliente, canvas (sem arrastar/conectar/apagar) e os campos do painel; a lista esconde criar/duplicar/excluir e mantém abrir. É só UX: o 403 do backend continua sendo a barreira.
- Somente leitura (TMFP-70362):
- Infra:
createDefaultServiceDeskClient(+ aliascreateHubServiceDeskClient),useServiceDeskRealtime,patchTicketCache,sdQueryKeys,useSDI18n,getSdCatalog,defaultSDUIPrimitives,mergeSDUI, constantesSD_*e tiposSD*
Detalhe de cada área em
FUNCIONALIDADES.md.
6. Checklist de adoção
.npmrccom registry Forgejo +legacy-peer-deps=true.npm i @tmf/service-desk-front+ peers do tiptap v3 e@tiptap/suggestion(§1).baseUrldo serviçoservice-deskno contrato apontando para onde o back montado responde.- Se usar fluxos, importar
@xyflow/react/dist/style.css. OServiceDeskProviderjá traz umQueryClientProviderinterno (propqueryClientpara compartilhar cache). - Renderizar
<ServiceDeskApp contract apiClient tenantMode getToken sections />. - Validar
tsc --noEmit+ smoke (listar/abrir/criar ticket, comentar, métricas) no QA do host.
Dúvidas de contrato/escopo:
../back/INTEGRATION.md(§4 montagem e §5.1 eixo de escopo).
Dependencies
Dependencies
| ID | Version |
|---|---|
| @tanstack/react-query | ^5.0.0 |
| @xyflow/react | ^12.0.0 |
| dompurify | ^3.0.0 |
| lucide-react | ^0.400.0 |
| sonner | ^1.0.0 |
Development dependencies
| ID | Version |
|---|---|
| @tiptap/extension-image | ^3.29.1 |
| @tiptap/extension-mention | ^3.27.3 |
| @tiptap/pm | ^3.27.3 |
| @tiptap/react | ^3.27.3 |
| @tiptap/starter-kit | ^3.27.3 |
| @tmf/flow-ui | file:../../flow-ui |
| @tmf/platform-core | file:../../platform-core |
| @types/dompurify | ^3.0.5 |
| @types/react | ^18.2.47 |
| @types/react-dom | ^18.2.18 |
| tsup | ^8.5.1 |
| typescript | ^5.3.3 |
Peer dependencies
| ID | Version |
|---|---|
| @tiptap/extension-image | >=3.0.0 |
| @tiptap/extension-mention | >=3.0.0 |
| @tiptap/pm | >=3.0.0 |
| @tiptap/react | >=3.0.0 |
| @tiptap/starter-kit | >=3.0.0 |
| @tmf/design-tokens | >=0.6.0 |
| react | >=18.0.0 |
| react-dom | >=18.0.0 |