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.