Skip to content

Overview

  • File: lib/views/events_page.dart

The events_page.dart file implements the events management screen of the HVC XR application. It provides functionality for viewing, joining, and managing scheduled events or meetings. The page supports voice command capabilities for RealWear devices and includes features for event filtering and pagination.

Class Structure

dart
class EventsPage extends StatelessWidget {
  static const String routeName = '/EventsPage';

  EventsPage({Key? key}) : super(key: key);

  // Controller declarations
  // Methods
  // Build method
}

Dependencies

dart
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hvc_xr/hlk_helpers/hlk_extension_methods.dart';
import 'package:hvc_xr/main.dart';
import 'package:hvc_xr/models/core_models.dart';
import 'package:hvc_xr/shared/config.dart';
import 'package:permission_handler/permission_handler.dart';
// Additional imports for controllers, models, and widgets

Key Components

Controllers

The page uses several GetX controllers:

dart
final EventsController eventsController = Get.find();
final RealTimeController realTimeController = Get.find();
final DigilensController digilensController = Get.find();

State Management

  • Uses GetX for state management
  • Implements reactive state with RxBool variables
  • Manages event data and pagination

Event Joining Functionality

Join Meeting Method

dart
Future<void> joinTheMeeting(HvcEvent event) async {
  await eventsController.getParticipants(event);
  final callDto = InitCallDto(
    from: user.userId,
    fromName: user.name,
    title: 'Meeting with ${user.name}',
    eventId: event.eventId,
    source: 'Headset',
    platform: Platform.isIOS ? 'iOS' : 'Android',
  );

  await validatePermission(
      Permission.camera,
      () async => await validatePermission(Permission.microphone, () async {
            realTimeController.pageFrom = routeName;
            await realTimeController.makeCall(
                callDto, null, isEventOwner(event), false);
          }));
}

Voice Command Integration

Event Commander

dart
void applyEventCommander(HvcEvent e, int position) {
  logInfo('event position = $position');
  var call = 'join call $position';
  voiceCommandMap.clear();
  voiceCommandMap[call] = () => hvcDebounce(() => joinTheMeeting(e), call);
  voiceCommandMap[getMethodFromCommand(call)] =
      () => hvcDebounce(() => joinTheMeeting(e), getMethodFromCommand(call));

  // by Name session
  var callByName = 'join ${e.title.toLowerCase()}';
  voiceCommandMap[callByName] =
      () => hvcDebounce(() => joinTheMeeting(e), callByName);
  voiceCommandMap[getMethodFromCommand(callByName)] = () =>
      hvcDebounce(() => joinTheMeeting(e), getMethodFromCommand(callByName));

  digilensController.loadPageCommands(routeName);
}

Event Grouping by Date

New Day Detection

dart
bool isNewDay(int index) {
  if (index == 0) return true;
  final curSchedule =
      DateUtils.dateOnly(eventsController.events[index].startDate);
  final prevSchedule =
      DateUtils.dateOnly(eventsController.events[index - 1].startDate);
  return prevSchedule.compareTo(curSchedule) != 0;
}

UI Implementation

Base Page Structure

dart
return HvcBasePage(
  position: 2,
  pageTitle: 'Events',
  pageDescription: 'Select the event to view details',
  showSearchBox: eventsController.showSearchBox,
  // Additional properties and handlers
);

Event List

dart
Obx(
  () => eventsController.events.isNotEmpty
      ? ListView.builder(
          shrinkWrap: true,
          itemCount: eventsController.events.length,
          itemBuilder: (BuildContext context, int index) {
            final event = eventsController.events[index];
            if (isDigiLens) applyEventCommander(event, index + 1);
            final content = EventItem(
              position: index + 1,
              joinByName: () => canStartEvent(event.startDate)
                  ? joinTheMeeting(event)
                  : null,
              event: event,
              onTapHandler: () async {
                if (canStartEvent(event.startDate)) joinTheMeeting(event);
              },
              handleJoinMeeting: canStartEvent(event.startDate)
                  ? () => joinTheMeeting(event)
                  : null,
            );
            return isNewDay(index)
                ? Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Padding(
                        padding: const EdgeInsets.symmetric(
                            horizontal: 10.0, vertical: 2),
                        child:
                            Text(event.startDate.format('EEEE, MMM dd')),
                      ),
                      content,
                    ],
                  )
                : content;
          },
        )
      : Center(
          child: NoItemLoader(
            message: 'No events present',
            onTapHandler: () async =>
                await eventsController.getSchedules(),
          ),
        ),
),

Search Functionality

dart
handleSearch: (String newText) async {
  eventsController.name.value = newText;
  eventsController.page.value = 0;
  await eventsController.getSchedules();
},

Pagination

dart
handleNext: () async {
  eventsController.pageToShow.value = eventsController.page.value;
  eventsController.page.value = eventsController.page.value + 1;
  await eventsController.getSchedules();
},
handlePrevious: () async {
  if (eventsController.page.value > 0) {
    eventsController.pageToShow.value = eventsController.page.value;
    eventsController.page.value = eventsController.page.value - 1;
    await eventsController.getSchedules();
  }
},

Event Timing Validation

The page uses the canStartEvent function to determine if an event can be joined based on its start time. This function is imported from a shared utility file.

Dependencies

  • get: State management
  • permission_handler: Permission management
  • hvc_xr/widgets: Custom widgets
  • hvc_xr/controllers: Application controllers
  • hvc_xr/models: Data models
  • dart:io: Platform detection

Styling

  • Uses HvcBasePage for consistent layout
  • Implements responsive design
  • Uses custom widgets for event items
  • Maintains consistent styling across the application
  • Formats date headers for event grouping

Released under the MIT License.