Criar a interface de extensão personalizada
Este procedimento descreve como criar a tela que os usuários realmente veem e concluir a conexão (“handshake”) com o Fusion.
Durante esse processo, é importante lembrar que sua extensão é executada em dois quadros: o quadro oculto registro e o quadro visível interface.
Para obter informações sobre quadros em relação a extensões personalizadas, consulte Quadros incluídos em uma Extensão de Interface do Usuário.
Para obter instruções sobre como criar o quadro de registro, consulte Criar um projeto para Extensibilidade da Interface do Usuário.
Rota entre os dois quadros
Ambos os quadros carregam o mesmo index.html; um pequeno roteador front-end decide qual componente mostrar com base no URL.
-
Configurar as rotas em
web-src/src/components/App.js. A parte essencial é:code language-jsx import { HashRouter as Router, Routes, Route } from "react-router-dom"; import ExtensionRegistration from "./ExtensionRegistration"; import DashboardWidget from "./DashboardWidget"; export default function App() { return ( <Router> <Routes> {/* Background frame: registers the extension with Fusion */} <Route index element={<ExtensionRegistration />} /> <Route path="index.html" element={<ExtensionRegistration />} /> {/* Visible frame: the URL you returned from getWidget() */} <Route path="my-widget" element={<DashboardWidget />} /> </Routes> </Router> ); }Essas rotas são mapeadas para a configuração anterior da seguinte maneira:
- A rota padrão (
index) renderizaExtensionRegistration, o quadro oculto que chamaregister(...). - A rota
my-widgetrenderizaDashboardWidget, sua interface do usuário visível. Isto corresponde àurl: "/index.html#/my-widget"que você retornou degetWidget()em a página anterior.
note NOTE As rotas e a URL getWidgetdevem estar de acordo. Se você alterar o nome da rota, altere ourltambém, ou o Fusion carregará uma página em branco. - A rota padrão (
-
Continue para Concluir o handshake com
attach.
Conclua o handshake com attach
Esta é a única linha mais importante na interface do usuário visível. Quando o Fusion abre o quadro da interface do usuário, ele aguarda o quadro “fazer check-in”. Seu código é verificado chamando attach({ id }).
Se isso for omitido, o Fusion expirará com um erro como “aguardando mensagem inicial do iframe de destino.”
-
Adicionar o seguinte a
web-src/src/components/DashboardWidget.js:code language-jsx import { useEffect, useState } from "react"; import { attach } from "@adobe/uix-guest"; import { extensionId } from "./Constants"; export default function DashboardWidget() { const [connection, setConnection] = useState(null); useEffect(() => { // Tell Fusion this UI frame is ready. Required. attach({ id: extensionId }) .then(setConnection) .catch((e) => console.error("attach failed", e)); }, []); if (!connection) { return <p>Connecting to Fusion...</p>; } return <h2>Hello from my Fusion extension!</h2>; }Esse código faz o seguinte:
attach({ id })retorna um objeto de conexão assim que Fusion responde. Recomendamos salvar, pois você o usará na próxima etapa para ler o contexto que o Fusion envia.- Até que a conexão seja resolvida, um curto “Conectando…” é exibida.
- Usa o mesmo
extensionIddefinido emConstants.js.
Neste ponto, você tem uma extensão de trabalho: ela registra, anexa e mostra uma mensagem. Tudo depois disso é sobre usar os dados que a Fusão oferece.
-
Continue para Ler os compartilhamentos de Fusão de contexto.
Ler o contexto Compartilhamentos do Fusion
Depois de anexada, a conexão expõe um contexto compartilhado com informações sobre o usuário, a organização e a equipe atuais. Você pode ler valores individuais com connection.sharedContext.get("<key>"):
const orgId = connection.sharedContext.get("imsOrgId");
const organization = connection.sharedContext.get("organization"); // full Fusion org
const user = connection.sharedContext.get("user"); // full Fusion user
Este exemplo mostra um exemplo completo e reativo que também é atualizado quando o usuário alterna entre organização ou equipe:
import { useEffect, useState } from "react";
import { attach } from "@adobe/uix-guest";
import { extensionId } from "./Constants";
const KEYS = ["imsOrgId", "imsUserId", "organization", "team", "user"];
function readContext(source) {
// sharedContext behaves like a Map (.get); the change event gives a plain object.
const get =
typeof source.get === "function" ? (k) => source.get(k) : (k) => source[k];
return Object.fromEntries(KEYS.map((k) => [k, get(k)]));
}
export default function DashboardWidget() {
const [context, setContext] = useState(null);
useEffect(() => {
let cleanup = () => {};
attach({ id: extensionId })
.then((connection) => {
// 1) initial values
setContext(readContext(connection.sharedContext));
// 2) react to org/team/user changes pushed by Fusion
const onChange = (event) =>
setContext(readContext(event?.detail?.context ?? connection.sharedContext));
connection.addEventListener("contextchange", onChange);
cleanup = () => connection.removeEventListener?.("contextchange", onChange);
})
.catch((e) => console.error("attach failed", e));
return () => cleanup();
}, []);
if (!context) return <p>Connecting to Fusion...</p>;
return (
<div>
<h2>{context.organization?.name ?? "No organization"}</h2>
<p>Signed in as {context.user?.name} ({context.user?.email})</p>
<p>IMS org: {context.imsOrgId}</p>
</div>
);
}
Lembre-se do seguinte:
- Ler valores iniciais de
connection.sharedContext.get(key)logo apósattach. - Inscreva-se em
contextchangepara permanecer sincronizado. O Fusion aciona esse evento sempre que a organização, a equipe ou o usuário ativos são alterados. Os novos valores chegam emevent.detail.context.
Para obter a lista completa de chaves e o que cada uma contém, consulte a Referência de contexto do Fusion.
Para continuar o processo de configuração da extensão personalizada, vá para A referência de contexto do Fusion.