diff --git a/docs/android-core/quickstart.mdx b/docs/android-core/quickstart.mdx index d986bdd05d..b5401748aa 100644 --- a/docs/android-core/quickstart.mdx +++ b/docs/android-core/quickstart.mdx @@ -47,9 +47,9 @@ You must complete the following steps: ## Step 1: Install the SDK -1. Install the SDK using maven dependency. +1. Install the SDK using maven central - + 2. Add the following permissions to the AndroidManifest.xml file. diff --git a/docs/android-core/recording.mdx b/docs/android-core/recording.mdx index 96941c8167..2a6fa2bd8d 100644 --- a/docs/android-core/recording.mdx +++ b/docs/android-core/recording.mdx @@ -31,6 +31,22 @@ Call `meeting.recording.stop()` to stop the active recording. meeting.recording.stop(); ``` +## Pause a recording + +Call `meeting.recording.pause()` to pause the active recording. + +```kotlin +meeting.recording.pause(); +``` + +## Resume a paused recording + +Call `meeting.recording.resume()` to resume the paused recording. + +```kotlin +meeting.recording.resume(); +``` + ## Get active recording state The `meeting.recording.recordingState` property describes the current state of diff --git a/docs/android-core/release-notes.mdx b/docs/android-core/release-notes.mdx new file mode 100644 index 0000000000..b83573f9c2 --- /dev/null +++ b/docs/android-core/release-notes.mdx @@ -0,0 +1,10 @@ +--- +title: Release Notes +sidebar_position: 101 +sidebar_class_name: releaseSidebarHeading +tags: [mobile-core, releasenotes] +--- + +import ReleaseNotesGenerator from '@site/src/components/ReleaseNotesGenerator'; + + diff --git a/docs/android/quickstart.mdx b/docs/android/quickstart.mdx index 2073ad3d31..e5bee65af8 100644 --- a/docs/android/quickstart.mdx +++ b/docs/android/quickstart.mdx @@ -3,6 +3,8 @@ sidebar_position: 1 slug: / --- +import { MavenLatestInstallation } from '@site/src/components/LatestInstallation'; + # Quickstart This quickstart shows how to use Dyte's Android UI Kit SDK to add live video and @@ -42,10 +44,7 @@ You must complete the following steps: 1. Install the SDK using maven dependency. -```python - // other dependencies here - implementation 'io.dyte:uikit:1.14.2' -``` + 2. Add the following permissions to the AndroidManifest.xml file. @@ -94,8 +93,6 @@ val dyteUIKitInfo = DyteUIKitInfo( val dyteUIKit = DyteUIKitBuilder.build(dyteUIKitInfo) ``` - - ## Step 4: Launch the meeting UI To launch the meeting UI all you need to do is call `startMeeting()` which will take diff --git a/docs/android/release-notes.mdx b/docs/android/release-notes.mdx new file mode 100644 index 0000000000..380703ed7e --- /dev/null +++ b/docs/android/release-notes.mdx @@ -0,0 +1,10 @@ +--- +title: Release Notes +sidebar_position: 101 +sidebar_class_name: releaseSidebarHeading +tags: [releasenotes] +--- + +import ReleaseNotesGenerator from '@site/src/components/ReleaseNotesGenerator'; + + diff --git a/docs/flutter-core/release-notes.mdx b/docs/flutter-core/release-notes.mdx new file mode 100644 index 0000000000..854d235da8 --- /dev/null +++ b/docs/flutter-core/release-notes.mdx @@ -0,0 +1,10 @@ +--- +title: Release Notes +sidebar_position: 101 +sidebar_class_name: releaseSidebarHeading +tags: [mobile-core, releasenotes] +--- + +import ReleaseNotesGenerator from '@site/src/components/ReleaseNotesGenerator'; + + diff --git a/docs/flutter/release-notes.mdx b/docs/flutter/release-notes.mdx new file mode 100644 index 0000000000..aefa05e7a9 --- /dev/null +++ b/docs/flutter/release-notes.mdx @@ -0,0 +1,10 @@ +--- +title: Release Notes +sidebar_position: 101 +sidebar_class_name: releaseSidebarHeading +tags: [releasenotes] +--- + +import ReleaseNotesGenerator from '@site/src/components/ReleaseNotesGenerator'; + + diff --git a/docs/guides/capabilities/breakoutroom/integrating-breakout-rooms.mdx b/docs/guides/capabilities/breakoutroom/integrating-breakout-rooms.mdx new file mode 100644 index 0000000000..30f0577d56 --- /dev/null +++ b/docs/guides/capabilities/breakoutroom/integrating-breakout-rooms.mdx @@ -0,0 +1,115 @@ +--- +title: 'Integrating Breakout Rooms' +sidebar_position: 3 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import { WebCoreCDNInstallation } from '@site/src/components/LatestInstallation'; + +## Step 1: Install the SDK + +You can install the package using CDN, npm or Yarn. + + + +Install the SDK using npm. + +```shell +npm install @dytesdk/web-core +``` + +[![npm version](https://badge.fury.io/js/@dytesdk%2Fweb-core.svg)](https://badge.fury.io/js/@dytesdk%2Fweb-core) + + + +Install the SDK using yarn. + +```shell +yarn add @dytesdk/web-core +``` + +[![npm version](https://badge.fury.io/js/@dytesdk%2Fweb-core.svg)](https://badge.fury.io/js/@dytesdk%2Fweb-core) + + + +Add the following script tag in the head of your HTML file. + + + + + +## Step 2: Initialize the SDK + +| | | +| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `authToken` | After you've created the meeting, add each participant to the meeting using the [Add Participant API](/api#/operations/add_participant). The API response contains the authToken. | + +```js +let meeting = await DyteClient.init({ + authToken, +}); + +// add additional event handler for breakout rooms +meeting.connectedMeetings.on('meetingChanged', (newMeeting) => { + meeting = newMeeting; +}); +``` + +## Step 3: Pass the meeting object to pre-built ui component + + + + +```html + + + + +``` + +For detailed guide, check out - https://docs.dyte.io/ui-kit/quickstart + + + + +```jsx + +``` + +For detailed guide, check out - https://docs.dyte.io/react-ui-kit/quickstart + + + + +```js +class AppComponent { + title = 'MyProject'; + @ViewChild('myid') meetingComponent: DyteMeeting; + dyteMeeting: DyteClient; + + async ngAfterViewInit() { + const meeting = await DyteClient.init({ + authToken: '', + }); + meeting.joinRoom(); + this.dyteMeeting = meeting; + if (this.meetingComponent) this.meetingComponent.meeting = meeting; + } +} +``` + +For detailed guide, check out - https://docs.dyte.io/angular-ui-kit/quickstart + + + diff --git a/docs/guides/capabilities/plugins/_category_.json b/docs/guides/capabilities/plugins/_category_.json new file mode 100644 index 0000000000..b241fe9f77 --- /dev/null +++ b/docs/guides/capabilities/plugins/_category_.json @@ -0,0 +1,5 @@ +{ + "position": 4, + "label": "Plugins", + "collapsible": true +} diff --git a/docs/guides/capabilities/plugins/docshare.mdx b/docs/guides/capabilities/plugins/docshare.mdx new file mode 100644 index 0000000000..0a426713d3 --- /dev/null +++ b/docs/guides/capabilities/plugins/docshare.mdx @@ -0,0 +1,37 @@ +# Document Sharing + +DocShare allows you to share, view documents and annotate the documents collaboratively. +The plugin exposes a few APIs to control the document viewer + +## Loading a document + +You can specify the following parameters: + +- `followId`: It syncs the zoom and scroll values of the userId specified to other users (including the recording) +- `document` : You can also specify the document that you wish to open beforehand. + +```ts +const id = '317b4f59-40f0-46af-90d6-1ed6035bb477'; +const docsharePlugin = meeting.plugins.all.get(id); +docsharePlugin.on('ready', () => { + // Ensure the isHost check is only there for one participant + // since the recording can't follow multiple people + const isHost = meeting.self.presetName === ''; + if (!isHost) return; + docsharePlugin.sendData({ + eventName: 'config', + data: { + eventName: 'config', + document: '', + followId: meeting.self.userId, + }, + }); +}); +``` + +Now whenever the plugin is loaded it will use the specified parameters. +To open the plugin you can call + +```ts +docsharePlugin.activate(); +``` diff --git a/docs/guides/capabilities/plugins/index.mdx b/docs/guides/capabilities/plugins/index.mdx new file mode 100644 index 0000000000..f6bf5346b3 --- /dev/null +++ b/docs/guides/capabilities/plugins/index.mdx @@ -0,0 +1,285 @@ +# Plugins + +Dyte Plugins allow you to build collaborative and immersive experiences in your meetings without ever having to the meeting. The guides listed here will help you enable or disable plugins during meetings, configure existing plugins and even create new plugins with the help of Meeting APIs and built-in realtime database. + +## Enable Plugins + +Here is an introduction on how to enable plugins in your meetings: + + + +The activate() method activates a plugin for all users in the meeting. When you activate a plugin, it moves into the active plugins map and can be accessed from `meeting.plugins.active`. + +The snippet below displays all plugins and activates a plugin on click. + +```js +const plugins = meeting.plugins.all.toArray(); + +plugins.forEach((plugin: DytePlugin) => { + const button = document.createElement('button'); + button.innerText = plugin.name; + button.onclick = async () => { + await plugin.activate(); + }; + document.body.appendChild(button); +}); +``` + + + +The activate() method activates a plugin for all users in the meeting. When you activate a plugin, it moves into the active plugins map and can be accessed from `meeting.plugins.active`. + +The snippet below displays all plugins and activates a plugin on click. + +```js +const plugins = meeting.plugins.all.toArray(); + +plugins.forEach((plugin: DytePlugin) => { + const button = document.createElement('button'); + button.innerText = plugin.name; + button.onclick = async () => { + await plugin.activate(); + }; + document.body.appendChild(button); +}); +``` + + + + +:::info + +Plugins are not yet available for FlutterCore. + +::: + + + +The activate() method activates a plugin for all users in the meeting. When you activate a plugin, it moves into the active plugins map and can be accessed from `meeting.plugins.active`. + +The snippet below displays all plugins and activates a plugin on click. + +```js +const plugins = meeting.plugins.all.toArray(); + +plugins.forEach((plugin: DytePlugin) => { + const button = document.createElement('button'); + button.innerText = plugin.name; + button.onclick = async () => { + await plugin.activate(); + }; + document.body.appendChild(button); +}); +``` + + + +The activate() method activates a plugin for all users in the meeting. When you activate a plugin, it moves into the active plugins map and can be accessed from `meeting.plugins.active`. You can get all plugins in a meeting using `meeting.plugins.all`. + +The snippet below displays activates a given plugin. + +```kotlin + val plugin = meeting.plugins.all['pluginName'] + plugin?.activate() +``` + +This will trigger a callback in onPluginActivated(). To be able to listen to plugin events you need to implement a methods from callback `DytePluginEventsListener`. You can subscribe to this events by calling meeting.addPluginEventsListener(dytePluginEventsListener). + +```kotlin + meeting.addMeetingRoomEventsListener(object : + DyteMeetingRoomEventsListener { + override fun onPluginActivated(plugin: DytePlugin) { + super.onPluginActivated(plugin) + // your code to handle plugin activation + } + + override fun onPluginDeactivated(plugin: DytePlugin) { + super.onPluginDeactivated(plugin) + // your code to handle plugin de-activation + } +``` + + + + +The activate() method activates a plugin for all users in the meeting. When you activate a plugin, it moves into the active plugins map and can be accessed from `meeting.plugins.active`. You can get all plugins in a meeting using `meeting.plugins.all`. + +The snippet below displays activates a given plugin. + +```kotlin + val plugin = meeting.plugins.all['pluginName'] + plugin?.activate() +``` + +This will trigger a callback in onPluginActivated(). To be able to listen to plugin events you need to implement a methods from callback `DytePluginEventsListener`. You can subscribe to this events by calling meeting.addPluginEventsListener(dytePluginEventsListener). + +```swift +extension MeetingViewModel: DytePluginEventsListener { + + func onPluginActivated(plugin: DytePlugin) { + // your code to handle plugin activation + } + +} +``` + + + + +## Disable Plugins + +Here is an introduction on how to disable plugins in your meetings: + + + +The deactivate() method deactivates the plugin for all users in the meeting. When you deactivate a plugin, it gets removed from the active plugins map and can only be accessed from meeting.plugins.all. + +The snippet below displays all active plugins and deactivate a plugin on click. + +```js +const plugins = meeting.plugins.active.toArray(); + +plugins.forEach((plugin: DytePlugin) => { + const button = document.createElement('button'); + button.innerText = `Deactivate ${plugin.name}`; + button.onclick = async () => { + await plugin.deactivate(); + }; + document.body.appendChild(button); +}); +``` + +Alternately, to disable a particular plugin, you can filter the `plugins` array by name of the plugins you want to deactivate. + +```js +const plugins = meeting.plugins.active.toArray(); +const plugin = plugins.find((p) => p.name === 'YouTube'); + +await plugin?.deactivate(); +``` + + + +The deactivate() method deactivates the plugin for all users in the meeting. When you deactivate a plugin, it gets removed from the active plugins map and can only be accessed from meeting.plugins.all. + +The snippet below displays all active plugins and deactivate a plugin on click. + +```js +const plugins = meeting.plugins.active.toArray(); + +plugins.forEach((plugin: DytePlugin) => { + const button = document.createElement('button'); + button.innerText = `Deactivate ${plugin.name}`; + button.onclick = async () => { + await plugin.deactivate(); + }; + document.body.appendChild(button); +}); +``` + +Alternately, to disable a particular plugin, you can filter the `plugins` array by name of the plugins you want to deactivate. + +```js +const plugins = meeting.plugins.active.toArray(); +const plugin = plugins.find((p) => p.name === 'YouTube'); + +await plugin?.deactivate(); +``` + + + + +:::info + +Plugins are not yet available for FlutterCore. + +::: + + + +The deactivate() method deactivates the plugin for all users in the meeting. When you deactivate a plugin, it gets removed from the active plugins map and can only be accessed from meeting.plugins.all. + +The snippet below displays all active plugins and deactivate a plugin on click. + +```js +const plugins = meeting.plugins.active.toArray(); + +plugins.forEach((plugin: DytePlugin) => { + const button = document.createElement('button'); + button.innerText = `Deactivate ${plugin.name}`; + button.onclick = async () => { + await plugin.deactivate(); + }; + document.body.appendChild(button); +}); +``` + +Alternately, to disable a particular plugin, you can filter the `plugins` array by name of the plugins you want to deactivate. + +```js +const plugins = meeting.plugins.active.toArray(); +const plugin = plugins.find((p) => p.name === 'YouTube'); + +await plugin?.deactivate(); +``` + + + + +The deactivate() method activates a plugin for all users in the meeting. You can access all active plugins from `meeting.plugins.active`. + +The snippet below displays deactivate a single plugin. + +```kotlin + val plugin = meeting.plugins.active['pluginName'] + plugin?.deactivate() +``` + + + + +The deactivate() method activates a plugin for all users in the meeting. You can access all active plugins from `meeting.plugins.active`. + +The snippet below displays deactivate a single plugin. + +```swift + val plugin = meeting.plugins.active['pluginName'] + plugin?.deactivate() +``` + +When a plugin is deactivated, it triggers a callback in onPluginDeactivated(). To be able to listen to plugin events you need to implement a methods from callback `DytePluginEventsListener`. You can subscribe to this events by calling meeting.addPluginEventsListener(dytePluginEventsListener). + +```swift +extension MeetingViewModel: DytePluginEventsListener { + + func onPluginDeactivated(plugin: DytePlugin) { + // your code to handle plugin de-activation + } + +} +``` + + + + +## Configure existing plgins + +For further reading on configuring existing plugins, check out the guides below: + + + + + + diff --git a/docs/guides/capabilities/plugins/streamer.mdx b/docs/guides/capabilities/plugins/streamer.mdx new file mode 100644 index 0000000000..78a743fae8 --- /dev/null +++ b/docs/guides/capabilities/plugins/streamer.mdx @@ -0,0 +1,36 @@ +# Video Player + +Streamer allows you to share & watch your favorite videos together. The plugin exposes a few APIs to control the video playback + +## Loading a video + +You can specify the following parameters: + +- `link` : URL to the video you wish to play +- `loop` : Specify video behavior, if you want to restart the video once it has ended. +- `hideBack` : Prevents users from closing the video. + +Any user can send the parameters to the plugin + +```ts +const id = '20b1dd35-4500-4315-80aa-bbbaa2083f2b'; +const streamerPlugin = meeting.plugins.all.get(id); +streamerPlugin.on('ready', () => { + streamerPlugin.sendData({ + eventName: 'config', + data: { + eventName: 'config', + link: 'https://www.youtube.com/watch?v=UGl4XZ_zr5w&t=5s', + loop: true, + hideBack: true, + }, + }); +}); +``` + +Now whenever the plugin is loaded it will use the specified parameters. +To open the plugin you can call + +```ts +streamerPlugin.activate(); +``` diff --git a/docs/guides/capabilities/plugins/whiteboard.mdx b/docs/guides/capabilities/plugins/whiteboard.mdx new file mode 100644 index 0000000000..bba4023154 --- /dev/null +++ b/docs/guides/capabilities/plugins/whiteboard.mdx @@ -0,0 +1,40 @@ +# Whiteboard + +Whiteboard allows you to write, draw and ideate collaboratively. Built on top of tldraw + +## Saving the whiteboard + +You can save the whiteboard from the UI or you can use the API + +```ts +const id = 'ae79b269-24ca-4f8a-8112-f96084c8c19a'; +const plugin = meeting.plugins.all.get(id); + +plugin.sendData({ + eventName: 'save-board', + data: { eventName: 'save-board' }, +}); +``` + +## Customization + +You can customization the following parameters: + +- `follow`: Peer ID of the participant you want this user to follow. +- `role`: The role you want the current user to assume in the plugin. This field can have two values: `editor` , `viewer`. The default value for this field is `editor`. +- `autoScale`: Scales the user’s board to view all content when another user draws on it. The default value for this field is `false`. + +```ts +meeting.participants.on('participantJoined', (participant) => { + if (participant.id !== '') return; + plugin.sendData({ + eventName: 'config', + data: { + eventName: 'config', + follow: '', + role: 'viewer', + autoScale: true, + }, + }); +}); +``` diff --git a/docs/guides/capabilities/polls/_category_.json b/docs/guides/capabilities/polls/_category_.json new file mode 100644 index 0000000000..4d04e892b8 --- /dev/null +++ b/docs/guides/capabilities/polls/_category_.json @@ -0,0 +1,5 @@ +{ + "position": 5, + "label": "Polls", + "collapsible": true +} diff --git a/docs/guides/capabilities/polls/getting_started.mdx b/docs/guides/capabilities/polls/getting_started.mdx new file mode 100644 index 0000000000..1832395ac7 --- /dev/null +++ b/docs/guides/capabilities/polls/getting_started.mdx @@ -0,0 +1,575 @@ +# Getting started with Polls + +`Poll` objects exist within a meeting and can only be accessed through a meeting object. This object provides methods to create polls, vote, and more. + + + + +`meeting.polls.items` returns an array of all polls created in a meeting, where each element is an object of type `Poll` which is defined in the following manner. + +The Poll object has the following properties: + +| Property | Description | +| --------------- | ------------------------------------------------------------------------- | +| id | Unique ID assigned to each poll | +| question | Question of the poll | +| options | Array of PollOption object, contains all the options to the poll question | +| anonymous | To hide the votes of each user even after completion (false by default) | +| hideVotes | Hide votes until the voting is complete (enabled if anonymous is enabled) | +| createdBy | Name of creator of the poll | +| createdByUserId | ID of creator of the poll | +| voted | List of participant IDs who have voted on the poll | + +The `PollOption` object has the following properties: + +| Property | Description | +| -------- | ------------------------------------------------------------------------------------ | +| text | Contains the option text | +| votes | List of PollVote object, which contains the id and name of the voters of this option | +| count | Int of number of votes given to this option | + + + + +`meeting.polls.items` returns an array of all polls created in a meeting, where each element is an object of type `Poll` which is defined in the following manner. + +The Poll object has the following properties: + +| Property | Description | +| --------------- | ------------------------------------------------------------------------- | +| id | Unique ID assigned to each poll | +| question | Question of the poll | +| options | Array of PollOption object, contains all the options to the poll question | +| anonymous | To hide the votes of each user even after completion (false by default) | +| hideVotes | Hide votes until the voting is complete (enabled if anonymous is enabled) | +| createdBy | Name of creator of the poll | +| createdByUserId | ID of creator of the poll | +| voted | List of participant IDs who have voted on the poll | + +The `PollOption` object has the following properties: + +| Property | Description | +| -------- | ------------------------------------------------------------------------------------ | +| text | Contains the option text | +| votes | List of PollVote object, which contains the id and name of the voters of this option | +| count | Int of number of votes given to this option | + + + + +The meetings polls object can be accessed using `dyteClient.polls`. `dyteClient.polls.polls` returns an array of all polls created in a meeting, where each element is an object of type DytePollMessage. + +The `DytePollMessage` has the following properties: + +| Property | Description | +| --------- | ----------------------------------------------------------------------------- | +| id | Unique ID assigned to each poll | +| question | Question of the poll | +| anonymous | To hide the votes of each user even after completion (false by default) | +| hideVotes | Hide votes until the voting is complete (enabled if anonymous is enabled) | +| createdBy | Name of creator the poll | +| options | Array of DytePollOption object, contains all the options to the poll question | + +The `DytePollOption` has the following properties: + +| Property | Description | +| -------- | ---------------------------------------------------------------------------- | +| text | Contains the option text | +| votes | List of DytePollVote object, which contains info about voters of this option | +| count | Int of number of votes given to this option | + +The `DytePollVote` has the following properties: + +| Property | Description | +| -------- | ----------------- | +| id | ID of the voter | +| name | Name of the voter | + + + + +`meeting.polls.items` returns an array of all polls created in a meeting, where each element is an object of type `Poll` which is defined in the following manner. + +The Poll object has the following properties: + +| Property | Description | +| --------------- | ------------------------------------------------------------------------- | +| id | Unique ID assigned to each poll | +| question | Question of the poll | +| options | Array of PollOption object, contains all the options to the poll question | +| anonymous | To hide the votes of each user even after completion (false by default) | +| hideVotes | Hide votes until the voting is complete (enabled if anonymous is enabled) | +| createdBy | Name of creator of the poll | +| createdByUserId | ID of creator of the poll | +| voted | List of participant IDs who have voted on the poll | + +The `PollOption` object has the following properties: + +| Property | Description | +| -------- | ------------------------------------------------------------------------------------ | +| text | Contains the option text | +| votes | List of PollVote object, which contains the id and name of the voters of this option | +| count | Int of number of votes given to this option | + + + + +`meeting.polls.polls` returns an array of all polls created in a meeting, where +each element is an object of type `DytePollMessage`. + +The type `DytePollMessage` is the main class for any poll in Dyte. It also +contains list of `DytePollOption` which are options for a given poll. And every +`DytePollOption` has list of votes inside of it. Votes are objects of class +`DytePollVote` which internally has id and name of the vote. + +One can easily create, vote and view polls by listening to callbacks on +`meeting` object. + + + + +`meeting.polls.polls` returns an array of all polls created in a meeting, where each element is an object of type `DytePollMessage` + +The type `DytePollMessage` is the main class for any poll in Dyte. It also contains list of `DytePollOption` which are options for a given poll. And every `DytePollOption` has list of votes inside of it. Votes are objects of class DytePollVote which internally has id and name of the vote. + + + + +## Creating a new Poll + +### Using the coreSDK + +The `Polls` object gives a create function to create a new poll. It accepts the following parameters: + +| Param | Type | Default Value | Required | Description | +| --------- | -------- | ------------- | -------- | ------------------------------------------ | +| question | string | - | yes | The question that is to be voted for. | +| options | string[] | - | yes | The options of the poll. | +| anonymous | boolean | false | no | If true, the poll votes are anonymous. | +| hideVotes | boolean | false | no | If true, the votes on the poll are hidden. | + +Check the implementation in your desired framework. + + + + +```js +await meeting.poll.create( + 'Are you an early bird or a night owl?', + ['Early bird', 'Night owl'], + true +); +``` + +Here is a snippet of a poll where votes are anonymous. + + + + +```ts +await meeting.poll.create( + 'Are you an early bird or a night owl?', + ['Early bird', 'Night owl'], + true +); +``` + + + + +```dart +dyteClient.polls.create( + question: "Are you an early bird or a night owl?", + options: ["Early bird", "Night owl"], + anonymous: true, + hideVotes: false, +); +``` + + + + +```jsx +await meeting.poll.create( + 'Are you an early bird or a night owl?', + ['Early bird', 'Night owl'], + true +); +``` + + + + +```kotlin +meeting.poll.create( + "Are you an early bird or a night owl?", + listOf("Early bird", "Night owl"), + true, + false +) +``` + + + + +```swift +meeting.polls.create( + question: "Are you an early bird or a night owl?", + options: ["Early bird", "Night owl"], + anonymous: true, + hideVotes: false +) +``` + + + + +### Using the REST API + +You can also create a poll using the [Create a Poll](/api#/operations/CreatePoll) REST API. This can be used to create a new poll in an active meeting session. In the request, make sure to provide the meeting ID of the session. + +#### Request + +Here is a sample request, make sure to replace the meeting ID and the authorization header with your own. + +```bash +curl --request POST \ + --url https://api.dyte.io/v2/meetings/meeting_id/active-session/poll \ + --header 'Authorization: Basic undefined' \ + --header 'Content-Type: application/json' \ + --data '{ + "question": "string", + "options": [ + "string" + ], + "anonymous": true, + "hide_votes": true +}' +``` + +#### Response + +```json +{ + "success": true, + "data": { + "action": "string", + "poll": { + "id": "string", + "question": "string", + "options": [ + { + "text": "string", + "count": 0, + "votes": [ + { + "id": "string", + "name": "string" + } + ] + } + ], + "anonymous": true, + "hide_votes": true, + "created_by": "string", + "voted": ["string"] + } + } +} +``` + +## Voting on a Poll + +The `Poll` object also provides a `vote` method that can be used to register votes on a poll. +It accepts the following parameters: + +| Param | Type | Default Value | Required | Description | +| ----- | ------ | ------------- | -------- | ------------------------------------------ | +| id | string | - | yes | The ID of the poll that is to be voted on. | +| index | number | - | yes | The index of the option. | + + + + +```ts +const poll = meeting.polls.items[0]; +await meeting.poll.vote(poll.id, 0); +``` + + + + +```ts +const poll = meeting.polls.items[0]; +await meeting.poll.vote(poll.id, 0); +``` + + + + +```dart +final poll = dyteClient.polls.polls[0]; +final selectedPollOption = poll.options[0]; +dyteClient.polls.vote(poll, selectedPollOption); +``` + + + + +```ts +const poll = meeting.polls.items[0]; +await meeting.poll.vote(poll.id, 0); +``` + + + + +```kotlin +val poll = meeting.polls.items[0] +val selectedPollOption = poll.options[0] +meeting.poll.vote(poll, selectedPollOption) +``` + + + + +```swift +let poll = meeting.polls.items.first +let selectedPollOption = poll.options.first +meeting.polls.vote(pollMessage: poll, pollOption: selectedPollOption) +``` + + + + +## View Poll Results + +The total votes on a poll can be accessed in the following manner where `votes` is an array of all participant ids. + + + + +```jsx +const poll = meeting.polls.items[0]; +const votes = poll.voted; +``` + + + + +```tsx +const poll = meeting.polls.items[0]; +const votes = poll.voted; +``` + + + + +```dart +final poll = dyteClient.polls.polls[0]; +let votes = 0; +for (final option in poll.options) { + votes += option.count +} +``` + + + + +```tsx +const poll = meeting.polls.items[0]; +const votes = poll.voted; +``` + + + + +```kotlin +val poll = meeting.polls.items[0] +val votes = 0; +for (option in poll.options){ + votes += option.votes.siz; +} +``` + + + + +```swift +let poll = meeting.polls.items.first +let votes = 0; +for option in poll.options { + votes += option.votes.count +} +``` + + + + +To get total votes on a particular poll option, the list of all options can be fetched, through which you can get the number of votes on each option. + + + + +```jsx +const poll = meeting.polls.items[0]; +const options = poll.options; +``` + +`options` returns an array of objects, where each object is of type [`PollObject`](./). + + + + +```tsx +const poll = meeting.polls.items[0]; +const options = poll.options; +``` + + + + +```dart +final poll = dyteClient.polls.polls[0]; +final options = poll.option; +``` + + + + +```tsx +const poll = meeting.polls.items[0]; +const options = poll.options; +``` + + + + +```kotlin +val poll = meeting.polls.items[0] +val options = poll.options; +``` + + + + +```swift +let poll = meeting.polls.items.first; +let options = poll.option; +``` + + + + +## Get notified when a poll is created or updated + +An event is fired each time `items` in the `Polls Objects` are updated or created. User +can listen for this to get the updated list of polls. the response object +contains the following properties. + +- `polls`: List of all polls. +- `newPoll`: A boolean variable which is true when a new poll has been created. + + + + +```ts +meeting.polls.on('pollsUpdate', ({ polls, newPoll }) => { + console.log(polls, newPoll); +}); +``` + + + + +```jsx +meeting.polls.on('pollsUpdate', ({ polls, newPoll }) => { + console.log(polls, newPoll); +}); +``` + + + + +To be able to receive new poll messages you need to implement a method onPollUpdates() method from callback `DytePollEventsListener`: + +To get poll updates, listen to `onPollUpdates()` callback: + +```dart + +class PollEventsListeners extends DytePollEventsListener { + + ... + + @override + void onPollUpdates(List polls) { + /// code to handle polls + } + + @override + void onNewPoll(DytePollMessage poll) { + /// code to handle new poll + } + + ... +} + +``` + +You can subscribe to this events by `addPollEventsListener` method: + +```dart +dyteClient.addPollEventsListener(PollEventsListeners()); +``` + + + + +```jsx +meeting.polls.on('pollsUpdate', ({ polls, newPoll }) => { + console.log(polls, newPoll); +}); +``` + + + + +To be able to receive new poll messages you need to implement a method +`onPollUpdates()` method from callback `DyteMeetingRoomEventsListener`. You can +subscribe to this events by calling +`meeting.addMeetingEventsListener(dyteMeetingRoomEventsListener)` + +```kotlin + meeting.addMeetingRoomEventsListener(object : + DyteMeetingRoomEventsListener { + override fun onNewPoll(poll: DytePollMessage) { + super.onNewPoll(poll) + // code to handle new poll + } + + override fun onPollUpdates(pollMessages: List) { + super.onPollUpdates(pollMessages) + // code to handle polls and their vote updates. + } + }) +``` + + + + +To receive new poll messages, you must implement the` onPollUpdates()` method from the callback `DytePollEventsListener`. You can subscribe to this event by using the meeting.`addMeetingEventsListener(dytePollEventsListener)` method. + +```swift +extension MeetingViewModel: DytePollEventsListener { + func onNewPoll(poll: DytePollMessage) { + // code to handle new poll + } + + func onPollUpdates(pollMessages: [DytePollMessage]) { + // code to handle polls and their vote updates + } + } +``` + + + diff --git a/docs/guides/capabilities/polls/index.mdx b/docs/guides/capabilities/polls/index.mdx new file mode 100644 index 0000000000..be7db20013 --- /dev/null +++ b/docs/guides/capabilities/polls/index.mdx @@ -0,0 +1,9 @@ +# Polls + +Polls can be integrated in all kinds of Dyte meetings ranging from voice to livestream. Dyte's SDK makes it really simple to perform all operations required to create and run a poll. You can choose to use the coreSDK with Dyte's UIKit to create seamless poll interactions in a couple of minutes, or you can also use the coreSDK with your custom components. + +The guides walk you through the functionalities that the coreSDK and the UIKit provide you. + +1. [Getting started with Polls](./polls/getting_started) walks through creating polls from the coreSDK + +2. [Integrating UIKit for Polls](./polls/uikit) helps understand the UI components that can be used to make integrating polls even easier diff --git a/docs/guides/capabilities/polls/uikit.mdx b/docs/guides/capabilities/polls/uikit.mdx new file mode 100644 index 0000000000..c70e7547f4 --- /dev/null +++ b/docs/guides/capabilities/polls/uikit.mdx @@ -0,0 +1,423 @@ +# UIKit components for Polls + +Using Dyte's UIKit you can simplify the process of adding polls in your meetings! + +### Prerequisites + +1. Install coreSDK for your framework +2. Install UIKit for your framework + +## Dyte Poll Form : Create a new poll + +If a user has the right set of permissions, the first thing they woulds want to do is create a poll for the meeting. The easiest way to get started is to grab the `Dyte Poll Form` which allows you to create a poll. Check out the implementation based on the framework you are using: + + + + +```jsx + + +``` + + + + +```jsx + console.log('create poll', e.detail)} /> +``` + +You can control what happens after a poll is creating by using `onDyteCreatePoll` prop. + + + + +```jsx + + + +``` + + + + +:::info + +This component is not yet available on Flutter. + +::: + + + + +```jsx + console.log('create poll', e.detail)} /> +``` + + + + +:::info + +This component is not yet available for android development. + +::: + + + + +:::info + +This component is not yet available for iOS development. + +::: + + + + +## Dyte Polls : View existing polls + +After a user is done creating a poll, they can see all the polls available in a meeting using `Dyte Polls` and enable/disable the polls. + + + + +```jsx + + + + + +``` + + + + +```jsx + +``` + + + + +```jsx + + + + +``` + + + + +:::info + +This component is not yet available on Flutter. + +::: + + + + +```jsx + +``` + + + + +:::info + +This component is not yet available for android development. + +::: + + + + +:::info + +This component is not yet available for iOS development. + +::: + + + + +## Dyte Poll: View poll + +The `Dyte Poll` component lets the users view a given poll. It requires a poll object to render the poll. + + + + +```jsx + + + +``` + + + + +```jsx + { + console.log('Voted', e.detail); + }} +/> +``` + + + + +```jsx + + + +``` + + + + +:::info + +This component is not yet available on Flutter. + +::: + + + + +```jsx + { + console.log('Voted', e.detail); + }} +/> +``` + + + + +:::info + +This component is not yet available for android development. + +::: + + + + +:::info + +This component is not yet available for iOS development. + +::: + + + + +## Dyte Polls Toggle + +Using the `Dyte Polls Toggle`, one can easily change the visibility of a poll on the screen. It requires the user's meeting object to see the unread polls count badge on the component. + + + + +```jsx + + +``` + + + + +```jsx + +``` + + + + +```jsx + + + +``` + + + + +:::info + +This component is not yet available on Flutter. + +::: + + + + +```jsx + +``` + + + + +:::info + +This component is not yet available for android development. + +::: + + + + +:::info + +This component is not yet available for iOS development. + +::: + + + diff --git a/docs/guides/capabilities/screensharing/_category_.json b/docs/guides/capabilities/screensharing/_category_.json new file mode 100644 index 0000000000..d6f0876a4c --- /dev/null +++ b/docs/guides/capabilities/screensharing/_category_.json @@ -0,0 +1,4 @@ +{ + "position": 8, + "label": "Screen Sharing" +} diff --git a/docs/guides/capabilities/screensharing/index.mdx b/docs/guides/capabilities/screensharing/index.mdx new file mode 100644 index 0000000000..31034ecbc7 --- /dev/null +++ b/docs/guides/capabilities/screensharing/index.mdx @@ -0,0 +1,310 @@ +# Screen Sharing + +Dyte allows you to enable multiple users to share their screens during a meeting session. To integrate screen sharing in your application, go through the following steps: + +## Screen Sharing Permission + +First you want to ensure that the user has permission to share the screen. This can be configured using the preset that is assigned to the user in a meeting session. You can always change the configurations of the preset. + +To allow the participant to share their screen, make sure to set `canAllowParticipantScreensharing` to `true` in the preset configuration. + +To allow certain users to share their screen during an active meeting session, you can control the preset the user is assigned to (`presetName` property of the participant object) or update the configuration of their current preset. + +:::info + +Presets can be updated from the Dyte developer portal or using the [update preset API](/api#/operations/patch-presets-preset_id). + +::: + +## Enable/Disable Screen Sharing + +Once users have the permissions to share their screen, they need to be able to start or stop sharing their screens. Use the coreSDK to enable or disable screen sharing for the user. Follow the implementation based on the development platform you are using. + + + + +```jsx +// Enable Screenshare +await meeting.self.enableScreenShare(); + +// Disable Screenshare +await meeting.self.disableScreenShare(); + +// Get current status +meeting.self.screenShareEnabled; +``` + +You can also define defaults for screen sharing during the client initialisation. Check out the [local user](/web-core/local-user/introduction#enable--disable-screen-share) reference for more details. + + + + +```jsx +// Enable Screenshare +await meeting.self.enableScreenShare(); + +// Disable Screenshare +await meeting.self.disableScreenShare(); + +// Get current status +meeting.self.screenShareEnabled; +``` + +You can also define defaults for screen sharing during the client initialisation. Check out the [local user](/web-core/local-user/introduction#enable--disable-screen-share) reference for more details. + + + + +```dart +// Enable Screenshare +dyteClient.localUser.enableScreenShare(); + +// Disable Screenshare +dyteClient.localUser.disableScreenShare(); + +// Get current status +dyteClient.localUser.screenShareEnabled; +``` + + + + +```jsx +// Enable Screenshare +await meeting.self.enableScreenShare(); + +// Disable Screenshare +await meeting.self.disableScreenShare(); + +// Get current status +meeting.self.screenShareEnabled; +``` + + + + +```kotlin +// Enable Screenshare +meeting.localUser.enableScreenShare(); + +// Disable Screenshare +meeting.localUser.disableScreenShare(); + +// Get current status +meeting.localUser.screenShareEnabled; +``` + + + + +```swift +// Enable Screenshare +meeting.localUser.enableScreenShare(); + +// Disable Screenshare +meeting.localUser.disableScreenShare(); + +// Get current status +meeting.localUser.screenShareEnabled; +``` + + + + +## Building UI for screen sharing + +### Screen share View + +Once the user starts sharing the screen, use the screenshare view from the UIKit to display the shared screen. The component allows you to nest other components inside it to create a custom layout based on your needs. Check out a the sample usage of UIKit on your prefered platform. + +This component does not render anything if the participant hasn't start sharing their screen. + + + + +```jsx + + + + + + + +``` + +Check out the [reference](/ui-kit/components/dyte-screenshare-view) for more details about the attributes. + +To create your own component, you can use the `screenShareTracks` property of the [local user](/web-core/local-user/introduction) to get the list of screen share tracks and control how you want to display them. + + + + +```jsx +import { + DyteScreenshareView, + DyteNameTag, + DyteAudioVisualizer, +} from '@dytesdk/react-ui-kit'; + + + + + +; +``` + +Check out the [reference](/react-ui-kit/components/dyte-screenshare-view) for more details about the props. + +To create your own component, you can use the `screenShareTracks` property of the [local user](/react-web-core/local-user/introduction) to get the list of screen share tracks and control how you want to display them. + + + + +```jsx + + + + + +``` + +Check out the [reference](/angular-ui-kit/components/dyte-screenshare-view) for more details about the attributes. + +To create your own component, you can use the `screenShareTracks` property of the [local user](/web-core/local-user/introduction) to get the list of screen share tracks and control how you want to display them. + + + + +:::info +This UI component does not currently exist in the Flutter UIKit. +::: + + + + +```jsx +import { + DyteScreenshareView, + DyteNameTag, + DyteAudioVisualizer, +} from '@dytesdk/react-native-ui-kit'; + + + + + +; +``` + +Check out the [reference](/react-native/components/dyte-screenshare-view) for more details about the props. + +To create your own component, you can use the `screenShareTracks` property of the [local user](/rn-core/local-user/introduction) to get the list of screen share tracks and control how you want to display them. + + + + +:::info +This UI component does not currently exist in the Android UIKit. +::: + +You can create your own component. To do so use the `screenShareTrack` property of the [local user](/android-core/local-user/introduction) to get the list of screen share tracks and control how you want to display them. + + + + +:::info +This UI component does not currently exist in the iOS UIKit. +::: + +You can create your own component. To do so use the `screenShareTrack` property of the [local user](/ios-core/local-user/introduction) to get the list of screen share tracks and control how you want to display them. + + + + +### Screen share toggle + +You can create your own button to toggle screen sharing for the user or use the default button provided by the UIKit. + + + + +```jsx + + + + + +``` + + + + +```jsx +import { DyteScreenShareToggle } from '@dytesdk/react-ui-kit'; +
+ + + +
; +``` + +
+ + +```jsx + + + +``` + + + + +:::info +This UI component does not currently exist in the Flutter UIKit. +::: + + + + +```jsx +import { DyteScreenShareToggle } from '@dytesdk/react-native-ui-kit'; +
+ + + +
; +``` + +
+ + +:::info +This UI component does not currently exist in the Android UIKit. +::: + + + + +:::info +This UI component does not currently exist in the iOS UIKit. +::: + + +
diff --git a/docs/guides/live-video/concepts.mdx b/docs/guides/live-video/concepts.mdx index 009701ea04..a4e1432701 100644 --- a/docs/guides/live-video/concepts.mdx +++ b/docs/guides/live-video/concepts.mdx @@ -81,7 +81,7 @@ Once you have grabbed your API key, we can begin to take a look at your server s That’s all for the server, now let’s move to the client side which will majorly define how your user interacts with the services. In video calls, there are a number of interactions that the user needs to perform. These interactions can become really complex with things like handling audio/video permissions, but Dyte's SDK makes it really simple for you. It abstracts away all these tiresome details through a thin layer of abstraction that is our **coreSDK**. You still get granular control without having to worry about messy implementation details. -To connect with the meetings from the client, you need to initialise the coreSDK. This requires the `authToken` which is unique to every participant in a meeting. Your client needs to connect with the meetings. The key requirement for initialising the coreSDK is the `authToken`. The coreSDK itself does not provide any UI components but instead is a data-only API layer. +To connect with the meetings from the client, you need to initialise the coreSDK. This requires the `authToken` which is unique to every participant in a meeting. Your client needs to connect with the meetings. The `authToken`is returned from the [Add Participant API](api#/operations/add_participant). The coreSDK itself does not provide any UI components but instead is a data-only API layer. ### UIKit diff --git a/docs/guides/livestream/concepts.mdx b/docs/guides/livestream/concepts.mdx index f6faa06b63..7416de13bf 100644 --- a/docs/guides/livestream/concepts.mdx +++ b/docs/guides/livestream/concepts.mdx @@ -5,7 +5,7 @@ sidebar_position: 2 # Concepts -This topic covers essential concepts related to Dyte's interactive live streaming (ILS). For the concepts related to live video applications, see [Video Conferencing concepts](/guides/live-video/concepts-live-video). +This topic covers essential concepts related to Dyte's interactive live streaming (ILS). For the concepts related to live video applications, see [Video Conferencing concepts](/guides/live-video/concepts). ## Interactive live streaming diff --git a/docs/guides/migration/twilio/feature-comparison.mdx b/docs/guides/migration/twilio/feature-comparison.mdx index 8473ff97fa..5a5107e1c0 100644 --- a/docs/guides/migration/twilio/feature-comparison.mdx +++ b/docs/guides/migration/twilio/feature-comparison.mdx @@ -1,3 +1,4 @@ + --- title: 'Compatibility Matrix' wrapperClassName: 'test2' @@ -41,11 +42,11 @@ wrapperClassName: 'test2'
-1. **PSTN** πŸ”΅ - Can integrate with third party SIP to provide telephony support +1. **PSTN** πŸ”΅ : Can integrate with third-party SIP to provide telephony support. -2. **Callkit (iOS)** 🟠 - Customers can add it at their end, sample code available +2. **Callkit (iOS)** 🟠 : Customers can add it at their end, sample code is available. -3. **Data center selection** ⭐ - With Twilio a Room can only take place in one Data Center at a time, so that means if a user from US is connecting with a user in India, a region in the middle of two (like Europe) would be choose by default under 'gcc'. In Dyte a single media meeting can take place across multiple regions (Beta), so for the previous example the US user will connect to the US region and Indian user to the India region. +3. **Data center selection** ⭐ : With Twilio a Room can only take place in one Data Center at a time, so that means if a user from the US is connecting with a user in India, a region in the middle of two (like Europe) would be choose by default under 'gcc'. In Dyte a single media meeting can take place across multiple regions (Beta), so for the previous example the US user will connect to the US region and the Indian user to the India region.
@@ -63,15 +64,13 @@ wrapperClassName: 'test2' | Max Audio Track Publications per Participant | 2 | 2 | | Max Video Track Publications per Participant | 6 | 2 | -
* Default quota is 1000, contact support to increase it upto 10000 +
* Default quota is 1000, contact [support](https://dyte.io/contact) to increase it upto 10000.

-Note: These are upper bound numbers and it might not be possible to reach the maximum of multiple of these metrics at the same time, for eg - -Scenario : In case where participants in Room (Meeting) = 10000; We will not be able to do 300 publications per Room with 30 subscriptions per Participant +**Note:** These are upper bound numbers and it might not be possible to reach the maximum of multiple of these metrics at the same time. For example, in a scenario where participants in Room (Meeting) = 10000; we will not be able to do 300 publications per Room with 30 subscriptions per Participant. -Reach out to us at support [at] dyte.io to understand how we can accommodate your limits +Reach out to us at support [at] dyte.io to understand how we can accommodate your limits. diff --git a/docs/guides/voice-conf/concepts.mdx b/docs/guides/voice-conf/concepts.mdx index ba869a98b4..a4e1432701 100644 --- a/docs/guides/voice-conf/concepts.mdx +++ b/docs/guides/voice-conf/concepts.mdx @@ -3,39 +3,14 @@ title: 'Concepts' sidebar_position: 2 --- -This topic covers essential concepts related to Dyte's voice applications. +We highly recommend that you go through this page to understand the basics of Dyte and to optimally use it in your applications. This page is divided into two sections **Basic Concepts** and **Architecture**. -## Backend HTTP REST APIs +- [Basic Concepts](#basic-concepts) section takes you through Dyte's key terminology to give you an understanding of what purpose they serve +- [Architecture](#architecture) walks you through the different components of Dyte and how the pieces fit in with your existing application -Your backend utilizes Dyte REST APIs to perform actions such as: +## Basic Concepts -- [Create meetings](/api#/operations/create_meeting) -- [Add participants to a meeting](/api#/operations/add_participant) -- [Start recording a meeting](/api#/operations/start_recording) and so on - -## Frontend SDKs - -Your applications bundle Dyte Core SDKs (and UI Kits) to acquire, transmit and play media, and manage network connections. - -- **Core SDK**: The Dyte Core SDK is designed to provide an easy way to incorporate real-time communication (RTC) solutions. With full customization and branding options, you can build your own UI from the ground up without dealing with complicated media layers. See [Introduction to Core SDK](/web-core/Introduction). - -- **UI Kit**: Dyte's UI Kit is a prebuilt design library of UI components designed to simplify the integration of video and voice calls into your product. See [UI Kit](/react-ui-kit). - -## Developer portal - -The [Developer Portal](https://dev.dyte.io/dashboard) serves as a comprehensive platform, offering access to meeting logs, API key management, billing operations, and various other functionalities in one place. - -You can also use Developer Portal to create meetings, presets, setup storage for recordings, add webhooks, and much more. - -dev-portal - -## Organization +### Organization In Dyte, the organization serves as the top-level entity where all participants of your group are added. You can create an organization using the [API](/api#/operations/createOrg) or through the Developer Portal. @@ -43,7 +18,7 @@ In Dyte, the organization serves as the top-level entity where all participants - The API keys are generated for your organization. These API Keys are unique to your organization and are required to use Dyte REST APIs such as when instantiating a meeting. - Additionally, Dyte considers the organization as a billing unit. -## Meeting +### Meeting A communication channel created on Dyte is termed as a `meeting`. Meetings can be created using the [Create a meeting API](/api#/operations/create_meeting) or through the Developer Portal. Similarly, you can get the details of your meeting using the [API](/api#/operations/get_all_meetings) or developer portal. @@ -57,7 +32,7 @@ An example from the Developer Portal displaying meeting details. className="concept-meeting-live-video" /> -## Session +### Session In Dyte, a meeting is a communication channel, and each instance of that channel is called a session. A session represents an ongoing meeting within that communication channel. Like meetings, you can get fetch the details of a session via Developer Portal or using the [APIs](/api#/operations/GetSessions). @@ -71,10 +46,43 @@ An example from the Developer Portal displaying session details. className="session-details-live-video" /> -## Preset +### Preset A preset is a set of permissions and UI configurations that are applied to participants for different meeting types such as Group Call, Webinar, and Livestream. The presets define how a meeting will appear visually and functional aspects of the meeting. They allow customization options like setting maximum number of participants on-screen, permissions to share screen, enabling poll creation, disabling video and audio, adjusting text color, configuring plugins, etc. -## Participants +### Participant Anyone who joins the `meeting`, including actual users and machine users. You can add participants using the [Add Participant API](/api#/operations/add_participant). Participants will have permissions for the meeting depending on the selected preset. The `presetName` must be passed in the body of the Add Participant API request. + +## Architecture + +Now that you are familiar with the terminology of basic concepts on Dyte, we can take a look at how different offerings from Dyte come together. The key offerings are the REST API, core SDK , UIKit and a Developer Portal. Each of these serve different purposes and belong in different blocks of your application. + +Let’s dive deeper into what purpose each of these components server. + +### Developer Portal + +To begin with, let's start with our dashboard. This is where you will do a number of administrative tasks. This is your go-to-place for things like defining organisations, meeting logs, grabbing API Keys and billing operations. +You can also use Developer Portal to create meetings, presets, setup storage for recordings, add webhooks, and much more. + +dev-portal + +### REST API + +Once you have grabbed your API key, we can begin to take a look at your server side. To enable live video on your platform, all you have to do is call Dyte’s REST API from your server and it does all the heavy lifting for you. We have endpoints for all your needs. We give you granular control over what all you can do through our infrastructure. On your server, all you need to worry about is how and when to make an API call to Dyte’s server and make use of the data or functionality you need. You can check out all the endpoints that are available to you [here](/api/) + +### Core SDK + +That’s all for the server, now let’s move to the client side which will majorly define how your user interacts with the services. In video calls, there are a number of interactions that the user needs to perform. These interactions can become really complex with things like handling audio/video permissions, but Dyte's SDK makes it really simple for you. It abstracts away all these tiresome details through a thin layer of abstraction that is our **coreSDK**. You still get granular control without having to worry about messy implementation details. + +To connect with the meetings from the client, you need to initialise the coreSDK. This requires the `authToken` which is unique to every participant in a meeting. Your client needs to connect with the meetings. The `authToken`is returned from the [Add Participant API](api#/operations/add_participant). The coreSDK itself does not provide any UI components but instead is a data-only API layer. + +### UIKit + +We have separated the load of building user interactions from the UI components. You can simply use the coreSDK to enable components to perform actions around the meetings and extend your existing UI libraries. But to make your life easier, we offer a UIKit that can be easily integrated with your application including your branding! The UIKit provides multiple kinds of UI components which follow the atomic design principles. You can choose from a variety of basic components like buttons to very advanced components like meeting pages. Our UIKit is built on top of the coreSDK and it cannot function in isolation! Make sure you grab both the UIKit and the coreSDK when you choose to work with our UIKit. To learn more about how to work with UIKit you can head [here](/guides/capabilities/customize-ui/use-ui-kit-components). diff --git a/docs/ios-core/quickstart.mdx b/docs/ios-core/quickstart.mdx index 45d1850ca3..6b95135a83 100644 --- a/docs/ios-core/quickstart.mdx +++ b/docs/ios-core/quickstart.mdx @@ -6,6 +6,8 @@ tags: [mobile-core, quickstart] slug: / --- +import { CocoaPodInstallation } from '@site/src/components/LatestInstallation'; + # iOS Core SDK Quickstart This quickstart shows how to use Dyte's iOS Core SDK to add live video and audio @@ -59,9 +61,7 @@ platform :ios, '13.0' 2. Add 'DyteiOSCore' to your Podfile. -```ruby -pod 'DyteiOSCore' , '1.25.4' -``` + 3. Install the client SDK from pod. @@ -147,6 +147,22 @@ with the Dyte meeting server. ```swift meeting.doInit(dyteMeetingInfo_: meetingInfo) ``` +Note: This is the asynchronous method, You will have to attached observer (meeting.addMeetingRoomEventsListener(meetingRoomEventsListener: self) +) to know its completion state, success or failure, Listen to below callbacks of 'DyteMeetingRoomEventsListener'. + + +```swift +func onMeetingInitCompleted() { + } + +func onMeetingInitFailed(exception: KotlinException) { + } +``` + +OR + +To initialize the connection request, call the `doInit(dyteMeetingInfo: DyteMeetingInfoV2, onInitCompleted: () -> Void, onInitFailed_: () -> Void)` method +which is asynchronous and callback based. ## Step 5: Connect to the meeting @@ -156,10 +172,26 @@ the room. ### Join the room -To join the meeting room, do the following: +To join the meeting room, do the following only after you received the doInit completion callbacks. + +```swift +func onMeetingInitCompleted() { + meeting.joinRoom() + } +``` + +Or ```swift -meeting.joinRoom() + meeting.doInit(dyteMeetingInfo: meetingInfo) { + self.meeting.joinRoom { + print("Room Joined successfully") + } onRoomJoinFailed: { + print("Room Joined failed") + } + } onInitFailed_: { + print("Meeting Initialisation got failed") + } ``` Join room event listeners: Once you call `joinRoom()`, you can listen to diff --git a/docs/ios-core/recording.mdx b/docs/ios-core/recording.mdx index b0df98a412..14b8ab6808 100644 --- a/docs/ios-core/recording.mdx +++ b/docs/ios-core/recording.mdx @@ -31,6 +31,22 @@ Call `meeting.recording.stop()` to stop the active recording. meeting.recording.stop() ``` +## Pause a recording + +Call `meeting.recording.pause()` to pause the active recording. + +```swift +meeting.recording.pause(); +``` + +## Resume a paused recording + +Call `meeting.recording.resume()` to resume the paused recording. + +```swift +meeting.recording.resume(); +``` + ## Get active recording state The `meeting.recording.recordingState` property describes the current state of diff --git a/docs/ios-core/release-notes.mdx b/docs/ios-core/release-notes.mdx new file mode 100644 index 0000000000..3ec694bb7e --- /dev/null +++ b/docs/ios-core/release-notes.mdx @@ -0,0 +1,10 @@ +--- +title: Release Notes +sidebar_position: 101 +sidebar_class_name: releaseSidebarHeading +tags: [mobile-core, releasenotes] +--- + +import ReleaseNotesGenerator from '@site/src/components/ReleaseNotesGenerator'; + + diff --git a/docs/ios/quickstart.mdx b/docs/ios/quickstart.mdx index 442cd9aa15..c022336ecf 100644 --- a/docs/ios/quickstart.mdx +++ b/docs/ios/quickstart.mdx @@ -3,6 +3,8 @@ title: Quickstart sidebar_position: 2 --- +import { CocoaPodInstallation } from '@site/src/components/LatestInstallation'; + # Quickstart This quickstart shows how to use Dyte's iOS UI Kit SDK to add live video and @@ -40,17 +42,7 @@ You must complete the following steps: 1. Add the following line to your `Podfile`. -```ruby -pod 'DyteUiKit' -``` - -OR for a specific version, use - -```ruby - -pod 'DyteUiKit', '0.4.1' - -``` + 2. Install the client SDK as a CocoaPods dependency. diff --git a/docs/ios/release-notes.mdx b/docs/ios/release-notes.mdx new file mode 100644 index 0000000000..af9f4d2ed2 --- /dev/null +++ b/docs/ios/release-notes.mdx @@ -0,0 +1,10 @@ +--- +title: Release Notes +sidebar_position: 101 +sidebar_class_name: releaseSidebarHeading +tags: [releasenotes] +--- + +import ReleaseNotesGenerator from '@site/src/components/ReleaseNotesGenerator'; + + diff --git a/docs/partials/_android-quickstart.mdx b/docs/partials/_android-quickstart.mdx index 10a37b406f..02552fe003 100644 --- a/docs/partials/_android-quickstart.mdx +++ b/docs/partials/_android-quickstart.mdx @@ -37,10 +37,7 @@ Make sure you've a mechanism to get `authToken` from your server-side, which you 1. Install the SDK using maven central dependency. -```python - // other dependencies here - implementation 'io.dyte:uikit:1.13.0' -``` + 2. Add the following permissions to the AndroidManifest.xml file. diff --git a/docs/partials/_flutter-quickstart.mdx b/docs/partials/_flutter-quickstart.mdx index bdcce80aef..dc431af690 100644 --- a/docs/partials/_flutter-quickstart.mdx +++ b/docs/partials/_flutter-quickstart.mdx @@ -1,6 +1,5 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import { MavenLatestInstallation } from '@site/src/components/LatestInstallation'; ## Quickstart diff --git a/docs/partials/_ios-quickstart.mdx b/docs/partials/_ios-quickstart.mdx index 95cea3ddf9..b9ce3e5dd1 100644 --- a/docs/partials/_ios-quickstart.mdx +++ b/docs/partials/_ios-quickstart.mdx @@ -1,6 +1,6 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -import { MavenLatestInstallation } from '@site/src/components/LatestInstallation'; +import { CocoaPodInstallation } from '@site/src/components/LatestInstallation'; ## Quickstart @@ -37,15 +37,7 @@ You'll learn how to: 1. Add the following line to your `Podfile` -```ruby -pod 'DyteUiKit' -``` - -OR for specific version: - -```ruby -pod 'DyteUiKit', '0.2.6' -``` + 2. Install the client SDK as CocoaPods dependency diff --git a/docs/rn-core/release-notes.mdx b/docs/rn-core/release-notes.mdx new file mode 100644 index 0000000000..bfea6de5d9 --- /dev/null +++ b/docs/rn-core/release-notes.mdx @@ -0,0 +1,10 @@ +--- +title: Release Notes +sidebar_position: 101 +sidebar_class_name: releaseSidebarHeading +tags: [mobile-core, releasenotes] +--- + +import ReleaseNotesGenerator from '@site/src/components/ReleaseNotesGenerator'; + + diff --git a/docs/rn-ui-kit/release-notes.mdx b/docs/rn-ui-kit/release-notes.mdx index c069b2ef16..4616e87167 100644 --- a/docs/rn-ui-kit/release-notes.mdx +++ b/docs/rn-ui-kit/release-notes.mdx @@ -7,4 +7,4 @@ tags: [releasenotes] import ReleaseNotesGenerator from '@site/src/components/ReleaseNotesGenerator'; - + diff --git a/docs/web-core/recording.mdx b/docs/web-core/recording.mdx index 3d61015b58..354cd99151 100644 --- a/docs/web-core/recording.mdx +++ b/docs/web-core/recording.mdx @@ -12,25 +12,91 @@ meeting. You can also get the current status of a recording using this API. The `meeting.recording` object has the following properties: -- `recordingState`: Indicates the current recording state of the meeting. +## List recordings + +Retrieve a list of active recordings along with their current status. + +```ts +const recordings = meeting.recording.recordings; +``` + +it returns list of recording ids and their state + +```ts +[ + { + id: '', + state: '', + }, +]; +``` + +The recording states include `IDLE`, `STARTING`, `RECORDING`, `PAUSED`, and `STOPPING`. ## Start a recording -To start a recording, you can call the `start` method in the `meeting.recording` -object. The valid states are `IDLE`, `STARTING`, `RECORDING`, and `STOPPING`. +Initiate a recording using the start method. ```ts await meeting.recording.start(); ``` +To enable multiple parallel recordings, the first recording must be started with the option `{ allowMultiple: true }`. + +```ts +await meeting.recording.start({ allowMultiple: true }); +``` + +Subsequent recordings can then be initiated while the first is still running. + ## Stop a recording -Call `meeting.recording.stop()` to stop the active recording. +End an active recording with the stop method. ```ts await meeting.recording.stop(); ``` +To stop a specific recording, provide the recording ID: + +```ts +await meeting.recording.stop(recordingId); +``` + +Omitting the recording ID will stop all recordings in `RECORDING` or `PAUSED` state. + +## Pause a recording + +Temporarily halt a recording using the pause method. + +```ts +await meeting.recording.pause(); +``` + +To pause a specific recording, include the recording ID: + +```ts +await meeting.recording.pause(recordingId); +``` + +Without a recording ID, all recordings in the `RECORDING` state will be paused. + +## Resume a recording + +Restart a paused recording with the resume method. + +```ts +await meeting.recording.resume(); +``` + +For resuming a specific recording, pass the recording ID: + +```ts +await meeting.recording.resume(recordingId); +``` + +If no recording ID is specified, all recordings in the `PAUSED` state will be resumed. + ## Recording Configuration You can set the defaults for recording during initialization @@ -83,5 +149,5 @@ It is equivalent of `file_name_prefix` in our [start recording API](https://docs ## Check active recording state The `meeting.recording.recordingState` property describes the current state of -the recording. The valid states are `IDLE`, `STARTING`, `RECORDING`, and +the recording. The valid states are `IDLE`, `STARTING`, `RECORDING`, `PAUSED` and `STOPPING`. diff --git a/docusaurus.config.js b/docusaurus.config.js index 886fbb46cf..58c046d382 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -133,7 +133,7 @@ const docs = [ routeBasePath: '/rn-core', versions: { current: { - label: '0.5.x', + label: '0.x.x', }, }, }, @@ -145,7 +145,7 @@ const docs = [ routeBasePath: '/android', versions: { current: { - label: '0.14.x', + label: '1.x.x', }, }, }, @@ -165,7 +165,7 @@ const docs = [ routeBasePath: '/ios', versions: { current: { - label: '1.33.x', + label: '1.x.x', }, }, }, @@ -175,7 +175,7 @@ const docs = [ routeBasePath: '/react-native', versions: { current: { - label: '1.4.x', + label: '1.x.x', }, }, }, diff --git a/src/components/LatestInstallation.jsx b/src/components/LatestInstallation.jsx index 6c92e5f49a..34e73b557a 100644 --- a/src/components/LatestInstallation.jsx +++ b/src/components/LatestInstallation.jsx @@ -2,12 +2,12 @@ import React, { useEffect, useState } from 'react'; import CodeBlock from '@theme/CodeBlock'; import latestNPMVersion from '../utils/npm'; -export const MavenLatestInstallation = () => { +export const MavenLatestInstallation = ({ pkg }) => { const [version, setVersion] = useState('+'); useEffect(() => { const raw = JSON.stringify({ - androidCore: true, + maven: pkg, }); const requestOptions = { @@ -27,13 +27,38 @@ export const MavenLatestInstallation = () => { {`dependencies { // (other dependencies) - implementation 'io.dyte:core-android:${version}' + implementation 'io.dyte:${pkg}:${version}' }`} ); }; +export const CocoaPodInstallation = ({ pkg, path }) => { + const [version, setVersion] = useState(undefined); + + useEffect(() => { + const requestOptions = { + method: 'GET', + body: null, + }; + + const url = `https://api.github.com/repos/CocoaPods/Specs/contents/Specs/${path}/`; + + fetch(url, requestOptions) + .then((response) => response.json()) + .then((result) => setVersion(result[result.length - 1]['name'])); + }, []); + + return ( +
+ + {`pod '${pkg}' ${version ? `, '${version}'` : ''}`} + +
+ ); +}; + export const WebCoreCDNInstallation = () => { const [version, setVersion] = useState(''); useEffect(() => { diff --git a/static/release-notes/android-core.json b/static/release-notes/android-core.json new file mode 100644 index 0000000000..3661c58a5f --- /dev/null +++ b/static/release-notes/android-core.json @@ -0,0 +1,22 @@ +[ + { + "version": "1.24.0", + "createdAt": 1701778861, + "fixes": [ + "Fixed an issue where callback was not getting triggered on un-pinning a participant", + "Fixed a crash for customers targeting Android 14 as their compileSdk configuration on their application" + ], + "breaking-changes": [] + }, + { + "version": "1.26.1", + "createdAt": 1702288067, + "new_api": [ + "DyteRecording class now have [pause()](../android-core/recording) and [resume()](../android-core/recording) methods to pause a recording and resume the same recording" + ], + "fixes": [ + "Fixed an issue with DyteStage where the stage status was not updating correctly when a participant received a request to join stage" + ], + "breaking-changes": [] + } +] diff --git a/static/release-notes/android-ui-kit.json b/static/release-notes/android-ui-kit.json new file mode 100644 index 0000000000..50787fbfaa --- /dev/null +++ b/static/release-notes/android-ui-kit.json @@ -0,0 +1,20 @@ +[ + { + "version": "1.14.2", + "createdAt": 1701928945, + "breaking-changes": [], + "features": [ + "In-app notifications when a participant requests to join the stage", + "New UI components, some of the previously internal components are now public, use them to build custom UI. Check out the components page for list of all new components" + ] + }, + { + "version": "1.14.3", + "createdAt": 1702361789, + "breaking-changes": [], + "features": [], + "fixes": [ + "Fixed an issue with Participant screen where the pinned status was not updating correctly when a participant was un-pinned" + ] + } +] diff --git a/static/release-notes/flutter-core.json b/static/release-notes/flutter-core.json new file mode 100644 index 0000000000..2319b35df0 --- /dev/null +++ b/static/release-notes/flutter-core.json @@ -0,0 +1,10 @@ +[ + { + "version": "1.24.0", + "createdAt": 1701778861, + "fixes": [ + "Fixed an issues with a callback not getting triggered for un-pinning a participant" + ], + "breaking-changes": [] + } +] diff --git a/static/release-notes/flutter-ui-kit.json b/static/release-notes/flutter-ui-kit.json new file mode 100644 index 0000000000..170748b940 --- /dev/null +++ b/static/release-notes/flutter-ui-kit.json @@ -0,0 +1,10 @@ +[ + { + "version": "0.4.0", + "createdAt": 1700632945, + "fixes": [ + "Small bug-fixes and performance improvements" + ], + "breaking-changes": [] + } +] diff --git a/static/release-notes/iOS-core.json b/static/release-notes/iOS-core.json new file mode 100644 index 0000000000..c2be3dc7d7 --- /dev/null +++ b/static/release-notes/iOS-core.json @@ -0,0 +1,21 @@ +[ + { + "version": "1.25.4", + "createdAt": 1701842545, + "fixes": [ + "Fixed an issue where callback was not getting triggered on un-pinning a participant" + ], + "breaking-changes": [] + }, + { + "version": "1.26.1", + "createdAt": 1702288067, + "new_api": [ + "DyteRecording class now have [pause()](../ios-core/recording) and [resume()](../ios-core/recording) methods to pause a recording and resume the same recording" + ], + "fixes": [ + "Fixed an issue with DyteStage where the stage status was not updating correctly when a participant received a request to join stage" + ], + "breaking-changes": [] + } +] diff --git a/static/release-notes/iOS-ui-kit.json b/static/release-notes/iOS-ui-kit.json new file mode 100644 index 0000000000..d141d2d0f1 --- /dev/null +++ b/static/release-notes/iOS-ui-kit.json @@ -0,0 +1,10 @@ +[ + { + "version": "0.4.1", + "createdAt": 1700978545, + "fixes": [ + "Minor bug-fixes and performance improvements" + ], + "breaking-changes": [] + } +] diff --git a/static/release-notes/react-native-core.json b/static/release-notes/react-native-core.json new file mode 100644 index 0000000000..065cf0cef2 --- /dev/null +++ b/static/release-notes/react-native-core.json @@ -0,0 +1,10 @@ +[ + { + "version": "0.6.7", + "createdAt": 1701064945, + "fixes": [ + "Small bug-fixes and performance improvements" + ], + "breaking-changes": [] + } +] diff --git a/static/release-notes/react-native-ui-kit.json b/static/release-notes/react-native-ui-kit.json new file mode 100644 index 0000000000..33d0d9525e --- /dev/null +++ b/static/release-notes/react-native-ui-kit.json @@ -0,0 +1,10 @@ +[ + { + "version": "1.4.5", + "createdAt": 1701410545, + "fixes": [ + "Small bug-fixes and performance improvements" + ], + "breaking-changes": [] + } +] diff --git a/static/release-notes/react-web-core.json b/static/release-notes/react-web-core.json index 5c188cb852..bfb7750cf4 100644 --- a/static/release-notes/react-web-core.json +++ b/static/release-notes/react-web-core.json @@ -1,173 +1,188 @@ [ - { - "version": "1.36.0", - "createdAt": "1698351924", - "fixes": [ - "Firefox 110+ [simulcast](https://en.wikipedia.org/wiki/Simulcast) optimizations" - ], - "new_api": [ - "New [DyteSelfMedia](./reference/DyteSelfMedia) class to initialize media before from DyteClient.init", - "New `DyteClient.init` parameter `defaults.autoSwitchAudioDevice` allows user to disable the default behavior of switching to a newly connected audio device automatically" - ] - }, - { - "version": "1.35.0", - "createdAt": "1696145560", - "fixes": [ - "Maintain the source aspect ratio when camera device is detected as OBS (Beta)", - "[Webinar] Fix a race when an accepted user resend request to join stage" - ], - "new_api": [ - "Webinar and Livestream now both use the same [Stage Management APIs](./stage)", - "By default Dyte's media handler does not prefer virtual devices, adds a new function to override what is a preferred device and what isn't", - "Allow [updating video resolution at runtime](./local-user/extras#update-media-resolution-at-runtime)", - "New baseURI to replace the old apiBase. With this new parameter all network connections including socket connections can now be whitelisted", - "Render `active` participants as Picture-in-Picture through [a simple new API](./participants/pip)", - "Join the meeting using `meeting.join()` and leave with the new `meeting.leave()`" - ], - "dep_api": [ - "`meeting.joinRoom()` is deprecated in favour of the new `meeting.join()`", - "`meeting.leaveRoom()` is deprecated in favour of the new `meeting.leave()`", - "`meeting.self.requestToJoinStage()` is deprecated in favour of `meeting.stage.requestAccess()`", - "`meeting.self.withdrawRequestToJoinStage()` is deprecated in favour of `meeting.stage.cancelRequestAccess()`", - "`meeting.self.leaveStage()` is deprecated in favour of `meeting.stage.leave()`", - "`meeting.self.joinStage()` is deprecated in favour of `meeting.stage.join()`", - "`meeting.participants.acceptAllRequestToJoinStageRequests()` is deprecated in favour of `meeting.stage.grantAccess([userIds])`" - ] - }, - { - "version": "1.34.0", - "createdAt": 1686303420, - "fixes": [ - "Fixed an issue with activating / deactivating the plugin where the plugin is already in the desired state." - ] - }, - { - "version": "1.16.x", - "createdAt": 1690502400, - "fixes": [ - "Fixed an edge case where the screen share with audio was not working as expected.", - "Handle a race condition which used to prevent user from joining stage in a webinar setup.", - "Separated the private and public chat permissions.", - "Fixed an issue which was adding duplicate device names on the device list.", - "Fixed an issue which was not allowing host to kick a participant from the meeting.", - "`initMeeting` is now idempotent. Calling it multiple times will not cause any issues." - ] - }, - { - "version": "1.15.0", - "createdAt": 1688083200, - "fixes": ["Fixed an edge case around file upload in Chat."], - "features": [ - "Added add support for quoting a chat message while reply for Chat SDK", - "Chat SDK now shows unread count and last message on channel list.", - "Participants using Chat SDK will be able to edit and delete their messages." - ] - }, - { - "version": "1.14.0", - "createdAt": 1686303420, - "fixes": [ - "Added execution locks around `initClient` method to prevent accidental double initialisation method calls", - "Handled multiple edge cases around media capture and its retention" - ], - "features": [ - "Added self-troubleshooting features, allow users to run tests to discover issues in their calls. More details on this in the next release" - ] - }, - { - "version": "1.13.0", - "createdAt": 1685491200, - "fixes": [ - "Optimized `mediaPermissionUpdate` event to be emitted when the user grants media permission for the first time.", - "Improved the correctness of `meeting.self.getCurrentDevices()` to return the recent device list when the user grants the permission for the first time.", - "Fixed an edge case where the `screenshareUpdate` event would be emitted twice upon stopping the screenshare.", - "Improved the reliability of clearing the `pinned` state from participant after they leave meeting." - ], - "new_api": [ - "Added a new `CANCELLED` state to [meeting.self.mediaPermission](./local-user/introduction#properties) when the user cancels the screenshare selection dialog in Chromium browsers." - ] - }, - { - "version": "1.25.0", - "createdAt": 1679433268, - "fixes": [ - "Build issue for customers using Webpack v5 aliasing `process` with `false` is resolved.", - "Removed `Poll Messages` from [meeting.chat.messages](./reference/DyteChat#module_DyteChat+messages). Poll messages were wrongly included in the chat messages.", - "Optimized screenshare production for higher frame rate.", - "Improved correctness of [mediaScoreUpdate](./participants/events#network-quality-score) on participant." - ], - "new_api": [ - "The `defaults` parameter in the init() function [now take recording configuration](./recording#recording-configuration), which is utilized when [starting a recording](./recording#start-a-recording). ", - "When calling init() the `defaults` param now take screen sharing configuration. \nConfigure the preferred screen sharing screen surface (Screen / Window / Browser Tab)." - ] - }, - { - "version": "1.22.0", - "createdAt": 1678333268, - "fixes": [], - "features": [ - "**Interactive Livestream Release (LL-HLS)** \n 1. Broadcast a meeting to 100,000 viewers with Low latency (3-6 seconds)\n 2. Interactive Chat and Polls \n 3. Viewers can raise hands or the host can invite Viewers to join the stage" - ], - "new_api": [ - "A new `DyteStage` module introduced at [meeting.stage](./reference/DyteStage) to manage the stage during livestreaming. \n For more information, see [Livestreaming State Management APIs](https://docs.dyte.io/guides/livestream/state-management-apis).", - "A new 'DyteLiveStream' module introduced at [meeting.livestream](./Reference/DyteLivestream) to start and stop the livestreaming. \n For more information, see [Livestreaming: Properties, Functions, and Events](https://docs.dyte.io/guides/livestream/livestream-apis)." - ] - }, - { - "version": "1.21.x", - "createdAt": 1677609000, - "fixes": ["Handle WeWork Solistice Camera gracefully"], - "features": [ - "Initial support for our upcoming Interactive Livestream product (LL-HLS)", - "Webcam quality can now be controlled from the preset, allows customer to select a higher base quality in the preset editor (beta)" - ], - "new_api": [ - "Added boolean flag `socketConnected` to `meeting.meta` that shows when the socket connection is established" - ] - }, - { - "version": "1.20.0", - "createdAt": 1676643893, - "fixes": [ - "**🚨 Critical 🚨** Fixed a WebRTC video production bug that would impact *future* Chrome/Edge browser builds (version β‰₯ M111 - Scheduled to be released in the first week of March)", - "Fixed a regression introduced in `1.3.1` where defaults values passed during initialisation were not respected correctly under a certain edge case", - "Fixed an issue where a bluetooth device disconnection on Google Chrome did not automatically switch to an alternative device", - "Added workarounds for a [Safari Bug](https://bugs.webkit.org/show_bug.cgi?id=231787) where on disconnection of a bluetooth device, local video playback was paused", - "Fixed an issue with Safari screenshare, this improves the screenshare quality in Safari.", - "Minor improvement in the loading times of participant videos when joining a meeting with many participant on the Stage" - ], - "features": [ - "Reduced the size impact of this library from from 1020KB to 880KB (from 228KB to 208KB GZipped). A 12% improvement from the previous release " - ] - }, - { - "version": "1.19.1", - "createdAt": 1675261282, - "fixes": [ - "Improve text legibility when screensharing on Chrome under poor network conditions" - ], - "features": [] - }, - { - "version": "1.19.0", - "createdAt": 1674714600, - "fixes": ["Improved permissions check for audio/video/screenshare"], - "features": [ - "When Tab Sync is enabled, now a `selfTabUpdate` event is fired on the local user when the user switches a plugin" - ], - "breaking-changes": [] - }, - { - "version": "1.18.0", - "createdAt": 1674206130, - "fixes": [ - "Improved handling of iphone Continuity on Mac OS", - "Fix issues in Websocket connection on Safari 12.x / 13.x / 14.x" - ], - "features": [ - "**V2 REST API** - Supports `authToken` generated from V2 REST APIs" - ], - "breaking-changes": [] - } + { + "version": "1.35.8", + "createdAt": "1702598400", + "fixes": [ + "Fixed an issue where the video would not be produced correctly in Firefox browser.", + "Improved webinars and livestreams reliability by handling edge cases around stage management." + ] + }, + { + "version": "1.35.7", + "createdAt": "1702252800", + "new_api": [ + "Recordings now supports Pause and resume functionality with the new [pauseRecording](./recording#pause-recording) and [resumeRecording](./recording#resume-recording) APIs" + ] + }, + { + "version": "1.35.6", + "createdAt": "1698351924", + "fixes": [ + "Firefox 110+ [simulcast](https://en.wikipedia.org/wiki/Simulcast) optimizations" + ], + "new_api": [ + "New [DyteSelfMedia](./reference/DyteSelfMedia) class to initialize media before from DyteClient.init", + "New `DyteClient.init` parameter `defaults.autoSwitchAudioDevice` allows user to disable the default behavior of switching to a newly connected audio device automatically" + ] + }, + { + "version": "1.35.0", + "createdAt": "1696145560", + "fixes": [ + "Maintain the source aspect ratio when camera device is detected as OBS (Beta)", + "[Webinar] Fix a race when an accepted user resend request to join stage" + ], + "new_api": [ + "Webinar and Livestream now both use the same [Stage Management APIs](./stage)", + "By default Dyte's media handler does not prefer virtual devices, adds a new function to override what is a preferred device and what isn't", + "Allow [updating video resolution at runtime](./local-user/extras#update-media-resolution-at-runtime)", + "New baseURI to replace the old apiBase. With this new parameter all network connections including socket connections can now be whitelisted", + "Render `active` participants as Picture-in-Picture through [a simple new API](./participants/pip)", + "Join the meeting using `meeting.join()` and leave with the new `meeting.leave()`" + ], + "dep_api": [ + "`meeting.joinRoom()` is deprecated in favour of the new `meeting.join()`", + "`meeting.leaveRoom()` is deprecated in favour of the new `meeting.leave()`", + "`meeting.self.requestToJoinStage()` is deprecated in favour of `meeting.stage.requestAccess()`", + "`meeting.self.withdrawRequestToJoinStage()` is deprecated in favour of `meeting.stage.cancelRequestAccess()`", + "`meeting.self.leaveStage()` is deprecated in favour of `meeting.stage.leave()`", + "`meeting.self.joinStage()` is deprecated in favour of `meeting.stage.join()`", + "`meeting.participants.acceptAllRequestToJoinStageRequests()` is deprecated in favour of `meeting.stage.grantAccess([userIds])`" + ] + }, + { + "version": "1.34.0", + "createdAt": 1686303420, + "fixes": [ + "Fixed an issue with activating / deactivating the plugin where the plugin is already in the desired state." + ] + }, + { + "version": "1.16.x", + "createdAt": 1690502400, + "fixes": [ + "Fixed an edge case where the screen share with audio was not working as expected.", + "Handle a race condition which used to prevent user from joining stage in a webinar setup.", + "Separated the private and public chat permissions.", + "Fixed an issue which was adding duplicate device names on the device list.", + "Fixed an issue which was not allowing host to kick a participant from the meeting.", + "`initMeeting` is now idempotent. Calling it multiple times will not cause any issues." + ] + }, + { + "version": "1.15.0", + "createdAt": 1688083200, + "fixes": ["Fixed an edge case around file upload in Chat."], + "features": [ + "Added add support for quoting a chat message while reply for Chat SDK", + "Chat SDK now shows unread count and last message on channel list.", + "Participants using Chat SDK will be able to edit and delete their messages." + ] + }, + { + "version": "1.14.0", + "createdAt": 1686303420, + "fixes": [ + "Added execution locks around `initClient` method to prevent accidental double initialisation method calls", + "Handled multiple edge cases around media capture and its retention" + ], + "features": [ + "Added self-troubleshooting features, allow users to run tests to discover issues in their calls. More details on this in the next release" + ] + }, + { + "version": "1.13.0", + "createdAt": 1685491200, + "fixes": [ + "Optimized `mediaPermissionUpdate` event to be emitted when the user grants media permission for the first time.", + "Improved the correctness of `meeting.self.getCurrentDevices()` to return the recent device list when the user grants the permission for the first time.", + "Fixed an edge case where the `screenshareUpdate` event would be emitted twice upon stopping the screenshare.", + "Improved the reliability of clearing the `pinned` state from participant after they leave meeting." + ], + "new_api": [ + "Added a new `CANCELLED` state to [meeting.self.mediaPermission](./local-user/introduction#properties) when the user cancels the screenshare selection dialog in Chromium browsers." + ] + }, + { + "version": "1.25.0", + "createdAt": 1679433268, + "fixes": [ + "Build issue for customers using Webpack v5 aliasing `process` with `false` is resolved.", + "Removed `Poll Messages` from [meeting.chat.messages](./reference/DyteChat#module_DyteChat+messages). Poll messages were wrongly included in the chat messages.", + "Optimized screenshare production for higher frame rate.", + "Improved correctness of [mediaScoreUpdate](./participants/events#network-quality-score) on participant." + ], + "new_api": [ + "The `defaults` parameter in the init() function [now take recording configuration](./recording#recording-configuration), which is utilized when [starting a recording](./recording#start-a-recording). ", + "When calling init() the `defaults` param now take screen sharing configuration. \nConfigure the preferred screen sharing screen surface (Screen / Window / Browser Tab)." + ] + }, + { + "version": "1.22.0", + "createdAt": 1678333268, + "fixes": [], + "features": [ + "**Interactive Livestream Release (LL-HLS)** \n 1. Broadcast a meeting to 100,000 viewers with Low latency (3-6 seconds)\n 2. Interactive Chat and Polls \n 3. Viewers can raise hands or the host can invite Viewers to join the stage" + ], + "new_api": [ + "A new `DyteStage` module introduced at [meeting.stage](./reference/DyteStage) to manage the stage during livestreaming. \n For more information, see [Livestreaming State Management APIs](https://docs.dyte.io/guides/livestream/state-management-apis).", + "A new 'DyteLiveStream' module introduced at [meeting.livestream](./Reference/DyteLivestream) to start and stop the livestreaming. \n For more information, see [Livestreaming: Properties, Functions, and Events](https://docs.dyte.io/guides/livestream/livestream-apis)." + ] + }, + { + "version": "1.21.x", + "createdAt": 1677609000, + "fixes": ["Handle WeWork Solistice Camera gracefully"], + "features": [ + "Initial support for our upcoming Interactive Livestream product (LL-HLS)", + "Webcam quality can now be controlled from the preset, allows customer to select a higher base quality in the preset editor (beta)" + ], + "new_api": [ + "Added boolean flag `socketConnected` to `meeting.meta` that shows when the socket connection is established" + ] + }, + { + "version": "1.20.0", + "createdAt": 1676643893, + "fixes": [ + "**🚨 Critical 🚨** Fixed a WebRTC video production bug that would impact *future* Chrome/Edge browser builds (version β‰₯ M111 - Scheduled to be released in the first week of March)", + "Fixed a regression introduced in `1.3.1` where defaults values passed during initialisation were not respected correctly under a certain edge case", + "Fixed an issue where a bluetooth device disconnection on Google Chrome did not automatically switch to an alternative device", + "Added workarounds for a [Safari Bug](https://bugs.webkit.org/show_bug.cgi?id=231787) where on disconnection of a bluetooth device, local video playback was paused", + "Fixed an issue with Safari screenshare, this improves the screenshare quality in Safari.", + "Minor improvement in the loading times of participant videos when joining a meeting with many participant on the Stage" + ], + "features": [ + "Reduced the size impact of this library from from 1020KB to 880KB (from 228KB to 208KB GZipped). A 12% improvement from the previous release " + ] + }, + { + "version": "1.19.1", + "createdAt": 1675261282, + "fixes": [ + "Improve text legibility when screensharing on Chrome under poor network conditions" + ], + "features": [] + }, + { + "version": "1.19.0", + "createdAt": 1674714600, + "fixes": ["Improved permissions check for audio/video/screenshare"], + "features": [ + "When Tab Sync is enabled, now a `selfTabUpdate` event is fired on the local user when the user switches a plugin" + ], + "breaking-changes": [] + }, + { + "version": "1.18.0", + "createdAt": 1674206130, + "fixes": [ + "Improved handling of iphone Continuity on Mac OS", + "Fix issues in Websocket connection on Safari 12.x / 13.x / 14.x" + ], + "features": [ + "**V2 REST API** - Supports `authToken` generated from V2 REST APIs" + ], + "breaking-changes": [] + } ] diff --git a/static/release-notes/ui-kit.json b/static/release-notes/ui-kit.json index f887dd8904..dcdb34663c 100644 --- a/static/release-notes/ui-kit.json +++ b/static/release-notes/ui-kit.json @@ -1,199 +1,290 @@ [ - { - "version": "1.55.0", - "createdAt": 1691712000, - "features": [ - "`` now takes a `targetElement` prop to toggle fullscreen on a specific element." - ], - "fixes": [ - "Improved the link detection to work with more links.", - "Fixed an issue with play audio modal which was closing on esc key press. This should not have happened, we require the user to click on the close button to enable auto-play.", - "Fixed an issue where the plugin access control was not working as expected for some plugins." - ] - }, - { - "version": "1.54.0", - "createdAt": 1690502400, - "features": [ - "The 'more-items' slot is added to ``. You can use this slot to add action items to the participant." - ], - "fixes": [ - "Emoji picker now has a close button when the user wants to close the emoji picker.", - "Fixed an issue with pasting texts to chat in Safari browsers.", - "Fixed an issue with long device names in the settings modal." - ] - }, - { - "version": "1.53.1", - "createdAt": 1689638400, - "fixes": [ - "Fixed an edge case where the `Mute all` button was not visible.", - "Optimized loading the first page of chat messages." - ] - }, - { - "version": "1.53.0", - "createdAt": 1689552000, - "fixes": [ - "Optimized the avatar size in chat messages.", - "Fixed an edge case where the file name in the upload preview was overflowing the UI.", - "Handled an edge case in the audio playback for livestreaming meetings.", - "Optimized the spacing between the chat messages.", - "Better handling of event listeners in `` component.", - "Optimized polls styling.", - "Fixed an issue with font color in `` component." - ], - "features": [ - "Added a close button for emoji picker in `` component.", - "New component that can be used to render the sidebar in your app." - ] - }, - { - "version": "1.52.2", - "createdAt": 1688688000, - "fixes": [ - "Fixed an edge case where the view only mode for plugins was not working." - ] - }, - { - "version": "1.52.1", - "createdAt": 1688515200, - "fixes": [ - "Fixed an issue where the links in chat messages were opening in the same tab.", - "Modified the controlbar items order to be more accessible.", - "Fixed an issue where the unread counts were flickering on the selected channel." - ] - }, - { - "version": "1.52.0", - "createdAt": 1688083200, - "fixes": [ - "Fixed an edge case where the chat messages were overflowing the chat ui.", - "Improved the UI for chat composer.", - "Fixed an issue with chat composer component, where the attachment remove button placement was not correct in Safari browser.", - "Added new strings for i18n" - ], - "features": [ - "dyte-channel-details, dyte-channel-header, dyte-channel-manager and dyte-channel-selector-ui components for Chat SDK" - ] - }, - { - "version": "1.51.1", - "createdAt": 1686303420, - "fixes": [ - "In order to improve the organization of multiple buttons within the bottom control bar, some of the buttons are moved to the new component on desktop.", - "Fixed list of devices not being updated when a new device was added while `` and `` were already rendered" - ] - }, - { - "version": "1.51.0", - "createdAt": 1685491200, - "fixes": [ - "`` component now can be loaded outside of the .", - "`` now stores the draft message in local storage and restores it on page refresh.", - "Fixed an edge case where the state of the pinned participant was not getting updated when they left the meeting." - ], - "features": [ - "✨ Added support for our upcoming AI features. Keep an eye out for more updates!" - ] - }, - { - "version": "1.50.0", - "createdAt": 1683849600, - "fixes": [ - "Removed the extra space that was being taken by `` when there is only one tab.", - "Fixed an edge case where the `` component was mysteriously disappearing.", - "Fixed autoplay issues with ``" - ], - "features": [ - "Added observability and quality metrics collection for ``" - ] - }, - { - "version": "1.49.0", - "createdAt": 1682985600, - "fixes": [ - "Optimized the performance of ``", - "Fixed a style issue with `` on Safari browser.", - "Optimized a few more components for [Breakout rooms](/guides/breakoutroom/introduction-breakout-rooms)." - ], - "features": [ - "A new `dialogClose` not gets fired when you close the dialog.", - "Now you can pass the i18n prop `t` to ``" - ] - }, - { - "version": "1.48.0", - "createdAt": 1682035200, - "fixes": [ - "Fixed an issue with angular builds.", - "Fixed an edge case where the host controls were not visible for a combination of `canDisableParticipantAudio` and `canDisableParticipantVideo` permissions.", - "Fixed an issue with text `line-height` in `` when the body/html font size is defined in percentage.", - "Improved the spacing around sidebar heading and `` component." - ], - "features": [ - "Added support for our upcoming layout configurations. Keep an eye out for more updates!" - ] - }, - { - "version": "1.46.0", - "createdAt": 1679409000, - "fixes": [ - "The **stop screenshare** feature was not working when multiple users were sharing their screens simultaneously." - ], - "features": [ - "Chat in a livestreaming meeting is now paginated to handle hundreds of thousands of messages." - ] - }, - { - "version": "1.45.0", - "createdAt": 1678209000, - "features": [ - "**Interactive Livestream Release (LL-HLS)** \n 1. Broadcast a meeting to up to 100,000 viewers with low latency of just 3 to 6 seconds.\n 2. Interactive chat and polls. \n 3. Viewers can raise hands to join the stage or the host can invite viewers to join the stage. \n For more information, see [ILS Overview](https://docs.dyte.io/guides/livestream/livestream-overview) and [Getting Started with ILS](https://docs.dyte.io/guides/livestream/getting-started-with-livestreaming)." - ], - "new_api": [ - "New ``, `` and `` components." - ] - }, - { - "version": "1.44.2", - "createdAt": 1677609000, - "fixes": [ - "Fixed an edge case in file name and size detection in chat.", - "Clap file names in chat to single line. Now long files names are truncated with ellipsis.", - "Optimized icons to have consistent colors." - ], - "features": [] - }, - { - "version": "1.44.0", - "createdAt": 1677004200, - "fixes": [ - "Performance improvement for `` when the window is in background.", - "Fixed an issue with `` in Safari, where the component was overlapping with ``." - ], - "features": [ - "`` now supports `disableEmojiPicker` property to disable emoji picker." - ] - }, - { - "version": "1.43.1", - "createdAt": 1677473766, - "fixes": [ - "Issue with disabled state in the `dyte-control` bar-button has been resolved.", - "`dyte-avatar` now handles multibyte characters better and removes special characters from the name.", - "The dimensions of avatars in polls have been fixed.", - "The alignment of tab bar names has been fixed for cases where the plugin name is short." - ], - "features": ["`dyte-grid` now supports background color."] - }, - { - "version": "1.41.1", - "createdAt": 1674206130, - "fixes": [ - "Double render of dyte-header and dyte-controlbar elements", - "Missing export for a few Angular UI Kit Components" - ], - "breaking-changes": [] - } + { + "version": "1.60.2", + "createdAt": 1703030400, + "fixes": [ + "Fixed an issue where sidebar participant state was not in sync with the grid view", + "Optimized event handling for stage" + ] + }, + { + "version": "1.60.1", + "createdAt": 1702598400, + "fixes": ["Improved state handling for PiP view"] + }, + { + "version": "1.60.0", + "createdAt": 1702252800, + "features": [ + " for toggling [captions](https://docs.dyte.io/guides/capabilities/audio/transcriptions) in the meeting" + ], + "fixes": [ + "Fixed text in chat placeholder", + "Handle setSinkId error while playing audio", + "Fixed the inconsistent state of the grid view when multiple people leave the meeting", + "Fixed the inconsistent state of the grid pagination when multiple people leave the meeting at once.", + "Fixed an issue where the was emitting an additional dyteStateUpdate event when the grid view was already in the same state." + ] + }, + { + "version": "1.59.0", + "createdAt": 1698710400, + "features": [ + "New and improved for chat SDK" + ] + }, + { + "version": "1.58.0", + "createdAt": 1698278400, + "features": [ + " now takes `start` and `end` slots to render custom elements before and after the sidebar participants list.", + " now takes slot to render custom action elements for the participant." + ] + }, + { + "version": "1.57.4", + "createdAt": 1697760000, + "fixes": [ + "Optimize event binding to lower memory usage", + "Fixed an issue with `` component where the tile was not showing the correct state when the meeting object was not passed to the component" + ] + }, + { + "version": "1.57.3", + "createdAt": 1697414400, + "fixes": [ + "Allow customizing `` component from config.", + "Fix PiP view to show initials when video is off" + ] + }, + { + "version": "1.57.2", + "createdAt": 1696982400, + "fixes": [ + "Fix UI state for offline grid for livestream viewers", + "Handle autoplay errors for livestream player" + ] + }, + { + "version": "1.57.1", + "createdAt": 1696464000, + "fixes": ["Fix tooltip for in progress operations in the control bar"] + }, + { + "version": "1.57.0", + "createdAt": 1696377600, + "features": ["Support for plugins for audio rooms"] + }, + { + "version": "1.56.0", + "createdAt": 1695859200, + "features": [ + "Added support for [UI kit Addons](https://dyte.io/blog/ui-kit-add-ons/)", + "New audio visualizer for audio room grid view", + "Grid view now shows appropriate state when participant is offline or no one is on stage" + ], + "fixes": [ + "Improved link detection in chat messages", + "Improved rich text support in chat messages", + "Sidebar becomes floating when the screen size is small", + "Improved Polls UI" + ] + }, + { + "version": "1.55.0", + "createdAt": 1691712000, + "features": [ + "`` now takes a `targetElement` prop to toggle fullscreen on a specific element." + ], + "fixes": [ + "Improved the link detection to work with more links.", + "Fixed an issue with play audio modal which was closing on esc key press. This should not have happened, we require the user to click on the close button to enable auto-play.", + "Fixed an issue where the plugin access control was not working as expected for some plugins." + ] + }, + { + "version": "1.54.0", + "createdAt": 1690502400, + "features": [ + "The 'more-items' slot is added to ``. You can use this slot to add action items to the participant." + ], + "fixes": [ + "Emoji picker now has a close button when the user wants to close the emoji picker.", + "Fixed an issue with pasting texts to chat in Safari browsers.", + "Fixed an issue with long device names in the settings modal." + ] + }, + { + "version": "1.53.1", + "createdAt": 1689638400, + "fixes": [ + "Fixed an edge case where the `Mute all` button was not visible.", + "Optimized loading the first page of chat messages." + ] + }, + { + "version": "1.53.0", + "createdAt": 1689552000, + "fixes": [ + "Optimized the avatar size in chat messages.", + "Fixed an edge case where the file name in the upload preview was overflowing the UI.", + "Handled an edge case in the audio playback for livestreaming meetings.", + "Optimized the spacing between the chat messages.", + "Better handling of event listeners in `` component.", + "Optimized polls styling.", + "Fixed an issue with font color in `` component." + ], + "features": [ + "Added a close button for emoji picker in `` component.", + "New component that can be used to render the sidebar in your app." + ] + }, + { + "version": "1.52.2", + "createdAt": 1688688000, + "fixes": [ + "Fixed an edge case where the view only mode for plugins was not working." + ] + }, + { + "version": "1.52.1", + "createdAt": 1688515200, + "fixes": [ + "Fixed an issue where the links in chat messages were opening in the same tab.", + "Modified the controlbar items order to be more accessible.", + "Fixed an issue where the unread counts were flickering on the selected channel." + ] + }, + { + "version": "1.52.0", + "createdAt": 1688083200, + "fixes": [ + "Fixed an edge case where the chat messages were overflowing the chat ui.", + "Improved the UI for chat composer.", + "Fixed an issue with chat composer component, where the attachment remove button placement was not correct in Safari browser.", + "Added new strings for i18n" + ], + "features": [ + "dyte-channel-details, dyte-channel-header, dyte-channel-manager and dyte-channel-selector-ui components for Chat SDK" + ] + }, + { + "version": "1.51.1", + "createdAt": 1686303420, + "fixes": [ + "In order to improve the organization of multiple buttons within the bottom control bar, some of the buttons are moved to the new component on desktop.", + "Fixed list of devices not being updated when a new device was added while `` and `` were already rendered" + ] + }, + { + "version": "1.51.0", + "createdAt": 1685491200, + "fixes": [ + "`` component now can be loaded outside of the .", + "`` now stores the draft message in local storage and restores it on page refresh.", + "Fixed an edge case where the state of the pinned participant was not getting updated when they left the meeting." + ], + "features": [ + "✨ Added support for our upcoming AI features. Keep an eye out for more updates!" + ] + }, + { + "version": "1.50.0", + "createdAt": 1683849600, + "fixes": [ + "Removed the extra space that was being taken by `` when there is only one tab.", + "Fixed an edge case where the `` component was mysteriously disappearing.", + "Fixed autoplay issues with ``" + ], + "features": [ + "Added observability and quality metrics collection for ``" + ] + }, + { + "version": "1.49.0", + "createdAt": 1682985600, + "fixes": [ + "Optimized the performance of ``", + "Fixed a style issue with `` on Safari browser.", + "Optimized a few more components for [Breakout rooms](/guides/breakoutroom/introduction-breakout-rooms)." + ], + "features": [ + "A new `dialogClose` not gets fired when you close the dialog.", + "Now you can pass the i18n prop `t` to ``" + ] + }, + { + "version": "1.48.0", + "createdAt": 1682035200, + "fixes": [ + "Fixed an issue with angular builds.", + "Fixed an edge case where the host controls were not visible for a combination of `canDisableParticipantAudio` and `canDisableParticipantVideo` permissions.", + "Fixed an issue with text `line-height` in `` when the body/html font size is defined in percentage.", + "Improved the spacing around sidebar heading and `` component." + ], + "features": [ + "Added support for our upcoming layout configurations. Keep an eye out for more updates!" + ] + }, + { + "version": "1.46.0", + "createdAt": 1679409000, + "fixes": [ + "The **stop screenshare** feature was not working when multiple users were sharing their screens simultaneously." + ], + "features": [ + "Chat in a livestreaming meeting is now paginated to handle hundreds of thousands of messages." + ] + }, + { + "version": "1.45.0", + "createdAt": 1678209000, + "features": [ + "**Interactive Livestream Release (LL-HLS)** \n 1. Broadcast a meeting to up to 100,000 viewers with low latency of just 3 to 6 seconds.\n 2. Interactive chat and polls. \n 3. Viewers can raise hands to join the stage or the host can invite viewers to join the stage. \n For more information, see [ILS Overview](https://docs.dyte.io/guides/livestream/livestream-overview) and [Getting Started with ILS](https://docs.dyte.io/guides/livestream/getting-started-with-livestreaming)." + ], + "new_api": [ + "New ``, `` and `` components." + ] + }, + { + "version": "1.44.2", + "createdAt": 1677609000, + "fixes": [ + "Fixed an edge case in file name and size detection in chat.", + "Clap file names in chat to single line. Now long files names are truncated with ellipsis.", + "Optimized icons to have consistent colors." + ], + "features": [] + }, + { + "version": "1.44.0", + "createdAt": 1677004200, + "fixes": [ + "Performance improvement for `` when the window is in background.", + "Fixed an issue with `` in Safari, where the component was overlapping with ``." + ], + "features": [ + "`` now supports `disableEmojiPicker` property to disable emoji picker." + ] + }, + { + "version": "1.43.1", + "createdAt": 1677473766, + "fixes": [ + "Issue with disabled state in the `dyte-control` bar-button has been resolved.", + "`dyte-avatar` now handles multibyte characters better and removes special characters from the name.", + "The dimensions of avatars in polls have been fixed.", + "The alignment of tab bar names has been fixed for cases where the plugin name is short." + ], + "features": ["`dyte-grid` now supports background color."] + }, + { + "version": "1.41.1", + "createdAt": 1674206130, + "fixes": [ + "Double render of dyte-header and dyte-controlbar elements", + "Missing export for a few Angular UI Kit Components" + ], + "breaking-changes": [] + } ] diff --git a/static/release-notes/web-core.json b/static/release-notes/web-core.json index 283229dcb3..6a4b061aec 100644 --- a/static/release-notes/web-core.json +++ b/static/release-notes/web-core.json @@ -1,218 +1,241 @@ [ - { - "version": "1.20.0", - "createdAt": "1698351924", - "fixes": [ - "Firefox 110+ [simulcast](https://en.wikipedia.org/wiki/Simulcast) optimizations" - ], - "new_api": [ - "New [DyteSelfMedia](./reference/DyteSelfMedia) class to initialize media before from DyteClient.init" - ] - }, - { - "version": "1.19.0", - "createdAt": "1697840724", - "new_api": [ - "New `DyteClient.init` parameter `defaults.autoSwitchAudioDevice` allows user to disable the default behavior of switching to a newly connected audio device automatically" - ] - }, - { - "version": "1.18.0-2", - "createdAt": "1696145560", - "fixes": [ - "Maintain the source aspect ratio when camera device is detected as OBS (Beta)", - "[Webinar] Fix a race when an accepted user resend request to join stage" - ], - "new_api": [ - "Webinar and Livestream now both use the same [Stage Management APIs](./stage)", - "By default Dyte's media handler does not prefer virtual devices, adds a new function to override what is a preferred device and what isn't", - "Allow [updating video resolution at runtime](./local-user/extras#update-media-resolution-at-runtime)", - "New baseURI to replace the old apiBase. With this new parameter all network connections including socket connections can now be whitelisted", - "Render `active` participants as Picture-in-Picture through [a simple new API](./participants/pip)", - "Join the meeting using `meeting.join()` and leave with the new `meeting.leave()`" - ], - "dep_api": [ - "`meeting.joinRoom()` is deprecated in favour of the new `meeting.join()`", - "`meeting.leaveRoom()` is deprecated in favour of the new `meeting.leave()`", - "`meeting.self.requestToJoinStage()` is deprecated in favour of `meeting.stage.requestAccess()`", - "`meeting.self.withdrawRequestToJoinStage()` is deprecated in favour of `meeting.stage.cancelRequestAccess()`", - "`meeting.self.leaveStage()` is deprecated in favour of `meeting.stage.leave()`", - "`meeting.self.joinStage()` is deprecated in favour of `meeting.stage.join()`", - "`meeting.participants.acceptAllRequestToJoinStageRequests()` is deprecated in favour of `meeting.stage.grantAccess([userIds])`" - ] - }, - { - "version": "1.17.0", - "createdAt": "1691712000", - "fixes": [ - "Fixed an issue with activating / deactivating the plugin where the plugin is already in the desired state." - ] - }, - { - "version": "1.16.x", - "createdAt": 1690502400, - "fixes": [ - "Fixed an edge case where the screen share with audio was not working as expected.", - "Handle a race condition which used to prevent user from joining stage in a webinar setup.", - "Separated the private and public chat permissions.", - "Fixed an issue which was adding duplicate device names on the device list.", - "Fixed an issue which was not allowing host to kick a participant from the meeting.", - "DyteClient.init() is now idempotent. Calling init() multiple times will not cause any issues." - ] - }, - { - "version": "1.15.0", - "createdAt": 1688083200, - "fixes": ["Fixed an edge case around file upload in Chat."], - "features": [ - "Added add support for quoting a chat message while reply for Chat SDK", - "Chat SDK now shows unread count and last message on channel list.", - "Participants using Chat SDK will be able to edit and delete their messages." - ] - }, - { - "version": "1.14.0", - "createdAt": 1686303420, - "fixes": [ - "Added execution locks around `DyteClient.init` method to prevent accidental double initialisation method calls", - "Handle multiple edge cases around media capture and its retention" - ], - "features": [ - "Added self-troubleshooting features, allow users to run tests to discover issues in their calls. More details on this in the next release" - ] - }, - { - "version": "1.13.0", - "createdAt": 1685491200, - "fixes": [ - "Optimized `mediaPermissionUpdate` event to be emitted when the user grants media permission for the first time.", - "Improved the correctness of `meeting.self.getCurrentDevices()` to return the recent device list when the user grants the permission for the first time.", - "Fixed an edge case where the `screenshareUpdate` event would be emitted twice upon stopping the screenshare.", - "Improved the reliability of clearing the `pinned` state from participant after they leave meeting." - ], - "new_api": [ - "Added a new `CANCELLED` state to [meeting.self.mediaPermission](./local-user/introduction#properties) when the user cancels the screenshare selection dialog in Chromium browsers." - ] - }, - { - "version": "1.12.x", - "createdAt": 1682985600, - "perf": [ - "⚑ Optimized the performance of an API to save ~400ms on meeting join time.", - "⚑ Optimized the SDK to reduce the bundle size by 3%." - ], - "fixes": [ - "**🚨 Critical 🚨** Fixed an issue with Safari 16.4 that was breaking video calls.", - "Emit `peerRequestToJoinStage` and `stageLeft` for _self_ participant when the user joins or leaves the stage." - ], - "features": [ - "Added support for request retry with alternative network path when the primary network path fails. This improves the reliability of the meeting experience in case of network issues." - ] - }, - { - "version": "1.11.x", - "createdAt": 1682035200, - "perf": [ - "⚑ Optimized the performance to get 2x faster meeting join time." - ], - "fixes": [ - "Emit `peerRequestToJoinStage` and `stageLeft` for _self_ participant when the user joins or leaves the stage." - ], - "new_api": [ - "[meeting.self.roomState](./local-user/introduction#properties) now contains the current room state of the participant." - ] - }, - { - "version": "1.10.x", - "createdAt": 1680048000, - "fixes": [ - "Improved the reliability of `mediaPermissionUpdate` events.", - "Observability improvements to help us debug issues faster." - ], - "features": [ - "Emit `mediaPermissionUpdate` events when media permission goes from errored to granted." - ] - }, - { - "version": "1.9.0", - "createdAt": 1679433268, - "fixes": [ - "Build issue for customers using Webpack v5 aliasing `process` with `false` is resolved.", - "Removed `Poll Messages` from [meeting.chat.messages](./reference/DyteChat#module_DyteChat+messages). Poll messages were wrongly included in the chat messages.", - "Optimized screenshare production for higher frame rate.", - "Improved correctness of [mediaScoreUpdate](./participants/events#network-quality-score) on participant." - ], - "new_api": [ - "The `defaults` parameter in the init() function [now take recording configuration](./recording#recording-configuration), which is utilized when [starting a recording](./recording#start-a-recording). ", - "When calling init() the `defaults` param now take screen sharing configuration. \nConfigure the preferred screen sharing screen surface (Screen / Window / Browser Tab)." - ] - }, - { - "version": "1.6.0", - "createdAt": 1678333268, - "fixes": [], - "features": [ - "**Interactive Livestream Release (LL-HLS)** \n 1. Broadcast a meeting to up to 100,000 viewers with low latency of just 3 to 6 seconds.\n 2. Interactive chat and polls. \n 3. Viewers can raise hands to join the stage or the host can invite viewers to join the stage. \n For more information, see [ILS Overview](https://docs.dyte.io/guides/livestream/livestream-overview) and [Getting Started with ILS](https://docs.dyte.io/guides/livestream/getting-started-with-livestreaming)." - ], - "new_api": [ - "A new `DyteStage` module introduced at [meeting.stage](./reference/DyteStage) to manage the stage during livestreaming. \n For more information, see [Livestreaming State Management APIs](https://docs.dyte.io/guides/livestream/state-management-apis).", - "A new 'DyteLiveStream' module introduced at [meeting.livestream](./Reference/DyteLivestream) to start and stop the livestreaming. \n For more information, see [Livestreaming: Properties, Functions, and Events](https://docs.dyte.io/guides/livestream/livestream-apis)." - ] - }, - { - "version": "1.5.x", - "createdAt": 1677609000, - "fixes": ["Handle WeWork Solistice Camera gracefully"], - "features": [ - "Initial support for our upcoming Interactive Livestream product (LL-HLS)", - "Webcam quality can now be controlled from the preset, allows customer to select a higher base quality in the preset editor (beta)" - ], - "new_api": [ - "Added boolean flag `socketConnected` to `meeting.meta` that shows when the socket connection is established" - ] - }, - { - "version": "1.4.0", - "createdAt": 1676643893, - "fixes": [ - "**🚨 Critical 🚨** Fixed a WebRTC video production bug that would impact *future* Chrome/Edge browser builds (version β‰₯ M111 - Scheduled to be released in the first week of March)", - "Fixed a regression introduced in `1.3.1` where defaults values passed during initialisation were not respected correctly under a certain edge case", - "Fixed an issue where a bluetooth device disconnection on Google Chrome did not automatically switch to an alternative device", - "Added workarounds for a [Safari Bug](https://bugs.webkit.org/show_bug.cgi?id=231787) where on disconnection of a bluetooth device, local video playback was paused", - "Fixed an issue with Safari screenshare, this improves the screenshare quality in Safari.", - "Minor improvement in the loading times of participant videos when joining a meeting with many participant on the Stage" - ], - "features": [ - "Reduced the size impact of this library from from 1020KB to 880KB (from 228KB to 208KB GZipped). A 12% improvement from the previous release " - ] - }, - { - "version": "1.3.1", - "createdAt": 1675261282, - "fixes": [ - "Improve text legibility when screensharing on Chrome under poor network conditions" - ], - "features": [] - }, - { - "version": "1.2.0", - "createdAt": 1674714600, - "fixes": ["Improved permissions check for audio/video/screenshare"], - "features": [ - "When Tab Sync is enabled, now a `selfTabUpdate` event is fired on the local user when the user switches a plugin" - ], - "breaking-changes": [] - }, - { - "version": "1.1.0", - "createdAt": 1674206130, - "fixes": [ - "Improved handling of iphone Continuity on Mac OS", - "Fix issues in Websocket connection on Safari 12.x / 13.x / 14.x" - ], - "features": [ - "**V2 REST API** - Supports `authToken` generated from V2 REST APIs" - ], - "breaking-changes": [] - } + { + "version": "1.21.2", + "createdAt": "1703030400", + "fixes": [ + "Fixed a corner case on stage management.", + "Added type definitions for some events." + ] + }, + { + "version": "1.21.1", + "createdAt": "1702598400", + "fixes": [ + "Fixed an issue where the video would not be produced correctly in Firefox browser.", + "Improved webinars and livestreams reliability by handling edge cases around stage management." + ] + }, + { + "version": "1.21.0", + "createdAt": "1702252800", + "new_api": [ + "Recordings now supports Pause and resume functionality with the new [pauseRecording](./recording#pause-recording) and [resumeRecording](./recording#resume-recording) APIs" + ] + }, + { + "version": "1.20.0", + "createdAt": "1698351924", + "fixes": [ + "Firefox 110+ [simulcast](https://en.wikipedia.org/wiki/Simulcast) optimizations" + ], + "new_api": [ + "New [DyteSelfMedia](./reference/DyteSelfMedia) class to initialize media before from DyteClient.init" + ] + }, + { + "version": "1.19.0", + "createdAt": "1697840724", + "new_api": [ + "New `DyteClient.init` parameter `defaults.autoSwitchAudioDevice` allows user to disable the default behavior of switching to a newly connected audio device automatically" + ] + }, + { + "version": "1.18.0-2", + "createdAt": "1696145560", + "fixes": [ + "Maintain the source aspect ratio when camera device is detected as OBS (Beta)", + "[Webinar] Fix a race when an accepted user resend request to join stage" + ], + "new_api": [ + "Webinar and Livestream now both use the same [Stage Management APIs](./stage)", + "By default Dyte's media handler does not prefer virtual devices, adds a new function to override what is a preferred device and what isn't", + "Allow [updating video resolution at runtime](./local-user/extras#update-media-resolution-at-runtime)", + "New baseURI to replace the old apiBase. With this new parameter all network connections including socket connections can now be whitelisted", + "Render `active` participants as Picture-in-Picture through [a simple new API](./participants/pip)", + "Join the meeting using `meeting.join()` and leave with the new `meeting.leave()`" + ], + "dep_api": [ + "`meeting.joinRoom()` is deprecated in favour of the new `meeting.join()`", + "`meeting.leaveRoom()` is deprecated in favour of the new `meeting.leave()`", + "`meeting.self.requestToJoinStage()` is deprecated in favour of `meeting.stage.requestAccess()`", + "`meeting.self.withdrawRequestToJoinStage()` is deprecated in favour of `meeting.stage.cancelRequestAccess()`", + "`meeting.self.leaveStage()` is deprecated in favour of `meeting.stage.leave()`", + "`meeting.self.joinStage()` is deprecated in favour of `meeting.stage.join()`", + "`meeting.participants.acceptAllRequestToJoinStageRequests()` is deprecated in favour of `meeting.stage.grantAccess([userIds])`" + ] + }, + { + "version": "1.17.0", + "createdAt": "1691712000", + "fixes": [ + "Fixed an issue with activating / deactivating the plugin where the plugin is already in the desired state." + ] + }, + { + "version": "1.16.x", + "createdAt": 1690502400, + "fixes": [ + "Fixed an edge case where the screen share with audio was not working as expected.", + "Handle a race condition which used to prevent user from joining stage in a webinar setup.", + "Separated the private and public chat permissions.", + "Fixed an issue which was adding duplicate device names on the device list.", + "Fixed an issue which was not allowing host to kick a participant from the meeting.", + "DyteClient.init() is now idempotent. Calling init() multiple times will not cause any issues." + ] + }, + { + "version": "1.15.0", + "createdAt": 1688083200, + "fixes": ["Fixed an edge case around file upload in Chat."], + "features": [ + "Added add support for quoting a chat message while reply for Chat SDK", + "Chat SDK now shows unread count and last message on channel list.", + "Participants using Chat SDK will be able to edit and delete their messages." + ] + }, + { + "version": "1.14.0", + "createdAt": 1686303420, + "fixes": [ + "Added execution locks around `DyteClient.init` method to prevent accidental double initialisation method calls", + "Handle multiple edge cases around media capture and its retention" + ], + "features": [ + "Added self-troubleshooting features, allow users to run tests to discover issues in their calls. More details on this in the next release" + ] + }, + { + "version": "1.13.0", + "createdAt": 1685491200, + "fixes": [ + "Optimized `mediaPermissionUpdate` event to be emitted when the user grants media permission for the first time.", + "Improved the correctness of `meeting.self.getCurrentDevices()` to return the recent device list when the user grants the permission for the first time.", + "Fixed an edge case where the `screenshareUpdate` event would be emitted twice upon stopping the screenshare.", + "Improved the reliability of clearing the `pinned` state from participant after they leave meeting." + ], + "new_api": [ + "Added a new `CANCELLED` state to [meeting.self.mediaPermission](./local-user/introduction#properties) when the user cancels the screenshare selection dialog in Chromium browsers." + ] + }, + { + "version": "1.12.x", + "createdAt": 1682985600, + "perf": [ + "⚑ Optimized the performance of an API to save ~400ms on meeting join time.", + "⚑ Optimized the SDK to reduce the bundle size by 3%." + ], + "fixes": [ + "**🚨 Critical 🚨** Fixed an issue with Safari 16.4 that was breaking video calls.", + "Emit `peerRequestToJoinStage` and `stageLeft` for _self_ participant when the user joins or leaves the stage." + ], + "features": [ + "Added support for request retry with alternative network path when the primary network path fails. This improves the reliability of the meeting experience in case of network issues." + ] + }, + { + "version": "1.11.x", + "createdAt": 1682035200, + "perf": [ + "⚑ Optimized the performance to get 2x faster meeting join time." + ], + "fixes": [ + "Emit `peerRequestToJoinStage` and `stageLeft` for _self_ participant when the user joins or leaves the stage." + ], + "new_api": [ + "[meeting.self.roomState](./local-user/introduction#properties) now contains the current room state of the participant." + ] + }, + { + "version": "1.10.x", + "createdAt": 1680048000, + "fixes": [ + "Improved the reliability of `mediaPermissionUpdate` events.", + "Observability improvements to help us debug issues faster." + ], + "features": [ + "Emit `mediaPermissionUpdate` events when media permission goes from errored to granted." + ] + }, + { + "version": "1.9.0", + "createdAt": 1679433268, + "fixes": [ + "Build issue for customers using Webpack v5 aliasing `process` with `false` is resolved.", + "Removed `Poll Messages` from [meeting.chat.messages](./reference/DyteChat#module_DyteChat+messages). Poll messages were wrongly included in the chat messages.", + "Optimized screenshare production for higher frame rate.", + "Improved correctness of [mediaScoreUpdate](./participants/events#network-quality-score) on participant." + ], + "new_api": [ + "The `defaults` parameter in the init() function [now take recording configuration](./recording#recording-configuration), which is utilized when [starting a recording](./recording#start-a-recording). ", + "When calling init() the `defaults` param now take screen sharing configuration. \nConfigure the preferred screen sharing screen surface (Screen / Window / Browser Tab)." + ] + }, + { + "version": "1.6.0", + "createdAt": 1678333268, + "fixes": [], + "features": [ + "**Interactive Livestream Release (LL-HLS)** \n 1. Broadcast a meeting to up to 100,000 viewers with low latency of just 3 to 6 seconds.\n 2. Interactive chat and polls. \n 3. Viewers can raise hands to join the stage or the host can invite viewers to join the stage. \n For more information, see [ILS Overview](https://docs.dyte.io/guides/livestream/livestream-overview) and [Getting Started with ILS](https://docs.dyte.io/guides/livestream/getting-started-with-livestreaming)." + ], + "new_api": [ + "A new `DyteStage` module introduced at [meeting.stage](./reference/DyteStage) to manage the stage during livestreaming. \n For more information, see [Livestreaming State Management APIs](https://docs.dyte.io/guides/livestream/state-management-apis).", + "A new 'DyteLiveStream' module introduced at [meeting.livestream](./Reference/DyteLivestream) to start and stop the livestreaming. \n For more information, see [Livestreaming: Properties, Functions, and Events](https://docs.dyte.io/guides/livestream/livestream-apis)." + ] + }, + { + "version": "1.5.x", + "createdAt": 1677609000, + "fixes": ["Handle WeWork Solistice Camera gracefully"], + "features": [ + "Initial support for our upcoming Interactive Livestream product (LL-HLS)", + "Webcam quality can now be controlled from the preset, allows customer to select a higher base quality in the preset editor (beta)" + ], + "new_api": [ + "Added boolean flag `socketConnected` to `meeting.meta` that shows when the socket connection is established" + ] + }, + { + "version": "1.4.0", + "createdAt": 1676643893, + "fixes": [ + "**🚨 Critical 🚨** Fixed a WebRTC video production bug that would impact *future* Chrome/Edge browser builds (version β‰₯ M111 - Scheduled to be released in the first week of March)", + "Fixed a regression introduced in `1.3.1` where defaults values passed during initialisation were not respected correctly under a certain edge case", + "Fixed an issue where a bluetooth device disconnection on Google Chrome did not automatically switch to an alternative device", + "Added workarounds for a [Safari Bug](https://bugs.webkit.org/show_bug.cgi?id=231787) where on disconnection of a bluetooth device, local video playback was paused", + "Fixed an issue with Safari screenshare, this improves the screenshare quality in Safari.", + "Minor improvement in the loading times of participant videos when joining a meeting with many participant on the Stage" + ], + "features": [ + "Reduced the size impact of this library from from 1020KB to 880KB (from 228KB to 208KB GZipped). A 12% improvement from the previous release " + ] + }, + { + "version": "1.3.1", + "createdAt": 1675261282, + "fixes": [ + "Improve text legibility when screensharing on Chrome under poor network conditions" + ], + "features": [] + }, + { + "version": "1.2.0", + "createdAt": 1674714600, + "fixes": ["Improved permissions check for audio/video/screenshare"], + "features": [ + "When Tab Sync is enabled, now a `selfTabUpdate` event is fired on the local user when the user switches a plugin" + ], + "breaking-changes": [] + }, + { + "version": "1.1.0", + "createdAt": 1674206130, + "fixes": [ + "Improved handling of iphone Continuity on Mac OS", + "Fix issues in Websocket connection on Safari 12.x / 13.x / 14.x" + ], + "features": [ + "**V2 REST API** - Supports `authToken` generated from V2 REST APIs" + ], + "breaking-changes": [] + } ]