Skip to content

Overview

  • File: lib/views/events_page.dart

The EventsPage is a Flutter widget that displays and manages events in the HVC Mobile application. It provides functionality for viewing, searching, joining, and managing events with infinite scrolling and real-time updates.

Class Structure

Class Definition

dart
class EventsPage extends StatefulWidget {
  static const String routeName = '/EventsPage';
  EventsPage({Key? key}) : super(key: key);

  @override
  _EventsPageState createState() => _EventsPageState();
}

Controllers

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

State Variables

dart
late UserData user;
final TextEditingController searchCtrl = TextEditingController();

Dependencies

Required Packages

  • flutter/material.dart - Core Flutter UI components
  • get/get.dart - State management and routing
  • infinite_scroll_pagination - Infinite scrolling functionality
  • permission_handler - Permission management

Internal Dependencies

  • events_controller.dart - Event management logic
  • real_time_controller.dart - Real-time communication
  • hlk_helpers/ - Custom helper utilities
  • models/ - Data models
  • shared/ - Shared constants and configurations
  • widgets/ - Custom widgets

State Management

Initialization

dart
@override
void initState() {
  super.initState();
  eventsController.reload();
  if (eventsController.events.isEmpty) eventsController.fetchPage(1);
}

Reactive State

dart
Obx(() => eventsController.loadingEvent.value &&
        eventsController.events.isEmpty
    ? const Center(child: CircularProgressIndicator())
    : Column(...))

Event Management

Event Loading

dart
PagedListView<int, HvcEvent>(
  pagingController: eventsController.pagingController,
  builderDelegate: PagedChildBuilderDelegate<HvcEvent>(
    itemBuilder: (BuildContext context, HvcEvent event, int index) => ...
  ),
)

Event Actions

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

  await validatePermission(
    Permission.camera,
    () async => await validatePermission(
      Permission.microphone,
      () async {
        await realTimeController.makeCall(
          callDto,
          null,
          isEventOwner(event),
          false
        );
      }
    )
  );
}
  1. Cancel Event
dart
cancelEvent: () async {
  await eventsController.cancelEvent([event.eventId]);
}
  1. Modify Event
dart
modifyEvent: () async {
  await eventsController.getParticipants(event);
  Get.to(EventFormPage(event: event));
}

UI Components

dart
if (eventsController.showSearchBox.value)
  Padding(
    padding: const EdgeInsets.only(left: 24, right: 12, top: 10),
    child: Row(
      children: [
        Expanded(
          child: TextFormField(
            controller: searchCtrl,
            validator: requiredValidator,
            decoration: getInputDecoration('Search Event', false),
          ),
        ),
        IconButton(
          onPressed: () async {
            setState(() {
              eventsController.showSearchBox.value = false;
              eventsController.name.value = searchCtrl.text;
            });
            await eventsController.reload();
            searchCtrl.clear();
          },
          icon: const Icon(Icons.search),
        ),
      ],
    ),
  )

Event List

dart
PagedListView<int, HvcEvent>(
  pagingController: eventsController.pagingController,
  builderDelegate: PagedChildBuilderDelegate<HvcEvent>(
    itemBuilder: (context, event, index) => EventItem(...),
    noItemsFoundIndicatorBuilder: (context) => NoItemLoader(...),
  ),
)

Event Item

dart
EventItem(
  isOwner: isEventOwner(event),
  event: eventsController.events.elementAt(index),
  handleJoinMeeting: () async => await joinTheMeeting(event),
  onTapHandler: () async {
    await eventsController.getParticipants(event);
    Get.to(EventDetailsPage(
      event: event,
      joinMeeting: () async => await joinTheMeeting(event),
    ));
  },
  // ... other properties
)

Search Functionality

Search Implementation

dart
onPressed: () async {
  setState(() {
    eventsController.showSearchBox.value = false;
    eventsController.name.value = searchCtrl.text;
  });
  await eventsController.reload();
  searchCtrl.clear();
}

Search Box Toggle

dart
if (eventsController.showSearchBox.value)
  // Show search box
else
  // Hide search box

Meeting Management

Permission Handling

dart
await validatePermission(
  Permission.camera,
  () async => await validatePermission(
    Permission.microphone,
    () async {
      await realTimeController.makeCall(...)
    }
  )
)

Meeting Join Process

  1. Get participants
  2. Create call DTO
  3. Validate permissions
  4. Initiate call

Released under the MIT License.