Project setup

Prerequisites

  • You need a React app to embed the components into. If you don’t already have one, you can use the Ampersand starter project.
  • The Ampersand UI library requires React v18+.

Install the Ampersand React library

In your repo, use npm or yarn to install the package:
npm install @amp-labs/react
or
yarn add @amp-labs/react

AmpersandProvider

The AmpersandProvider is the foundational component that provides context for all Ampersand functionality, including both headless hooks and prebuilt UI components. It can be placed at any level in your component tree, but it must wrap all Ampersand components and hooks in your application. The AmpersandProvider accepts an options object with the following required properties:
  • project: Your Ampersand project name or ID (found on your General Settings page)
  • Authentication method: Either apiKey or getToken (but not both)
import { AmpersandProvider } from '@amp-labs/react';

const options = {
  project: 'PROJECT', // Your Ampersand project name or ID

  // Pick one of the following authentication methods:
  apiKey: 'API_KEY',  // Ampersand API key (simple)
  // OR 
  getToken: async ({consumerRef, groupRef}) => {  // JWT Authentication (advanced)
    // Custom logic to fetch JWT token from your backend, e.g.
    return await getTokenFromMyBackend(consumerRef, groupRef);
  },
};

function App() {
  return (
    <AmpersandProvider options={options}>
      {/* All your Ampersand components and hooks go here */}
    </AmpersandProvider>
  );
}

Authentication Methods

The AmpersandProvider supports two authentication methods through the options parameter. Only one method can be used at a time.

API key authentication

When you are first developing integrations with Ampersand, API keys are a quick way to get started. You can create an API key on the API keys page of your Ampersand Dashboard. Select “UI Library” for “Where will you use the API key?”

JWT authentication

When you are ready to ship your integrations to production, we highly recommend that you move to JWT authentication, as it is more secure than using API keys in the frontend. JWT tokens are time-bound and also enforce that your users only have access to their own integration data.
const options = {
  project: 'PROJECT',
  getToken: async ({consumerRef, groupRef}) => {
    // Custom logic to fetch JWT token from your backend, e.g.
    return await getTokenFromMyBackend(consumerRef, groupRef);
  },
};
return (
  <AmpersandProvider options={options}>
    {/* All your Ampersand components and hooks go here */}
  </AmpersandProvider>
);
The getToken function should return a promise that resolves to a valid JWT token by making a call to your backend. For detailed information on how to generate JWT tokens, see JWT Authentication.

Components

Install integration

The InstallIntegration component prompts your customer for their SaaS credentials, and then guides them through the installation flow for an integration. If they’ve already installed this integration, then the component will display the current configuration of the integration and allow them to update it. Please note that each group is able to install the integration once, so if someone else with the same groupRef has already installed the integration, then the user will not be able to install the same integration again. The parameters of the component are:
  • integration (string): the name of an integration that you’ve defined in amp.yaml.
  • consumerRef (string): the ID that your app uses to identify this end user.
  • consumerName (string, optional): the display name for this end user.
  • groupRef (string): the ID that your app uses to identify a company, team, or workspace. See group.
  • groupName (string, optional): the display name for this group.
  • onInstallSuccess (function, optional): a callback function that gets invoked after a consumer successfully installs the integration.
  • onUpdateSuccess (function, optional): a callback function that gets invoked after a consumer successfully updates an existing integration with the new configuration.
  • onUninstallSuccess (function, optional): a callback function that gets invoked after a consumer successfully uninstalls the integration.
  • fieldMapping (JSON): a JSON object that specifies the dynamic mapping configuration for this installation. Learn more about dynamic mapping here
Both onInstallSuccess and onUpdateSuccess should be functions with the following signature: (installationId: string, config: Config) => void. Config is an exported type from @amp-labs/react.
 <InstallIntegration 
  integration = {myIntegrationName}
  consumerRef = {userId}
  consumerName = {userFullName}
  groupRef = {teamId}
  groupName = {teamName}
  onInstallSuccess = {(installationId, configObject) =>
    console.log(`Successfully installed ${installationId}`
      + `with configuration ${JSON.stringify(configObject, null, 2)}`)
  }
  onUpdateSuccess = {(installationId, configObject) =>
    console.log(`Successfully updated ${installationId}`
      + ` with configuration ${JSON.stringify(configObject, null, 2)}`)
  }
  onUninstallSuccess = {(installationId) =>
    console.log(`Successfully uninstalled ${installationId}`)
  }
  fieldMapping={{
    contacts: [
      {
        mapToName: 'priority',
        mapToDisplayName: 'Priority',
        prompt: 'Which field do you use to track the priority of a deal?',
      },
      ... // other field mapping options
    ],
  }}
/>

Connect provider

