App bridge is an interface that connects App (running inside Dashboard) with Dashboard itself.
Create instance of AppBridge by running following code
import { AppBridge } from "@saleor/app-sdk/app-bridge";
const appBridge = new AppBridge(options);
Options object is following:
type AppBridgeOptions = {
targetDomain?: string;
saleorApiUrl?: string;
initialLocale?: LocaleCode;
autoNotifyReady?: boolean;
initialTheme?: "dark" | "light"
};
const { token, saleorApiUrl, ready, id } = appBridge.getState();
Available state represents AppBridgeState
:
type AppBridgeState = {
token?: string;
id: string;
ready: boolean;
domain: string;
path: string;
theme: ThemeType;
locale: LocaleCode; // See src/locales.ts
/**
* Full URL including protocol and path where GraphQL API is available
**/
saleorApiUrl: string;
};
AppBridgeProvider
and useAppBridge
hook are exposed from app-sdk
// app.tsx
import { AppBridgeProvider } from "@saleor/app-sdk/app-bridge";
<AppBridgeProvider>
<YourApp />
</AppBridgeProvider>;
AppBridgeProvider
can optionally receive AppBridge instance in props, otherwise will create one automatically
In components wrapped with AppBridgeProvider
, useAppBridge
hook is available
import { useAppBridge } from "@saleor/app-sdk/app-bridge";
import { useEffect } from "react";
const MyComponent = () => {
const { appBridge, appBridgeState } = useAppBridge();
useEffect(() => {
appBridge?.dispatch(/* Something */);
}, [appBridge]);
return <div>Current locale is: {appBridgeState?.locale}</div>;
};
appBridgeState?
and appBridge
can be nullish, because in server side context it's not available
Events are messages that originate in Saleor Dashboard. AppBridge can subscribe on events and app can react on them
subscribe(eventType, callback)
- can be used to listen to particular event type. It returns an unsubscribe function, which unregisters the callback.
Example:
const unsubscribe = appBridge.subscribe("handshake", (payload) => {
setToken(payload.token); // do something with event payload
const { token } = appState.getState(); // you can also get app's current state here
});
// unsubscribe when callback is no longer needed
unsubscribe();
unsubscribeAll(eventType?)
- unregisters all callbacks of provided type. If no type was provided, it will remove all event callbacks.
Example:
// unsubscribe from all handshake events
appBridge.unsubscribeAll("handshake");
// unsubscribe from all events
appBridge.unsubscribeAll();
Event type | Description |
---|---|
handshake |
Fired when iFrame containing the App is initialized or new token is assigned |
response |
Fired when Dashboard responds to an Action |
redirect |
Fired when Dashboard changes a subpath within the app path |
theme |
Fired when Dashboard changes the theme |
localeChanged |
Fired when Dashboard changes locale (and passes locale code in payload) |
See source code for detailed payload
Actions expose a high-level API to communicate with Saleor Dashboard. They're exported under an actions
namespace.
dispatch(action)
- dispatches an Action. Returns a promise which resolves when action is successfully completed.
Example:
import { actions } from "@saleor/app-sdk/app-bridge";
const handleRedirect = async () => {
await appBridge.dispatch(actions.Redirect({ to: "/orders" }));
console.log("Redirect complete!");
};
handleRedirect();
Action | Arguments | Description |
---|---|---|
Redirect |
to (string) - relative (inside Dashboard) or absolute URL path |
|
newContext (boolean) - should open in a new browsing context |
||
Notification |
status (info / success / warning / error / undefined) |
|
title (string / undefined) - title of the notification |
||
text (string / undefined) - content of the notification |
||
apiMessage (string / undefined) - error log from api |
||
NotifyReady |
Inform Dashboard that AppBridge is ready | |
UpdateRouting |
newRoute - current path of App to be set in URL |