34 lines
1.1 KiB
TypeScript
34 lines
1.1 KiB
TypeScript
// A module author's supported UI source: it imports the public SDK and must typecheck cleanly
|
|
// under the exact browser project a module uses (`browser-react.json`, `"types": []`).
|
|
import {
|
|
defineModuleUi,
|
|
type ModuleUiHostContext,
|
|
type ModuleUiPrincipal,
|
|
} from "../../src/index.js";
|
|
|
|
function describePrincipal(principal: ModuleUiPrincipal): string {
|
|
return principal.kind === "authenticated" ? principal.userId : "anonymous";
|
|
}
|
|
|
|
export default defineModuleUi({
|
|
id: "example",
|
|
version: "0.1.0",
|
|
mount(container: Element, context: ModuleUiHostContext) {
|
|
container.textContent = describePrincipal(context.principal);
|
|
void context.api.request("records");
|
|
void context.permissions.has("example.records.read");
|
|
const subscription = context.realtime.subscribe<{ readonly count: number }>("record-count", {
|
|
onSnapshot(state, sequence) {
|
|
container.textContent = `${state.count}:${sequence}`;
|
|
},
|
|
onStatus(status) {
|
|
container.setAttribute("data-realtime", status);
|
|
},
|
|
});
|
|
return () => {
|
|
subscription.close();
|
|
container.textContent = "";
|
|
};
|
|
},
|
|
});
|