The ConnectProvider component allows your customer to put in their SaaS credential, but does not lead them through the installation flow. After their SaaS credential is persisted by Ampersand, you can then make an API request to the CreateInstallation endpoint. The parameters of the component are:
  • provider (string): the name of the SaaS provider, such as “salesforce”.
  • consumerRef (string): the ID that your app uses to identify this end user.
  • consumerName (string, optional): the display name for this end user.
  • groupRef (string): the ID that your app uses to identify a company, team, or workspace. See group.
  • groupName (string, optional): the display name for this group.
  • redirectUrl (string, optional): if provided, the page will be redirected to this URL once a consumer successfully connects. This can either be an absolute or relative URL.
  • onConnectSuccess (function, optional): a callback function that gets invoked after a consumer successfully connects.
  • onDisconnectSuccess (function, optional): a callback function that gets invoked after a consumer successfully disconnects.
Both onConnectSuccess and onDisconnectSuccess should be functions with the following signature: (connection: Connection) => void. Connection is an exported type from @amp-labs/react.
 <ConnectProvider 
  provider = "salesforce"
  consumerRef = {userId}
  consumerName = {userFullName}
  groupRef = {teamId}
  groupName = {teamName}
  redirectUrl = "/connection-success"
  onConnectSuccess = {connection =>
    console.log(`Successfully created connection ${connection.id}`)
  }
  onDisconnectSuccess = {connection =>
    console.log(`Successfully deleted connection ${connection.id}`)
  }
/>

Hooks

Check if integration is installed

We provide a hook useIsIntegrationInstalled to check if an integration has been installed yet for this group. It takes in 2 parameters:
  • integration (string): the name of an integration that you’ve defined in amp.yaml.
  • groupRef (string): the ID that your app uses to identify a company, team, or workspace. See group.
It returns an object with fields isLoaded, indicating whether the API call has resolved, and isIntegrationInstalled, indicating whether the integration has already been installed by somebody in the group.
const {
  isLoaded,
  isIntegrationInstalled
} = useIsIntegrationInstalled("read-salesforce", groupRef);

Check if specific objects are installed

Currently, the InstallIntegration component will create an Installation as soon as the user saves a single object. This means that when useIsIntegrationInstalled returns true for isIntegrationInstalled, not all objects would have been configured and saved yet. If you need to know when all objects or specific objects are installed, inspect the Config object.
const {
  isLoaded,
  isIntegrationInstalled, 
  config,
} = useIsIntegrationInstalled("read-salesforce", groupRef);

// All 3 read objects are installed
if (isLoaded && isIntegrationInstalled && config.read.objects.length === 3) {
  // Do something 
}

// check if the Account object is installed
if (isLoaded && isIntegrationInstalled && config.read.objects.filter(o => o.objectName === "Account").length === 1) {
  // Do something 
}

// All 3 write objects are installed
if (isLoaded && isIntegrationInstalled && config.write.objects === 3) {
  // Do something 
}

Customize styles

Customized styling is only supported in v2.x.x
To customize the look and feel of Ampersand components, import your own CSS file directly after @amp-labs/react/styles. You can override CSS variables that are exposed in the variables.css file. By convention, CSS variables that are used in the Ampersand components are named with --amp as a prefix.
import { AmpersandProvider } from '@amp-labs/react';
import '@amp-labs/react/styles';
import './App.css'; // Optional: your own css override

Example App.css

App.css
:root {
    /* These affect the look and feel of buttons */
    --amp-colors-primary: #4360e0;
    --amp-default-border-radius: 8px;

    /* Override with your own color palette */
    --amp-colors-neutral-25: #FEFEFE;
    --amp-colors-neutral-50: #FDFCFD;
    --amp-colors-neutral-100: #FAFAFC;
    --amp-colors-neutral-200: #F6F5F9;
    --amp-colors-neutral-300: #F1EFF5;
    --amp-colors-neutral-400: #EDEAF2;
    --amp-colors-neutral-500: #E8E5EF;
    --amp-colors-neutral-600: #918E95;
    --amp-colors-neutral-700: #646266;
    --amp-colors-neutral-800: #363638;
    --amp-colors-neutral-900: #1D1D1D;
}

Dark mode

Dark mode is only supported in v2.1.0+
Ampersand’s UI components support dark mode. Ensure that you have the following lines in your application’s CSS:
:root {
  color-scheme: light dark;
}
When a user sets their system settings to dark mode, then Ampersand’s UI components will automatically render in dark mode. We do this by making use of the light-dark CSS function in our default colors. You can customize the colors by adding an override CSS file. See Customize styles.

Migrating to v2

@amp-labs/react v2.x.x no longer requires Chakra as a dependency, and also provides users with the ability to customize styles. When upgrading from v1.x.x. to v2.x.x, you must add an additional line after importing the library:
import { AmpersandProvider, InstallIntegration } from '@amp-labs/react';
import '@amp-labs/react/styles'; // Add this line when migrating to v2
import './App.css'; // Optional: your own CSS override 

Troubleshooting

Why does styling look so bare?

You likely forgot to import the stylesheet, please add this line once in your application.
import '@amp-labs/react/styles';