From 769173a508e13ba440f66de048de9ea7aac5d968 Mon Sep 17 00:00:00 2001 From: Sushruti Nihale Date: Fri, 15 Dec 2023 14:55:25 +0530 Subject: [PATCH 1/6] add section for API to fetch peer reports by provided peerId --- static/api/v2.yaml | 880 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 880 insertions(+) diff --git a/static/api/v2.yaml b/static/api/v2.yaml index b49bb1782e..7d3463a09b 100644 --- a/static/api/v2.yaml +++ b/static/api/v2.yaml @@ -2680,6 +2680,37 @@ paths: $ref: '#/components/requestBodies/UpdatePresetBody' tags: - Presets + '/sessions/peer-report/{peer_id}': + parameters: + - schema: + type: string + name: peer_id + in: path + required: true + description: ID of the peer + get: + summary: Fetch details of peer + tags: + - Sessions + responses: + '200': + $ref: '#/components/responses/GetParticipantDataFromPeerId' + operationId: GetParticipantDataFromPeerId + x-stoplight: + id: b693pckykbu4q + description: Returns details of the given peer ID along with call statistics for the given session ID. + parameters: + - schema: + type: string + enum: + - device_info + - ip_information + - precall_network_information + - events + - quality_stats + in: query + name: filters + description: Comma separated list of filters to apply. Note that there must be no spaces between the filters. components: schemas: LivestreamWithSessions: @@ -5902,6 +5933,855 @@ components: - $ref: '#/components/schemas/Preset' required: - data + GetParticipantDataFromPeerId: + description: Returns details of a participant (using peer id) along with callstats data. + content: + application/json: + schema: + type: object + properties: + success: + type: boolean + data: + type: object + properties: + participant: + type: object + properties: + id: + type: string + user_id: + type: string + custom_participant_id: + type: string + display_name: + type: string + role: + type: string + joined_at: + type: string + left_at: + type: string + duration: + type: number + created_at: + type: string + updated_at: + type: string + peer_stats: + type: object + properties: + events: + type: array + items: + type: object + properties: + type: + type: string + timestamp: + type: string + metadata: + type: object + properties: + connection_info: + type: object + properties: + ip_details: + type: object + properties: + city: + type: string + country: + type: string + region: + type: string + loc: + type: string + timezone: + type: string + ip: + type: string + postal: + type: string + asn: + type: object + properties: + asn: + type: string + effective_network_type: + type: string + location: + type: object + properties: + coords: + type: object + properties: + latitude: + type: number + longitude: + type: number + turn_connectivity: + type: boolean + connectivity: + type: object + properties: + host: + type: boolean + relay: + type: boolean + reflexive: + type: boolean + throughput: + type: integer + fractional_loss: + type: integer + r_t_t: + type: number + jitter: + type: integer + backend_r_t_t: + type: number + device_info: + type: object + properties: + browser: + type: string + browser_version: + type: string + cpus: + type: integer + engine: + type: string + is_mobile: + type: boolean + os: + type: string + os_version: + type: string + sdk_name: + type: string + sdk_version: + type: string + user_agent: + type: string + webgl_support: + type: 'null' + ip_information: + type: object + properties: + city: + type: string + country: + type: string + timezone: + type: string + region: + type: string + asn: + type: object + properties: + asn: + type: string + ipv4: + type: string + ip_location: + type: string + org: + type: string + precall_network_information: + type: object + properties: + backend_rtt: + type: number + effective_networktype: + type: string + fractional_loss: + type: integer + jitter: + type: integer + reflexive_connectivity: + type: boolean + relay_connectivity: + type: boolean + rtt: + type: number + throughput: + type: integer + turn_connectivity: + type: boolean + quality_stats: + type: object + properties: + audio_stats: + type: array + items: + type: object + properties: {} + video_stats: + type: array + items: + type: object + properties: {} + peer_ids: + type: array + items: + type: string + start: + type: 'null' + end: + type: 'null' + total_audio_packets: + type: integer + total_audio_packets_lost: + type: integer + total_video_packets: + type: integer + total_video_packets_lost: + type: integer + first_audio_packet_received: + type: 'null' + first_video_packet_received: + type: 'null' + last_audio_packet_received: + type: 'null' + last_video_packet_received: + type: 'null' + average_quality: + type: integer + audio_bandwidth: + type: integer + video_bandwidth: + type: integer + peer_report: + type: object + properties: + metadata: + type: object + properties: + events: + type: array + items: + type: object + properties: + name: + type: string + timestamp: + type: string + pc_metadata: + type: array + items: + type: object + properties: + effective_network_type: + type: string + reflexive_connectivity: + type: boolean + relay_connectivity: + type: boolean + turn_connectivity: + type: boolean + timestamp: + type: string + audio_devices_updates: + type: array + items: + type: object + properties: {} + video_devices_updates: + type: array + items: + type: object + properties: {} + speaker_devices_updates: + type: array + items: + type: object + properties: {} + selected_device_updates: + type: array + items: + type: object + properties: {} + candidate_pairs: + type: object + properties: + producing_transport: + type: array + items: + type: object + properties: + nominated: + type: boolean + current_round_trip_time: + type: number + total_round_trip_time: + type: number + bytes_received: + type: integer + bytes_sent: + type: integer + available_outgoing_bitrate: + type: integer + last_packet_received_timestamp: + type: integer + last_packet_sent_timestamp: + type: integer + local_candidate_id: + type: string + remote_candidate_id: + type: string + bytes_discarded_on_send: + type: integer + packets_sent: + type: integer + packets_received: + type: integer + packets_discarded_on_send: + type: integer + local_candidate_type: + type: string + local_candidate_address: + type: string + local_candidate_port: + type: integer + local_candidate_protocol: + type: string + local_candidate_network_type: + type: string + local_candidate_related_address: + type: string + local_candidate_related_port: + type: integer + remote_candidate_type: + type: string + remote_candidate_address: + type: string + remote_candidate_port: + type: integer + remote_candidate_protocol: + type: string + consuming_transport: + type: array + items: + type: object + properties: {} + device_info: + type: object + properties: + cpus: + type: integer + is_mobile: + type: boolean + os: + type: string + os_version: + type: string + browser_metadata: + type: object + properties: + browser: + type: string + browser_version: + type: string + engine: + type: string + user_agent: + type: string + webgl_support: + type: 'null' + sdk_name: + type: string + sdk_version: + type: string + room_view_type: + type: string + ip_information: + type: object + properties: + city: + type: string + country: + type: string + timezone: + type: string + region: + type: string + asn: + type: object + properties: + asn: + type: string + ipv4: + type: string + quality: + type: object + properties: + video_consumer: + type: array + items: + type: object + properties: {} + audio_consumer: + type: array + items: + type: object + properties: {} + screenshare_video_consumer: + type: array + items: + type: object + properties: {} + screenshare_audio_consumer: + type: array + items: + type: object + properties: {} + video_producer: + type: array + items: + type: object + properties: {} + audio_producer: + type: array + items: + type: object + properties: + mos_quality: + type: integer + timestamp: + type: string + packets_lost: + type: integer + jitter: + type: integer + rtt: + type: + - integer + - number + packets_sent: + type: integer + bytes_sent: + type: integer + producer_id: + type: string + ssrc: + type: integer + mid: + type: string + screenshare_video_producer: + type: array + items: + type: object + properties: {} + screenshare_audio_producer: + type: array + items: + type: object + properties: {} + video_consumer_cumulative: + type: object + properties: {} + audio_consumer_cumulative: + type: object + properties: {} + screenshare_video_consumer_cumulative: + type: object + properties: {} + screenshare_audio_consumer_cumulative: + type: object + properties: {} + video_producer_cumulative: + type: object + properties: {} + screenshare_video_producer_cumulative: + type: object + properties: {} + audio_producer_cumulative: + type: object + properties: + quality_mos: + type: object + properties: + avg: + type: integer + p50: + type: integer + p75: + type: integer + p90: + type: integer + packet_loss: + type: object + properties: + avg: + type: integer + 50_or_greater_event_fraction: + type: integer + 25_or_greater_event_fraction: + type: integer + 10_or_greater_event_fraction: + type: integer + 5_or_greater_event_fraction: + type: integer + rtt: + type: object + properties: + avg: + type: number + 500ms_or_greater_event_fraction: + type: number + 250ms_or_greater_event_fraction: + type: number + 100ms_or_greater_event_fraction: + type: number + screenshare_audio_producer_cumulative: + type: object + properties: {} + x-examples: + Example 1: + success: true + data: + participant: + id: bd45f5a3-44d0-4d48-a9e5-b880b39d9e1c + user_id: aaad2360-4bf6-451d-b89a-98617f2bc549 + custom_participant_id: 0.svveiltvjko + display_name: sush + role: group_call_participant + joined_at: '2023-12-14T13:35:36.332Z' + left_at: '2023-12-14T13:36:42.872Z' + duration: 1.109 + created_at: '2023-12-14T13:35:36.346Z' + updated_at: '2023-12-14T13:36:42.907Z' + peer_stats: + events: + - type: precall_begin + timestamp: '2023-12-14T13:35:33.288Z' + - type: video_off + timestamp: '2023-12-14T13:35:35.182Z' + - type: audio_off + timestamp: '2023-12-14T13:35:35.558Z' + - type: call_join + metadata: + peer_meta_data: + user_id: aaad2360-4bf6-451d-b89a-98617f2bc549 + peer_id: bd45f5a3-44d0-4d48-a9e5-b880b39d9e1c + display_name: sush + room_u_u_i_d: 8b25af6b-14f4-4c50-948a-ad1ca48d4ad8 + room_view_type: groupCall + room_name: bbbf5e93-289c-4c9b-bd44-d677a9206df7 + device_info: + is_mobile: false + browser_name: Chrome + os_name: macOS + browser_version: 119.0.0.0 + os_version_name: 10.15.7 + engine_name: Blink + user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36' + memory: 8 + cpus: 8 + sdk_name: web-core + sdk_version: 1.21.1-staging.3 + meta_data: {} + permissions: {} + meeting_env: devel + timestamp: '2023-12-14T13:35:36.552Z' + - type: audio_off + timestamp: '2023-12-14T13:35:36.553Z' + - type: video_off + timestamp: '2023-12-14T13:35:36.553Z' + - type: tab_change + metadata: + is_meetings_tab_active: false + timestamp: '2023-12-14T13:35:38.593Z' + - type: browser_backgrounded + timestamp: '2023-12-14T13:35:38.593Z' + - type: precall_end + metadata: + connection_info: + ip_details: + city: Nashik + country: IN + region: Maharashtra + loc: '20.00240,73.79450' + timezone: Asia/Kolkata + ip: 103.183.81.21 + postal: '422003' + asn: + asn: AS135248 + effective_network_type: 4g + location: + coords: + latitude: 20.0024 + longitude: 73.7945 + turn_connectivity: true + connectivity: + host: true + relay: true + reflexive: false + throughput: 7931 + fractional_loss: 0 + r_t_t: 0.03 + jitter: 0 + backend_r_t_t: 0.031 + timestamp: '2023-12-14T13:35:41.144Z' + device_info: + browser: Chrome + browser_version: 119.0.0.0 + cpus: 8 + engine: Blink + is_mobile: false + os: macOS + os_version: 10.15.7 + sdk_name: web-core + sdk_version: 1.21.1-staging.3 + user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36' + webgl_support: null + ip_information: + city: Nashik + country: IN + timezone: Asia/Kolkata + region: Maharashtra + asn: + asn: AS135248 + ipv4: 103.183.81.21 + ip_location: 103.183.81.21 + org: 103.183.81.21 + precall_network_information: + backend_rtt: 0.031 + effective_networktype: 4g + fractional_loss: 0 + jitter: 0 + reflexive_connectivity: false + relay_connectivity: true + rtt: 0.03 + throughput: 7931 + turn_connectivity: true + quality_stats: + audio_stats: [] + video_stats: [] + peer_ids: + - bd45f5a3-44d0-4d48-a9e5-b880b39d9e1c + start: null + end: null + total_audio_packets: 0 + total_audio_packets_lost: 0 + total_video_packets: 0 + total_video_packets_lost: 0 + first_audio_packet_received: null + first_video_packet_received: null + last_audio_packet_received: null + last_video_packet_received: null + average_quality: 0 + audio_bandwidth: 0 + video_bandwidth: 0 + peer_report: + metadata: + events: + - name: precall_begin + timestamp: '2023-12-14T13:35:33.288Z' + - name: video_off + timestamp: '2023-12-14T13:35:35.182Z' + - name: audio_off + timestamp: '2023-12-14T13:35:35.558Z' + - name: audio_off + timestamp: '2023-12-14T13:35:36.553Z' + - name: video_off + timestamp: '2023-12-14T13:35:36.553Z' + - name: meeting_view_backgrounded + timestamp: '2023-12-14T13:35:38.593Z' + pc_metadata: + - effective_network_type: 4g + reflexive_connectivity: false + relay_connectivity: true + turn_connectivity: true + timestamp: '2023-12-14T13:35:41.144Z' + audio_devices_updates: [] + video_devices_updates: [] + speaker_devices_updates: [] + selected_device_updates: [] + candidate_pairs: + producing_transport: + - nominated: true + current_round_trip_time: 0.009 + total_round_trip_time: 4.055 + bytes_received: 33950 + bytes_sent: 200996 + available_outgoing_bitrate: 54858 + last_packet_received_timestamp: 1702561000121 + last_packet_sent_timestamp: 1702561000139 + local_candidate_id: IKf7CPY3N + remote_candidate_id: IAEFfn0BW + bytes_discarded_on_send: 0 + packets_sent: 3203 + packets_received: 692 + packets_discarded_on_send: 0 + local_candidate_type: prflx + local_candidate_address: 103.183.81.21 + local_candidate_port: 64799 + local_candidate_protocol: udp + local_candidate_network_type: wifi + local_candidate_related_address: 192.168.0.119 + local_candidate_related_port: 64799 + remote_candidate_type: host + remote_candidate_address: 43.205.177.161 + remote_candidate_port: 46252 + remote_candidate_protocol: udp + consuming_transport: [] + device_info: + cpus: 8 + is_mobile: false + os: macOS + os_version: 10.15.7 + browser_metadata: + browser: Chrome + browser_version: 119.0.0.0 + engine: Blink + user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36' + webgl_support: null + sdk_name: web-core + sdk_version: 1.21.1-staging.3 + room_view_type: groupCall + ip_information: + city: Nashik + country: IN + timezone: Asia/Kolkata + region: Maharashtra + asn: + asn: AS135248 + ipv4: 103.183.81.21 + quality: + video_consumer: [] + audio_consumer: [] + screenshare_video_consumer: [] + screenshare_audio_consumer: [] + video_producer: [] + audio_producer: + - mos_quality: 1 + timestamp: '2023-12-14T13:35:36.554Z' + packets_lost: 0 + jitter: 0 + rtt: 0 + packets_sent: 5 + bytes_sent: 86 + producer_id: fb6e75d3-d353-42a9-87cb-ce57f30e44b5 + ssrc: 2051826975 + mid: '0' + - mos_quality: 1 + timestamp: '2023-12-14T13:35:44.140Z' + packets_lost: 0 + jitter: 0 + rtt: 0.782913 + packets_sent: 382 + bytes_sent: 8162 + producer_id: fb6e75d3-d353-42a9-87cb-ce57f30e44b5 + ssrc: 2051826975 + mid: '0' + - mos_quality: 1 + timestamp: '2023-12-14T13:35:51.140Z' + packets_lost: 0 + jitter: 0 + rtt: 0.014374 + packets_sent: 350 + bytes_sent: 6300 + producer_id: fb6e75d3-d353-42a9-87cb-ce57f30e44b5 + ssrc: 2051826975 + mid: '0' + - mos_quality: 1 + timestamp: '2023-12-14T13:35:58.142Z' + packets_lost: 0 + jitter: 0 + rtt: 0.49529999999999996 + packets_sent: 351 + bytes_sent: 6318 + producer_id: fb6e75d3-d353-42a9-87cb-ce57f30e44b5 + ssrc: 2051826975 + mid: '0' + - mos_quality: 1 + timestamp: '2023-12-14T13:36:05.143Z' + packets_lost: 0 + jitter: 0 + rtt: 0.009659 + packets_sent: 350 + bytes_sent: 6300 + producer_id: fb6e75d3-d353-42a9-87cb-ce57f30e44b5 + ssrc: 2051826975 + mid: '0' + - mos_quality: 1 + timestamp: '2023-12-14T13:36:12.143Z' + packets_lost: 0 + jitter: 0 + rtt: 0.008513999999999999 + packets_sent: 350 + bytes_sent: 6300 + producer_id: fb6e75d3-d353-42a9-87cb-ce57f30e44b5 + ssrc: 2051826975 + mid: '0' + - mos_quality: 1 + timestamp: '2023-12-14T13:36:19.136Z' + packets_lost: 0 + jitter: 0 + rtt: 0.013321 + packets_sent: 349 + bytes_sent: 6282 + producer_id: fb6e75d3-d353-42a9-87cb-ce57f30e44b5 + ssrc: 2051826975 + mid: '0' + - mos_quality: 1 + timestamp: '2023-12-14T13:36:26.142Z' + packets_lost: 0 + jitter: 0 + rtt: 0.009888 + packets_sent: 351 + bytes_sent: 6318 + producer_id: fb6e75d3-d353-42a9-87cb-ce57f30e44b5 + ssrc: 2051826975 + mid: '0' + - mos_quality: 1 + timestamp: '2023-12-14T13:36:33.141Z' + packets_lost: 0 + jitter: 0 + rtt: 0.011932 + packets_sent: 350 + bytes_sent: 6300 + producer_id: fb6e75d3-d353-42a9-87cb-ce57f30e44b5 + ssrc: 2051826975 + mid: '0' + - mos_quality: 1 + timestamp: '2023-12-14T13:36:40.138Z' + packets_lost: 0 + jitter: 0 + rtt: 0.011108 + packets_sent: 350 + bytes_sent: 6300 + producer_id: fb6e75d3-d353-42a9-87cb-ce57f30e44b5 + ssrc: 2051826975 + mid: '0' + screenshare_video_producer: [] + screenshare_audio_producer: [] + video_consumer_cumulative: {} + audio_consumer_cumulative: {} + screenshare_video_consumer_cumulative: {} + screenshare_audio_consumer_cumulative: {} + video_producer_cumulative: {} + screenshare_video_producer_cumulative: {} + audio_producer_cumulative: + quality_mos: + avg: 1 + p50: 1 + p75: 1 + p90: 1 + packet_loss: + avg: 0 + 50_or_greater_event_fraction: 0 + 25_or_greater_event_fraction: 0 + 10_or_greater_event_fraction: 0 + 5_or_greater_event_fraction: 0 + rtt: + avg: 135.7009 + 500ms_or_greater_event_fraction: 0.1 + 250ms_or_greater_event_fraction: 0.2 + 100ms_or_greater_event_fraction: 0.2 + screenshare_audio_producer_cumulative: {} examples: GetActiveSessionSuccessResponse: summary: Success response for fetching active session From b164167bf1728054486f36f4d4daed92f87f56d8 Mon Sep 17 00:00:00 2001 From: Palash Date: Thu, 4 Jan 2024 00:26:21 +0530 Subject: [PATCH 2/6] feat: screensharing guide restructure --- .../screensharing/_category_.json | 4 +- .../capabilities/screensharing/displaying.mdx | 223 +++++++++++++++ .../capabilities/screensharing/enabling.mdx | 228 +++++++++++++++ .../capabilities/screensharing/index.mdx | 264 ------------------ src/css/custom.css | 24 ++ static/static/guides/screenshare-max.png | Bin 0 -> 93430 bytes 6 files changed, 477 insertions(+), 266 deletions(-) create mode 100644 docs/guides/capabilities/screensharing/displaying.mdx create mode 100644 docs/guides/capabilities/screensharing/enabling.mdx delete mode 100644 docs/guides/capabilities/screensharing/index.mdx create mode 100644 static/static/guides/screenshare-max.png diff --git a/docs/guides/capabilities/screensharing/_category_.json b/docs/guides/capabilities/screensharing/_category_.json index d6f0876a4c..f6672940e5 100644 --- a/docs/guides/capabilities/screensharing/_category_.json +++ b/docs/guides/capabilities/screensharing/_category_.json @@ -1,4 +1,4 @@ { - "position": 8, + "position": 3, "label": "Screen Sharing" -} +} \ No newline at end of file diff --git a/docs/guides/capabilities/screensharing/displaying.mdx b/docs/guides/capabilities/screensharing/displaying.mdx new file mode 100644 index 0000000000..a28159ff01 --- /dev/null +++ b/docs/guides/capabilities/screensharing/displaying.mdx @@ -0,0 +1,223 @@ +# Displaying Screenshare + +## Usage + +### Events
Core
+ +Once any 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. + + + + +```jsx +meeting.participants.joined.on('screenShareUpdate', (participant) => { + if (participant.screenShareEnabled) { + // participant.screenShareTrack + } else { + // handle stop screen share + } +}); +``` + + + + +```jsx +const { meeting } = useDyteMeeting(); + +// Array of participants having their screenshare on +const ssParticipants = useDyteSelector((m) => + m.participant.joined.toArray().filter((p) => p.screenShareEnabled) +); + +// or using traditional event listeners +meeting.participants.joined.on('screenShareUpdate', (participant) => { + if (participant.screenShareEnabled) { + // participant.screenShareTrack + } else { + // handle stop screen share + } +}); +``` + + + + +```dart +... + +@override +void onScreenShareStarted(DyteJoinedMeetingParticipant participant) { + /// handle screen share started of `DyteJoinedMeetingParticipant` participant +} + +@override +void onScreenShareEnded(DyteJoinedMeetingParticipant participant) { + /// handle screen share ended of `DyteJoinedMeetingParticipant` participant +} + +... +``` + + + + +```jsx +const { meeting } = useDyteMeeting(); + +// Array of participants having their screenshare on +const ssParticipants = useDyteSelector((m) => + m.participant.joined.toArray().filter((p) => p.screenShareEnabled) +); + +// or using traditional event listeners +meeting.participants.joined.on('screenShareUpdate', (participant) => { + if (participant.screenShareEnabled) { + // participant.screenShareTrack + } else { + // handle stop screen share + } +}); +``` + + + + +```kotlin + +private val participantEventsListener = object : DyteParticipantEventsListener { + override fun onScreenSharesUpdated() { + super.onScreenSharesUpdated() + + ... + } + } + +``` + + + + +```swift +DyteParticipantEventsListener { + func onScreenSharesUpdated() { + // your code here to handle screenshares from meeting + } + func onScreenShareEnded(participant: DyteMeetingParticipant) { + // your code here to handle screenshare ended + } + + func onScreenShareStarted(participant: DyteMeetingParticipant) { + // your code here to handle screenshare started + } +} +``` + + + + +### Components
UI Kit
+ +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 + + + + + +``` + +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 + + + + + +``` + +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. + + + diff --git a/docs/guides/capabilities/screensharing/enabling.mdx b/docs/guides/capabilities/screensharing/enabling.mdx new file mode 100644 index 0000000000..9d05104049 --- /dev/null +++ b/docs/guides/capabilities/screensharing/enabling.mdx @@ -0,0 +1,228 @@ +--- +slug: 'basics' +sidebar_position: 1 +--- + +# Enable/Disable Screenshare + +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: + +## Usage + +### Methods/Properties
Core
+ +Once users have the permissions to share their screen, they need to be able to start or stop sharing their screens. Use the Core SDK 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(); +``` + +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 +const { meeting } = useDyteMeeting(); + +// Enable Screenshare +await meeting.self.enableScreenShare(); + +// Disable Screenshare +await meeting.self.disableScreenShare(); +``` + +You can also define defaults for screen sharing during the client initialization. Check out the [local user](/web-core/local-user/introduction#enable--disable-screen-share) reference for more details. + + + + +```jsx +const { meeting } = useDyteMeeting(); + +// Enable Screenshare +await meeting.self.enableScreenShare(); + +// Disable Screenshare +await meeting.self.disableScreenShare(); +``` + + + + +### Events
Core
+ + + + +```jsx +meeting.self.on( + 'screenShareUpdate', + ({ screenShareEnabled, screenShareTracks }) => { + if (screenShareEnabled) { + // handle screen share start + } else { + // handle stop screen share + } + } +); +``` + + + + +```jsx +const { meeting } = useDyteMeeting(); + +const screenshareEnabled = useDyteSelector((m) => m.self.screenShareEnabled); + +// or using traditional event listeners +meeting.self.on( + 'screenShareUpdate', + ({ screenShareEnabled, screenShareTracks }) => { + if (screenShareEnabled) { + // handle screen share start + } else { + // handle stop screen share + } + } +); +``` + + + + +```jsx +const { meeting } = useDyteMeeting(); + +const screenshareEnabled = useDyteSelector((m) => m.self.screenShareEnabled); + +// or using traditional event listeners +meeting.self.on( + 'screenShareUpdate', + ({ screenShareEnabled, screenShareTracks }) => { + if (screenShareEnabled) { + // handle screen share start + } else { + // handle stop screen share + } + } +); +``` + + + + +### Components
UI Kit
+ +If you don't want to create your own button to toggle screen sharing, use the default button provided by our UI Kits. + + + + +```jsx + + + + + +``` + + + + +```jsx +
+ + + +
+``` + +
+ + +```jsx + + + +``` + + + + +```jsx +
+ + + +
+``` + +
+
+ +## Configuration + +### Multiple Screenshare
Preset
+ +Configure the number of people who can screenshare at once using preset configuration + + + +### Preferred panel
Core
Web
+ +On web browsers, a user can choose between sharing a tab, a window or the entire screen. While there is no browser API to restrict to a specific surface type you can set a preferred display surface + + + + +```js +meeting = await DyteClient.init({ + authToken, + defaults: { + screenShare: { + displaySurface: 'window' | 'monitor' | 'browser', + }, + }, +}); +``` + + + + +```js +const [meeting, initMeeting] = useDyteClient(); + +const join = () => { + initMeeting({ + authToken, + defaults: { + screenShare: { + displaySurface: 'window' | 'monitor' | 'browser', + }, + }, + }); +}; +``` + + + diff --git a/docs/guides/capabilities/screensharing/index.mdx b/docs/guides/capabilities/screensharing/index.mdx deleted file mode 100644 index 6e5568e26c..0000000000 --- a/docs/guides/capabilities/screensharing/index.mdx +++ /dev/null @@ -1,264 +0,0 @@ -# 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. - - - - -:::info - -This function is not yet available on the Flutter coreSDK. - -::: - - - - -```jsx -// Enable Screenshare -await meeting.self.enableScreenShare(); - -// Disable Screenshare -await meeting.self.disableScreenShare(); - -// Get current status -meeting.self.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 - - - - - -``` - -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 - - - - - -``` - -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 -
- - - -
-``` - -
- - -```jsx - - - -``` - - - - -:::info -This UI component does not currently exist in the Flutter UIKit. -::: - - - - -```jsx -
- - - -
-``` - -
- - -:::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/src/css/custom.css b/src/css/custom.css index 1eb9586679..7f94b0904c 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -1221,3 +1221,27 @@ html[data-theme='dark'] .video_sidebar_header > div > a::before { border-right: 1px solid rgb(240, 240, 240); border-left: 1px solid rgb(240, 240, 240); } + +.header-tag { + @apply ml-1 mt-0.5 inline rounded-md bg-secondary-700 p-1 text-xs text-text-400; +} + +.header-tag.tag-core { + @apply bg-teal-500 text-white; +} + +.header-tag.tag-ui { + @apply bg-fuchsia-400 text-white; +} + +.table-of-contents .header-tag { + @apply mt-0 rounded-sm py-0.5 text-[0.5rem]; +} + +.anchor { + @apply flex items-center; +} + +.max-512 { + max-width: 512px; +} diff --git a/static/static/guides/screenshare-max.png b/static/static/guides/screenshare-max.png new file mode 100644 index 0000000000000000000000000000000000000000..252a783d7e9e55791ad9add1e7ae00c4518d3e2d GIT binary patch literal 93430 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 ayAhu;Bc;4zGjEuH>yrMjdNmiFBL4+h>v$Xh literal 0 HcmV?d00001 From 38452fe6ff0c29563c528ed68b3f435664d47a7a Mon Sep 17 00:00:00 2001 From: Palash Date: Thu, 4 Jan 2024 17:10:46 +0530 Subject: [PATCH 3/6] fix: reduce tab text --- docs/guides/capabilities/screensharing/enabling.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guides/capabilities/screensharing/enabling.mdx b/docs/guides/capabilities/screensharing/enabling.mdx index 2890ec46fc..3f521864e6 100644 --- a/docs/guides/capabilities/screensharing/enabling.mdx +++ b/docs/guides/capabilities/screensharing/enabling.mdx @@ -69,7 +69,7 @@ dyteClient.localUser.screenShareEnabled; ``` - + ```kotlin // Enable Screenshare @@ -83,7 +83,7 @@ meeting.localUser.screenShareEnabled; ``` - + ```swift // Enable Screenshare From 8bf533a0c51851059d5b28781962819c6ad1e81b Mon Sep 17 00:00:00 2001 From: Palash Date: Thu, 4 Jan 2024 17:51:03 +0530 Subject: [PATCH 4/6] fix: rename coreSdk -> Core SDK --- docs/guides/capabilities/plugins/index.mdx | 4 ++-- docs/guides/capabilities/polls/getting_started.mdx | 2 +- docs/guides/capabilities/polls/index.mdx | 6 +++--- docs/guides/capabilities/polls/uikit.mdx | 2 +- docs/guides/live-video/concepts.mdx | 6 +++--- docs/guides/voice-conf/concepts.mdx | 6 +++--- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/guides/capabilities/plugins/index.mdx b/docs/guides/capabilities/plugins/index.mdx index f6bf5346b3..dd1d565d8e 100644 --- a/docs/guides/capabilities/plugins/index.mdx +++ b/docs/guides/capabilities/plugins/index.mdx @@ -250,7 +250,7 @@ The snippet below displays deactivate a single plugin. 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 { +DytePluginEventsListener { func onPluginDeactivated(plugin: DytePlugin) { // your code to handle plugin de-activation @@ -262,7 +262,7 @@ extension MeetingViewModel: DytePluginEventsListener { -## Configure existing plgins +## Configure existing plugins For further reading on configuring existing plugins, check out the guides below: diff --git a/docs/guides/capabilities/polls/getting_started.mdx b/docs/guides/capabilities/polls/getting_started.mdx index 1832395ac7..2419e4626a 100644 --- a/docs/guides/capabilities/polls/getting_started.mdx +++ b/docs/guides/capabilities/polls/getting_started.mdx @@ -137,7 +137,7 @@ The type `DytePollMessage` is the main class for any poll in Dyte. It also conta ## Creating a new Poll -### Using the coreSDK +### Using the Core SDK The `Polls` object gives a create function to create a new poll. It accepts the following parameters: diff --git a/docs/guides/capabilities/polls/index.mdx b/docs/guides/capabilities/polls/index.mdx index be7db20013..3d13425bd4 100644 --- a/docs/guides/capabilities/polls/index.mdx +++ b/docs/guides/capabilities/polls/index.mdx @@ -1,9 +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. +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 Core SDK with Dyte's UIKit to create seamless poll interactions in a couple of minutes, or you can also use the Core SDK with your custom components. -The guides walk you through the functionalities that the coreSDK and the UIKit provide you. +The guides walk you through the functionalities that the Core SDK and the UIKit provide you. -1. [Getting started with Polls](./polls/getting_started) walks through creating polls from the coreSDK +1. [Getting started with Polls](./polls/getting_started) walks through creating polls from the Core SDK 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 index c70e7547f4..9c22565bdb 100644 --- a/docs/guides/capabilities/polls/uikit.mdx +++ b/docs/guides/capabilities/polls/uikit.mdx @@ -4,7 +4,7 @@ Using Dyte's UIKit you can simplify the process of adding polls in your meetings ### Prerequisites -1. Install coreSDK for your framework +1. Install Core SDK for your framework 2. Install UIKit for your framework ## Dyte Poll Form : Create a new poll diff --git a/docs/guides/live-video/concepts.mdx b/docs/guides/live-video/concepts.mdx index a4e1432701..1f485b76ca 100644 --- a/docs/guides/live-video/concepts.mdx +++ b/docs/guides/live-video/concepts.mdx @@ -79,10 +79,10 @@ Once you have grabbed your API key, we can begin to take a look at your server s ### 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. +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 **Core SDK**. 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. +To connect with the meetings from the client, you need to initialise the Core SDK. 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 Core SDK 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). +We have separated the load of building user interactions from the UI components. You can simply use the Core SDK 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 Core SDK and it cannot function in isolation! Make sure you grab both the UIKit and the Core SDK 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/guides/voice-conf/concepts.mdx b/docs/guides/voice-conf/concepts.mdx index a4e1432701..1f485b76ca 100644 --- a/docs/guides/voice-conf/concepts.mdx +++ b/docs/guides/voice-conf/concepts.mdx @@ -79,10 +79,10 @@ Once you have grabbed your API key, we can begin to take a look at your server s ### 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. +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 **Core SDK**. 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. +To connect with the meetings from the client, you need to initialise the Core SDK. 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 Core SDK 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). +We have separated the load of building user interactions from the UI components. You can simply use the Core SDK 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 Core SDK and it cannot function in isolation! Make sure you grab both the UIKit and the Core SDK 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). From 19e15661a55a726ee78f5d1ba1171554df64fd2b Mon Sep 17 00:00:00 2001 From: Palash Date: Sat, 6 Jan 2024 13:28:53 +0530 Subject: [PATCH 5/6] fix: update plugin guides --- docs/guides/capabilities/plugins/index.mdx | 356 +++++++++++---------- 1 file changed, 187 insertions(+), 169 deletions(-) diff --git a/docs/guides/capabilities/plugins/index.mdx b/docs/guides/capabilities/plugins/index.mdx index dd1d565d8e..aa41afd2b6 100644 --- a/docs/guides/capabilities/plugins/index.mdx +++ b/docs/guides/capabilities/plugins/index.mdx @@ -1,259 +1,299 @@ # 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. +Dyte Plugins allow you to build collaborative and immersive experiences in your meetings without ever having to leave 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 +## Usage -Here is an introduction on how to enable plugins in your meetings: +### Methods / Properties

+ +Here is an introduction on the basics of 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. +#### List all plugins ```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); -}); +Each plugin object in the array is of type [DytePlugin](/web-core/reference/DytePlugin) + +#### Activate plugin + +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 finds a plugin by name and activates it + +```js +const plugins = meeting.plugins.all.toArray(); +const whiteboard = plugins.find((p) => p.name == 'Whiteboard'); + +await whiteboard.activate(); +``` + +#### Deactivate plugin + +``` +whiteboard.deactivate() ``` -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. +#### List all plugins ```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); -}); +Each plugin object in the array is of type [DytePlugin](/react-web-core/reference/DytePlugin) + +#### Activate plugin + +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 finds a plugin by name and activates it + +```js +const plugins = meeting.plugins.all.toArray(); +const whiteboard = plugins.find((p) => p.name == 'Whiteboard'); + +await whiteboard.activate(); +``` + +#### Deactivate plugin + +``` +whiteboard.deactivate() ``` -:::info +#### List all plugins + +```dart +List plugins = await dyteClient.plugins.all; +``` + +Each plugin object in the array is of type DytePlugin + +#### Activate plugin -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 finds a plugin by name and activates it + +```dart +List plugins = await dyteClient.plugins.all; +DytePlugin whiteboard = plugins.firstWhere((p) => p.name == 'Whiteboard'); + +await whiteboard.activate(); +``` + +#### Deactivate plugin + +```dart +whiteboard.deactivate() +``` -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. +#### List all plugins ```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); -}); +Each plugin object in the array is of type [DytePlugin](/react-native/reference/DytePlugin) + +#### Activate plugin + +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 finds a plugin by name and activates it + +```js +const plugins = meeting.plugins.all.toArray(); +const whiteboard = plugins.find((p) => p.name == 'Whiteboard'); + +await whiteboard.activate(); +``` + +#### Deactivate plugin + +``` +whiteboard.deactivate() ``` -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. +#### List all plugins ```kotlin - val plugin = meeting.plugins.all['pluginName'] - plugin?.activate() +val plugins = meeting.plugins.all ``` -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). +Each plugin object in the array is of type DytePlugin + +#### Activate plugin + +The `activate()` method activates a plugin for all users in the meeting. When you activate a plugin, it moves into the active plugins array and can be accessed from `meeting.plugins.active`. + +The snippet below finds a plugin by name and activates it ```kotlin - meeting.addMeetingRoomEventsListener(object : - DyteMeetingRoomEventsListener { - override fun onPluginActivated(plugin: DytePlugin) { - super.onPluginActivated(plugin) - // your code to handle plugin activation - } +val plugins = meeting.plugins.all +val whiteboard = plugins.find { p -> p.name == "Whiteboard" } - override fun onPluginDeactivated(plugin: DytePlugin) { - super.onPluginDeactivated(plugin) - // your code to handle plugin de-activation - } +whiteboard.activate(); +``` + +#### Deactivate plugin + +``` +whiteboard.deactivate() ``` -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`. +#### List all plugins -The snippet below displays activates a given plugin. - -```kotlin - val plugin = meeting.plugins.all['pluginName'] - plugin?.activate() +```swift +let plugins = meeting.plugins.all ``` -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). +Each plugin object in the array is of type DytePlugin + +#### Activate plugin + +The `activate()` method activates a plugin for all users in the meeting. When you activate a plugin, it moves into the active plugins array and can be accessed from `meeting.plugins.active`. + +The snippet below finds a plugin by name and activates it ```swift -extension MeetingViewModel: DytePluginEventsListener { +let plugins = meeting.plugins.all +let whiteboard = plugins.first { $0.name == "Whiteboard" } - func onPluginActivated(plugin: DytePlugin) { - // your code to handle plugin activation - } +whiteboard.activate(); +``` -} +#### Deactivate plugin + +``` +whiteboard.deactivate() ``` -## Disable Plugins - -Here is an introduction on how to disable plugins in your meetings: +### Events
Core
- -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. +Each `plugin` object emits an `enabled` event and a `closed` event ```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); +const whiteboard = plugins.find((p) => p.name == 'Whiteboard'); +whiteboard.on('enabled', () => { + console.log('Whiteboard has been enabled'); +}); +whiteboard.on('closed', () => { + console.log('Whiteboard has been disabled'); }); -``` - -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. +Each `plugin` object emits an `enabled` event and a `closed` event ```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); +const whiteboard = plugins.find((p) => p.name == 'Whiteboard'); +whiteboard.on('enabled', () => { + console.log('Whiteboard has been enabled'); +}); +whiteboard.on('closed', () => { + console.log('Whiteboard has been disabled'); }); -``` - -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 +```dart -Plugins are not yet available for FlutterCore. +class PluginNotifier extends DytePluginEventsListener { + @override + void onPluginActivated(DytePlugin plugin) { + state = OnPluginActivated(plugin); + } -::: + @override + void onPluginDeactivated(DytePlugin plugin) { + state = OnPluginDeactivated(plugin); + } +} + +meeting.addPluginEventsListener(PluginNotifier()) + +``` -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. +Each `plugin` object emits an `enabled` event and a `closed` event ```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); +const whiteboard = plugins.find((p) => p.name == 'Whiteboard'); +whiteboard.on('enabled', () => { + console.log('Whiteboard has been enabled'); +}); +whiteboard.on('closed', () => { + console.log('Whiteboard has been disabled'); }); -``` - -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. +Any plugin activation / deactivation will trigger a callback. 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 - val plugin = meeting.plugins.active['pluginName'] - plugin?.deactivate() +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 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. +Any plugin activation / deactivation will trigger a callback. 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 - 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). +extension MeetingViewModel: DytePluginEventsListener { -```swift -DytePluginEventsListener { + func onPluginActivated(plugin: DytePlugin) { + // your code to handle plugin activation + } func onPluginDeactivated(plugin: DytePlugin) { - // your code to handle plugin de-activation + // your code to handle plugin activation } } @@ -261,25 +301,3 @@ DytePluginEventsListener { - -## Configure existing plugins - -For further reading on configuring existing plugins, check out the guides below: - - - - - - From 9ae37c85b2b074cfb1a8559dd7fb0dfce77325f9 Mon Sep 17 00:00:00 2001 From: Palash Date: Sat, 6 Jan 2024 17:05:23 +0530 Subject: [PATCH 6/6] fix: build --- docs/guides/capabilities/plugins/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/capabilities/plugins/index.mdx b/docs/guides/capabilities/plugins/index.mdx index aa41afd2b6..f255ccdd54 100644 --- a/docs/guides/capabilities/plugins/index.mdx +++ b/docs/guides/capabilities/plugins/index.mdx @@ -107,7 +107,7 @@ whiteboard.deactivate() const plugins = meeting.plugins.all.toArray(); ``` -Each plugin object in the array is of type [DytePlugin](/react-native/reference/DytePlugin) +Each plugin object in the array is of type DytePlugin #### Activate plugin