File

projects/openvidu-components-angular/src/lib/directives/template/openvidu-components-angular.directive.ts

Description

The *ovPanel directive empowers you to seamlessly replace default panels with custom ones. It also provides the flexibility to insert elements tagged with the ChatPanelDirective, ParticipantsPanelDirective, and AdditionalPanelsDirective.

In the example below, we showcase how to entirely replace the PanelComponent using the ChatPanelDirective. Within it, you can tailor the appearance and behavior of the ParticipantsPanelComponent and ChatPanelComponent using their respective directives.

Example :
import { HttpClient } from '@angular/common/http';
import { Component } from '@angular/core';
import { lastValueFrom } from 'rxjs';

import { OpenViduComponentsModule } from 'openvidu-components-angular';

@Component({
    selector: 'app-root',
    template: `
        <!-- OpenVidu Video Conference Component -->
        <ov-videoconference
            [token]="token"
            [livekitUrl]="LIVEKIT_URL"
            (onTokenRequested)="onTokenRequested($event)"
        >
            <!-- Custom Panels -->
            <ov-panel *ovPanel>
                <!-- Custom Chat Panel -->
                <div *ovChatPanel id="my-chat-panel">This is my custom chat panel</div>

                <!-- Custom Participants Panel -->
                <div *ovParticipantsPanel id="my-participants-panel">
                    This is my custom participants panel
                </div>

                <!-- Custom Activities Panel -->
                <div *ovActivitiesPanel id="my-activities-panel">
                    This is my custom activities panel
                </div>
            </ov-panel>
        </ov-videoconference>
    `,
    styles: `
        #my-chat-panel,
        #my-participants-panel,
        #my-activities-panel {
            text-align: center;
            height: calc(100% - 40px);
            margin: 20px;
        }

        #my-chat-panel {
            background: #c9ffb2;
        }

        #my-participants-panel {
            background: #ddf2ff;
        }

        #my-activities-panel {
            background: #ffddc9;
        }
    `,
    standalone: true,
    imports: [OpenViduComponentsModule],
})
export class AppComponent {
    // For local development, leave these variables empty
    // For production, configure them with correct URLs depending on your deployment
    APPLICATION_SERVER_URL = '';
    LIVEKIT_URL = '';

    // Define the name of the room and initialize the token variable
    roomName = 'custom-panels';
    token!: string;

    constructor(private httpClient: HttpClient) {
        this.configureUrls();
    }

    private configureUrls() {
        // If APPLICATION_SERVER_URL is not configured, use default value from local development
        if (!this.APPLICATION_SERVER_URL) {
            if (window.location.hostname === 'localhost') {
                this.APPLICATION_SERVER_URL = 'http://localhost:6080/';
            } else {
                this.APPLICATION_SERVER_URL =
                    'https://' + window.location.hostname + ':6443/';
            }
        }

        // If LIVEKIT_URL is not configured, use default value from local development
        if (!this.LIVEKIT_URL) {
            if (window.location.hostname === 'localhost') {
                this.LIVEKIT_URL = 'ws://localhost:7880/';
            } else {
                this.LIVEKIT_URL = 'wss://' + window.location.hostname + ':7443/';
            }
        }
    }

    // Function to request a token when a participant joins the room
    async onTokenRequested(participantName: string) {
        const { token } = await this.getToken(this.roomName, participantName);
        this.token = token;
    }

    // Function to get a token from the server
    getToken(roomName: string, participantName: string): Promise<any> {
        try {
            // Send a POST request to the server to obtain a token
            return lastValueFrom(
                this.httpClient.post<any>(this.APPLICATION_SERVER_URL + 'token', {
                    roomName,
                    participantName,
                })
            );
        } catch (error: any) {
            // Handle errors, e.g., if the server is not reachable
            if (error.status === 404) {
                throw {
                    status: error.status,
                    message:
                        'Cannot connect with the backend. ' + error.url + ' not found',
                };
            }
            throw error;
        }
    }
}

For a comprehensive tutorial on implementing custom panels, please refer to the associated guide here.

Metadata

results matching ""

    No results matching ""