Skip to main content

Tool API

Bambuser product: Video Consultation / Live

An API to provide custom User Interface Tools from your app

Replacement of built-in tools

Any tool that the app would like to provide a replacement for must be registered in App manifest using the {hostId}.tools property, see User Interface Tools for the available types you can replace

Example tool registration in App manifest:

{
"permissions": [
"callsWidget:tool.write",
"callsAgentTool:tool.write"
],
"url": {
"type": "module",
"src": "https://your-app-domain.com/main.js"
},
"callsWidget": {
"tools": [{
"id": "my-custom-vto-session-tool",
"type": "vto-session"
}]
},
"callsAgentTool": {
"tools": [{
"id": "my-custom-vto-session-tool",
"type": "vto-session"
}]
}
}

Methods

createTool()

Permission: callsWidget:tool.write / callsAgentTool:tool.write
Context: Main app

Creates a custom tool with the view provided by your app.

Parameters

  • id - String for the id associated with the tool, required when creating a built-in tool replacement
  • label - Text string for the title and menu action label
  • viewUrl - Url to the tool's view, must have the same origin as the URL to your app's main entrypoint

Return value

A promise whose fulfillment handler will receive an instance of a Tool view.

Example

const { toolApi } = await bambuserAppFramework.getContext();

const tool = await toolApi.createTool({
label: 'My tool',
url: 'https://example.com/tool.html',
});

Events

provide-instance

Permission: callsWidget:tool.write / callsAgentTool:tool.write
Context: Main app

When there are one or more built-in tools that the app should replace, this event will be fired so you can provide the replacement tool view(s)

Event properties

  • id - The id corresponding to the tool registration in App manifest that should be provided

Event return value

It is expected that the event handler will return a tool view created by createTool() with the id provided by the event

Example

const { toolApi } = await bambuserAppFramework.getContext();

toolApi.on('provide-instance', async ({ id }) => {
const tool = await toolApi.createTool({
id, // Must match the requested id, corresponds to the id for the tool added in App Manifest
label: 'My tool',
viewUrl: `http://your-app-domain.com/custom-tool/${id}.html`,
});

tool.on('open', () => {
console.log(`Tool ${id} was opened`);
});

tool.on('close', () => {
console.log(`Tool ${id} was closed`);
});

return tool;
});

Tool view

A tool view is a specific tool added via the Tool API and is available from both main app and tool view context.

As a tool runs in a separate context, referred to as the tool view context, communication between the tool view context and main app context can be achieved with a bi-directional message channel, see emit() / postMessage() / message. Keep in mind that the tool life cycle is usually dependent upon user interactions, so it can be a good idea to communicate essential UI state with main app context so a tool can be closed and opened into the same state. It's also a good idea to perform long running tasks in main app context as user can at any time decide to look at something else for a while and the tool view will be removed and any ongoing task will be aborted.

Example tool view:

<!DOCTYPE html>
<html lang="en" className="bam-ui">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Custom tool</title>
<link rel="stylesheet" href="https://app-framework.bambuser.com/bam-ui.css" />
</head>
<body>
<h1>Hello world</h1>
<script src="https://app-framework.bambuser.com/runtime.js"></script>
<script src="https://app-framework.bambuser.com/bam-ui.js"></script>
<script type="module">
const { tool } = await bambuserAppFramework.getContext();

// The tool's UI has loaded and may now be presented
tool.setReady()
</script>
</body>
</html>
info

The page loaded in the tool view context must load the Bambuser App Framework Runtime and at least communicate back when the UI is ready to be presented to the user by using setReady(), until you do this a loader will be shown to the user

info

The page loaded in the tool view context must follow our Design Guidelines and make the look and feel to be aligned with other parts of the user interface

Tool view methods

setReady()

Permission: Implicit via Tool API
Context: Tool view

Decide when the tool is ready to be displayed, ex. your page has loaded completely and initial UI can be presented to the user. Before this, a loader will be displayed to the user.

Return value

None.

Example

const { tool } = await bambuserAppFramework.getContext();

// All necessary resources has been loaded and the UI is presentable to the user
// The loader currently showing should be removed and the tool UI presented
tool.setReady();

open()

Permission: Implicit via Tool API
Context: Main app

Open the tool programatically from main app context

Return value

None.

Example

// ...

tool.open();

close()

Permission: Implicit via Tool API
Context: Main app, Tool view

Close the tool programatically

Return value

None.

Example

// ...

tool.close();

emit()

Permission: Implicit via Tool API
Context: Tool view

Send a message from tool view context to main app context

Parameters

  • payload - The message payload to send to the main app context

Return value

None.

Example

const { tool } = await bambuserAppFramework.getContext();

// ...

tool.emit({
eventName: 'hello-from-tool-view-context',
data: {
foo: 'bar',
},
});

postMessage()

Permission: Implicit via Tool API
Context: Main app

Send a message from main app context to tool view context

Parameters

  • payload - The message payload to send to the tool view context

Return value

None.

Example

// ...

tool.postMessage({
eventName: 'hello-from-main-context',
data: {
foo: 'bar',
},
});

Tool view events

open

Permission: Implicit via Tool API
Context: Main app

The open event is fired in main app context when tool is opened

Example

// ...

tool.on('open', () => {
console.log('Tool was opened');
});

close

Permission: Implicit via Tool API
Context: Main app

The close event is fired in main app context when tool is closed

Example

// ...

dialog.on('close', () => {
console.log('Tool was closed');
});

Permission: Implicit via Tool API
Context: Main app, Tool view

Receive a message sent from the main app context or tool view context

Event properties

  • event.* - The message payload sent from other context

Example

// ...

tool.on('message', event => {
console.log('Tool message event', event);
});

message

Permission: Implicit via Tool API
Context: Main app, Screen view

Receive a message sent from the main app context or tool view context

Event properties

  • event.* - The message payload sent from other context

Example

// ...

tool.on('message', event => {
console.log('Tool message event', event);
});