Fixed Error in Event Creation & Update with latest recurrence changes

**What kind of change does this PR introduce?**

bugfix, feature, refactoring

**Issue Number:**

Fixes #2468

**Did you add tests for your changes?**

Yes

**Snapshots/Videos:**

https://github.com/PalisadoesFoundation/talawa/assets/109027247/7f3718c6-00f2-4bc8-8d23-da7abf868110

**Summary**

- Remove latitude, longitude, recurrance deprecated fields from events and updated query.
- Added support for latest recurrence changes made in https://github.com/PalisadoesFoundation/talawa-api/pull/2234
- Added dynamic recurrence labels in dropdown as well as custom monthly recurrence
- Generated new test_helper_mocks (mockito)
- Update Create event model to remove unused fields.
- Updated test cases & Added docs for modified files.

**Does this PR introduce a breaking change?**

No.

**Other information**

No. of files changed is large as had to make minor changes in unrelated files due to generating new test_helper_mocks via mockito.

**Have you read the [contributing guide](https://github.com/PalisadoesFoundation/talawa/blob/master/CONTRIBUTING.md)?**

Yes

Error in Event Creation & Fetch due to Faulty mutation
**Describe the bug**
User is unable to create event due to faulty and old implementation of `createEvent` mutation. The support for recurrance field was removed from API in https://github.com/PalisadoesFoundation/talawa-api/issues/2107 and there are issuein recurrenceRule used on Talawa Mobile.

Update mutation as per latest https://github.com/PalisadoesFoundation/talawa-api/pull/2234

**Errors in console:**

 - **`GraphQLError(message: Variable "$recurrenceRuleData" got invalid value "TU" at "recurrenceRuleData.weekDays[0]"; Value "TU" does not exist in "WeekDays" enum., locations: null, path: null, extensions: null)`**
 -  **`Field "recurrance" is not defined by type "EventInput"`.**

**To Reproduce**
Steps to reproduce the behavior:

1. Login to a organization.
2. Open Events tab
3. Click on Create Event Button
4. Fill the details and try to create new event
5. Error Dialog is shown on the screen.

**Expected behavior**
On click of create event button, the Event should be created successfully if all details are filled and valid.

**Actual behavior**
On click of create event button, A Error Dialog is shown.

**Screenshots**

https://github.com/PalisadoesFoundation/talawa/assets/109027247/139fa0d8-f512-4d3f-8f2a-89c519dc1673

**Additional details**
Part (pre-requisite) for Event Parity Project.

**Potential internship candidates**
Please read this if you are planning to apply for a Palisadoes Foundation internship https://github.com/PalisadoesFoundation/talawa/issues/359

diff --git a/lang/de.json b/lang/de.json
index 679e807a59..d1e9798204 100644
--- a/lang/de.json
+++ b/lang/de.json
@@ -70,6 +70,8 @@
   "Add Event": "Ereignis hinzufügen",
   "Add": "Anzeige",
   "Add Image": "Bild hinzufügen",
+  "Select Start Date": "Startdatum auswählen",
+  "Select End Date": "Enddatum auswählen",
   "Select Start Date and Time": "Wählen Sie Startdatum und -uhrzeit",
   "Select End Date and Time": "Wählen Sie Enddatum und -uhrzeit",
   "Does not repeat": "Wiederholt sich nicht",
diff --git a/lang/en.json b/lang/en.json
index aa970061d6..a110b9ae4e 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -76,6 +76,8 @@
   "Add Event": "Add Event",
   "Add": "Add",
   "Add Image": "Add Image",
+  "Select Start Date": "Select Start Date",
+  "Select End Date": "Select End Date",
   "Select Start Date and Time": "Select Start Date and Time",
   "Select End Date and Time": "Select End Date and Time",
   "Does not repeat": "Does not repeat",
diff --git a/lang/es.json b/lang/es.json
index df4d6ea1cf..9885c9af3c 100644
--- a/lang/es.json
+++ b/lang/es.json
@@ -73,6 +73,8 @@
   "Add Image": "Añadir imagen",
   "Select Start Date and Time": "Seleccione la fecha y hora de inicio",
   "Select End Date and Time": "Seleccione la fecha y hora de finalización",
+  "Select Start Date": "Seleccionar fecha de inicio",
+  "Select End Date": "Seleccionar fecha de finalización",
   "Does not repeat": "No se repite",
   "Keep Public": "Mantener pública",
   "Keep Registerable": "Mantener registrable",
diff --git a/lang/fr.json b/lang/fr.json
index 9c241bbb17..c6535f724c 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -76,6 +76,8 @@
   "Add Event": "Ajouter un évènement",
   "Add": "Ajoutez-le",
   "Add Image": "Ajouter une image",
+  "Select Start Date": "Sélectionner la date de début",
+  "Select End Date": "Sélectionner la date de fin",
   "Select Start Date and Time": "Sélectionnez la date et l'heure de début",
   "Select End Date and Time": "Sélectionnez la date et l'heure de fin",
   "Does not repeat": "ça ne se répète pas",
diff --git a/lang/hi.json b/lang/hi.json
index 75d702e976..4cc46c1cc4 100644
--- a/lang/hi.json
+++ b/lang/hi.json
@@ -71,6 +71,8 @@
   "Add Event": "कार्यक्रम जोड़ें",
   "Add": "इसे जोड़ें",
   "Add Image": "छवि जोड़ें",
+  "Select Start Date": "शुरूआत की तिथि का चयन करें",
+  "Select End Date": "समाप्ति की तिथि का चयन करें",
   "Select Start Date and Time": "प्रारंभ दिनांक और समय चुनें",
   "Select End Date and Time": "समाप्ति तिथि और समय चुनें",
   "Does not repeat": "यह दोहराता नहीं है",
diff --git a/lang/ja.json b/lang/ja.json
index 7c802fe1e3..75dd81deee 100644
--- a/lang/ja.json
+++ b/lang/ja.json
@@ -71,6 +71,8 @@
   "Add Event": "イベントを追加",
   "Add": "追加",
   "Add Image": "画像を追加",
+  "Select Start Date": "開始日を選択",
+  "Select End Date": "終了日を選択",
   "Select Start Date and Time": "開始日時を選択します",
   "Select End Date and Time": "終了日時を選択します",
   "Does not repeat": "繰り返さない",
diff --git a/lang/pt.json b/lang/pt.json
index f83c80a06b..861139a632 100644
--- a/lang/pt.json
+++ b/lang/pt.json
@@ -71,6 +71,8 @@
   "Add Event": "Adicionar Evento",
   "Add": "Adicionar",
   "Add Image": "Adicionar imagem",
+  "Select Start Date": "Selecionar data de início",
+  "Select End Date": "Selecionar data de término",
   "Select Start Date and Time": "Selecione a data e hora de início",
   "Select End Date and Time": "Selecione a data e hora de término",
   "Does not repeat": "Não repete",
diff --git a/lang/zh.json b/lang/zh.json
index 8d473194c5..68e3dc825a 100644
--- a/lang/zh.json
+++ b/lang/zh.json
@@ -71,6 +71,8 @@
   "Add Event": "添加事件",
   "Add": "添加",
   "Add Image": "添加图片",
+  "Select Start Date": "选择开始日期",
+  "Select End Date": "选择结束日期",
   "Select Start Date and Time": "选择开始日期和时间",
   "Select End Date and Time": "选择结束日期和时间",
   "Does not repeat": "不重复",
diff --git a/lib/constants/recurrence_values.dart b/lib/constants/recurrence_values.dart
index c6393aa06c..ff55d17c75 100644
--- a/lib/constants/recurrence_values.dart
+++ b/lib/constants/recurrence_values.dart
@@ -1,53 +1,279 @@
-/// Class containing constants for recurrence options.
-class Recurrance {
-  /// Constant representing an event that does not repeat.
-  static const once = 'Does not repeat';
+import 'dart:core';
+import 'package:intl/intl.dart';

-  /// Constant representing daily recurrence.
+/// Class containing constants for event intervals.
+class EventIntervals {
+  /// Constant representing an event that occurs every day.
   static const daily = 'day';

-  /// Constant representing weekly recurrence.
+  /// Constant representing an event that occurs every week.
   static const weekly = 'week';

-  /// Constant representing monthly recurrence.
+  /// Constant representing an event that occurs every month.
   static const monthly = 'month';

-  /// Constant representing yearly recurrence.
+  /// Constant representing an event that occurs every year.
   static const yearly = 'year';
+}

-  /// Constant representing a custom recurrence.
-  static const custom = 'custom...';
+/// Class containing constants for event end types.
+class EventEndTypes {
+  /// Constant representing an event that never ends.
+  static const never = 'never';

-  /// Constant representing Monday in weekdays.
-  static const weekdayMonday = 'MO';
+  /// Constant representing an event that ends on a specific date.
+  static const on = 'on';

-  /// Constant representing Tuesday in weekdays.
-  static const weekdayTuesday = 'TU';
+  /// Constant representing an event that ends after a specified number of occurrences.
+  static const after = 'after';
+}
+
+/// Class containing constants for frequency options.
+class Frequency {
+  /// Constant representing an event that occurs every day.
+  static const daily = 'DAILY';
+
+  /// Constant representing an event that occurs every week.
+  static const weekly = 'WEEKLY';

-  /// Constant representing Wednesday in weekdays.
-  static const weekdayWednesday = 'WE';
+  /// Constant representing an event that occurs every month.
+  static const monthly = 'MONTHLY';
+
+  /// Constant representing an event that occurs every year.
+  static const yearly = 'YEARLY';
+}

-  /// Constant representing Thursday in weekdays.
-  static const weekdayThursday = 'TH';
+/// Class containing constants for week days.
+class WeekDays {
+  /// Constant representing Sunday.
+  static const sunday = 'SUNDAY';

-  /// Constant representing Friday in weekdays.
-  static const weekdayFriday = 'FR';
+  /// Constant representing Monday.
+  static const monday = 'MONDAY';

-  /// Constant representing Saturday in weekdays.
-  static const weekdaySaturday = 'SA';
+  /// Constant representing Tuesday.
+  static const tuesday = 'TUESDAY';

-  /// Constant representing Sunday in weekdays.
-  static const weekdaySunday = 'SU';
+  /// Constant representing Wednesday.
+  static const wednesday = 'WEDNESDAY';
+
+  /// Constant representing Thursday.
+  static const thursday = 'THURSDAY';
+
+  /// Constant representing Friday.
+  static const friday = 'FRIDAY';
+
+  /// Constant representing Saturday.
+  static const saturday = 'SATURDAY';
 }

-/// Class containing constants for event end types.
-class EventEndTypes {
-  /// Constant representing an event that never ends.
-  static const never = 'Never';
+/// Class containing constants for recurrence end types.
+class RecurringEventMutationType {
+  /// Constant representing mutation of current instance only.
+  static const thisInstance = 'ThisInstance';

-  /// Constant representing an event that ends on a specific date.
-  static const on = 'On';
+  /// constant representing mutation of current and following instances.
+  static const thisAndFollowingInstances = 'ThisAndFollowingInstances';

-  /// Constant representing an event that ends after a specified number of occurrences.
-  static const after = 'After';
+  /// constant representing mutation of all instances.
+  static const allInstances = 'AllInstances';
+}
+
+/// represents all the days in a week.
+List<String> days = [
+  WeekDays.monday,
+  WeekDays.tuesday,
+  WeekDays.wednesday,
+  WeekDays.thursday,
+  WeekDays.friday,
+  WeekDays.saturday,
+  WeekDays.sunday,
+];
+
+/// conatins all neccessary utils.
+class RecurrenceUtils {
+  /// represents all the months.
+  static const List<String> monthNames = [
+    'January',
+    'February',
+    'March',
+    'April',
+    'May',
+    'June',
+    'July',
+    'August',
+    'September',
+    'October',
+    'November',
+    'December',
+  ];
+
+  /// represents all the week day occurences.
+  static const List<String> weekDayOccurences = [
+    'First',
+    'Second',
+    'Third',
+    'Fourth',
+    'Last',
+  ];
+
+  /// represents all the week days.
+  static const List<String> weekDays = [
+    'Monday',
+    'Tuesday',
+    'Wednesday',
+    'Thursday',
+    'Friday',
+    'Saturday',
+    'Sunday',
+  ];
+
+  /// 'getRecurrenceRuleText' return text for various recurrence rules.
+  ///
+  /// **params**:
+  /// * `frequency`: Frequency of the event.
+  /// * `weekDays`: List of week days.
+  /// * `interval`: Interval of the event.
+  /// * `count`: Count of the event.
+  /// * `weekDayOccurenceInMonth`: Week day occurence in month.
+  /// * `startDate`: Start date of the event.
+  /// * `endDate`: End date of the event.
+  ///
+  /// **returns**:
+  /// * `String`: Recurrence rule text.
+  static String getRecurrenceRuleText(
+    String frequency,
+    Set<String>? weekDays,
+    int? interval,
+    int? count,
+    int? weekDayOccurenceInMonth,
+    DateTime startDate,
+    DateTime? endDate,
+  ) {
+    String recurrenceRuleText = '';
+
+    switch (frequency) {
+      case Frequency.daily:
+        if (interval != null && interval > 1) {
+          recurrenceRuleText = 'Every $interval days';
+        } else {
+          recurrenceRuleText = 'Daily';
+        }
+        break;
+      case Frequency.weekly:
+        if (weekDays == null) {
+          break;
+        }
+        if (interval != null && interval > 1) {
+          recurrenceRuleText = 'Every $interval weeks on ';
+        } else {
+          recurrenceRuleText = 'Weekly on ';
+        }
+        recurrenceRuleText += getWeekDaysString(weekDays.toList());
+        break;
+      case Frequency.monthly:
+        if (interval != null && interval > 1) {
+          recurrenceRuleText = 'Every $interval months on ';
+        } else {
+          recurrenceRuleText = 'Monthly on ';
+        }
+
+        if (weekDayOccurenceInMonth != null) {
+          final getOccurence =
+              weekDayOccurenceInMonth != -1 ? weekDayOccurenceInMonth - 1 : 4;
+          recurrenceRuleText +=
+              '${weekDayOccurences[getOccurence]} ${RecurrenceUtils.weekDays[startDate.weekday - 1]}';
+        } else {
+          recurrenceRuleText += 'Day ${startDate.day}';
+        }
+        break;
+      case Frequency.yearly:
+        if (interval != null && interval > 1) {
+          recurrenceRuleText = 'Every $interval years on ';
+        } else {
+          recurrenceRuleText = 'Annually on ';
+        }
+        recurrenceRuleText +=
+            '${monthNames[startDate.month - 1]} ${startDate.day}';
+        break;
+    }
+
+    if (endDate != null) {
+      final formatter = DateFormat('MMMM dd, yyyy');
+      recurrenceRuleText += ', until ${formatter.format(endDate)}';
+    }
+
+    if (count != null) {
+      recurrenceRuleText += ', $count ${count > 1 ? 'times' : 'time'}';
+    }
+
+    return recurrenceRuleText;
+  }
+
+  /// 'getWeekDaysString' returns string for weekDays.
+  ///
+  /// **params**:
+  /// * `weekDays`: List of Weekdays
+  ///
+  /// **returns**:
+  /// * `String`: returns string for weekDays.
+  static String getWeekDaysString(List<String> weekDays) {
+    final fullDayNames = weekDays
+        .map((day) => RecurrenceUtils.weekDays[weekDays.indexOf(day)])
+        .toList();
+
+    String weekDaysString = fullDayNames.join(', ');
+
+    final lastCommaIndex = weekDaysString.lastIndexOf(',');
+    if (lastCommaIndex != -1) {
+      weekDaysString =
+          '${weekDaysString.substring(0, lastCommaIndex)} &${weekDaysString.substring(lastCommaIndex + 1)}';
+    }
+
+    return weekDaysString;
+  }
+
+  /// 'getWeekDayOccurenceInMonth' returns the week day occurence in month.
+  ///
+  /// **params**:
+  /// * `date`: Date of the event.
+  ///
+  /// **returns**:
+  /// * `int`: Week day occurence in month.
+  static int getWeekDayOccurenceInMonth(DateTime date) {
+    final dayOfMonth = date.day;
+
+    // Calculate the current occurrence
+    final occurrence = (dayOfMonth / 7).ceil();
+
+    return occurrence;
+  }
+
+  /// Function to check whether cuurent event instance is Last occurence of Week Day.
+  ///
+  /// **params**:
+  /// * `date`: Date of the event.
+  ///
+  /// **returns**:
+  /// * `bool`: Returns true if the current event instance is the last occurence of the week day.
+  static bool isLastOccurenceOfWeekDay(DateTime date) {
+    final currentDay = date.weekday;
+
+    DateTime lastOccurenceInMonth = DateTime(
+      date.year,
+      date.month + 1,
+      0,
+    );
+
+    // set the lastOccurenceInMonth to that day's last occurence
+    while (lastOccurenceInMonth.weekday != currentDay) {
+      lastOccurenceInMonth = DateTime(
+        lastOccurenceInMonth.year,
+        lastOccurenceInMonth.month,
+        lastOccurenceInMonth.day - 1,
+      );
+    }
+
+    return date.day == lastOccurenceInMonth.day;
+  }
 }
diff --git a/lib/models/chats/chat_list_tile_data_model.g.dart b/lib/models/chats/chat_list_tile_data_model.g.dart
index b7d137027e..200e515497 100644
--- a/lib/models/chats/chat_list_tile_data_model.g.dart
+++ b/lib/models/chats/chat_list_tile_data_model.g.dart
@@ -1,6 +1,3 @@
-// ignore_for_file: talawa_api_doc
-// ignore_for_file: talawa_good_doc_comments
-
 // GENERATED CODE - DO NOT MODIFY BY HAND

 part of 'chat_list_tile_data_model.dart';
@@ -16,7 +13,7 @@ ChatListTileDataModel _$ChatListTileDataModelFromJson(
       (json['users'] as List<dynamic>?)
           ?.map((e) => ChatUser.fromJson(e as Map<String, dynamic>))
           .toList(),
-      json['_id'] as String?,
+      json['id'] as String?,
     );

 Map<String, dynamic> _$ChatListTileDataModelToJson(
@@ -24,5 +21,5 @@ Map<String, dynamic> _$ChatListTileDataModelToJson(
 ) =>
     <String, dynamic>{
       'users': instance.users,
-      '_id': instance.id,
+      'id': instance.id,
     };
diff --git a/lib/models/chats/chat_message.g.dart b/lib/models/chats/chat_message.g.dart
index 4ac1f34564..24dedabc9b 100644
--- a/lib/models/chats/chat_message.g.dart
+++ b/lib/models/chats/chat_message.g.dart
@@ -1,6 +1,3 @@
-// ignore_for_file: talawa_api_doc
-// ignore_for_file: talawa_good_doc_comments
-
 // GENERATED CODE - DO NOT MODIFY BY HAND

 part of 'chat_message.dart';
@@ -10,7 +7,7 @@ part of 'chat_message.dart';
 // **************************************************************************

 ChatMessage _$ChatMessageFromJson(Map<String, dynamic> json) => ChatMessage(
-      json['_id'] as String?,
+      json['id'] as String?,
       json['sender'] == null
           ? null
           : ChatUser.fromJson(json['sender'] as Map<String, dynamic>),
@@ -22,7 +19,7 @@ ChatMessage _$ChatMessageFromJson(Map<String, dynamic> json) => ChatMessage(

 Map<String, dynamic> _$ChatMessageToJson(ChatMessage instance) =>
     <String, dynamic>{
-      '_id': instance.id,
+      'id': instance.id,
       'sender': instance.sender?.toJson(),
       'receiver': instance.receiver?.toJson(),
       'messageContent': instance.messageContent,
diff --git a/lib/models/chats/chat_user.g.dart b/lib/models/chats/chat_user.g.dart
index 421737da7e..beeef4f36e 100644
--- a/lib/models/chats/chat_user.g.dart
+++ b/lib/models/chats/chat_user.g.dart
@@ -1,6 +1,3 @@
-// ignore_for_file: talawa_api_doc
-// ignore_for_file: talawa_good_doc_comments
-
 // GENERATED CODE - DO NOT MODIFY BY HAND

 part of 'chat_user.dart';
@@ -11,12 +8,12 @@ part of 'chat_user.dart';

 ChatUser _$ChatUserFromJson(Map<String, dynamic> json) => ChatUser(
       firstName: json['firstName'] as String?,
-      id: json['_id'] as String?,
+      id: json['id'] as String?,
       image: json['image'] as String?,
     );

 Map<String, dynamic> _$ChatUserToJson(ChatUser instance) => <String, dynamic>{
       'firstName': instance.firstName,
-      '_id': instance.id,
+      'id': instance.id,
       'image': instance.image,
     };
diff --git a/lib/models/events/event_model.dart b/lib/models/events/event_model.dart
index 4c4bbb727d..a15db5925c 100644
--- a/lib/models/events/event_model.dart
+++ b/lib/models/events/event_model.dart
@@ -9,15 +9,12 @@ class Event {
     this.description,
     this.attendees,
     this.location,
-    this.latitude,
-    this.longitude,
     this.recurring,
     this.allDay,
     this.startDate,
     this.endDate,
     this.startTime,
     this.endTime,
-    this.recurrence,
     this.isPublic,
     this.isRegistered,
     this.isRegisterable,
@@ -34,15 +31,12 @@ class Event {
       title: json['title'] as String?,
       description: json['description'] as String?,
       location: json['location'] as String?,
-      longitude: json['longitude'] as double?,
-      latitude: json['latitude'] as double?,
       recurring: json['recurring'] as bool?,
       allDay: json['allDay'] as bool?,
       startDate: json['startDate'] as String?,
       endDate: json['endDate'] as String?,
       startTime: json['startTime'] as String?,
       endTime: json['endTime'] as String?,
-      recurrence: json['recurrence'] as String?,
       isPublic: json['isPublic'] as bool?,
       isRegistered: json['isRegistered'] as bool?,
       isRegisterable: json['isRegisterable'] as bool?,
@@ -84,12 +78,6 @@ class Event {
   /// The location of the event.
   String? location;

-  /// The latitude of the event.
-  double? latitude;
-
-  /// The longitude of the event.
-  double? longitude;
-
   /// A boolean value that indicates if the event is recurring.
   bool? recurring;

@@ -108,9 +96,6 @@ class Event {
   /// The end time of the event.
   String? endTime;

-  /// The recurrence of the event.
-  String? recurrence;
-
   /// A boolean value that indicates if the event is public.
   bool? isPublic;

diff --git a/lib/models/user/user_info.g.dart b/lib/models/user/user_info.g.dart
index 7059bec4c8..3b89a5ff1d 100644
--- a/lib/models/user/user_info.g.dart
+++ b/lib/models/user/user_info.g.dart
@@ -1,6 +1,3 @@
-// ignore_for_file: talawa_api_doc
-// ignore_for_file: talawa_good_doc_comments
-
 // GENERATED CODE - DO NOT MODIFY BY HAND

 part of 'user_info.dart';
diff --git a/lib/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart b/lib/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart
index 3baf49052d..dd2ec28dd7 100644
--- a/lib/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart
+++ b/lib/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart
@@ -41,7 +41,8 @@ class CreateEventViewModel extends BaseModel {
       TextEditingController(text: '1');

   /// Event ends After n occurences controller.
-  TextEditingController endOccurenceController = TextEditingController();
+  TextEditingController endOccurenceController =
+      TextEditingController(text: '1');

   /// Event Start Time.
   TimeOfDay eventStartTime = TimeOfDay.now();
@@ -56,7 +57,13 @@ class CreateEventViewModel extends BaseModel {
   DateTime eventStartDate = DateTime.now();

   /// Event End Date.
-  DateTime? eventEndDate = DateTime.now();
+  DateTime eventEndDate = DateTime.now();
+
+  /// Event Start Date for recurrence.
+  DateTime recurrenceStartDate = DateTime.now();
+
+  /// Event End Date for recurrence.
+  DateTime? recurrenceEndDate;

   /// Public Event or Not.
   bool isPublicSwitch = true;
@@ -73,38 +80,37 @@ class CreateEventViewModel extends BaseModel {
   /// DescriptionFocus FocusNode.
   FocusNode descriptionFocus = FocusNode();

-  /// Latitude store.
-  double? latitude;
-
-  /// Longitude store.
-  double? longitude;
-
   /// is an allday event.
   bool isAllDay = true;

   /// Is a recurring event.
   bool isRecurring = false;

-  /// recurrence count.
-  int recurranceCount = 1;
+  /// RecurrenceRuleData frequency.
+  String recurrenceInterval = EventIntervals.weekly;
+
+  /// Event end type.
+  String eventEndType = EventEndTypes.never;

-  /// recurrence.
-  String? recurrance;
+  /// represents the frequency of the event.
+  String frequency = Frequency.weekly;

-  /// RecurranceRuleData frequency.
-  String recurranceFrequency = Recurrance.weekly;
+  /// represents the week days of the event.
+  Set<String> weekDays = {
+    days[DateTime.now().weekday - 1],
+  };

-  /// Monthly recurrence.
-  String monthlyRecurrence = 'Monthly on day 3';
+  /// represents the interval of the event.
+  int interval = 1;

-  /// weekdays.
-  Set<String> weekdays = {Recurrance.weekdayTuesday};
+  /// represents the count of the event.
+  int? count;

-  /// Event end type.
-  String eventEndType = EventEndTypes.never;
+  /// represents the week day occurence in Month.
+  int? weekDayOccurenceInMonth;

-  /// Custom recurrance event end date.
-  DateTime? eventEndOnEndDate = DateTime.now();
+  /// represents the recurrence label.
+  String recurrenceLabel = 'Does not repeat';

   //late OrganizationService _organizationService;
   late final Map<String, bool> _memberCheckedMap = {};
@@ -193,41 +199,47 @@ class CreateEventViewModel extends BaseModel {
         eventStartTime.minute,
       );
       final DateTime endTime = DateTime(
-        eventEndDate?.year ?? DateTime.now().year,
-        eventEndDate?.month ?? DateTime.now().month,
-        eventEndDate?.day ?? DateTime.now().day,
+        eventEndDate.year,
+        eventEndDate.month,
+        eventEndDate.day,
         eventEndTime.hour,
         eventEndTime.minute,
       );
-
-      final String? frequency = getRecurrance(recurranceFrequency);
-
       // all required data for creating an event
       final Map<String, dynamic> variables = {
         "data": {
-          'startDate': DateFormat('yyyy-MM-dd').format(eventStartDate),
-          if (eventEndDate != null)
-            'endDate': DateFormat('yyyy-MM-dd').format(eventEndDate!),
-          'organizationId': _currentOrg.id,
           'title': eventTitleTextController.text,
           'description': eventDescriptionTextController.text,
           'location': eventLocationTextController.text,
           'isPublic': isPublicSwitch,
           'isRegisterable': isRegisterableSwitch,
           'recurring': isRecurring,
-          'recurrance': recurrance ?? frequency,
           'allDay': isAllDay,
-          'startTime': '${DateFormat('HH:mm:ss').format(startTime)}Z',
-          if (eventEndDate != null)
-            'endTime': '${DateFormat('HH:mm:ss').format(endTime)}Z',
-          if (latitude != null) 'latitude': latitude,
-          if (longitude != null) 'longitude': longitude,
+          'organizationId': _currentOrg.id,
+          'startDate': DateFormat('yyyy-MM-dd').format(eventStartDate),
+          'endDate': DateFormat('yyyy-MM-dd').format(eventEndDate),
+          'startTime':
+              isAllDay ? null : '${DateFormat('HH:mm:ss').format(startTime)}Z',
+          'endTime':
+              isAllDay ? null : '${DateFormat('HH:mm:ss').format(endTime)}Z',
         },
-        if (recurrance == null)
+        if (isRecurring)
           'recurrenceRuleData': {
-            if (eventEndType != EventEndTypes.never) 'count': recurranceCount,
+            'recurrenceStartDate': DateFormat('yyyy-MM-dd').format(
+              recurrenceStartDate,
+            ),
+            'recurrenceEndDate': recurrenceEndDate != null
+                ? DateFormat('yyyy-MM-dd').format(recurrenceEndDate!)
+                : null,
             'frequency': frequency,
-            if (frequency == 'WEEKLY') 'weekDays': List.from(weekdays),
+            'weekDays': (frequency == Frequency.weekly ||
+                    (frequency == Frequency.monthly &&
+                        weekDayOccurenceInMonth != null))
+                ? weekDays.toList()
+                : null,
+            'interval': interval,
+            'count': count,
+            'weekDayOccurenceInMonth': weekDayOccurenceInMonth,
           },
       };

@@ -240,11 +252,9 @@ class CreateEventViewModel extends BaseModel {
         EventQueries().addEvent(),
         variables: variables,
       );
-      print(result);
       navigationService.pop();
       if (result != null) {
         navigationService.pop();
-
         await _eventService.getEvents();
       }
     }
@@ -343,33 +353,8 @@ class CreateEventViewModel extends BaseModel {
   ///
   /// **returns**:
   ///   None
-  void setEventEndDate(DateTime? selectedEndDate) {
+  void setEventEndDate(DateTime selectedEndDate) {
     eventEndDate = selectedEndDate;
     notifyListeners();
   }
-
-  /// Returns corresponding recurrence value based on frequency.
-  ///
-  /// **params**:
-  /// * `frequency`: Recurrence frequency selected by user.
-  ///
-  /// **returns**:
-  /// * `String?`: Recurrence value.
-  String? getRecurrance(String frequency) {
-    isRecurring = true;
-    if (frequency == Recurrance.daily || frequency == 'Every day') {
-      return 'DAILY';
-    } else if (frequency == Recurrance.weekly || frequency == 'Every week') {
-      return 'WEEKLY';
-    } else if (frequency == Recurrance.monthly || frequency == 'Every month') {
-      return 'MONTHLY';
-    } else if (frequency == Recurrance.yearly || frequency == 'Every year') {
-      return 'YEARLY';
-    } else if (frequency == Recurrance.once) {
-      isRecurring = false;
-      return null;
-    } else {
-      return null;
-    }
-  }
 }
diff --git a/lib/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart b/lib/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart
index 4740452f6a..7b792d7be0 100644
--- a/lib/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart
+++ b/lib/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart
@@ -1,6 +1,4 @@
 import 'dart:async';
-
-import 'package:intl/intl.dart';
 import 'package:talawa/enums/enums.dart';
 import 'package:talawa/locator.dart';
 import 'package:talawa/models/events/event_model.dart';
@@ -117,7 +115,7 @@ class ExploreEventsViewModel extends BaseModel {
     if (!_uniqueEventIds.contains(newEvent.id) &&
         newEvent.organization!.id == userConfig.currentOrg.id) {
       _uniqueEventIds.add(newEvent.id!);
-      _parseEventDateTime(newEvent);
+      _events.insert(0, newEvent);
     }
     if (!_userEvents.any((event) => event.id == newEvent.id) &&
         newEvent.creator!.id == userConfig.currentUser.id) {
@@ -126,43 +124,6 @@ class ExploreEventsViewModel extends BaseModel {
     notifyListeners();
   }

-  /// The helper function that used to parse the date and time.
-  ///
-  /// **params**:
-  /// * `newEvent`: `Event` type variable containing data to create a new event.
-  ///
-  /// **returns**:
-  ///   None
-  void _parseEventDateTime(Event newEvent) {
-    // Maybe needed for the tests. Can be further discussed.
-    if (newEvent.startDate == null ||
-        newEvent.endDate == null ||
-        newEvent.startTime == null ||
-        newEvent.endTime == null) {
-      newEvent.startDate = DateFormat('yyyy-MM-dd').format(DateTime.now());
-      newEvent.endDate = DateFormat('yyyy-MM-dd').format(DateTime.now());
-      newEvent.startTime = DateFormat('HH:mm:ss').format(DateTime.now());
-      newEvent.endTime = DateFormat('HH:mm:ss').format(DateTime.now());
-    }
-
-    if (RegExp(r'^\d{4}-\d{2}-\d{2}$').hasMatch(newEvent.startDate!) &&
-        RegExp(r'^\d{2}:\d{2}:\d{2}.\d{3}Z$').hasMatch(newEvent.startTime!) &&
-        RegExp(r'^\d{4}-\d{2}-\d{2}$').hasMatch(newEvent.endDate!) &&
-        RegExp(r'^\d{2}:\d{2}:\d{2}.\d{3}Z$').hasMatch(newEvent.endTime!)) {
-      final startMoment =
-          DateTime.parse('${newEvent.startDate} ${newEvent.startTime}')
-              .toLocal();
-      final endMoment =
-          DateTime.parse('${newEvent.endDate} ${newEvent.endTime}').toLocal();
-
-      newEvent.startDate = DateFormat('yMd').format(startMoment);
-      newEvent.endDate = DateFormat('yMd').format(endMoment);
-      newEvent.startTime = DateFormat('h:mm a').format(startMoment);
-      newEvent.endTime = DateFormat('h:mm a').format(endMoment);
-    }
-    _events.insert(0, newEvent);
-  }
-
   /// This function deletes the event.
   ///
   /// **params**:
@@ -184,7 +145,6 @@ class ExploreEventsViewModel extends BaseModel {
               if (result != null) {
                 navigationService.pop();
                 setState(ViewState.busy);
-                print(result);
                 _uniqueEventIds.remove(eventId);
                 _events.removeWhere((element) => element.id == eventId);
                 _userEvents.removeWhere((element) => element.id == eventId);
diff --git a/lib/views/after_auth_screens/events/create_custom_recurring_event.dart b/lib/views/after_auth_screens/events/create_custom_recurring_event.dart
index 5edd07ab20..0667482d91 100644
--- a/lib/views/after_auth_screens/events/create_custom_recurring_event.dart
+++ b/lib/views/after_auth_screens/events/create_custom_recurring_event.dart
@@ -26,8 +26,13 @@ class _CustomRecurrencePageState extends State<CustomRecurrencePage> {
   late CreateEventViewModel viewModel;

   @override
-  Widget build(BuildContext context) {
+  void initState() {
+    super.initState();
     viewModel = widget.model;
+  }
+
+  @override
+  Widget build(BuildContext context) {
     return Scaffold(
       appBar: AppBar(
         backgroundColor: Theme.of(context).primaryColor,
@@ -43,14 +48,26 @@ class _CustomRecurrencePageState extends State<CustomRecurrencePage> {
         actions: [
           TextButton(
             onPressed: () {
-              if (viewModel.eventEndType == EventEndTypes.never) {
-                viewModel.setEventEndDate(null);
-              } else if (viewModel.eventEndType == EventEndTypes.on) {
-                viewModel.eventEndDate = viewModel.eventEndOnEndDate;
-              } else if (viewModel.eventEndType == EventEndTypes.after) {
-                viewModel.recurranceCount =
-                    int.parse(viewModel.endOccurenceController.text);
-              }
+              setState(() {
+                if (viewModel.eventEndType == EventEndTypes.never) {
+                  viewModel.recurrenceEndDate = null;
+                } else if (viewModel.eventEndType == EventEndTypes.after) {
+                  viewModel.count =
+                      int.parse(viewModel.endOccurenceController.text);
+                }
+                viewModel.interval =
+                    int.parse(viewModel.repeatsEveryCountController.text);
+                viewModel.recurrenceLabel =
+                    RecurrenceUtils.getRecurrenceRuleText(
+                  viewModel.frequency,
+                  viewModel.weekDays,
+                  viewModel.interval,
+                  viewModel.count,
+                  viewModel.weekDayOccurenceInMonth,
+                  viewModel.recurrenceStartDate,
+                  viewModel.recurrenceEndDate,
+                );
+              });
               navigationService.pop();
             },
             child: Text(AppLocalizations.of(context)!.strictTranslate('Done')),
@@ -72,6 +89,43 @@ class _CustomRecurrencePageState extends State<CustomRecurrencePage> {
   /// **returns**:
   /// * `Column`: Column of recurrence options widgets.
   Column _buildRecurrenceOptions(BuildContext context) {
+    final List<String> monthlyOptions = [
+      RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.monthly,
+        null,
+        int.parse(viewModel.repeatsEveryCountController.text),
+        int.parse(viewModel.endOccurenceController.text),
+        null,
+        viewModel.recurrenceStartDate,
+        viewModel.recurrenceEndDate,
+      ),
+      RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.monthly,
+        {
+          RecurrenceUtils
+              .weekDays[widget.model.recurrenceStartDate.weekday - 1],
+        },
+        int.parse(viewModel.repeatsEveryCountController.text),
+        int.parse(viewModel.endOccurenceController.text),
+        RecurrenceUtils.getWeekDayOccurenceInMonth(
+          widget.model.recurrenceStartDate,
+        ),
+        viewModel.recurrenceStartDate,
+        viewModel.recurrenceEndDate,
+      ),
+      RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.monthly,
+        {
+          RecurrenceUtils
+              .weekDays[widget.model.recurrenceStartDate.weekday - 1],
+        },
+        int.parse(viewModel.repeatsEveryCountController.text),
+        int.parse(viewModel.endOccurenceController.text),
+        -1,
+        viewModel.recurrenceStartDate,
+        viewModel.recurrenceEndDate,
+      ),
+    ];
     return Column(
       crossAxisAlignment: CrossAxisAlignment.start,
       children: [
@@ -85,11 +139,12 @@ class _CustomRecurrencePageState extends State<CustomRecurrencePage> {
             ],
           ),
         ),
-        recurrenceisDailyorYearly()
-            ? buildCustomDivider(context)
+        (viewModel.recurrenceInterval == EventIntervals.daily ||
+                viewModel.recurrenceInterval == EventIntervals.yearly)
+            ? Divider(color: Theme.of(context).hintColor)
             : Column(
                 children: [
-                  buildCustomDivider(context),
+                  Divider(color: Theme.of(context).hintColor),
                   Container(
                     padding: EdgeInsets.fromLTRB(
                       _sectionPadding,
@@ -97,19 +152,57 @@ class _CustomRecurrencePageState extends State<CustomRecurrencePage> {
                       90,
                       _sectionPadding,
                     ),
-                    child: viewModel.recurranceFrequency == Recurrance.monthly
+                    child: viewModel.recurrenceInterval ==
+                            EventIntervals.monthly
                         ? Row(
                             children: [
                               RecurrenceFrequencyDropdown(
                                 model: viewModel,
                                 options: [
-                                  'Monthly on day 3',
-                                  'Monthly on the first Sunday',
+                                  monthlyOptions[0],
+                                  if (RecurrenceUtils
+                                          .getWeekDayOccurenceInMonth(
+                                        widget.model.recurrenceStartDate,
+                                      ) !=
+                                      5)
+                                    monthlyOptions[1],
+                                  if (RecurrenceUtils.isLastOccurenceOfWeekDay(
+                                    widget.model.recurrenceStartDate,
+                                  ))
+                                    monthlyOptions[2],
                                 ],
-                                selectedOption: viewModel.monthlyRecurrence,
+                                selectedOption: monthlyOptions[0],
                                 onSelected: (String value) {
+                                  Set<String> tempWeekDays;
+                                  int? tempWeekDayOccurenceInMonth;
+                                  if (value == monthlyOptions[0]) {
+                                    tempWeekDays = {};
+                                    tempWeekDayOccurenceInMonth = null;
+                                  } else if (value == monthlyOptions[1]) {
+                                    tempWeekDays = {
+                                      RecurrenceUtils.weekDays[widget.model
+                                              .recurrenceStartDate.weekday -
+                                          1],
+                                    };
+                                    tempWeekDayOccurenceInMonth =
+                                        RecurrenceUtils
+                                            .getWeekDayOccurenceInMonth(
+                                      widget.model.recurrenceStartDate,
+                                    );
+                                  } else {
+                                    tempWeekDays = {
+                                      RecurrenceUtils.weekDays[widget.model
+                                              .recurrenceStartDate.weekday -
+                                          1],
+                                    };
+                                    tempWeekDayOccurenceInMonth = -1;
+                                  }
                                   setState(() {
-                                    viewModel.monthlyRecurrence = value;
+                                    viewModel.frequency = Frequency.monthly;
+                                    viewModel.recurrenceLabel = value;
+                                    viewModel.weekDays = tempWeekDays;
+                                    viewModel.weekDayOccurenceInMonth =
+                                        tempWeekDayOccurenceInMonth;
                                   });
                                 },
                               ),
@@ -125,7 +218,7 @@ class _CustomRecurrencePageState extends State<CustomRecurrencePage> {
                             ],
                           ),
                   ),
-                  buildCustomDivider(context),
+                  Divider(color: Theme.of(context).hintColor),
                 ],
               ),
         Column(
@@ -136,9 +229,7 @@ class _CustomRecurrencePageState extends State<CustomRecurrencePage> {
                   EdgeInsets.only(top: _sectionPadding, left: _sectionPadding),
               child: inputFieldHeading('Ends'),
             ),
-            EventEndOptions(
-              model: viewModel,
-            ),
+            EventEndOptions(model: viewModel),
           ],
         ),
       ],
@@ -169,16 +260,27 @@ class _CustomRecurrencePageState extends State<CustomRecurrencePage> {
         RecurrenceFrequencyDropdown(
           model: viewModel,
           options: [
-            Recurrance.daily,
-            Recurrance.weekly,
-            Recurrance.monthly,
-            Recurrance.yearly,
+            EventIntervals.daily,
+            EventIntervals.weekly,
+            EventIntervals.monthly,
+            EventIntervals.yearly,
           ],
-          selectedOption: viewModel.recurranceFrequency,
+          selectedOption: viewModel.recurrenceInterval,
           onSelected: (String value) {
-            setState(() {
-              viewModel.recurranceFrequency = value;
-            });
+            switch (value) {
+              case EventIntervals.daily:
+                updateModel(Frequency.daily, value, null, null);
+                break;
+              case EventIntervals.weekly:
+                updateModel(Frequency.weekly, value, null, null);
+                break;
+              case EventIntervals.monthly:
+                updateModel(Frequency.monthly, value, null, null);
+                break;
+              case EventIntervals.yearly:
+                updateModel(Frequency.yearly, value, null, null);
+                break;
+            }
           },
         ),
       ],
@@ -204,29 +306,27 @@ class _CustomRecurrencePageState extends State<CustomRecurrencePage> {
         ),
       );

-  /// Divider with custom properties.
+  /// Returns the updated model with the selected recurrence options.
   ///
   /// **params**:
-  /// * `context`: BuildContext of the widget.
+  /// * `frequency`: represent the frequency of the event.
+  /// * `value`: represent the interval of the event.
+  /// * `weekDayOccurenceInMonth`: represent the week day occurence in month.
+  /// * `weekDays`: represent the list of week days.
   ///
   /// **returns**:
-  /// * `Divider`: Custom divider.
-  Divider buildCustomDivider(BuildContext context) {
-    return Divider(
-      color: Theme.of(context).hintColor,
-    );
-  }
-
-  /// Determines whether the recurrence frequency is daily or yearly.
-  ///
-  /// **params**:
   ///   None
-  ///
-  /// **returns**:
-  /// * `bool`: A boolean value indicating whether the recurrence frequency is daily or yearly.
-  bool recurrenceisDailyorYearly() {
-    final widgetModel = viewModel;
-    return widgetModel.recurranceFrequency == Recurrance.daily ||
-        widgetModel.recurranceFrequency == Recurrance.yearly;
+  void updateModel(
+    String frequency,
+    String value,
+    int? weekDayOccurenceInMonth,
+    Set<String>? weekDays,
+  ) {
+    setState(() {
+      widget.model.frequency = frequency;
+      widget.model.recurrenceInterval = value;
+      widget.model.weekDayOccurenceInMonth = weekDayOccurenceInMonth;
+      widget.model.weekDays = weekDays ?? {};
+    });
   }
 }
diff --git a/lib/views/after_auth_screens/events/create_event_page.dart b/lib/views/after_auth_screens/events/create_event_page.dart
index ba5f2a770f..99cd94457d 100644
--- a/lib/views/after_auth_screens/events/create_event_page.dart
+++ b/lib/views/after_auth_screens/events/create_event_page.dart
@@ -26,8 +26,6 @@ class CreateEventPage extends StatefulWidget {

 /// _CreateEventPageState returns a widget for a Page to Creatxe the Event in the Organization.
 class _CreateEventPageState extends State<CreateEventPage> {
-  /// Recurrence label of recurrence selection button.
-  String recurrenceLabel = Recurrance.once;
   @override
   Widget build(BuildContext context) {
     final TextStyle subtitleTextStyle =
@@ -36,7 +34,6 @@ class _CreateEventPageState extends State<CreateEventPage> {
     return BaseView<CreateEventViewModel>(
       onModelReady: (model) => model.initialize(),
       builder: (context, model, child) {
-        print(model.recurrance);
         return Scaffold(
           // AppBar is the header of the page
           appBar: AppBar(
@@ -44,14 +41,10 @@ class _CreateEventPageState extends State<CreateEventPage> {
             elevation: 1,
             centerTitle: true,
             leading: GestureDetector(
-              onTap: () {
-                // ignore: undefined_method
-                navigationServiceLocal.pop();
-              },
+              onTap: () => navigationServiceLocal.pop(),
               child: const Icon(Icons.close),
             ),
             title: Text(
-              // text translation to the app language.
               AppLocalizations.of(context)!.strictTranslate('Add Event'),
               style: Theme.of(context).textTheme.titleLarge!.copyWith(
                     fontWeight: FontWeight.w600,
@@ -82,7 +75,6 @@ class _CreateEventPageState extends State<CreateEventPage> {
           body: Scrollbar(
             thickness: 2,
             child: SingleChildScrollView(
-              // SingleChildScrollView is a box in which a single widget can be scrolled.
               child: Padding(
                 padding: const EdgeInsets.all(15),
                 child: Column(
@@ -109,10 +101,8 @@ class _CreateEventPageState extends State<CreateEventPage> {
                         ),
                       ],
                     ),
-                    // If the image for the event is selected or not null.
                     model.imageFile != null
                         ? Container(
-                            // Container for rendering the selected image
                             height: 300,
                             padding: const EdgeInsets.all(8.0),
                             child: Stack(
@@ -139,27 +129,109 @@ class _CreateEventPageState extends State<CreateEventPage> {
                         : Container(),
                     const Divider(),
                     CreateEventForm(
-                      // CreateEventForm returns a widget of a Form for creating events.
-                      // This widget is exported from `lib/views/after_auth_screens/events/create_event_form.dart`.
                       model: model,
                     ),
+                    SizedBox(height: SizeConfig.screenHeight! * 0.013),
+                    const Divider(),
+                    SizedBox(
+                      width: SizeConfig.screenWidth,
+                      child: Wrap(
+                        alignment: WrapAlignment.spaceBetween,
+                        children: [
+                          Row(
+                            mainAxisSize: MainAxisSize.min,
+                            children: [
+                              Text(
+                                AppLocalizations.of(context)!
+                                    .strictTranslate('Keep Registerable'),
+                                style: subtitleTextStyle,
+                              ),
+                              SizedBox(
+                                width: SizeConfig.screenWidth! * 0.005,
+                              ),
+                              Switch(
+                                value: model.isRegisterableSwitch,
+                                onChanged: (value) {
+                                  setState(() {
+                                    model.isRegisterableSwitch = value;
+                                  });
+                                },
+                                activeColor:
+                                    Theme.of(context).colorScheme.primary,
+                              ),
+                            ],
+                          ),
+                          Row(
+                            mainAxisSize: MainAxisSize.min,
+                            children: [
+                              Text(
+                                AppLocalizations.of(context)!
+                                    .strictTranslate('All day'),
+                                style: subtitleTextStyle,
+                              ),
+                              SizedBox(
+                                width: SizeConfig.screenWidth! * 0.005,
+                              ),
+                              Switch(
+                                // Switch to select the visibility of the event.
+                                value: model.isAllDay,
+                                onChanged: (value) {
+                                  setState(() {
+                                    model.isAllDay = value;
+                                  });
+                                },
+                                activeColor:
+                                    Theme.of(context).colorScheme.primary,
+                              ),
+                            ],
+                          ),
+                          Row(
+                            mainAxisSize: MainAxisSize.min,
+                            children: [
+                              Text(
+                                AppLocalizations.of(context)!
+                                    .strictTranslate('Keep Public'),
+                                style: subtitleTextStyle,
+                              ),
+                              SizedBox(
+                                width: SizeConfig.screenWidth! * 0.005,
+                              ),
+                              Switch(
+                                value: model.isPublicSwitch,
+                                onChanged: (value) {
+                                  setState(() {
+                                    model.isPublicSwitch = value;
+                                  });
+                                },
+                                activeColor:
+                                    Theme.of(context).colorScheme.primary,
+                              ),
+                            ],
+                          ),
+                        ],
+                      ),
+                    ),
                     SizedBox(
                       height: SizeConfig.screenHeight! * 0.013,
                     ),
                     const Divider(),
+                    SizedBox(
+                      height: SizeConfig.screenHeight! * 0.013,
+                    ),
                     Text(
-                      // translation of the text to app language.
-                      AppLocalizations.of(context)!
-                          .strictTranslate('Select Start Date and Time'),
+                      AppLocalizations.of(context)!.strictTranslate(
+                        model.isAllDay
+                            ? 'Select Start Date'
+                            : 'Select Start Date and Time',
+                      ),
                       style: subtitleTextStyle,
                     ),
                     SizedBox(
                       height: SizeConfig.screenHeight! * 0.013,
                     ),
                     // DateTimeTile is custom widget that returns a tile to select date and time.
-                    // You can learn more about DateTimeTile from [here](lib/widgets/date_time_picker.dart).
                     DateTimeTile(
-                      // variables and member functions initialisation.
+                      isAllDay: model.isAllDay,
                       date: "${model.eventStartDate.toLocal()}".split(' ')[0],
                       time: model.eventStartTime.format(context),
                       setDate: () async {
@@ -172,25 +244,32 @@ class _CreateEventPageState extends State<CreateEventPage> {
                           );
                         }
                         setState(() {
-                          model.eventStartDate = date;
+                          if (model.eventStartDate != date) {
+                            model.eventStartDate = date;
+                            model.recurrenceStartDate = date;
+                            model.recurrenceLabel = 'Does not repeat';
+                            model.isRecurring = false;
+                            model.frequency = Frequency.weekly;
+                            model.weekDays = {};
+                            model.weekDayOccurenceInMonth = null;
+                          }
                         });
                       },
                       setTime: () async {
-                        print(model.eventStartDate);
                         final time = await customTimePicker(
                           initialTime: model.eventStartTime,
                         );
-                        // print(model.eventStartTime);
                         final validationError = Validator.validateEventTime(
                           time,
                           model.eventEndTime,
                         );
-                        print('hi');
                         if (validationError != null) {
+                          // coverage:ignore-start
                           navigationService.showTalawaErrorSnackBar(
                             'Start time must be before end time',
                             MessageType.error,
                           );
+                          // coverage:ignore-end
                         } else {
                           setState(() {
                             model.eventStartTime = time;
@@ -202,8 +281,11 @@ class _CreateEventPageState extends State<CreateEventPage> {
                       height: SizeConfig.screenHeight! * 0.026,
                     ),
                     Text(
-                      AppLocalizations.of(context)!
-                          .strictTranslate('Select End Date and Time'),
+                      AppLocalizations.of(context)!.strictTranslate(
+                        model.isAllDay
+                            ? 'Select End Date'
+                            : 'Select End Date and Time',
+                      ),
                       style: Theme.of(context)
                           .textTheme
                           .headlineSmall!
@@ -214,20 +296,29 @@ class _CreateEventPageState extends State<CreateEventPage> {
                     ),
                     DateTimeTile(
                       key: const Key('key for test cep'),
-                      date: "${model.eventEndDate?.toLocal() ?? DateTime.now()}"
-                          .split(' ')[0],
+                      isAllDay: model.isAllDay,
+                      date: "${model.eventEndDate.toLocal()}".split(' ')[0],
                       time: model.eventEndTime.format(context),
                       setDate: () async {
                         final date = await customDatePicker(
-                          initialDate: model.eventEndDate ?? DateTime.now(),
+                          initialDate: model.eventEndDate,
                         );
                         final startDate = model.eventStartDate;
+                        // coverage:ignore-start
                         if (startDate.compareTo(date) < 0) {
                           setState(() {
-                            model.eventEndDate = date;
+                            if (model.eventEndDate != date) {
+                              model.eventEndDate = date;
+                              model.recurrenceLabel = 'Does not repeat';
+                              model.recurrenceEndDate = null;
+                              model.isRecurring = false;
+                              model.frequency = Frequency.weekly;
+                              model.weekDays = {};
+                              model.weekDayOccurenceInMonth = null;
+                            }
                           });
+                          // coverage:ignore-end
                         } else {
-                          // ignore: undefined_method
                           navigationServiceLocal.showSnackBar(
                             "End Date cannot be after start date ",
                           );
@@ -244,10 +335,12 @@ class _CreateEventPageState extends State<CreateEventPage> {
                         final showSnackBar =
                             navigationService.showTalawaErrorSnackBar;
                         if (validationError != null) {
+                          // coverage:ignore-start
                           showSnackBar(
                             'Start time must be before end time',
                             MessageType.error,
                           );
+                          // coverage:ignore-end
                         } else {
                           setState(() {
                             model.eventEndTime = time;
@@ -259,16 +352,20 @@ class _CreateEventPageState extends State<CreateEventPage> {
                       height: SizeConfig.screenHeight! * 0.026,
                     ),
                     InkWell(
+                      key: const Key('inkwell_recurrLabel'),
                       child: Row(
                         children: [
                           const Icon(Icons.restore),
                           SizedBox(
                             width: SizeConfig.screenWidth! * 0.045,
                           ),
-                          Text(
-                            AppLocalizations.of(context)!
-                                .strictTranslate(recurrenceLabel),
-                            style: subtitleTextStyle,
+                          Expanded(
+                            child: Text(
+                              AppLocalizations.of(context)!
+                                  .strictTranslate(model.recurrenceLabel),
+                              style: subtitleTextStyle,
+                              overflow: TextOverflow.ellipsis,
+                            ),
                           ),
                         ],
                       ),
@@ -279,101 +376,18 @@ class _CreateEventPageState extends State<CreateEventPage> {
                           builder: (context) {
                             return ShowRecurrenceDialog(
                               model: model,
-                              initialRecurrence: recurrenceLabel,
                             );
                           },
                         );
                         setState(() {
-                          recurrenceLabel = selectedReccurence!;
+                          if (selectedReccurence != null) {
+                            model.recurrenceLabel = selectedReccurence;
+                          }
                         });
                       },
                     ),
                     SizedBox(height: SizeConfig.screenHeight! * 0.026),
                     const Divider(),
-                    SizedBox(
-                      width: SizeConfig.screenWidth,
-                      child: Wrap(
-                        alignment: WrapAlignment.spaceBetween,
-                        children: [
-                          Row(
-                            mainAxisSize: MainAxisSize.min,
-                            children: [
-                              Text(
-                                AppLocalizations.of(context)!
-                                    .strictTranslate('Keep Registerable'),
-                                style: subtitleTextStyle,
-                              ),
-                              SizedBox(
-                                width: SizeConfig.screenWidth! * 0.005,
-                              ),
-                              Switch(
-                                value: model.isRegisterableSwitch,
-                                onChanged: (value) {
-                                  setState(() {
-                                    model.isRegisterableSwitch = value;
-                                    print(model.isRegisterableSwitch);
-                                  });
-                                },
-                                activeColor:
-                                    Theme.of(context).colorScheme.primary,
-                              ),
-                            ],
-                          ),
-                          Row(
-                            mainAxisSize: MainAxisSize.min,
-                            children: [
-                              Text(
-                                AppLocalizations.of(context)!
-                                    .strictTranslate('All day'),
-                                style: subtitleTextStyle,
-                              ),
-                              SizedBox(
-                                width: SizeConfig.screenWidth! * 0.005,
-                              ),
-                              Switch(
-                                // Switch to select the visibility of the event.
-                                value: model.isAllDay,
-                                onChanged: (value) {
-                                  setState(() {
-                                    model.isAllDay = value;
-                                    print(model.isAllDay);
-                                  });
-                                },
-                                activeColor:
-                                    Theme.of(context).colorScheme.primary,
-                              ),
-                            ],
-                          ),
-                          Row(
-                            mainAxisSize: MainAxisSize.min,
-                            children: [
-                              Text(
-                                AppLocalizations.of(context)!
-                                    .strictTranslate('Keep Public'),
-                                style: subtitleTextStyle,
-                              ),
-                              SizedBox(
-                                width: SizeConfig.screenWidth! * 0.005,
-                              ),
-                              Switch(
-                                // Switch to select the visibility of the event.
-                                value: model.isPublicSwitch,
-                                onChanged: (value) {
-                                  setState(() {
-                                    model.isPublicSwitch = value;
-                                    print(model.isPublicSwitch);
-                                  });
-                                },
-                                activeColor:
-                                    Theme.of(context).colorScheme.primary,
-                              ),
-                            ],
-                          ),
-                        ],
-                      ),
-                    ),
-                    SizedBox(height: SizeConfig.screenHeight! * 0.026),
-                    const Divider(),
                     InkWell(
                       key: const Key('inwell_cep2'),
                       onTap: () {
diff --git a/lib/views/after_auth_screens/events/edit_event_page.dart b/lib/views/after_auth_screens/events/edit_event_page.dart
index 6a87ceb03b..8ea4d2a6da 100644
--- a/lib/views/after_auth_screens/events/edit_event_page.dart
+++ b/lib/views/after_auth_screens/events/edit_event_page.dart
@@ -1,6 +1,3 @@
-// ignore_for_file: talawa_api_doc
-// ignore_for_file: talawa_good_doc_comments
-
 import 'package:flutter/material.dart';
 import 'package:talawa/locator.dart';
 import 'package:talawa/models/events/event_model.dart';
@@ -15,14 +12,15 @@ import 'package:talawa/widgets/event_date_time_tile.dart';
 /// EditEventPage returns a widget that has mutable state _EditEventPageState.
 class EditEventPage extends StatefulWidget {
   const EditEventPage({super.key, required this.event});
+
+  /// Represents event instance to be edited.
   final Event event;

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

-/// _EditEventPageState returns a widget to edit the
-/// event that is being posted by the current user.
+/// _EditEventPageState returns a widget to edit the event that is being posted by the current user.
 class _EditEventPageState extends State<EditEventPage> {
   @override
   Widget build(BuildContext context) {
@@ -33,7 +31,6 @@ class _EditEventPageState extends State<EditEventPage> {
       builder: (context, model, child) {
         return Scaffold(
           appBar: AppBar(
-            // returns a header for the page.
             backgroundColor: Theme.of(context).primaryColor,
             elevation: 1,
             centerTitle: true,
@@ -90,8 +87,6 @@ class _EditEventPageState extends State<EditEventPage> {
                   ),
                   const Divider(),
                   EditEventForm(
-                    // EditEventForm returns a widget of a Form for editing the event.
-                    // This widget is exported from `lib/views/after_auth_screens/events/edit_events_form.dart`.
                     model: model,
                   ),
                   SizedBox(
@@ -102,9 +97,8 @@ class _EditEventPageState extends State<EditEventPage> {
                   SizedBox(
                     height: SizeConfig.screenHeight! * 0.013,
                   ),
-                  // DateTimeTile is custom widget that returns a tile to select date and time.
-                  // You can learn more about DateTimeTile from [here](lib/widgets/date_time_picker.dart).
                   DateTimeTile(
+                    isAllDay: false,
                     // variables and member functions initialisation.
                     date: "${model.eventStartDate.toLocal()}".split(' ')[0],
                     time: model.eventStartTime.format(context),
@@ -120,7 +114,6 @@ class _EditEventPageState extends State<EditEventPage> {
                       final time = await customTimePicker(
                         initialTime: model.eventStartTime,
                       );
-
                       setState(() {
                         model.eventStartTime = time;
                       });
@@ -140,6 +133,7 @@ class _EditEventPageState extends State<EditEventPage> {
                     height: SizeConfig.screenHeight! * 0.013,
                   ),
                   DateTimeTile(
+                    isAllDay: false,
                     date: "${model.eventEndDate.toLocal()}".split(' ')[0],
                     time: model.eventEndTime.format(context),
                     setDate: () async {
@@ -193,7 +187,6 @@ class _EditEventPageState extends State<EditEventPage> {
                               onChanged: (value) {
                                 setState(() {
                                   model.isPublicSwitch = value;
-                                  print(model.isPublicSwitch);
                                 });
                               },
                               activeColor:
@@ -216,7 +209,6 @@ class _EditEventPageState extends State<EditEventPage> {
                               onChanged: (value) {
                                 setState(() {
                                   model.isRegisterableSwitch = value;
-                                  print(model.isRegisterableSwitch);
                                 });
                               },
                               activeColor:
diff --git a/lib/views/after_auth_screens/events/event_info_body.dart b/lib/views/after_auth_screens/events/event_info_body.dart
index c47745a1c7..65f516282a 100644
--- a/lib/views/after_auth_screens/events/event_info_body.dart
+++ b/lib/views/after_auth_screens/events/event_info_body.dart
@@ -89,7 +89,7 @@ class EventInfoBody extends StatelessWidget {
                 ),
                 Text(
                   // Display start and end date of the Event.
-                  "${event.startDate!} - ${event.endDate!}",
+                  "${event.startDate} - ${event.endDate}",
                   style: Theme.of(context).textTheme.bodySmall,
                 ),
                 const Spacer(),
@@ -125,23 +125,24 @@ class EventInfoBody extends StatelessWidget {
             SizedBox(
               height: SizeConfig.screenHeight! * 0.011,
             ),
-            Row(
-              crossAxisAlignment: CrossAxisAlignment.start,
-              children: [
-                // display schedule icon with the start and end date of the time.
-                const Icon(
-                  Icons.schedule,
-                  size: 12,
-                ),
-                SizedBox(
-                  width: SizeConfig.screenWidth! * 0.025,
-                ),
-                Text(
-                  "${event.startTime!} - ${event.endTime!}",
-                  style: Theme.of(context).textTheme.bodySmall,
-                ),
-              ],
-            ),
+            if (event.startTime != null && event.endTime != null)
+              Row(
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: [
+                  // display schedule icon with the start and end date of the time.
+                  const Icon(
+                    Icons.schedule,
+                    size: 12,
+                  ),
+                  SizedBox(
+                    width: SizeConfig.screenWidth! * 0.025,
+                  ),
+                  Text(
+                    "${event.startTime} - ${event.endTime}",
+                    style: Theme.of(context).textTheme.bodySmall,
+                  ),
+                ],
+              ),
             SizedBox(
               height: SizeConfig.screenHeight! * 0.011,
             ),
diff --git a/lib/widgets/create_recurring_event_helper_widgets.dart b/lib/widgets/create_recurring_event_helper_widgets.dart
index 16c31b1bcd..df3d0240eb 100644
--- a/lib/widgets/create_recurring_event_helper_widgets.dart
+++ b/lib/widgets/create_recurring_event_helper_widgets.dart
@@ -137,7 +137,10 @@ class _RecurrenceFrequencyDropdownState
                 child: Row(
                   mainAxisAlignment: MainAxisAlignment.center,
                   children: [
-                    Text(widget.selectedOption),
+                    Text(
+                      widget.selectedOption,
+                      overflow: TextOverflow.ellipsis,
+                    ),
                     const Icon(Icons.arrow_drop_down),
                   ],
                 ),
@@ -177,16 +180,13 @@ class _EventEndOptionsState extends State<EventEndOptions> {
   @override
   void initState() {
     if (widget.model.eventEndType == EventEndTypes.never) {
-      widget.model.eventEndDate = null;
+      widget.model.recurrenceEndDate = null;
     }
     super.initState();
   }

   @override
   Widget build(BuildContext context) {
-    print(widget.model.eventEndType);
-    print(widget.model.recurrance);
-    print(widget.model.recurranceFrequency);
     return Column(
       children: [
         radioButton(
@@ -194,8 +194,9 @@ class _EventEndOptionsState extends State<EventEndOptions> {
           child: const Text(EventEndTypes.never),
           index: 0,
           inputAction: () {
-            widget.model.setEventEndDate(null);
             setState(() {
+              widget.model.count = null;
+              widget.model.recurrenceEndDate = null;
               widget.model.eventEndType = EventEndTypes.never;
             });
           },
@@ -216,17 +217,18 @@ class _EventEndOptionsState extends State<EventEndOptions> {
                     onPressed: () async {
                       // initially pickedDate is initialised with current end time.
                       final pickedDate = await customDatePicker(
-                        initialDate:
-                            widget.model.eventEndOnEndDate ?? DateTime.now(),
+                        initialDate: DateTime.now(),
                       );
                       setState(() {
-                        widget.model.eventEndOnEndDate = pickedDate;
+                        widget.model.recurrenceEndDate = pickedDate;
                         widget.model.eventEndType = EventEndTypes.on;
                       });
                     },
                     icon: Text(
                       formatDate(
-                        widget.model.eventEndOnEndDate.toString().split(" ")[0],
+                        (widget.model.recurrenceEndDate ?? DateTime.now())
+                            .toString()
+                            .split(" ")[0],
                       ),
                       style: widget.model.eventEndType == EventEndTypes.on
                           ? TextStyle(color: Theme.of(context).dividerColor)
@@ -244,7 +246,9 @@ class _EventEndOptionsState extends State<EventEndOptions> {
           index: 1,
           inputAction: () {
             setState(() {
+              widget.model.recurrenceEndDate = DateTime.now();
               widget.model.eventEndType = EventEndTypes.on;
+              widget.model.count = null;
             });
           },
         ),
@@ -266,6 +270,7 @@ class _EventEndOptionsState extends State<EventEndOptions> {
           index: 2,
           inputAction: () {
             setState(() {
+              widget.model.recurrenceEndDate = null;
               widget.model.eventEndType = EventEndTypes.after;
             });
           },
diff --git a/lib/widgets/custom_weekday_selector.dart b/lib/widgets/custom_weekday_selector.dart
index 6f60696642..f46ef92d11 100644
--- a/lib/widgets/custom_weekday_selector.dart
+++ b/lib/widgets/custom_weekday_selector.dart
@@ -16,7 +16,7 @@ class CustomWeekDaySelector extends StatefulWidget {
 class _CustomWeekDaySelectorState extends State<CustomWeekDaySelector> {
   @override
   Widget build(BuildContext context) {
-    final Set<String> weekdays = widget.model.weekdays;
+    final Set<String> weekdays = widget.model.weekDays;
     return Container(
       child: Row(
         mainAxisAlignment: MainAxisAlignment.spaceBetween,
@@ -30,6 +30,7 @@ class _CustomWeekDaySelectorState extends State<CustomWeekDaySelector> {
                 } else {
                   weekdays.add(weekday);
                 }
+                widget.model.weekDays = weekdays;
               });
             },
             child: Container(
@@ -73,19 +74,19 @@ class _CustomWeekDaySelectorState extends State<CustomWeekDaySelector> {
   String _getWeekdayAbbreviation(int index) {
     switch (index) {
       case 0:
-        return Recurrance.weekdaySunday;
+        return WeekDays.sunday;
       case 1:
-        return Recurrance.weekdayMonday;
+        return WeekDays.monday;
       case 2:
-        return Recurrance.weekdayTuesday;
+        return WeekDays.tuesday;
       case 3:
-        return Recurrance.weekdayWednesday;
+        return WeekDays.wednesday;
       case 4:
-        return Recurrance.weekdayThursday;
+        return WeekDays.thursday;
       case 5:
-        return Recurrance.weekdayFriday;
+        return WeekDays.friday;
       case 6:
-        return Recurrance.weekdaySaturday;
+        return WeekDays.saturday;
       default:
         return '';
     }
diff --git a/lib/widgets/event_card.dart b/lib/widgets/event_card.dart
index 676e24b6a1..6e1691b5c6 100644
--- a/lib/widgets/event_card.dart
+++ b/lib/widgets/event_card.dart
@@ -122,7 +122,7 @@ class EventCard extends StatelessWidget {
                           const Spacer(),
                           Expanded(
                             child: Text(
-                              "${event.startDate!} - ${event.endDate!}",
+                              "${event.startDate} - ${event.endDate}",
                               style: Theme.of(context).textTheme.bodySmall,
                             ),
                           ),
@@ -131,35 +131,36 @@ class EventCard extends StatelessWidget {
                       SizedBox(
                         height: SizeConfig.screenHeight! * 0.006,
                       ),
-                      Row(
-                        children: [
-                          const Icon(
-                            Icons.schedule,
-                            size: 12,
-                          ),
-                          SizedBox(
-                            width: SizeConfig.screenWidth! * 0.015,
-                          ),
-                          Text(
-                            "${event.startTime!} - ${event.endTime!}",
-                            style: Theme.of(context).textTheme.bodySmall,
-                          ),
-                          const Spacer(),
-                          const Icon(
-                            Icons.place,
-                            size: 12,
-                          ),
-                          SizedBox(
-                            child: Text(
-                              event.location!.substring(
-                                0,
-                                min(event.location!.length, 20),
-                              ),
+                      if (event.startTime != null && event.endTime != null)
+                        Row(
+                          children: [
+                            const Icon(
+                              Icons.schedule,
+                              size: 12,
+                            ),
+                            SizedBox(
+                              width: SizeConfig.screenWidth! * 0.015,
+                            ),
+                            Text(
+                              "${event.startTime} - ${event.endTime!}",
                               style: Theme.of(context).textTheme.bodySmall,
                             ),
-                          ),
-                        ],
-                      ),
+                            const Spacer(),
+                            const Icon(
+                              Icons.place,
+                              size: 12,
+                            ),
+                            SizedBox(
+                              child: Text(
+                                event.location!.substring(
+                                  0,
+                                  min(event.location!.length, 20),
+                                ),
+                                style: Theme.of(context).textTheme.bodySmall,
+                              ),
+                            ),
+                          ],
+                        ),
                       SizedBox(
                         height: SizeConfig.screenHeight! * 0.013,
                       ),
diff --git a/lib/widgets/event_date_time_tile.dart b/lib/widgets/event_date_time_tile.dart
index 09a86b2204..459765823a 100644
--- a/lib/widgets/event_date_time_tile.dart
+++ b/lib/widgets/event_date_time_tile.dart
@@ -9,6 +9,7 @@ class DateTimeTile extends StatelessWidget {
     required this.time,
     required this.setDate,
     required this.setTime,
+    required this.isAllDay,
   });

   /// Represents a date in string format.
@@ -17,6 +18,9 @@ class DateTimeTile extends StatelessWidget {
   /// Represents a time in string format.
   final String time;

+  /// Represents a boolean value indicating if the event is all day.
+  final bool isAllDay;
+
   /// Function that sets the date.
   final Function() setDate;

@@ -52,25 +56,27 @@ class DateTimeTile extends StatelessWidget {
                 style: const TextStyle(fontSize: 16),
               ),
             ),
-            const Spacer(),
-            const Icon(
-              Icons.schedule,
-              color: Color(0xff524F4F),
-              size: 19,
-            ),
-            SizedBox(
-              width: SizeConfig.screenWidth! * 0.045,
-            ),
-            InkWell(
-              key: const Key('EventDateTimeTileTime'),
-              onTap: () async {
-                setTime();
-              },
-              child: Text(
-                time,
-                style: const TextStyle(fontSize: 16),
+            if (!isAllDay) ...[
+              const Spacer(),
+              const Icon(
+                Icons.schedule,
+                color: Color(0xff524F4F),
+                size: 19,
               ),
-            ),
+              SizedBox(
+                width: SizeConfig.screenWidth! * 0.045,
+              ),
+              InkWell(
+                key: const Key('EventDateTimeTileTime'),
+                onTap: () async {
+                  setTime();
+                },
+                child: Text(
+                  time,
+                  style: const TextStyle(fontSize: 16),
+                ),
+              ),
+            ],
           ],
         ),
       ),
diff --git a/lib/widgets/recurrence_dialog.dart b/lib/widgets/recurrence_dialog.dart
index 348460a9f9..2d35c103c1 100644
--- a/lib/widgets/recurrence_dialog.dart
+++ b/lib/widgets/recurrence_dialog.dart
@@ -1,4 +1,6 @@
 import 'package:flutter/material.dart';
+import 'package:intl/intl.dart';
+import 'package:talawa/constants/recurrence_values.dart';
 import 'package:talawa/constants/routing_constants.dart';
 import 'package:talawa/locator.dart';
 import 'package:talawa/services/size_config.dart';
@@ -9,78 +11,191 @@ class ShowRecurrenceDialog extends StatefulWidget {
   const ShowRecurrenceDialog({
     super.key,
     required this.model,
-    required this.initialRecurrence,
   });

+  /// Instance of create event view model.
   final CreateEventViewModel model;
-  final String initialRecurrence;

   @override
   State<ShowRecurrenceDialog> createState() => _ShowRecurrenceDialogState();
 }

 class _ShowRecurrenceDialogState extends State<ShowRecurrenceDialog> {
-  static const donotRepeat = "Does not repeat";
-  static const dialy = "Every day";
-  static const weekly = "Every week";
-  static const monthly = "Every month";
-  static const yearly = "Every year";
-  static const custom = "Custom...";
-
-  static const List<String> _frequencies = [
-    donotRepeat,
-    dialy,
-    weekly,
-    monthly,
-    yearly,
-    custom,
-  ];
-
-  late String _frequency;
   @override
   Widget build(BuildContext context) {
-    _frequency = widget.initialRecurrence;
-    print('widget built');
     return Dialog(
       child: SizedBox(
-        height: SizeConfig.screenHeight! * 0.5,
+        height: SizeConfig.screenHeight! * 0.74,
         child: Column(
           mainAxisAlignment: MainAxisAlignment.center,
           children: [
-            radioButton(_frequencies[0]),
-            radioButton(_frequencies[1]),
-            radioButton(_frequencies[2]),
-            radioButton(_frequencies[3]),
-            radioButton(_frequencies[4]),
-            radioButton(_frequencies[5]),
+            radioButtonFixText(
+              "Does not repeat",
+              // coverage:ignore-start
+              (value) => updateModel(value!, false, null, null, null),
+              // coverage:ignore-end
+            ),
+            radioButton(
+              Frequency.daily,
+              widget.model.interval,
+              widget.model.count,
+              null,
+              null,
+            ),
+            radioButton(Frequency.weekly, widget.model.interval,
+                widget.model.count, null, [
+              RecurrenceUtils
+                  .weekDays[widget.model.recurrenceStartDate.weekday - 1],
+            ]),
+            radioButton(
+              Frequency.monthly,
+              widget.model.interval,
+              widget.model.count,
+              null,
+              null,
+            ),
+            if (RecurrenceUtils.getWeekDayOccurenceInMonth(
+                  widget.model.recurrenceStartDate,
+                ) !=
+                5)
+              radioButton(
+                  Frequency.monthly,
+                  widget.model.interval,
+                  widget.model.count,
+                  RecurrenceUtils.getWeekDayOccurenceInMonth(
+                    widget.model.recurrenceStartDate,
+                  ),
+                  [
+                    RecurrenceUtils
+                        .weekDays[widget.model.recurrenceStartDate.weekday - 1],
+                  ]),
+            if (RecurrenceUtils.isLastOccurenceOfWeekDay(
+              widget.model.recurrenceStartDate,
+            ))
+              radioButton(Frequency.monthly, widget.model.interval,
+                  widget.model.count, -1, [
+                RecurrenceUtils
+                    .weekDays[widget.model.recurrenceStartDate.weekday],
+              ]),
+            radioButton(
+              Frequency.yearly,
+              widget.model.interval,
+              widget.model.count,
+              null,
+              null,
+            ),
+            radioButtonFixText(
+              'Monday to Friday ${widget.model.recurrenceEndDate != null ? "until ${DateFormat('MMMM d, y').format(widget.model.recurrenceEndDate!)}" : ""}',
+              (value) => updateModel(value!, true, Frequency.weekly, null, {
+                'MONDAY',
+                'TUESDAY',
+                'WEDNESDAY',
+                'THURSDAY',
+                'FRIDAY',
+              }),
+            ),
+            radioButtonFixText("Custom...", (value) async {
+              widget.model.isRecurring = true;
+              await navigationService.pushScreen(
+                Routes.customRecurrencePage,
+                arguments: widget.model,
+              );
+              setState(() {
+                Navigator.pop(context, widget.model.recurrenceLabel);
+              });
+            }),
           ],
         ),
       ),
     );
   }

-  // custom radio list tile.
+  /// custom radio list tile.
+  ///
+  /// **params**:
+  /// * `frequency`: represent the frequency of the event.
+  /// * `interval`: represent the interval of the event.
+  /// * `count`: represent the count of the event.
+  /// * `weekDayOccurenceInMonth`: represent the week day occurence in month.
+  /// * `weekDays`: represent the list of week days.
+  ///
+  /// **returns**:
+  /// * `RadioListTile<String>`: returns radio list tile.
   RadioListTile<String> radioButton(
     String frequency,
+    int? interval,
+    int? count,
+    int? weekDayOccurenceInMonth,
+    List<String>? weekDays,
+  ) {
+    final String text = RecurrenceUtils.getRecurrenceRuleText(
+      frequency,
+      weekDays?.toSet(),
+      interval,
+      count,
+      weekDayOccurenceInMonth,
+      widget.model.recurrenceStartDate,
+      widget.model.recurrenceEndDate,
+    );
+    return RadioListTile<String>(
+      title: Text(text),
+      value: text,
+      groupValue: widget.model.recurrenceLabel,
+      onChanged: (value) => updateModel(
+        value!,
+        true,
+        frequency,
+        weekDayOccurenceInMonth,
+        weekDays?.map((day) => day.toUpperCase()).toSet(),
+      ),
+    );
+  }
+
+  /// custom radio list tile with fixed the text.
+  ///
+  /// **params**:
+  /// * `text`: represents the text of the radio button.
+  /// * `onChanged`: represents the function to be called when the radio button is pressed.
+  ///
+  /// **returns**:
+  /// * `RadioListTile<String>`: returns radio list tile.
+  RadioListTile<String> radioButtonFixText(
+    String text,
+    Function(String?)? onChanged,
   ) {
     return RadioListTile<String>(
-      title: Text(frequency),
-      value: frequency,
-      groupValue: _frequency,
-      onChanged: (value) async {
-        // navigate to custom recurrence page when pressed custom... button.
-        widget.model.recurrance = widget.model.getRecurrance(value!);
-        if (value == _frequencies[5]) {
-          await navigationService.pushScreen(
-            Routes.customRecurrencePage,
-            arguments: widget.model,
-          );
-        }
-        setState(() {
-          _frequency = value;
-          Navigator.pop(context, _frequency);
-        });
-      },
+      title: Text(text),
+      value: text,
+      groupValue: widget.model.recurrenceLabel,
+      onChanged: onChanged,
     );
   }
+
+  /// Returns the updated model with the selected recurrence options.
+  ///
+  /// **params**:
+  /// * `value`: represents text of the selected recurrence option.
+  /// * `isRecurring`: represent whether the event is recurring or not.
+  /// * `frequency`: represent the frequency of the event.
+  /// * `weekDayOccurenceInMonth`: represent the week day occurence in month.
+  /// * `weekDays`: represent the list of week days.
+  ///
+  /// **returns**:
+  ///   None
+  void updateModel(
+    String value,
+    bool isRecurring,
+    String? frequency,
+    int? weekDayOccurenceInMonth,
+    Set<String>? weekDays,
+  ) {
+    setState(() {
+      widget.model.isRecurring = isRecurring;
+      widget.model.recurrenceLabel = value;
+      widget.model.weekDays = weekDays ?? {};
+      widget.model.weekDayOccurenceInMonth = weekDayOccurenceInMonth;
+      widget.model.frequency = frequency ?? Frequency.weekly;
+      Navigator.pop(context, value);
+    });
+  }
 }

diff --git a/test/helpers/test_helpers.mocks.dart b/test/helpers/test_helpers.mocks.dart
index 17c038dc22..017b54648e 100644
--- a/test/helpers/test_helpers.mocks.dart
+++ b/test/helpers/test_helpers.mocks.dart
@@ -978,6 +978,51 @@ class MockGraphQLClient extends _i2.Mock implements _i3.GraphQLClient {
 ///
 /// See the documentation for Mockito's code generation for more information.
 class MockPostService extends _i2.Mock implements _i16.PostService {
+  @override
+  set postInfo(Map<String, dynamic>? _postInfo) => super.noSuchMethod(
+        Invocation.setter(
+          #postInfo,
+          _postInfo,
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  set after(String? _after) => super.noSuchMethod(
+        Invocation.setter(
+          #after,
+          _after,
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  set before(String? _before) => super.noSuchMethod(
+        Invocation.setter(
+          #before,
+          _before,
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  set first(int? _first) => super.noSuchMethod(
+        Invocation.setter(
+          #first,
+          _first,
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  set last(int? _last) => super.noSuchMethod(
+        Invocation.setter(
+          #last,
+          _last,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
   _i5.Stream<List<_i17.Post>> get postStream => (super.noSuchMethod(
         Invocation.getter(#postStream),
@@ -1060,24 +1105,24 @@ class MockPostService extends _i2.Mock implements _i16.PostService {
       );

   @override
-  _i5.Future<void> nextPage() => super.noSuchMethod(
+  _i5.Future<void> nextPage() => (super.noSuchMethod(
         Invocation.method(
           #nextPage,
           [],
         ),
         returnValue: _i5.Future<void>.value(),
         returnValueForMissingStub: _i5.Future<void>.value(),
-      );
+      ) as _i5.Future<void>);

   @override
-  _i5.Future<void> previousPage() => super.noSuchMethod(
+  _i5.Future<void> previousPage() => (super.noSuchMethod(
         Invocation.method(
           #previousPage,
           [],
         ),
         returnValue: _i5.Future<void>.value(),
         returnValueForMissingStub: _i5.Future<void>.value(),
-      );
+      ) as _i5.Future<void>);
 }

 /// A class which mocks [MultiMediaPickerService].
@@ -2831,24 +2876,8 @@ class MockOrganizationFeedViewModel extends _i2.Mock
         ),
         returnValueForMissingStub: null,
       );
-  @override
-  void nextPage() => super.noSuchMethod(
-        Invocation.method(
-          #nextPage,
-          [],
-        ),
-        returnValueForMissingStub: null,
-      );

   @override
-  void previousPage() => super.noSuchMethod(
-        Invocation.method(
-          #previousPage,
-          [],
-        ),
-        returnValueForMissingStub: null,
-      );
-  @override
   void initialise({bool? isTest = false}) => super.noSuchMethod(
         Invocation.method(
           #initialise,
@@ -2922,6 +2951,24 @@ class MockOrganizationFeedViewModel extends _i2.Mock
         returnValueForMissingStub: _i5.Future<void>.value(),
       ) as _i5.Future<void>);

+  @override
+  void nextPage() => super.noSuchMethod(
+        Invocation.method(
+          #nextPage,
+          [],
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  void previousPage() => super.noSuchMethod(
+        Invocation.method(
+          #previousPage,
+          [],
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
   void setState(_i14.ViewState? viewState) => super.noSuchMethod(
         Invocation.method(
@@ -3447,6 +3494,19 @@ class MockCreateEventViewModel extends _i2.Mock
         returnValueForMissingStub: null,
       );

+  @override
+  DateTime get eventEndDate => (super.noSuchMethod(
+        Invocation.getter(#eventEndDate),
+        returnValue: _FakeDateTime_23(
+          this,
+          Invocation.getter(#eventEndDate),
+        ),
+        returnValueForMissingStub: _FakeDateTime_23(
+          this,
+          Invocation.getter(#eventEndDate),
+        ),
+      ) as DateTime);
+
   @override
   set eventEndDate(DateTime? _eventEndDate) => super.noSuchMethod(
         Invocation.setter(
@@ -3456,6 +3516,37 @@ class MockCreateEventViewModel extends _i2.Mock
         returnValueForMissingStub: null,
       );

+  @override
+  DateTime get recurrenceStartDate => (super.noSuchMethod(
+        Invocation.getter(#recurrenceStartDate),
+        returnValue: _FakeDateTime_23(
+          this,
+          Invocation.getter(#recurrenceStartDate),
+        ),
+        returnValueForMissingStub: _FakeDateTime_23(
+          this,
+          Invocation.getter(#recurrenceStartDate),
+        ),
+      ) as DateTime);
+
+  @override
+  set recurrenceStartDate(DateTime? _recurrenceStartDate) => super.noSuchMethod(
+        Invocation.setter(
+          #recurrenceStartDate,
+          _recurrenceStartDate,
+        ),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  set recurrenceEndDate(DateTime? _recurrenceEndDate) => super.noSuchMethod(
+        Invocation.setter(
+          #recurrenceEndDate,
+          _recurrenceEndDate,
+        ),
+        returnValueForMissingStub: null,
+      );
+
   @override
   bool get isPublicSwitch => (super.noSuchMethod(
         Invocation.getter(#isPublicSwitch),
@@ -3554,24 +3645,6 @@ class MockCreateEventViewModel extends _i2.Mock
         returnValueForMissingStub: null,
       );

-  @override
-  set latitude(double? _latitude) => super.noSuchMethod(
-        Invocation.setter(
-          #latitude,
-          _latitude,
-        ),
-        returnValueForMissingStub: null,
-      );
-
-  @override
-  set longitude(double? _longitude) => super.noSuchMethod(
-        Invocation.setter(
-          #longitude,
-          _longitude,
-        ),
-        returnValueForMissingStub: null,
-      );
-
   @override
   bool get isAllDay => (super.noSuchMethod(
         Invocation.getter(#isAllDay),
@@ -3605,117 +3678,140 @@ class MockCreateEventViewModel extends _i2.Mock
       );

   @override
-  int get recurranceCount => (super.noSuchMethod(
-        Invocation.getter(#recurranceCount),
-        returnValue: 0,
-        returnValueForMissingStub: 0,
-      ) as int);
-
-  @override
-  set recurranceCount(int? _recurranceCount) => super.noSuchMethod(
-        Invocation.setter(
-          #recurranceCount,
-          _recurranceCount,
+  String get recurrenceInterval => (super.noSuchMethod(
+        Invocation.getter(#recurrenceInterval),
+        returnValue: _i25.dummyValue<String>(
+          this,
+          Invocation.getter(#recurrenceInterval),
         ),
-        returnValueForMissingStub: null,
-      );
+        returnValueForMissingStub: _i25.dummyValue<String>(
+          this,
+          Invocation.getter(#recurrenceInterval),
+        ),
+      ) as String);

   @override
-  set recurrance(String? _recurrance) => super.noSuchMethod(
+  set recurrenceInterval(String? _recurrenceInterval) => super.noSuchMethod(
         Invocation.setter(
-          #recurrance,
-          _recurrance,
+          #recurrenceInterval,
+          _recurrenceInterval,
         ),
         returnValueForMissingStub: null,
       );

   @override
-  String get recurranceFrequency => (super.noSuchMethod(
-        Invocation.getter(#recurranceFrequency),
+  String get eventEndType => (super.noSuchMethod(
+        Invocation.getter(#eventEndType),
         returnValue: _i25.dummyValue<String>(
           this,
-          Invocation.getter(#recurranceFrequency),
+          Invocation.getter(#eventEndType),
         ),
         returnValueForMissingStub: _i25.dummyValue<String>(
           this,
-          Invocation.getter(#recurranceFrequency),
+          Invocation.getter(#eventEndType),
         ),
       ) as String);

   @override
-  set recurranceFrequency(String? _recurranceFrequency) => super.noSuchMethod(
+  set eventEndType(String? _eventEndType) => super.noSuchMethod(
         Invocation.setter(
-          #recurranceFrequency,
-          _recurranceFrequency,
+          #eventEndType,
+          _eventEndType,
         ),
         returnValueForMissingStub: null,
       );

   @override
-  String get monthlyRecurrence => (super.noSuchMethod(
-        Invocation.getter(#monthlyRecurrence),
+  String get frequency => (super.noSuchMethod(
+        Invocation.getter(#frequency),
         returnValue: _i25.dummyValue<String>(
           this,
-          Invocation.getter(#monthlyRecurrence),
+          Invocation.getter(#frequency),
         ),
         returnValueForMissingStub: _i25.dummyValue<String>(
           this,
-          Invocation.getter(#monthlyRecurrence),
+          Invocation.getter(#frequency),
         ),
       ) as String);

   @override
-  set monthlyRecurrence(String? _monthlyRecurrence) => super.noSuchMethod(
+  set frequency(String? _frequency) => super.noSuchMethod(
         Invocation.setter(
-          #monthlyRecurrence,
-          _monthlyRecurrence,
+          #frequency,
+          _frequency,
         ),
         returnValueForMissingStub: null,
       );

   @override
-  Set<String> get weekdays => (super.noSuchMethod(
-        Invocation.getter(#weekdays),
+  Set<String> get weekDays => (super.noSuchMethod(
+        Invocation.getter(#weekDays),
         returnValue: <String>{},
         returnValueForMissingStub: <String>{},
       ) as Set<String>);

   @override
-  set weekdays(Set<String>? _weekdays) => super.noSuchMethod(
+  set weekDays(Set<String>? _weekDays) => super.noSuchMethod(
         Invocation.setter(
-          #weekdays,
-          _weekdays,
+          #weekDays,
+          _weekDays,
         ),
         returnValueForMissingStub: null,
       );

   @override
-  String get eventEndType => (super.noSuchMethod(
-        Invocation.getter(#eventEndType),
-        returnValue: _i25.dummyValue<String>(
-          this,
-          Invocation.getter(#eventEndType),
+  int get interval => (super.noSuchMethod(
+        Invocation.getter(#interval),
+        returnValue: 0,
+        returnValueForMissingStub: 0,
+      ) as int);
+
+  @override
+  set interval(int? _interval) => super.noSuchMethod(
+        Invocation.setter(
+          #interval,
+          _interval,
         ),
-        returnValueForMissingStub: _i25.dummyValue<String>(
-          this,
-          Invocation.getter(#eventEndType),
+        returnValueForMissingStub: null,
+      );
+
+  @override
+  set count(int? _count) => super.noSuchMethod(
+        Invocation.setter(
+          #count,
+          _count,
         ),
-      ) as String);
+        returnValueForMissingStub: null,
+      );

   @override
-  set eventEndType(String? _eventEndType) => super.noSuchMethod(
+  set weekDayOccurenceInMonth(int? _weekDayOccurenceInMonth) =>
+      super.noSuchMethod(
         Invocation.setter(
-          #eventEndType,
-          _eventEndType,
+          #weekDayOccurenceInMonth,
+          _weekDayOccurenceInMonth,
         ),
         returnValueForMissingStub: null,
       );

   @override
-  set eventEndOnEndDate(DateTime? _eventEndOnEndDate) => super.noSuchMethod(
+  String get recurrenceLabel => (super.noSuchMethod(
+        Invocation.getter(#recurrenceLabel),
+        returnValue: _i25.dummyValue<String>(
+          this,
+          Invocation.getter(#recurrenceLabel),
+        ),
+        returnValueForMissingStub: _i25.dummyValue<String>(
+          this,
+          Invocation.getter(#recurrenceLabel),
+        ),
+      ) as String);
+
+  @override
+  set recurrenceLabel(String? _recurrenceLabel) => super.noSuchMethod(
         Invocation.setter(
-          #eventEndOnEndDate,
-          _eventEndOnEndDate,
+          #recurrenceLabel,
+          _recurrenceLabel,
         ),
         returnValueForMissingStub: null,
       );
@@ -3879,15 +3975,6 @@ class MockCreateEventViewModel extends _i2.Mock
         returnValueForMissingStub: null,
       );

-  @override
-  String? getRecurrance(String? frequency) => (super.noSuchMethod(
-        Invocation.method(
-          #getRecurrance,
-          [frequency],
-        ),
-        returnValueForMissingStub: null,
-      ) as String?);
-
   @override
   void setState(_i14.ViewState? viewState) => super.noSuchMethod(
         Invocation.method(
diff --git a/test/model_tests/chat/chat_list_tile_data_model_test.dart b/test/model_tests/chat/chat_list_tile_data_model_test.dart
index 0bda6029e0..5571f7aecf 100644
--- a/test/model_tests/chat/chat_list_tile_data_model_test.dart
+++ b/test/model_tests/chat/chat_list_tile_data_model_test.dart
@@ -1,10 +1,28 @@
-// ignore_for_file: talawa_api_doc
-// ignore_for_file: talawa_good_doc_comments
-
 import 'package:flutter_test/flutter_test.dart';
 import 'package:talawa/models/chats/chat_list_tile_data_model.dart';
 import 'package:talawa/models/chats/chat_user.dart';

+/// function to check if the users are equal or not.
+///
+/// **params**:
+/// * `users1`: list of ChatUser
+/// * `users2`: list of ChatUser
+///
+/// **returns**:
+///   None
+void checkUsers(List<ChatUser>? users1, List<ChatUser>? users2) {
+  if (users1 == null || users2 == null) {
+    expect(users1, users2);
+    return;
+  }
+
+  for (int index = 0; index < users1.length; index++) {
+    expect(users1[index].id, users2[index].id);
+    expect(users1[index].firstName, users2[index].firstName);
+    expect(users1[index].image, users2[index].image);
+  }
+}
+
 void main() {
   group('Test ChatListTileDataModel', () {
     const int listLength = 4;
@@ -23,29 +41,16 @@ void main() {
     );

     final Map<String, dynamic> json = {
-      '_id': '123',
+      'id': '123',
       'users': List.generate(listLength, (index) {
         return {
-          '_id': '$index',
+          'id': '$index',
           'firstName': 'First$index',
           'image': 'Image$index',
         };
       }),
     };

-    void checkUsers(List<ChatUser>? users1, List<ChatUser>? users2) {
-      if (users1 == null || users2 == null) {
-        expect(users1, users2);
-        return;
-      }
-
-      for (int index = 0; index < users1.length; index++) {
-        expect(users1[index].id, users2[index].id);
-        expect(users1[index].firstName, users2[index].firstName);
-        expect(users1[index].image, users2[index].image);
-      }
-    }
-
     test('Test constructor', () {
       expect(chatListTileDataModel.id, '123');
       checkUsers(chatListTileDataModel.users, users);
@@ -65,7 +70,7 @@ void main() {
     test('Test toJson', () {
       final Map<String, dynamic> json = chatListTileDataModel.toJson();

-      expect(json['_id'], chatListTileDataModel.id);
+      expect(json['id'], chatListTileDataModel.id);
       checkUsers(json['users'] as List<ChatUser>, chatListTileDataModel.users);
     });
   });
diff --git a/test/model_tests/chat/chat_user_test.dart b/test/model_tests/chat/chat_user_test.dart
index f6a4793a1e..50430f8304 100644
--- a/test/model_tests/chat/chat_user_test.dart
+++ b/test/model_tests/chat/chat_user_test.dart
@@ -1,6 +1,3 @@
-// ignore_for_file: talawa_api_doc
-// ignore_for_file: talawa_good_doc_comments
-
 import 'package:flutter_test/flutter_test.dart';
 import 'package:talawa/models/chats/chat_user.dart';

@@ -13,7 +10,7 @@ void main() {
     );
     final chatUserJson = {
       'firstName': 'Ayush',
-      '_id': null,
+      'id': null,
       'image': 'random image url',
     };
     test('Test json to model', () {
diff --git a/test/model_tests/events/event_model_test.dart b/test/model_tests/events/event_model_test.dart
index 689472c0cf..2557fa085a 100644
--- a/test/model_tests/events/event_model_test.dart
+++ b/test/model_tests/events/event_model_test.dart
@@ -21,15 +21,12 @@ void main() {
         title: 'for test only',
         description: 'for test only',
         location: 'for test only',
-        latitude: 1233,
-        longitude: 123,
         recurring: false,
         allDay: false,
         startDate: 'for test only',
         endDate: 'for test only',
         startTime: 'for test only',
         endTime: 'for test only',
-        recurrence: 'for test only',
         isPublic: true,
         isRegistered: true,
         isRegisterable: true,
@@ -56,15 +53,12 @@ void main() {
         'title': 'for test only',
         'description': 'for test only',
         'location': 'for test only',
-        'latitude': 1233.00,
-        'longitude': 123.00,
         'recurring': false,
         'allDay': false,
         'startDate': 'for test only',
         'endDate': 'for test only',
         'startTime': 'for test only',
         'endTime': 'for test only',
-        'recurrence': 'for test only',
         'isPublic': true,
         'isRegistered': true,
         'isRegisterable': true,
@@ -119,14 +113,11 @@ void main() {
       );
       expect(event.attendees?[0].image, eventFromJson.attendees?[0].image);
       expect(event.location, eventFromJson.location);
-      expect(event.latitude, eventFromJson.latitude);
-      expect(event.longitude, eventFromJson.longitude);
       expect(event.recurring, eventFromJson.recurring);
       expect(event.allDay, eventFromJson.allDay);
       expect(event.startDate, eventFromJson.startDate);
       expect(event.startTime, eventFromJson.startTime);
       expect(event.endTime, eventFromJson.endTime);
-      expect(event.recurrence, eventFromJson.recurrence);
       expect(event.isPublic, eventFromJson.isPublic);
       expect(event.isRegistered, eventFromJson.isRegistered);
       expect(event.isRegisterable, eventFromJson.isRegisterable);
diff --git a/test/service_tests/event_service_test.dart b/test/service_tests/event_service_test.dart
index 76c461bbde..9da3f09356 100644
--- a/test/service_tests/event_service_test.dart
+++ b/test/service_tests/event_service_test.dart
@@ -136,15 +136,12 @@ void main() {
                 "title": "Sample Event",
                 "description": "This is a sample event description.",
                 "location": "Sample Location",
-                "longitude": -73.935242,
-                "latitude": 40.73061,
                 "recurring": true,
                 "allDay": false,
                 "startDate": "2024-01-15",
                 "endDate": "2024-01-16",
                 "startTime": "10:00 AM",
                 "endTime": "4:00 PM",
-                "recurrence": "Weekly",
                 "isPublic": true,
                 "isRegistered": true,
                 "isRegisterable": true,
diff --git a/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/create_event_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/create_event_view_model_test.dart
index 7c444d6c2b..cd683b6f8c 100644
--- a/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/create_event_view_model_test.dart
+++ b/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/create_event_view_model_test.dart
@@ -1,6 +1,3 @@
-// ignore_for_file: talawa_api_doc
-// ignore_for_file: talawa_good_doc_comments
-
 import 'dart:io';

 import 'package:flutter/material.dart';
@@ -21,12 +18,33 @@ import 'package:talawa/view_model/after_auth_view_models/event_view_models/creat
 import '../../../helpers/test_helpers.dart';
 import '../../../helpers/test_locator.dart';

+/// `MockBuildContext` class represents mock instance of Build context.
 class MockBuildContext extends Mock implements BuildContext {}

+/// Instance of callback function.
 class MockCallbackFunction extends Mock {
+  /// Callback function.
+  ///
+  /// **params**:
+  ///   None
+  ///
+  /// **returns**:
+  ///   None
   void call();
 }

+/// a_line_ending_with_end_punctuation.
+///
+/// more_info_if_required
+///
+/// **params**:
+/// * `formKey`: define_the_param
+/// * `eventTitleTextController`: define_the_param
+/// * `eventLocationTextController`: define_the_param
+/// * `eventDescriptionTextController`: define_the_param
+///
+/// **returns**:
+/// * `Widget`: define_the_return
 Widget createApp(
   GlobalKey<FormState> formKey,
   TextEditingController eventTitleTextController,
@@ -127,9 +145,9 @@ void main() {
         model.eventStartTime.minute,
       );
       final DateTime endMoment = DateTime(
-        model.eventEndDate!.year,
-        model.eventEndDate!.month,
-        model.eventEndDate!.day,
+        model.eventEndDate.year,
+        model.eventEndDate.month,
+        model.eventEndDate.day,
         model.eventEndTime.hour,
         model.eventEndTime.minute,
       );
@@ -169,16 +187,177 @@ void main() {
               'location': model.eventLocationTextController.text,
               'isPublic': model.isPublicSwitch,
               'isRegisterable': model.isRegisterableSwitch,
-              'recurring': true,
-              'recurrance': 'WEEKLY',
+              'recurring': model.isRecurring,
               'allDay': true,
-              'startTime': '${DateFormat('HH:mm:ss').format(startMoment)}Z',
-              'endTime': '${DateFormat('HH:mm:ss').format(endMoment)}Z',
+              'startTime': model.isAllDay
+                  ? null
+                  : '${DateFormat('HH:mm:ss').format(startMoment)}Z',
+              'endTime': model.isAllDay
+                  ? null
+                  : '${DateFormat('HH:mm:ss').format(endMoment)}Z',
             },
-            'recurrenceRuleData': {
-              'frequency': 'WEEKLY',
-              'weekDays': ['TU'],
+            if (model.isRecurring)
+              'recurrenceRuleData': {
+                'recurrenceStartDate':
+                    DateFormat('yyyy-MM-dd').format(model.recurrenceStartDate),
+                'recurrenceEndDate': model.recurrenceEndDate != null
+                    ? DateFormat('yyyy-MM-dd').format(model.recurrenceEndDate!)
+                    : null,
+                'frequency': model.frequency,
+                'weekDays': (model.frequency == Frequency.weekly ||
+                        (model.frequency == Frequency.monthly &&
+                            model.weekDayOccurenceInMonth != null))
+                    ? model.weekDays.toList()
+                    : null,
+                'interval': model.interval,
+                'count': model.count,
+                'weekDayOccurenceInMonth': model.weekDayOccurenceInMonth,
+              },
+          },
+        ),
+      ).thenAnswer((_) async {
+        return true;
+      });
+
+      await model.createEvent();
+
+      verify(
+        databaseFunctions.gqlAuthMutation(
+          EventQueries().addEvent(),
+          variables: {
+            'data': {
+              'startDate': DateFormat('yyyy-MM-dd').format(startMoment),
+              'endDate': DateFormat('yyyy-MM-dd').format(endMoment),
+              'organizationId': 'XYZ',
+              'title': model.eventTitleTextController.text,
+              'description': model.eventDescriptionTextController.text,
+              'location': model.eventLocationTextController.text,
+              'isPublic': model.isPublicSwitch,
+              'isRegisterable': model.isRegisterableSwitch,
+              'recurring': model.isRecurring,
+              'allDay': true,
+              'startTime': model.isAllDay
+                  ? null
+                  : '${DateFormat('HH:mm:ss').format(startMoment)}Z',
+              'endTime': model.isAllDay
+                  ? null
+                  : '${DateFormat('HH:mm:ss').format(endMoment)}Z',
             },
+            if (model.isRecurring)
+              'recurrenceRuleData': {
+                'recurrenceStartDate':
+                    DateFormat('yyyy-MM-dd').format(model.recurrenceStartDate),
+                'recurrenceEndDate': model.recurrenceEndDate != null
+                    ? DateFormat('yyyy-MM-dd').format(model.recurrenceEndDate!)
+                    : null,
+                'frequency': model.frequency,
+                'weekDays': (model.frequency == Frequency.weekly ||
+                        (model.frequency == Frequency.monthly &&
+                            model.weekDayOccurenceInMonth != null))
+                    ? model.weekDays.toList()
+                    : null,
+                'interval': model.interval,
+                'count': model.count,
+                'weekDayOccurenceInMonth': model.weekDayOccurenceInMonth,
+              },
+          },
+        ),
+      );
+
+      verify(navigationService.pop());
+    });
+
+    testWidgets("testing createEvent function (Recurring)", (tester) async {
+      final model = CreateEventViewModel();
+      model.initialize();
+      await tester.pumpWidget(
+        createApp(
+          model.formKey,
+          model.eventTitleTextController,
+          model.eventLocationTextController,
+          model.eventDescriptionTextController,
+        ),
+      );
+
+      final DateTime startMoment = DateTime(
+        model.eventStartDate.year,
+        model.eventStartDate.month,
+        model.eventStartDate.day,
+        model.eventStartTime.hour,
+        model.eventStartTime.minute,
+      );
+
+      final DateTime endMoment = DateTime(
+        model.eventEndDate.year,
+        model.eventEndDate.month,
+        model.eventEndDate.day,
+        model.eventEndTime.hour,
+        model.eventEndTime.minute,
+      );
+
+      model.isRecurring = true;
+
+      await tester.pump();
+      await tester.pumpAndSettle();
+
+      await tester.enterText(
+        find.byType(TextFormField).first,
+        'fakeEventTitle',
+      );
+      await tester.enterText(
+        find.byType(TextFormField).last,
+        'fakeEventDescription',
+      );
+      await tester.enterText(
+        find.byType(TextFormField).at(1),
+        'fakeEventLocation',
+      );
+      databaseFunctions.init();
+
+      when(databaseFunctions.refreshAccessToken("testtoken"))
+          .thenAnswer((realInvocation) async {
+        return true;
+      });
+
+      when(
+        databaseFunctions.gqlAuthMutation(
+          EventQueries().addEvent(),
+          variables: {
+            'data': {
+              'startDate': DateFormat('yyyy-MM-dd').format(startMoment),
+              'endDate': DateFormat('yyyy-MM-dd').format(endMoment),
+              'organizationId': 'XYZ',
+              'title': model.eventTitleTextController.text,
+              'description': model.eventDescriptionTextController.text,
+              'location': model.eventLocationTextController.text,
+              'isPublic': model.isPublicSwitch,
+              'isRegisterable': model.isRegisterableSwitch,
+              'recurring': model.isRecurring,
+              'allDay': true,
+              'startTime': model.isAllDay
+                  ? null
+                  : '${DateFormat('HH:mm:ss').format(startMoment)}Z',
+              'endTime': model.isAllDay
+                  ? null
+                  : '${DateFormat('HH:mm:ss').format(endMoment)}Z',
+            },
+            if (model.isRecurring)
+              'recurrenceRuleData': {
+                'recurrenceStartDate':
+                    DateFormat('yyyy-MM-dd').format(model.recurrenceStartDate),
+                'recurrenceEndDate': model.recurrenceEndDate != null
+                    ? DateFormat('yyyy-MM-dd').format(model.recurrenceEndDate!)
+                    : null,
+                'frequency': model.frequency,
+                'weekDays': (model.frequency == Frequency.weekly ||
+                        (model.frequency == Frequency.monthly &&
+                            model.weekDayOccurenceInMonth != null))
+                    ? model.weekDays.toList()
+                    : null,
+                'interval': model.interval,
+                'count': model.count,
+                'weekDayOccurenceInMonth': model.weekDayOccurenceInMonth,
+              },
           },
         ),
       ).thenAnswer((_) async {
@@ -200,16 +379,83 @@ void main() {
               'location': model.eventLocationTextController.text,
               'isPublic': model.isPublicSwitch,
               'isRegisterable': model.isRegisterableSwitch,
-              'recurring': true,
-              'recurrance': 'WEEKLY',
+              'recurring': model.isRecurring,
               'allDay': true,
-              'startTime': '${DateFormat('HH:mm:ss').format(startMoment)}Z',
-              'endTime': '${DateFormat('HH:mm:ss').format(endMoment)}Z',
+              'startTime': model.isAllDay
+                  ? null
+                  : '${DateFormat('HH:mm:ss').format(startMoment)}Z',
+              'endTime': model.isAllDay
+                  ? null
+                  : '${DateFormat('HH:mm:ss').format(endMoment)}Z',
             },
-            'recurrenceRuleData': {
-              'frequency': 'WEEKLY',
-              'weekDays': ['TU'],
+            if (model.isRecurring)
+              'recurrenceRuleData': {
+                'recurrenceStartDate':
+                    DateFormat('yyyy-MM-dd').format(model.recurrenceStartDate),
+                'recurrenceEndDate': model.recurrenceEndDate != null
+                    ? DateFormat('yyyy-MM-dd').format(model.recurrenceEndDate!)
+                    : null,
+                'frequency': model.frequency,
+                'weekDays': (model.frequency == Frequency.weekly ||
+                        (model.frequency == Frequency.monthly &&
+                            model.weekDayOccurenceInMonth != null))
+                    ? model.weekDays.toList()
+                    : null,
+                'interval': model.interval,
+                'count': model.count,
+                'weekDayOccurenceInMonth': model.weekDayOccurenceInMonth,
+              },
+          },
+        ),
+      );
+
+      verify(navigationService.pop());
+
+      model.recurrenceEndDate = DateTime.now();
+      model.frequency = Frequency.monthly;
+      model.weekDayOccurenceInMonth = 1;
+
+      await model.createEvent();
+
+      verify(
+        databaseFunctions.gqlAuthMutation(
+          EventQueries().addEvent(),
+          variables: {
+            'data': {
+              'startDate': DateFormat('yyyy-MM-dd').format(startMoment),
+              'endDate': DateFormat('yyyy-MM-dd').format(endMoment),
+              'organizationId': 'XYZ',
+              'title': model.eventTitleTextController.text,
+              'description': model.eventDescriptionTextController.text,
+              'location': model.eventLocationTextController.text,
+              'isPublic': model.isPublicSwitch,
+              'isRegisterable': model.isRegisterableSwitch,
+              'recurring': model.isRecurring,
+              'allDay': true,
+              'startTime': model.isAllDay
+                  ? null
+                  : '${DateFormat('HH:mm:ss').format(startMoment)}Z',
+              'endTime': model.isAllDay
+                  ? null
+                  : '${DateFormat('HH:mm:ss').format(endMoment)}Z',
             },
+            if (model.isRecurring)
+              'recurrenceRuleData': {
+                'recurrenceStartDate':
+                    DateFormat('yyyy-MM-dd').format(model.recurrenceStartDate),
+                'recurrenceEndDate': model.recurrenceEndDate != null
+                    ? DateFormat('yyyy-MM-dd').format(model.recurrenceEndDate!)
+                    : null,
+                'frequency': model.frequency,
+                'weekDays': (model.frequency == Frequency.weekly ||
+                        (model.frequency == Frequency.monthly &&
+                            model.weekDayOccurenceInMonth != null))
+                    ? model.weekDays.toList()
+                    : null,
+                'interval': model.interval,
+                'count': model.count,
+                'weekDayOccurenceInMonth': model.weekDayOccurenceInMonth,
+              },
           },
         ),
       );
@@ -313,12 +559,19 @@ void main() {
       expect(isMemberFound, false);
     });

-    test('getRecurrence method', () {
+    test('setEventEndDate should set the event end date and notify listeners',
+        () {
       final model = CreateEventViewModel();
       model.initialize();
-      expect(model.getRecurrance(Recurrance.monthly), 'MONTHLY');
-      expect(model.getRecurrance(Recurrance.yearly), 'YEARLY');
-      expect(model.getRecurrance(Recurrance.once), null);
+
+      final newDate = DateTime.now().add(const Duration(days: 1));
+      final notifyListenerCallback = MockCallbackFunction();
+      model.addListener(notifyListenerCallback);
+
+      model.setEventEndDate(newDate);
+
+      expect(model.eventEndDate, newDate);
+      verify(notifyListenerCallback()).called(1);
     });
   });
 }
diff --git a/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/explore_events_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/explore_events_view_model_test.dart
index 7c157e70be..294e7e79a3 100644
--- a/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/explore_events_view_model_test.dart
+++ b/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/explore_events_view_model_test.dart
@@ -75,7 +75,6 @@ void main() {
       endDate: '2024-01-14',
       startTime: '08:01:00.000Z',
       endTime: '08:50:00.000Z',
-      recurrence: "none",
       creator: User(id: 'Test Id'),
       isPublic: true,
       isRegistered: true,
diff --git a/test/views/after_auth_screens/events/create_custom_recurring_event_test.dart b/test/views/after_auth_screens/events/create_custom_recurring_event_test.dart
index b4997ad425..9043883d4b 100644
--- a/test/views/after_auth_screens/events/create_custom_recurring_event_test.dart
+++ b/test/views/after_auth_screens/events/create_custom_recurring_event_test.dart
@@ -21,6 +21,7 @@ import '../../../helpers/test_locator.dart';
 /// **params**:
 /// * `themeMode`: ThemeMode
 /// * `theme`: ThemeData of App
+/// * `model`: CreateEventViewModel
 ///
 /// **returns**:
 /// * `Widget`: Event Screen Widget
@@ -65,6 +66,125 @@ void main() {
   // tearDown(() {
   //   unregisterServices();
   // });
+
+  group("RecurrenceUtils", () {
+    test("getRecurrenceRuleText for Frequency Daily", () {
+      final ruleText = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.daily,
+        null,
+        2,
+        null,
+        null,
+        DateTime(2024, 1, 1),
+        null,
+      );
+      expect(ruleText, 'Every 2 days');
+
+      final ruleText2 = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.daily,
+        null,
+        1,
+        null,
+        null,
+        DateTime(2024, 1, 1),
+        null,
+      );
+      expect(ruleText2, 'Daily');
+    });
+
+    test("getRecurrenceRuleText for Frequency Weekly", () {
+      final ruleText = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.weekly,
+        {'MONDAY'},
+        2,
+        null,
+        null,
+        DateTime(2024, 1, 1),
+        null,
+      );
+      expect(ruleText, 'Every 2 weeks on Monday');
+
+      final ruleText2 = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.weekly,
+        {'MONDAY'},
+        1,
+        null,
+        null,
+        DateTime(2024, 1, 1),
+        null,
+      );
+      expect(ruleText2, 'Weekly on Monday');
+    });
+
+    test("getRecurrenceRuleText for Frequency Monthly", () {
+      final ruleText = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.monthly,
+        null,
+        2,
+        null,
+        2,
+        DateTime(2024, 1, 1),
+        null,
+      );
+      expect(ruleText, 'Every 2 months on Second Monday');
+
+      final ruleText2 = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.monthly,
+        null,
+        1,
+        null,
+        null,
+        DateTime(2024, 1, 1),
+        null,
+      );
+      expect(ruleText2, 'Monthly on Day 1');
+    });
+
+    test("getRecurrenceRuleText for Frequency Yearly", () {
+      final ruleText = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.yearly,
+        null,
+        3,
+        null,
+        null,
+        DateTime(2024, 1, 1),
+        null,
+      );
+      expect(ruleText, 'Every 3 years on January 1');
+
+      final ruleText2 = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.yearly,
+        null,
+        1,
+        null,
+        null,
+        DateTime(2024, 1, 1),
+        null,
+      );
+      expect(ruleText2, 'Annually on January 1');
+    });
+
+    test('getWeekDaysString formats string correctly', () {
+      final weekDaysString = RecurrenceUtils.getWeekDaysString([
+        WeekDays.monday,
+        WeekDays.tuesday,
+        WeekDays.wednesday,
+      ]);
+      expect(weekDaysString, 'Monday, Tuesday & Wednesday');
+    });
+
+    test('isLastOccurenceOfWeekDay returns true for last occurrence', () {
+      final date = DateTime(2022, 1, 31); // Last Monday of January 2022
+      final isLastOccurrence = RecurrenceUtils.isLastOccurenceOfWeekDay(date);
+      expect(isLastOccurrence, true);
+    });
+
+    test('isLastOccurenceOfWeekDay returns false for not last occurrence', () {
+      final date = DateTime(2022, 1, 24); // Not the last Monday of January 2022
+      final isLastOccurrence = RecurrenceUtils.isLastOccurenceOfWeekDay(date);
+      expect(isLastOccurrence, false);
+    });
+  });
   group('Test custom recurrence page.', () {
     testWidgets('Appbar is being rendered as expected.', (tester) async {
       await tester.pumpWidget(
@@ -72,17 +192,11 @@ void main() {
           theme: TalawaTheme.darkTheme,
         ),
       );
-      await tester.pump();
-
+      await tester.pumpAndSettle();
       final appBarFinder = find.byType(AppBar);

-      // verify if AppBar renders.
       expect(appBarFinder, findsOne);
-
-      // Verify if the AppBar renders with the correct title
       expect(find.text('Custom recurrence'), findsOneWidget);
-
-      // Verify if the Done button is present
       expect(find.text('Done'), findsOneWidget);
     });

@@ -93,9 +207,7 @@ void main() {
         ),
       );
       await tester.pump();
-
       final customDividerFinder = find.byType(Divider);
-
       expect(customDividerFinder, findsNWidgets(2));
     });

@@ -127,10 +239,12 @@ void main() {
       expect(customTextFieldFinder, findsNWidgets(2));
     });

-    testWidgets('section1InputFields', (tester) async {
+    testWidgets('Check functionality of Interval Frequency', (tester) async {
+      final model = CreateEventViewModel();
       await tester.pumpWidget(
         createCustomRecurrenceScreen(
           theme: TalawaTheme.darkTheme,
+          model: model,
         ),
       );
       await tester.pump();
@@ -153,7 +267,7 @@ void main() {
       // Test RecurrenceFrequencyDropdown
       expect(find.text("week"), findsOne);

-      final popupMenuButton = find.byType(PopupMenuButton<String>);
+      final popupMenuButton = find.byType(PopupMenuButton<String>).first;

       await tester.tap(popupMenuButton);
       await tester.pumpAndSettle();
@@ -162,26 +276,138 @@ void main() {
       expect(find.text("month"), findsOne);
       expect(find.text("year"), findsOne);

-      // Test dropdown selection working.
-      await tester.tap(find.text("month"));
+      // check functionality of interval frequency day
+      await tester.tap(find.text(EventIntervals.daily));
+      await tester.pumpAndSettle();
+
+      expect(model.frequency, Frequency.daily);
+      expect(model.recurrenceInterval, EventIntervals.daily);
+      expect(model.weekDayOccurenceInMonth, null);
+      expect(model.weekDays, []);
+
+      // check functionality of interval frequency week
+      await tester.tap(popupMenuButton);
+      await tester.pumpAndSettle();
+      await tester.tap(find.text(EventIntervals.weekly));
+      await tester.pumpAndSettle();
+
+      expect(model.frequency, Frequency.weekly);
+      expect(model.recurrenceInterval, EventIntervals.weekly);
+      expect(model.weekDayOccurenceInMonth, null);
+      expect(model.weekDays, []);
+
+      // check functionality of interval frequency week
+      await tester.tap(popupMenuButton);
       await tester.pumpAndSettle();
+      await tester.tap(find.text(EventIntervals.monthly));
+      await tester.pumpAndSettle();
+
+      expect(model.frequency, Frequency.monthly);
+      expect(model.recurrenceInterval, EventIntervals.monthly);
+      expect(model.weekDayOccurenceInMonth, null);
+      expect(model.weekDays, []);
+
+      // check functionality of interval frequency year
+      await tester.tap(popupMenuButton);
+      await tester.pumpAndSettle();
+      await tester.tap(find.text(EventIntervals.yearly));
+      await tester.pumpAndSettle();
+
+      expect(model.frequency, Frequency.yearly);
+      expect(model.recurrenceInterval, EventIntervals.yearly);
+      expect(model.weekDayOccurenceInMonth, null);
+      expect(model.weekDays, []);
+    });
+
+    testWidgets("Dropdown for Monthly frequency", (tester) async {
+      final model = CreateEventViewModel();
+      model.recurrenceStartDate = DateTime(2023, 02, 28);
+      await tester.pumpWidget(
+        createCustomRecurrenceScreen(
+          theme: TalawaTheme.darkTheme,
+          model: model,
+        ),
+      );
+      await tester.pump();

+      final frequencyDropdown = find.byType(PopupMenuButton<String>).first;
+      await tester.tap(frequencyDropdown);
+      await tester.pumpAndSettle();
+
+      expect(find.text("day"), findsOne);
       expect(find.text("month"), findsOne);
+      expect(find.text("year"), findsOne);
+
+      // select interval frequency as month
+      await tester.tap(find.text("month"));
+      await tester.pumpAndSettle();

-      // check if monthly recurrence dropdown shows up.
-      await tester.tap(find.text('Monthly on day 3'));
+      await tester.tap(find.byType(PopupMenuButton<String>).last);
       await tester.pumpAndSettle();
-      await tester.tap(find.text('Monthly on day 3').last);
+
+      // check all the functionality of dropdown option shown on isLastDayOccurence is true (monthlyOption[2])
+      final monthlyRecurrenceLabel1 = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.monthly,
+        {
+          RecurrenceUtils.weekDays[model.recurrenceStartDate.weekday - 1],
+        },
+        int.parse(model.repeatsEveryCountController.text),
+        int.parse(model.endOccurenceController.text),
+        -1,
+        model.recurrenceStartDate,
+        model.recurrenceEndDate,
+      );
+      expect(
+        find.text(monthlyRecurrenceLabel1),
+        findsOne,
+      );
+
+      await tester.tap(find.text(monthlyRecurrenceLabel1));
       await tester.pumpAndSettle();

-      // check if interval UI's middle part dissappears
-      // when clicked on day/year.
-      await tester.tap(find.text('month'));
+      expect(model.frequency, Frequency.monthly);
+      expect(model.recurrenceLabel, monthlyRecurrenceLabel1);
+      expect(model.weekDayOccurenceInMonth, -1);
+      expect(model.weekDays, {
+        RecurrenceUtils.weekDays[model.recurrenceStartDate.weekday - 1],
+      });
+
+      // check all the functionality of dropdown option shown when weekDayOccurence~=5 (monthlyOption[1])
+      await tester.tap(find.byType(PopupMenuButton<String>).last);
       await tester.pumpAndSettle();
-      await tester.tap(find.text('year'));
+
+      final monthlyRecurrenceLabel2 = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.monthly,
+        {
+          RecurrenceUtils.weekDays[model.recurrenceStartDate.weekday - 1],
+        },
+        int.parse(model.repeatsEveryCountController.text),
+        int.parse(model.endOccurenceController.text),
+        RecurrenceUtils.getWeekDayOccurenceInMonth(
+          model.recurrenceStartDate,
+        ),
+        model.recurrenceStartDate,
+        model.recurrenceEndDate,
+      );
+      expect(
+        find.text(monthlyRecurrenceLabel2),
+        findsOne,
+      );
+
+      await tester.tap(find.text(monthlyRecurrenceLabel2));
       await tester.pumpAndSettle();

-      expect(find.text('Monthly on day 3'), findsNothing);
+      expect(model.frequency, Frequency.monthly);
+      expect(model.recurrenceLabel, monthlyRecurrenceLabel2);
+      expect(
+        model.weekDayOccurenceInMonth,
+        RecurrenceUtils.getWeekDayOccurenceInMonth(
+          model.recurrenceStartDate,
+        ),
+      );
+      expect(model.weekDays, {
+        RecurrenceUtils.weekDays[model.recurrenceStartDate.weekday - 1],
+      });
     });

     testWidgets('CustomWeekDaySelector', (tester) async {
@@ -191,10 +417,8 @@ void main() {
       await tester.pumpWidget(widget);
       await tester.pump();

-      // Test widget rendering.
       expect(find.byType(CustomWeekDaySelector), findsOne);

-      // Test widget functionality.
       await tester.tap(find.text("M"));
       await tester.pumpAndSettle();
       await tester.tap(find.text("W"));
@@ -250,13 +474,13 @@ void main() {

       expect(find.byType(DatePickerDialog), findsNothing);

-      await tester.tap(find.text('Never'));
+      await tester.tap(find.text('never'));
       await tester.pumpAndSettle();

       expect(model.eventEndType, EventEndTypes.never);
-      expect(model.eventEndDate, null);
+      expect(model.recurrenceEndDate, null);

-      await tester.tap(find.text('On'));
+      await tester.tap(find.text('on'));
       await tester.pumpAndSettle();

       expect(model.eventEndType, EventEndTypes.on);
@@ -274,17 +498,15 @@ void main() {
       await tester.tap(find.text('Done'));
       await tester.pumpAndSettle();

-      expect(model.eventEndDate, null);
+      expect(model.recurrenceEndDate, null);

-      await tester.tap(find.text('On'));
+      await tester.tap(find.text('on'));
       await tester.pumpAndSettle();

       await tester.tap(find.text('Done'));
       await tester.pumpAndSettle();

-      expect(model.eventEndDate, model.eventEndOnEndDate);
-
-      await tester.tap(find.text('After'));
+      await tester.tap(find.text('after'));
       await tester.pumpAndSettle();

       final afterTextField = find.byType(CustomTextField).last;
diff --git a/test/views/after_auth_screens/events/create_event_page_test.dart b/test/views/after_auth_screens/events/create_event_page_test.dart
index 5d5f5eb7a3..c947afb148 100644
--- a/test/views/after_auth_screens/events/create_event_page_test.dart
+++ b/test/views/after_auth_screens/events/create_event_page_test.dart
@@ -1,5 +1,4 @@
 import 'dart:io';
-
 import 'package:flutter/material.dart';
 import 'package:flutter_localizations/flutter_localizations.dart';
 import 'package:flutter_test/flutter_test.dart';
@@ -21,11 +20,22 @@ import '../../../helpers/test_helpers.dart';
 import '../../../helpers/test_locator.dart';
 import '../../../widget_tests/after_auth_screens/events/create_event_form_test.dart';

+/// Mock class instance of CallbackFunction.
 class MockCallbackFunction extends Mock {
+  /// Mock function call.
+  ///
+  /// **params**:
+  ///   None
+  ///
+  /// **returns**:
+  ///   None
   void call();
 }

+/// mock instance for setDateCallback.
 final setDateCallback = MockCallbackFunction();
+
+/// mock instance for setTimeCallback.
 final setTimeCallback = MockCallbackFunction();

 /// Creates a EventScreen for tests.
@@ -79,7 +89,7 @@ void main() {
   tearDown(() {
     unregisterServices();
   });
-  group('testing', () {
+  group('testing -> CreateEventPage', () {
     testWidgets("Checking tap Inkwell for setDate 1 datetime", (tester) async {
       await tester.pumpWidget(
         createEventScreen(
@@ -87,25 +97,26 @@ void main() {
           theme: TalawaTheme.darkTheme,
         ),
       );
+
+      await tester.pumpAndSettle();
+
+      final switches = find.descendant(
+        of: find.byType(Row),
+        matching: find.byType(Switch),
+      );
+      expect(switches, findsNWidgets(3));
+      expect((tester.widgetList(switches).toList()[0] as Switch).value, true);
+      await tester.ensureVisible(switches.at(0));
+      await tester.tap(switches.at(1));
+
       await tester.pump();
       final inkwellFinder = find.byType(InkWell);
       expect(inkwellFinder, findsNWidgets(8));
-      // tester.allElements.forEach((element) {
-      //   print(element);
-      // });

-      ///returning the file variable to the
-      ///result of function multimediaPickerService.getPhotoFromGallery
-      ///when this function is called in the
-      ///view model of add_post_page.
       final file = File('fakePath');

-      /// using the new instance of multimediaPickerService
-      /// so that when statement can be used again,
-      /// else it gives null point exception
       final multimediaPickerService = locator<MultiMediaPickerService>();

-      /// when is function provided by mockito lib
       when(multimediaPickerService.getPhotoFromGallery(camera: false))
           .thenAnswer((_) async {
         return file;
@@ -122,22 +133,25 @@ void main() {
           theme: TalawaTheme.darkTheme,
         ),
       );
+      await tester.pumpAndSettle();
+
+      final switches = find.descendant(
+        of: find.byType(Row),
+        matching: find.byType(Switch),
+      );
+      expect(switches, findsNWidgets(3));
+      expect((tester.widgetList(switches).toList()[0] as Switch).value, true);
+      await tester.ensureVisible(switches.at(0));
+      await tester.tap(switches.at(1));
+
       await tester.pump();
       final inkwellFinder = find.byType(InkWell);
       expect(inkwellFinder, findsNWidgets(8));

-      ///returning the file variable to the
-      ///result of function multimediaPickerService.getPhotoFromGallery
-      ///when this function is called in the
-      ///view model of add_post_page.
       final file = File('fakePath');

-      /// using the new instance of multimediaPickerService
-      /// so that when statement can be used again,
-      /// else it gives null point exception
       final multimediaPickerService = locator<MultiMediaPickerService>();

-      /// when is function provided by mockito lib
       when(multimediaPickerService.getPhotoFromGallery(camera: false))
           .thenAnswer((_) async {
         return file;
@@ -174,31 +188,13 @@ void main() {
       );
       await tester.pumpAndSettle();

-      const List<String> frequencies = [
-        "Does not repeat",
-        "Every day",
-        "Every week",
-        "Every month",
-        "Every year",
-        "Custom...",
-      ];
-
-      String prev = frequencies[0];
-      for (int i = 1; i < 5; i++) {
-        expect(find.text(prev), findsAny);
-        await tester.tap(find.text(prev));
-        await tester.pumpAndSettle();
-        await tester.tap(find.text(frequencies[i]).last);
-        await tester.pumpAndSettle();
-        expect(find.byType(ShowRecurrenceDialog), findsNothing);
-        expect(find.text(frequencies[i]), findsOneWidget);
-        prev = frequencies[i];
-      }
+      const String prev = "Does not repeat";

       expect(find.text(prev), findsAny);
+      await tester.ensureVisible(find.byKey(const Key("inkwell_recurrLabel")));
       await tester.tap(find.text(prev));
       await tester.pumpAndSettle();
-      await tester.tap(find.text(frequencies[5]));
+      await tester.tap(find.text("Custom..."));
       await tester.pumpAndSettle();

       expect(find.byType(ShowRecurrenceDialog), findsNothing);
@@ -211,22 +207,26 @@ void main() {
           theme: TalawaTheme.darkTheme,
         ),
       );
+
+      await tester.pumpAndSettle();
+
+      final switches = find.descendant(
+        of: find.byType(Row),
+        matching: find.byType(Switch),
+      );
+      expect(switches, findsNWidgets(3));
+      expect((tester.widgetList(switches).toList()[0] as Switch).value, true);
+      await tester.ensureVisible(switches.at(0));
+      await tester.tap(switches.at(1));
+
       await tester.pump();
       final inkwellFinder = find.byType(InkWell);
       expect(inkwellFinder, findsNWidgets(8));

-      ///returning the file variable to the
-      ///result of function multimediaPickerService.getPhotoFromGallery
-      ///when this function is called in the
-      ///view model of add_post_page.
       final file = File('fakePath');

-      /// using the new instance of multimediaPickerService
-      /// so that when statement can be used again,
-      /// else it gives null point exception
       final multimediaPickerService = locator<MultiMediaPickerService>();

-      /// when is function provided by mockito lib
       when(multimediaPickerService.getPhotoFromGallery(camera: false))
           .thenAnswer((_) async {
         return file;
@@ -243,25 +243,26 @@ void main() {
           theme: TalawaTheme.darkTheme,
         ),
       );
+
+      await tester.pumpAndSettle();
+
+      final switches = find.descendant(
+        of: find.byType(Row),
+        matching: find.byType(Switch),
+      );
+      expect(switches, findsNWidgets(3));
+      expect((tester.widgetList(switches).toList()[0] as Switch).value, true);
+      await tester.ensureVisible(switches.at(0));
+      await tester.tap(switches.at(1));
+
       await tester.pump();
       final inkwellFinder = find.byType(InkWell);
       expect(inkwellFinder, findsNWidgets(8));
-      // tester.allElements.forEach((element) {
-      //   print(element);
-      // });

-      ///returning the file variable to the
-      ///result of function multimediaPickerService.getPhotoFromGallery
-      ///when this function is called in the
-      ///view model of add_post_page.
       final file = File('fakePath');

-      /// using the new instance of multimediaPickerService
-      /// so that when statement can be used again,
-      /// else it gives null point exception
       final multimediaPickerService = locator<MultiMediaPickerService>();

-      /// when is function provided by mockito lib
       when(multimediaPickerService.getPhotoFromGallery(camera: false))
           .thenAnswer((_) async {
         return file;
@@ -281,25 +282,12 @@ void main() {
       );
       await tester.pump();

-      /// using the key of icon button
-      /// because their are many icon button
-
       final finder = find.byKey(const Key('txt_btn_cep'));

       expect(finder, findsOneWidget);
-
-      ///returning the file variable to the
-      ///result of function multimediaPickerService.getPhotoFromGallery
-      ///when this function is called in the
-      ///view model of add_post_page.
       final file = File('fakePath');
-
-      /// using the new instance of multimediaPickerService
-      /// so that when statement can be used again,
-      /// else it gives null point exception
       final multimediaPickerServices = locator<MultiMediaPickerService>();

-      /// when is function provided by mockito lib
       when(multimediaPickerServices.getPhotoFromGallery())
           .thenAnswer((_) async {
         return file;
@@ -331,18 +319,10 @@ void main() {

       expect(finder, findsOneWidget);

-      ///returning the file variable to the
-      ///result of function multimediaPickerService.getPhotoFromGallery
-      ///when this function is called in the
-      ///view model of add_post_page.
       final file = File('fakePath');

-      /// using the new instance of multimediaPickerService
-      /// so that when statement can be used again,
-      /// else it gives null point exception
       final multimediaPickerService = locator<MultiMediaPickerService>();

-      /// when is function provided by mockito lib
       when(multimediaPickerService.getPhotoFromGallery(camera: false))
           .thenAnswer((_) async {
         return file;
@@ -509,6 +489,18 @@ void main() {
           theme: TalawaTheme.darkTheme,
         ),
       );
+
+      await tester.pumpAndSettle();
+
+      final switches = find.descendant(
+        of: find.byType(Row),
+        matching: find.byType(Switch),
+      );
+      expect(switches, findsNWidgets(3));
+      expect((tester.widgetList(switches).toList()[0] as Switch).value, true);
+      await tester.ensureVisible(switches.at(0));
+      await tester.tap(switches.at(1));
+
       await tester.pump();
       final inkwellFinder = find.byType(InkWell);
       expect(inkwellFinder, findsNWidgets(8));
@@ -558,6 +550,36 @@ void main() {
           findsNWidgets(2),
         );
       });
+
+      testWidgets('Test end date selection', (tester) async {
+        await tester.pumpWidget(
+          createEventScreen(
+            themeMode: ThemeMode.dark,
+            theme: TalawaTheme.darkTheme,
+          ),
+        );
+
+        await tester.pumpAndSettle();
+
+        final switches = find.descendant(
+          of: find.byType(Row),
+          matching: find.byType(Switch),
+        );
+        expect(switches, findsNWidgets(3));
+        expect((tester.widgetList(switches).toList()[0] as Switch).value, true);
+        await tester.ensureVisible(switches.at(0));
+        await tester.tap(switches.at(1));
+
+        await tester.pump();
+
+        await tester.tap(find.byKey(const Key('EventDateTimeTileDate')).last);
+        await tester.pump();
+
+        await tester.tap(find.text('OK'));
+        await tester.pumpAndSettle();
+        expect(find.text('Does not repeat'), findsOneWidget);
+      });
+
       testWidgets('Tap on DateTimeTile time', (tester) async {
         final currentTime = DateTime.now();
         final futureTime = currentTime.add(const Duration(minutes: 30));
@@ -569,6 +591,16 @@ void main() {
         );
         await tester.pumpAndSettle();

+        final switches = find.descendant(
+          of: find.byType(Row),
+          matching: find.byType(Switch),
+        );
+        expect(switches, findsNWidgets(3));
+        expect((tester.widgetList(switches).toList()[0] as Switch).value, true);
+        await tester.ensureVisible(switches.at(0));
+        await tester.tap(switches.at(1));
+
+        await tester.pump();
         await tester.tap(find.byKey(const Key('EventDateTimeTileTime')).first);
         await tester.pump();

@@ -593,6 +625,18 @@ void main() {
             theme: TalawaTheme.darkTheme,
           ),
         );
+
+        await tester.pumpAndSettle();
+
+        final switches = find.descendant(
+          of: find.byType(Row),
+          matching: find.byType(Switch),
+        );
+        expect(switches, findsNWidgets(3));
+        expect((tester.widgetList(switches).toList()[0] as Switch).value, true);
+        await tester.ensureVisible(switches.at(0));
+        await tester.tap(switches.at(1));
+
         await tester.pump();

         await tester.tap(find.byKey(const Key('EventDateTimeTileDate')).last);
@@ -622,6 +666,16 @@ void main() {
         );
         await tester.pumpAndSettle();

+        final switches = find.descendant(
+          of: find.byType(Row),
+          matching: find.byType(Switch),
+        );
+        expect(switches, findsNWidgets(3));
+        expect((tester.widgetList(switches).toList()[0] as Switch).value, true);
+        await tester.ensureVisible(switches.at(0));
+        await tester.tap(switches.at(1));
+
+        await tester.pump();
         await tester.tap(find.byKey(const Key('EventDateTimeTileTime')).last);
         await tester.pump();

@@ -642,11 +696,12 @@ void main() {
     });

     group("Tests for integration with view model and services", () {
-      late final CreateEventViewModel cachedViewModel;
+      late final CreateEventViewModel cachedViewModel =
+          getAndRegisterCreateEventModel();

-      testWidgets("setup MockCreateEventViewModel", (tester) async {
-        cachedViewModel = getAndRegisterCreateEventModel();
-      });
+      // testWidgets("setup MockCreateEventViewModel", (tester) async {
+      //   cachedViewModel = getAndRegisterCreateEventModel();
+      // });

       testWidgets("Check if AppBar buttons work", (tester) async {
         mockNetworkImages(() async {
@@ -709,12 +764,9 @@ void main() {
         await tester.ensureVisible(find.byKey(const Key('text_btn_ambs1')));
         await tester.pumpAndSettle();

-        await tester.tap(find.byType(CheckboxListTile));
-        expect(cachedViewModel.memberCheckedMap['fakeUser1'], false);
-        await tester.pumpAndSettle();
-        await tester.tap(find.byType(CheckboxListTile));
+        await tester.tap(find.byType(CheckboxListTile).first);
         expect(cachedViewModel.memberCheckedMap['fakeUser1'], true);
-        await tester.pump();
+        await tester.pumpAndSettle();
       });

       testWidgets(
diff --git a/test/views/after_auth_screens/events/event_info_body_test.dart b/test/views/after_auth_screens/events/event_info_body_test.dart
index e1804b6cf8..b7b8b5bba3 100644
--- a/test/views/after_auth_screens/events/event_info_body_test.dart
+++ b/test/views/after_auth_screens/events/event_info_body_test.dart
@@ -36,8 +36,6 @@ Event getTestEvent({
     startTime: "00:00",
     endTime: "24:00",
     location: "iitbhu, varanasi",
-    latitude: viewOnMap ? 40.730610 : null,
-    longitude: viewOnMap ? -73.935242 : null,
     description: "test_event_description",
     admins: [
       User(
@@ -57,7 +55,6 @@ Event getTestEvent({
       ),
     ],
     isRegisterable: true,
-    isRegistered: false,
   );
 }

diff --git a/test/views/after_auth_screens/profile/user_event_test.dart b/test/views/after_auth_screens/profile/user_event_test.dart
index 0d39be40d8..c210b26eb5 100644
--- a/test/views/after_auth_screens/profile/user_event_test.dart
+++ b/test/views/after_auth_screens/profile/user_event_test.dart
@@ -139,15 +139,12 @@ void main() {
           title: 'Sample Event',
           description: 'This is a fake event description.',
           location: 'City Park',
-          latitude: 40.7128,
-          longitude: -74.0060,
           recurring: false,
           allDay: false,
           startDate: '2022-01-01',
           endDate: '2022-01-02',
           startTime: '12:00 PM',
           endTime: '3:00 PM',
-          recurrence: 'Weekly',
           isPublic: true,
           isRegistered: false,
           isRegisterable: true,
diff --git a/test/widget_tests/after_auth_screens/events/create_event_page_test.dart b/test/widget_tests/after_auth_screens/events/create_event_page_test.dart
index 55e8f5d6fb..c3a33cbf58 100644
--- a/test/widget_tests/after_auth_screens/events/create_event_page_test.dart
+++ b/test/widget_tests/after_auth_screens/events/create_event_page_test.dart
@@ -1,6 +1,3 @@
-// ignore_for_file: talawa_api_doc
-// ignore_for_file: talawa_good_doc_comments
-
 import 'package:flutter/material.dart';
 import 'package:flutter_localizations/flutter_localizations.dart';
 import 'package:flutter_test/flutter_test.dart';
@@ -16,6 +13,14 @@ import 'package:talawa/views/base_view.dart';
 import 'package:talawa/widgets/event_date_time_tile.dart';
 import 'package:talawa/widgets/member_name_tile.dart';

+/// Creates an instance of CreateEventScreen with the given parameters.
+///
+/// **params**:
+/// * `themeMode`: ThemeMode of the app
+/// * `theme`: ThemeData of the app
+///
+/// **returns**:
+/// * `Widget`: return the CreateEventScreen widget
 Widget createEventScreen({
   ThemeMode themeMode = ThemeMode.light,
   required ThemeData theme,
@@ -277,7 +282,7 @@ void main() {
           navigationService.navigatorKey.currentContext!,
         );
         final textDesc = find.text(
-          appLocalization!.strictTranslate('Select Start Date and Time'),
+          appLocalization!.strictTranslate('Select Start Date'),
         );
         final dateTimeTiles = find.byType(DateTimeTile);
         expect(textDesc, findsOneWidget);
@@ -299,7 +304,7 @@ void main() {
           navigationService.navigatorKey.currentContext!,
         );
         final textDesc = find.text(
-          appLocalization!.strictTranslate('Select End Date and Time'),
+          appLocalization!.strictTranslate('Select End Date'),
         );
         final dateTimeTiles = find.byType(DateTimeTile);
         expect(textDesc, findsOneWidget);
diff --git a/test/widget_tests/after_auth_screens/events/event_info_page_test.dart b/test/widget_tests/after_auth_screens/events/event_info_page_test.dart
index 752b2506ce..054f21ce9e 100644
--- a/test/widget_tests/after_auth_screens/events/event_info_page_test.dart
+++ b/test/widget_tests/after_auth_screens/events/event_info_page_test.dart
@@ -1,8 +1,3 @@
-// ignore_for_file: talawa_api_doc
-// ignore_for_file: talawa_good_doc_comments
-
-// ignore_for_file: avoid_positional_boolean_parameters
-
 import 'package:flutter/material.dart';
 import 'package:flutter_localizations/flutter_localizations.dart';
 import 'package:flutter_test/flutter_test.dart';
@@ -19,6 +14,14 @@ import 'package:talawa/views/after_auth_screens/events/event_info_page.dart';

 import '../../../helpers/test_helpers.dart';

+/// Creates an instance of Event with the given parameters.
+///
+/// **params**:
+/// * `isPublic`: event is public or not
+/// * `isCreator`: user is creator of the event or not
+///
+/// **returns**:
+/// * `Event`: return the Event instance
 Event getEvent(bool isPublic, bool isCreator) {
   return Event(
     id: '1',
@@ -37,8 +40,6 @@ Event getEvent(bool isPublic, bool isCreator) {
     ),
     startDate: '10000',
     endDate: '20000',
-    latitude: 23.45,
-    longitude: -23.45,
     admins: [
       User(
         id: isCreator ? "xzy1" : "abc1",
@@ -51,6 +52,14 @@ Event getEvent(bool isPublic, bool isCreator) {
   );
 }

+/// Creates an instance of EventInfoPage with the given parameters.
+///
+/// **params**:
+/// * `isPublic`: whether the event is public or not
+/// * `isCreator`: whether the user is the creator of the event or not
+///
+/// **returns**:
+/// * `Widget`: return the EventInfoPage widget
 Widget createEventInfoPage(bool isPublic, bool isCreator) {
   return MaterialApp(
     localizationsDelegates: [
diff --git a/test/widget_tests/widgets/event_date_time_tile_test.dart b/test/widget_tests/widgets/event_date_time_tile_test.dart
index 7e7291f706..4fb0c6e0de 100644
--- a/test/widget_tests/widgets/event_date_time_tile_test.dart
+++ b/test/widget_tests/widgets/event_date_time_tile_test.dart
@@ -1,6 +1,3 @@
-// ignore_for_file: talawa_api_doc
-// ignore_for_file: talawa_good_doc_comments
-
 import 'package:flutter/material.dart';
 import 'package:flutter_test/flutter_test.dart';
 import 'package:mockito/mockito.dart';
@@ -10,17 +7,36 @@ import 'package:talawa/widgets/event_date_time_tile.dart';
 import '../../helpers/test_helpers.dart';
 import '../../helpers/test_locator.dart';

+/// Instance of callback function.
 class MockCallbackFunction extends Mock {
+  /// Callback function.
+  ///
+  /// **params**:
+  ///   None
+  ///
+  /// **returns**:
+  ///   None
   void call();
 }

+/// A callback function to set date.
 final setDateCallback = MockCallbackFunction();
+
+/// A callback function to set time.
 final setTimeCallback = MockCallbackFunction();

+/// Creates a widget for testing.
+///
+/// **params**:
+///   None
+///
+/// **returns**:
+/// * `Widget`: Returns mocked Material App Widget
 Widget createWidget() {
   return MaterialApp(
     home: Scaffold(
       body: DateTimeTile(
+        isAllDay: false,
         date: "fakeDate",
         time: "fakeTime",
         setDate: setDateCallback,
diff --git a/test/widget_tests/widgets/recurrence_dialog_test.dart b/test/widget_tests/widgets/recurrence_dialog_test.dart
new file mode 100644
index 0000000000..6909cf2bc0
--- /dev/null
+++ b/test/widget_tests/widgets/recurrence_dialog_test.dart
@@ -0,0 +1,257 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:intl/intl.dart';
+import 'package:talawa/constants/recurrence_values.dart';
+import 'package:talawa/services/size_config.dart';
+import 'package:talawa/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart';
+import 'package:talawa/widgets/recurrence_dialog.dart';
+
+import '../../helpers/test_helpers.dart';
+import '../../helpers/test_locator.dart';
+
+void main() {
+  group('ShowRecurrenceDialog', () {
+    TestWidgetsFlutterBinding.ensureInitialized();
+    testSetupLocator();
+    locator<SizeConfig>().test();
+    late CreateEventViewModel model;
+
+    setUp(() {
+      locator<SizeConfig>().test();
+      registerServices();
+      model = CreateEventViewModel();
+      model.initialize();
+    });
+
+    tearDown(() => unregisterServices());
+
+    testWidgets('shows correct initial values', (tester) async {
+      await tester.pumpWidget(
+        MaterialApp(
+          home: ShowRecurrenceDialog(model: model),
+        ),
+      );
+
+      expect(find.text('Does not repeat'), findsOneWidget);
+      expect(find.text('Daily'), findsOneWidget);
+      expect(
+        find.text(
+          RecurrenceUtils.getRecurrenceRuleText(
+            Frequency.weekly,
+            {RecurrenceUtils.weekDays[model.recurrenceStartDate.weekday - 1]},
+            model.interval,
+            model.count,
+            model.weekDayOccurenceInMonth,
+            model.recurrenceStartDate,
+            model.recurrenceEndDate,
+          ),
+        ),
+        findsOneWidget,
+      );
+      expect(
+        find.text(
+          RecurrenceUtils.getRecurrenceRuleText(
+            Frequency.monthly,
+            null,
+            model.interval,
+            model.count,
+            model.weekDayOccurenceInMonth,
+            model.recurrenceStartDate,
+            model.recurrenceEndDate,
+          ),
+        ),
+        findsOneWidget,
+      );
+      expect(
+        find.text(
+          RecurrenceUtils.getRecurrenceRuleText(
+            Frequency.yearly,
+            null,
+            model.interval,
+            model.count,
+            model.weekDayOccurenceInMonth,
+            model.recurrenceStartDate,
+            model.recurrenceEndDate,
+          ),
+        ),
+        findsOneWidget,
+      );
+      expect(
+        find.text(
+          'Monday to Friday ${model.recurrenceEndDate != null ? "until ${DateFormat('MMMM d, y').format(model.recurrenceEndDate!)}" : ""}',
+        ),
+        findsOneWidget,
+      );
+      expect(find.text('Custom...'), findsOneWidget);
+    });
+
+    testWidgets('shows correct initial values for last weekday occurrence',
+        (tester) async {
+      model.recurrenceStartDate = DateTime(2023, 02, 28);
+      await tester.pumpWidget(
+        MaterialApp(
+          home: ShowRecurrenceDialog(model: model),
+        ),
+      );
+
+      expect(
+        find.text(
+          RecurrenceUtils.getRecurrenceRuleText(
+            Frequency.monthly,
+            {'TUESDAY'},
+            model.interval,
+            model.count,
+            -1,
+            model.recurrenceStartDate,
+            model.recurrenceEndDate,
+          ),
+        ),
+        findsOneWidget,
+      );
+    });
+
+    testWidgets('updates model when Does not repeat is selected',
+        (tester) async {
+      await tester.pumpWidget(
+        MaterialApp(
+          home: ShowRecurrenceDialog(model: model),
+        ),
+      );
+
+      await tester.tap(find.text('Does not repeat'));
+      await tester.pump();
+
+      expect(model.isRecurring, false);
+      expect(model.recurrenceLabel, 'Does not repeat');
+      expect(model.frequency, Frequency.weekly);
+      expect(model.weekDays, {
+        days[DateTime.now().weekday - 1],
+      });
+      expect(model.weekDayOccurenceInMonth, null);
+    });
+
+    testWidgets('updates model when Daily is selected', (tester) async {
+      await tester.pumpWidget(
+        MaterialApp(
+          home: ShowRecurrenceDialog(model: model),
+        ),
+      );
+
+      await tester.tap(find.text('Daily'));
+      await tester.pump();
+
+      expect(model.isRecurring, true);
+      expect(model.recurrenceLabel, 'Daily');
+      expect(model.frequency, Frequency.daily);
+    });
+
+    testWidgets('updates model when Weekly is selected', (tester) async {
+      await tester.pumpWidget(
+        MaterialApp(
+          home: ShowRecurrenceDialog(model: model),
+        ),
+      );
+      final label = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.weekly,
+        {RecurrenceUtils.weekDays[model.recurrenceStartDate.weekday - 1]},
+        model.interval,
+        model.count,
+        model.weekDayOccurenceInMonth,
+        model.recurrenceStartDate,
+        model.recurrenceEndDate,
+      );
+      await tester.tap(find.text(label));
+      await tester.pump();
+
+      expect(model.isRecurring, true);
+      expect(model.recurrenceLabel, label);
+      expect(model.frequency, Frequency.weekly);
+      expect(
+        model.weekDays,
+        {
+          RecurrenceUtils.weekDays[model.recurrenceStartDate.weekday - 1]
+              .toUpperCase(),
+        },
+      );
+    });
+
+    testWidgets('updates model when Monthly is selected', (tester) async {
+      await tester.pumpWidget(
+        MaterialApp(
+          home: ShowRecurrenceDialog(model: model),
+        ),
+      );
+
+      final label = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.monthly,
+        null,
+        model.interval,
+        model.count,
+        model.weekDayOccurenceInMonth,
+        model.recurrenceStartDate,
+        model.recurrenceEndDate,
+      );
+
+      await tester.tap(find.text(label));
+      await tester.pump();
+
+      expect(model.isRecurring, true);
+      expect(model.recurrenceLabel, label);
+      expect(model.frequency, Frequency.monthly);
+    });
+
+    testWidgets('updates model when Yearly is selected', (tester) async {
+      await tester.pumpWidget(
+        MaterialApp(
+          home: ShowRecurrenceDialog(model: model),
+        ),
+      );
+
+      final label = RecurrenceUtils.getRecurrenceRuleText(
+        Frequency.yearly,
+        null,
+        model.interval,
+        model.count,
+        model.weekDayOccurenceInMonth,
+        model.recurrenceStartDate,
+        model.recurrenceEndDate,
+      );
+
+      await tester.tap(find.text(label));
+      await tester.pump();
+
+      expect(model.isRecurring, true);
+      expect(model.recurrenceLabel, label);
+      expect(model.frequency, Frequency.yearly);
+    });
+
+    testWidgets('updates model when Monday to Friday is selected',
+        (tester) async {
+      await tester.pumpWidget(
+        MaterialApp(
+          home: ShowRecurrenceDialog(model: model),
+        ),
+      );
+
+      final label =
+          'Monday to Friday ${model.recurrenceEndDate != null ? "until ${DateFormat('MMMM d, y').format(model.recurrenceEndDate!)}" : ""}';
+
+      await tester.tap(find.text(label));
+      await tester.pump();
+
+      expect(model.isRecurring, true);
+      expect(model.recurrenceLabel, label);
+      expect(model.frequency, Frequency.weekly);
+      expect(
+        model.weekDays,
+        {
+          'MONDAY',
+          'TUESDAY',
+          'WEDNESDAY',
+          'THURSDAY',
+          'FRIDAY',
+        },
+      );
+    });
+  });
+}