diff --git a/frontend/projects/shared-meet-components/src/lib/pages/console/rooms/room-form/room-form.component.html b/frontend/projects/shared-meet-components/src/lib/pages/console/rooms/room-form/room-form.component.html
index 9ac5509..57bfb17 100644
--- a/frontend/projects/shared-meet-components/src/lib/pages/console/rooms/room-form/room-form.component.html
+++ b/frontend/projects/shared-meet-components/src/lib/pages/console/rooms/room-form/room-form.component.html
@@ -1 +1,37 @@
-
room-form works!
+
diff --git a/frontend/projects/shared-meet-components/src/lib/pages/console/rooms/room-form/room-form.component.scss b/frontend/projects/shared-meet-components/src/lib/pages/console/rooms/room-form/room-form.component.scss
index e69de29..1e6ede6 100644
--- a/frontend/projects/shared-meet-components/src/lib/pages/console/rooms/room-form/room-form.component.scss
+++ b/frontend/projects/shared-meet-components/src/lib/pages/console/rooms/room-form/room-form.component.scss
@@ -0,0 +1,186 @@
+$formBorderRadius: 0.35rem;
+$formColor: #e6e6e6;
+$formError: #770000;
+$formInputBackgroundColor: #434a52;
+$formInputHoverBackgroundColor: #3c4249;
+$formLabelBackgroundColor: #363b41;
+$formSubmitBackgroundColor: #0087a9;
+$formSubmitDisabledBackgroundColor: #264b55;
+
+$formSubmitColor: #eee;
+$formSubmitDisabledColor: #bdbdbd;
+
+$formSubmitHoverBackgroundColor: #006a85;
+$iconFill: #606468;
+$formGap: 0.375rem;
+
+.roomError {
+ font-size: 14px;
+ color: $formError;
+ text-shadow: 0.2px 0px #ffffff;
+ text-align: left;
+ font-weight: 600;
+}
+
+.roomError mat-icon {
+ vertical-align: bottom;
+ padding-right: 4px;
+}
+
+.grid {
+ inline-size: 90%;
+ margin-inline: auto;
+ max-inline-size: 26rem;
+}
+
+.hidden {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+
+.icons {
+ display: none;
+}
+
+.icon {
+ block-size: 1em;
+ display: inline-block;
+ fill: $iconFill;
+ inline-size: 1em;
+ vertical-align: middle;
+}
+
+input {
+ background-image: none;
+ border: 0;
+ color: inherit;
+ font: inherit;
+ margin: 0;
+ outline: 0;
+ padding: 0;
+ transition: background-color 0.3s;
+}
+
+input[type='submit'] {
+ cursor: pointer;
+}
+
+.form {
+ display: grid;
+ gap: $formGap;
+}
+
+.form input[type='password'],
+.form input[type='text'],
+.form button[type='submit'] {
+ inline-size: 100%;
+}
+
+.form-field {
+ display: flex;
+}
+
+.form-input {
+ flex: 1;
+}
+
+.room-prefix {
+ color: $formColor;
+}
+
+.room-prefix label.error {
+ background-color: $formError;
+}
+.room-prefix label,
+.room-prefix input[type='text'],
+.room-prefix input[type='password'] {
+ border-radius: $formBorderRadius;
+ padding: 0.85rem;
+}
+
+#room-id-input {
+ border-radius: 0;
+}
+
+.room-prefix button[type='submit'] {
+ border-radius: $formBorderRadius;
+ padding: 0.4rem;
+ cursor: pointer;
+}
+
+.room-prefix button:disabled[type='submit'] {
+ cursor: auto;
+ color: $formSubmitDisabledColor !important;
+ background-color: $formSubmitDisabledBackgroundColor !important;
+}
+
+.room-prefix label {
+ background-color: $formLabelBackgroundColor;
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+ padding-inline: 1.25rem;
+}
+
+.room-prefix input[type='password'],
+.room-prefix input[type='text'] {
+ background-color: $formInputBackgroundColor;
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+ font-size: 16px;
+}
+
+.room-prefix input[type='password']:focus,
+.room-prefix input[type='password']:hover,
+.room-prefix input[type='text']:focus,
+.room-prefix input[type='text']:hover {
+ background-color: $formInputHoverBackgroundColor;
+}
+
+.room-prefix button[type='submit'] {
+ background-color: $formSubmitBackgroundColor;
+ color: $formSubmitColor;
+ font-weight: 500;
+ text-transform: uppercase;
+}
+
+.room-prefix button[type='submit']:focus,
+.room-prefix button[type='submit']:hover {
+ background-color: $formSubmitHoverBackgroundColor;
+}
+#clear-room-id-btn {
+ height: auto;
+ background-color: $formInputBackgroundColor;
+ border-radius: 0;
+ color: $formColor;
+ mat-icon {
+ vertical-align: middle;
+ }
+}
+#room-id-generator-btn {
+ height: auto;
+ background-color: $formInputBackgroundColor;
+ border-radius: $formBorderRadius;
+ border-bottom-left-radius: 0;
+ border-top-left-radius: 0;
+ color: $formColor;
+ mat-icon {
+ vertical-align: middle;
+ }
+ &:hover {
+ background-color: $formInputHoverBackgroundColor;
+ }
+}
+
+p {
+ margin-block: 1.5rem;
+}
+
+.text--center {
+ text-align: center;
+}
diff --git a/frontend/projects/shared-meet-components/src/lib/pages/console/rooms/room-form/room-form.component.ts b/frontend/projects/shared-meet-components/src/lib/pages/console/rooms/room-form/room-form.component.ts
index 09ad3ea..404b3bf 100644
--- a/frontend/projects/shared-meet-components/src/lib/pages/console/rooms/room-form/room-form.component.ts
+++ b/frontend/projects/shared-meet-components/src/lib/pages/console/rooms/room-form/room-form.component.ts
@@ -1,12 +1,74 @@
+import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
+import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { MatButton, MatIconButton } from '@angular/material/button';
+import { MatIcon } from '@angular/material/icon';
+import { MatTooltip } from '@angular/material/tooltip';
+import { Router } from '@angular/router';
+import { HttpService } from '@lib/services';
+import { MeetRoom, MeetRoomOptions } from '@lib/typings/ce';
+import { animals, colors, Config, uniqueNamesGenerator } from 'unique-names-generator';
@Component({
- selector: 'ov-room-form',
- standalone: true,
- imports: [],
- templateUrl: './room-form.component.html',
- styleUrl: './room-form.component.scss'
+ selector: 'ov-room-form',
+ standalone: true,
+ imports: [MatIconButton, MatTooltip, MatIcon, FormsModule, ReactiveFormsModule, CommonModule, MatButton],
+ templateUrl: './room-form.component.html',
+ styleUrl: './room-form.component.scss'
})
export class RoomFormComponent {
+ roomForm = new FormGroup({
+ roomIdPrefix: new FormControl(this.getRandomName(), [])
+ });
+ constructor(
+ private router: Router,
+ private httpService: HttpService
+ ) {}
+
+ generateRoomId(event: any) {
+ event.preventDefault();
+ this.roomForm.get('roomIdPrefix')?.setValue(this.getRandomName());
+ }
+
+ clearRoomId() {
+ this.roomForm.get('roomIdPrefix')?.setValue('');
+ }
+
+ async goToVideoRoom() {
+ if (!this.roomForm.valid) {
+ console.error('Room name is not valid');
+ return;
+ }
+
+ const roomIdPrefix = this.roomForm.get('roomIdPrefix')?.value!.replace(/ /g, '-');
+
+ try {
+ const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000; // 24h * 60m * 60s * 1000ms
+
+ const options: MeetRoomOptions = {
+ roomIdPrefix,
+ autoDeletionDate: Date.now() + MILLISECONDS_PER_DAY // Expires 1 day from now
+ };
+
+ const room: MeetRoom = await this.httpService.createRoom(options);
+
+ const accessRoomUrl = new URL(room.moderatorRoomUrl);
+ const secret = accessRoomUrl.searchParams.get('secret');
+ const roomUrl = accessRoomUrl.pathname;
+
+ this.router.navigate([roomUrl], { queryParams: { secret } });
+ } catch (error) {
+ console.error('Error creating room ', error);
+ }
+ }
+
+ private getRandomName(): string {
+ const configName: Config = {
+ dictionaries: [colors, animals],
+ separator: '-',
+ style: 'lowerCase'
+ };
+ return uniqueNamesGenerator(configName).replace(/[^\w-]/g, '');
+ }
}