# DigitalSambaEmbedded class

This is the main class of the [SDK](https://docs.digitalsamba.com/reference/sdk). Your journey always starts by initializing this class and then calling its [methods](https://docs.digitalsamba.com/reference/sdk/methods) to control your integration. There are also various [events](https://docs.digitalsamba.com/reference/sdk/events) to subscribe to with callbacks.

#### There are two approaches to initializing:&#x20;

* Using the constructor which will load **immediately** the specified room based on the [**InitOptions**](#initoptions) and the optional [**InstanceProperties**](#instanceproperties).<br>

  ```javascript
  //instanceProperties is an optional param
  const sambaFrame = new DigitalSambaEmbedded(initOptions, instanceProperties);
  ```
* Using the `createControl` factory method. Later you can load the room by calling the [load](https://docs.digitalsamba.com/reference/sdk/methods/load) method. That way creation of the **DigitalSambaEmbedded** class is decoupled from the actual loading of the room which gives you more control during initialization.<br>

  ```javascript
  // notice `createControl` vs constructor call
  const sambaFrame = DigitalSambaEmbedded.createControl(initOptions);

  // ...
  // when necessary, load the room in the frame
  // instanceProperties is optional
  sambaFrame.load(instanceProperties);
  ```

#### InitOptions - look also at the [code examples](#code-examples-of-the-possible-initoptions-combinations)

* `root` - HTMLElement. If specified, target frame will be created as a child tag of `root`. Otherwise the created iframe will be appended to the `body` tag of the page
* `frame` - HTMLIFrameElement to be wrapped. This is useful if you want the room to be loaded in an `iframe` element which already exists. If `frame` is not specified, then an `iframe` element will be created automatically by the SDK
* `url` - full room URL to be applied as the iframe src attribute. Must include https protocol.\
  `https://`**`[teamNameHere]`**`.digitalsamba.com/`**`[roomNameHere]`**
* `team` - team name (string) - used if you do not want to specify the `url` manually
* `room` - room name (string) - used if you do not want to specify the `url` manually
* `token` - optional JWT string [token](https://docs.digitalsamba.com/reference/rest-api/tokens) for authentication, mainly for private rooms
* `templateParams`- an optional JSON object configuring custom URL template parameters when opening an embedded content from the content library. These template parameters are very useful to provide per user authentication or identification when embedding external websites.

  ```javascript
  {
     "GEOGEBRA_TOKEN": "..............."
  }
  ```

  \
  Parameters are specified with curly braces in the embedded URLs - e.g. <https://www.anexternalwebsite.com/?gt=**{GEOGEBRA\\_TOKEN}**\\>
  \
  Note **{USERNAME}** is supported as a default built-in param and you don't need to configure it. \
  The name with which the user entered the room will automatically replace the template.\
  <https://www.anexternalwebsite.com/?name=**{USERNAME}>\*\*<br>
* `roomSettings` - an optional JSON object configuring the initial room settings. Read also about the possible [VirtualBackgroundOptions](https://docs.digitalsamba.com/reference/sdk/methods/configurevirtualbackground) and how to configure custom [virtualBackgrounds](#virtual-backgrounds-configuration) array.

  <pre class="language-javascript"><code class="lang-javascript"><strong>{
  </strong>  //Configures if user's video device will be enabled on entering the room
    videoEnabled: boolean,
    
    //Configures if user's audio device will be enabled on entering the room
    audioEnabled: boolean,
    
    //Configures initial video and audio devices to use on entering the room
    mediaDevices: {
      videoinput: 'label of camera',
      audioinput: 'label of microphone',
      audiooutput: 'label of speaker device'
    },
    
    //Language for the user. Use language code - e.g. en, de-DE, es-ES
    appLanguage: string,
    
    //Name of the user on entering the room
    username: string,
    
    //Custom initials (max 2 letters) for the user tile
    initials: string,
    
    //If 'auto' or 'tiled' layout mode will be used
    layoutMode: string,
    
    //If the toolbar will be visible or not
    showToolbar: boolean,
    
    //If the topbar will be visible or not
    showTopbar: boolean,
    
    //If the captions panel will be visible or not
    showCaptions: boolean,
    
    //The virtual background
    virtualBackground: VirtualBackgroundOptions,
    
    /*
      Allows you to customize the virtual backgrounds available 
      to users in your application. You can provide your own collection
      of backgrounds and optionally replace the default backgrounds
    */
    virtualBackgrounds: [
      Read below how to configure it
    ],
    
    // Replace default backgrounds with custom ones (optional)
    replaceVirtualBackgrounds: false,
    
    //If the frame will be muted on join for the local user
    muteFrame: boolean,
    
    //If a confirmation modal will be shown when you remove (kick) another user
    requireRemoveUserConfirmation: boolean,
    
    /* 
       An optional base domain to use when generating invitation links

       This is useful if you are a integrator where the invitation links 
       are not on your main domain where the meeting UI is loaded.
    */
    baseDomain: string //For example 'your.domain.com',
    
    /* 
       An optional url to use when generating invitation links
       in the advanced invitation modal

       This is useful if you are a integrator where the invitation links 
       are not on your main domain where the meeting UI is loaded.
    */
    publicRoomUrl: string //For example https://your.domain.com/meeting/ABCDEF
  }
  </code></pre>

The following combinations of fields are valid for **initOptions** ([token](https://docs.digitalsamba.com/reference/rest-api/tokens) and roomSettings can be used with any of them):

* `url` - will create a frame as a child of the `body` tag and load the room url
* `url + root` - will create a frame as a child of `root` element and load the room url
* `url + frame` - will load the room url in the provided existing frame
* `team + room` - will create a frame as a child of the `body` tag and load the specified room
* `team + room + root` - will create a frame inside `root` element and load the specified room
* `team + room + frame` - will load the specified room in the provided existing frame
* `frame` - will attach to the specified existing frame (assuming you've manually set correct room url as the iframe src)

### Virtual Backgrounds Configuration

The Digital Samba SDK allows you to customize the virtual backgrounds available to users in your application. You can provide your own collection of backgrounds and optionally replace the default backgrounds provided by the SDK.

#### Custom Backgrounds Collection

You can provide a custom collection of virtual backgrounds during SDK initialization:

```javascript
const sambaFrame = DigitalSambaEmbedded.createControl({ 
  url: roomUrl,
  // Other configuration options...
  roomSettings: {

    // Custom backgrounds collection (optional)
    virtualBackgrounds: [
      {
        id: 'custom-bg-1',    // Unique identifier
        type: 'image',        // Type: 'blur', 'image', or 'video'
        value: 'https://example.com/custom-bg-1.jpg', // URL or blur strength
        thumbnail: 'https://example.com/custom-bg-1-thumb.jpg', // Optional for images, required for videos
        label: 'Custom Background 1' // Display name
      }
    ],
  
    // Replace default backgrounds with custom ones (optional)
    replaceVirtualBackgrounds: false
  }
});

sambaFrame.load();
```

#### Background Item Properties

| Property    | Type   | Description                                                                 | Required                      |
| ----------- | ------ | --------------------------------------------------------------------------- | ----------------------------- |
| `id`        | string | Unique identifier for the background.                                       | Yes                           |
| `type`      | string | Type of background: `'blur'`, `'image'`, or `'video'`.                      | Yes                           |
| `value`     | string | For blur: `'balanced'` or `'strong'`. For image/video: URL to the resource. | Yes                           |
| `thumbnail` | string | URL to a thumbnail image. Optional for images, required for videos.         | No for images, Yes for videos |
| `label`     | string | Display name for the background.                                            | No                            |

#### Replacing Default Backgrounds

By default, the SDK provides a set of predefined backgrounds. You can choose to replace them with your custom collection by setting `replaceVirtualBackgrounds` to `true`:

```javascript
const sambaFrame = DigitalSambaEmbedded.createControl({
  url: roomUrl,
  // Other configuration options...
  roomSettings: {
     virtualBackgrounds: [
       // Your custom backgrounds...
     ],
     replaceVirtualBackgrounds: true
  }
});

sambaFrame.load();
```

If `replaceVirtualBackgrounds` is set to `true` but no `virtualBackgrounds` are provided, the default backgrounds will be preserved and an error will be emitted.

The SDK validates all virtual background items to ensure they meet the required format. If validation fails, an error event will be emitted and the invalid backgrounds will be ignored.

#### InstanceProperties - look also at the[ code example](#sample-usage-of-the-optional-instanceproperties-to-set-a-red-border-and-also-report-errors)

* `frameAttributes` - list of attributes to be applied to the target iframe
* `reportErrors` - boolean, false by default. Whether to report misconfiguration or runtime errors to the browser console

#### Code examples of the possible **initOptions** combinations:

{% code lineNumbers="true" %}

```javascript
//SDK will create a frame as a child of the body tag and load the room url
import DigitalSambaEmbedded from '@digitalsamba/embedded-sdk';
const roomUrl = 'https://[TEAM_NAME_HERE].digitalsamba.com/[ROOM_NAME_HERE]';
const sambaFrame = DigitalSambaEmbedded.createControl({ 
    url: roomUrl,
    //Optional room settings
    /*roomSettings: {
        username: 'John Smith'
        layoutMode: 'auto',
        virtualBackground: { blur: 'balanced' },
        .....................
    },*/
    //token: TOKEN_HERE_IF_YOU_ARE_USING_IT
});
sambaFrame.load();
```

{% endcode %}

{% code lineNumbers="true" %}

```javascript
//SDK will create a frame as a child of the parent element and load the room url
import DigitalSambaEmbedded from '@digitalsamba/embedded-sdk';
const parentElement = document.querySelector('USE_CSS_SELECTOR_HERE');
const roomUrl = 'https://[TEAM_NAME_HERE].digitalsamba.com/[ROOM_NAME_HERE]';
const sambaFrame = DigitalSambaEmbedded.createControl({ 
    url: roomUrl, 
    root: parentElement,
    //token: TOKEN_HERE_IF_YOU_ARE_USING_IT
});
sambaFrame.load();
```

{% endcode %}

{% code lineNumbers="true" %}

```javascript
//SDK will load the room url in the specified existing iframe
import DigitalSambaEmbedded from '@digitalsamba/embedded-sdk';
const existingIFrame = document.querySelector('USE_CSS_SELECTOR_HERE');
const roomUrl = 'https://[TEAM_NAME_HERE].digitalsamba.com/[ROOM_NAME_HERE]';
const sambaFrame = DigitalSambaEmbedded.createControl({ 
    url: roomUrl, 
    frame: existingIFrame,
    //token: TOKEN_HERE_IF_YOU_ARE_USING_IT
});
sambaFrame.load();
```

{% endcode %}

{% code lineNumbers="true" %}

```javascript
//SDK will create a frame as a child of the body tag and load the specified room
import DigitalSambaEmbedded from '@digitalsamba/embedded-sdk';
const teamName = 'TEAM_NAME_HERE';
const roomName = 'ROOM_NAME_HERE';
const sambaFrame = DigitalSambaEmbedded.createControl({ 
    team: teamName, 
    room: roomName,
    //token: TOKEN_HERE_IF_YOU_ARE_USING_IT
});
sambaFrame.load();
```

{% endcode %}

{% code lineNumbers="true" %}

```javascript
//SDK will create a frame as a child of the parent element and load the room
import DigitalSambaEmbedded from '@digitalsamba/embedded-sdk';
const parentElement = document.querySelector('USE_CSS_SELECTOR_HERE');
const teamName = 'TEAM_NAME_HERE';
const roomName = 'ROOM_NAME_HERE';
const sambaFrame = DigitalSambaEmbedded.createControl({ 
     team: teamName, 
     room: roomName,
     root: parentElement,
     //token: TOKEN_HERE_IF_YOU_ARE_USING_IT
});
sambaFrame.load();
```

{% endcode %}

{% code lineNumbers="true" %}

```javascript
//SDK will load the room in the specified existing frame
import DigitalSambaEmbedded from '@digitalsamba/embedded-sdk';
const existingIFrame = document.querySelector('USE_CSS_SELECTOR_HERE');
const teamName = 'TEAM_NAME_HERE';
const roomName = 'ROOM_NAME_HERE';
const sambaFrame = DigitalSambaEmbedded.createControl({ 
     team: teamName, 
     room: roomName,
     frame: existingIFrame,
     //token: TOKEN_HERE_IF_YOU_ARE_USING_IT
});
sambaFrame.load();
```

{% endcode %}

{% code lineNumbers="true" %}

```javascript
//SDK will attach to the specified existing frame
//Assuming you've manually preset correct room url as the iframe src
import DigitalSambaEmbedded from '@digitalsamba/embedded-sdk';
const existingIFrame = document.querySelector('USE_CSS_SELECTOR_HERE');
const sambaFrame = DigitalSambaEmbedded.createControl({ 
     frame: existingIFrame,
     //token: TOKEN_HERE_IF_YOU_ARE_USING_IT
});
sambaFrame.load();
```

{% endcode %}

#### **Sample usage of the optional instanceProperties to set a red border and also report errors**:

Note that you can use any initOptions combination from the [previous examples](#code-examples-of-the-possible-initoptions-combinations).

{% code lineNumbers="true" %}

```javascript
import DigitalSambaEmbedded from '@digitalsamba/embedded-sdk';
const roomUrl = 'https://[TEAM_NAME_HERE].digitalsamba.com/[ROOM_NAME_HERE]';
const sambaFrame = DigitalSambaEmbedded.createControl({ url: roomUrl });

//SDK will put a 5px solid red border around the iframe
const instanceProps = { 
   frameAttributes: {style: "border: 5px solid red"}, 
   reportErrors: true 
};
sambaFrame.load(instanceProps);
```

{% endcode %}
