# JavaScript

Source: https://docs.interop.io/desktop/capabilities/data-sharing/shared-contexts/javascript/index.html

## Overview

The Shared Contexts API is accessible via the [`io.contexts`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md) object.

> ℹ️ *See the JavaScript [Shared Contexts example](https://github.com/InteropIO/js-examples/tree/master/shared-contexts) on GitHub.*

## Setting Contexts

To create a shared context or replace entirely the value of an existing one, use the [`set()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-set) method:

```javascript
const newContext = { backgroundColor: "purple" };

// This will create a new shared context, or if the context already exists,
// will completely overwrite its value.
await io.contexts.set("app-styling", newContext);
```

The [`set()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-set) method overwrites the existing value of the shared context object, as opposed to the [`update()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-update) method, which only updates the values of its properties.

## Getting Contexts

To get the value of a specific shared context, use the [`get()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-get) method:

```javascript
const data = await io.contexts.get("app-styling");
```

## Listing All Contexts

To get the names of all currently available shared contexts, use the [`all()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-all) method:

```javascript
// Returns a string array with the available context names.
const availableContexts = io.contexts.all();
```

## Updating Contexts

To update the value of an existing shared context, use the [`update()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-update) method. New properties will be added, existing ones will be updated, and you can also remove shared context keys by setting them to `null`. If the specified shared context doesn't exist, it will be created:

```javascript
const contextUpdate = {
    backgroundColor: "red",
    alternativeColor: "green"
};

await io.contexts.update("app-styling", contextUpdate);
```

To remove a shared context key, set it to `null`:

```javascript
const keyToRemove = { alternativeColor: null };

await io.contexts.update("app-styling", keyToRemove);
```

## Updating Specific Properties

You can use the [`setPath()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-setPath) and [`setPaths()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-setPaths) methods to update specific shared context properties using a dot-separated string path (e.g., `"prop1.prop2"`) to point to the location of the property within the shared context object. If the property (or the path) doesn't exist, it will be created. These methods are useful for updating or creating one or more nested properties within the shared context object.

To update or create a single property, use the [`setPath()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-setPath) method. It accepts the name of the shared context, a path to the property to update, and a value for the property as required arguments:

```javascript
const path = "text.color";
const value = "grey";

await io.contexts.setPath("app-styling", path, value);

// Assuming the context already exists and its data has this shape:
// { backgroundColor: "red" }, it will be updated as follows:
// { backgroundColor: "red", text: { color: "grey" } }
```

To update or create multiple properties, use the [`setPaths()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-setPaths) method. It accepts as required arguments the name of the shared context and a list of [`PathValue`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/pathvalue/index.md) objects each containing a path to the property to update and a value for it:

```javascript
const updates = [
    { path: "table.cells", value: { width: 50, height: 30 } },
    { path: "text.color", value: "white" }
];

await io.contexts.setPaths("app-styling", updates);

// Assuming the context already exists and its data has this shape:
// { backgroundColor: "red", text: { color: "grey" } }, it will be updated as follows:
//
// {
//     backgroundColor: "red",
//     text: {
//         color: "white"
//     },
//     table: {
//         cells: {
//             width: 50,
//             height: 30
//         }
//     }
// }
```

## Subscribing for Context Updates

To subscribe for context updates, use the [`subscribe()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-subscribe) method. It accepts the name of the shared context as a first required argument and a function that will handle the context updates as a second required argument:

```javascript
const handler = (context, delta, removed) => {
    const bgColor = context.backgroundColor;

    console.log(bgColor);
};

await io.contexts.subscribe("app-styling", handler);
```

## Unsubscribing

The [`subscribe()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-subscribe) method returns a `Promise` which resolves with a function you can use to unsubscribe from context updates:

```javascript
const unsubscribe = await io.contexts.subscribe("app-styling", handler);

unsubscribe();
```

## Destroying Contexts

To destroy a context object, use the [`destroy()`](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md#API-destroy) method:

```javascript
await io.contexts.destroy("app-styling");
```

## API Reference

For a complete list of the available Shared Contexts API methods and properties, see the [Shared Contexts API reference documentation](https://docs.interop.io/desktop/reference/javascript/shared%20contexts/api/index.md).
