Event.fromICalStrings constructor

Event.fromICalStrings(
  1. List<String> icalStrings
)

Implementation

factory Event.fromICalStrings(List<String> icalStrings) {
  String? uid;
  String? summary;
  String? description;
  List<Attachment>? attachments;
  List<Attendee>? attendees;
  Organizer? organizer;
  DateTime? created;
  DateTime? lastModified;
  DateTime? startDate;
  DateTime? endDate;
  DateTime? stamp;
  int? sequence;
  String? transparency;
  EventStatus? status;
  TimeZone? timezone;
  RecurrenceRule? recurrenceRule;
  List<XDate>? exDates;
  Location? location;
  String? recurrenceId;
  String? eventClass;
  Map<String, String>? customProperties;
  List<Attachment>? attachFiles;

  List<int> indicesToSkip = [];

  for (int i = 0; i < icalStrings.length; i++) {
    if (indicesToSkip.contains(i)) {
      continue;
    }
    var icalString = icalStrings[i];
    int j = i + 1;

    while (j < icalStrings.length && icalStrings[j].startsWith(' ')) {
      String stringToAdd = icalStrings[j].substring(1);
      icalString += stringToAdd;
      indicesToSkip.add(j);
      j++;
    }

    if (icalString.startsWith('UID:')) {
      uid = icalString.split('UID:').last.trim();
    } else if (icalString.startsWith('SUMMARY:')) {
      summary = icalString.split('SUMMARY:').last.trim();
    } else if (icalString.startsWith('DESCRIPTION:')) {
      description = icalString.split('DESCRIPTION:').last.trim();
    } else if (icalString.startsWith('ATTACH:')) {
      attachments ??= [];
      attachments.add(Attachment.fromICalString(icalString));
    } else if (icalString.startsWith('ATTENDEE;')) {
      attendees ??= [];
      attendees.add(Attendee.fromICalString(icalString));
    } else if (icalString.startsWith('ORGANIZER')) {
      organizer = Organizer.fromICalString(icalString);
    } else if (icalString.startsWith('CREATED:')) {
      final createdString = icalString.split('CREATED:').last.trim();
      created = DateTime.parse(createdString);
    } else if (icalString.startsWith('LAST-MODIFIED:')) {
      final lastModifiedString =
          icalString.split('LAST-MODIFIED:').last.trim();
      lastModified = DateTime.parse(lastModifiedString);
    } else if (icalString.startsWith(
      'DTSTART:',
    )) {
      final startDateString = icalString.split('DTSTART:').last.trim();
      startDate = DateTime.parse(startDateString);
    } else if (icalString.startsWith('DTEND:')) {
      final endDateString = icalString.split('DTEND:').last.trim();
      endDate = DateTime.parse(endDateString);
    } else if (icalString.startsWith('RRULE:')) {
      recurrenceRule = RecurrenceRule.fromICalString(icalString);
    } else if (icalString.startsWith('DTSTAMP:')) {
      final stampString = icalString.split('DTSTAMP:').last.trim();
      stamp = DateTime.parse(stampString);
    } else if (icalString.startsWith('SEQUENCE:')) {
      sequence = int.parse(icalString.split('SEQUENCE:').last.trim());
    } else if (icalString.startsWith('STATUS:')) {
      String statusString = icalString.split('STATUS:').last.trim();
      status = EventStatus.fromStatusString(statusString);
    } else if (icalString.startsWith('TRANSP:')) {
      transparency = icalString.split('TRANSP:').last.trim();
    } else if (icalString.startsWith('DTSTART;')) {
      timezone = TimeZone.fromICalString(icalString.split('DTSTART;').last);
      startDate = DateTime.parse(
        icalString.split('DTSTART;TZID=').last.split(':').last.trim(),
      );
    } else if (icalString.startsWith('DTEND;')) {
      timezone = TimeZone.fromICalString(icalString.split('DTEND;').last);
      endDate = DateTime.parse(
        icalString.split('DTEND;TZID=').last.split(':').last.trim(),
      );
    } else if (icalString.startsWith('EXDATE;')) {
      exDates ??= [];
      exDates.add(XDate.fromICalString(icalString));
    } else if (icalString.startsWith('LOCATION:')) {
      location = Location.fromICalString(icalString);
    } else if (icalString.startsWith('RECURRENCE-ID;')) {
      recurrenceId = icalString.split('RECURRENCE-ID;').last.trim();
    } else if (icalString.startsWith('X-')) {
      customProperties ??= {};
      List<String> parts = icalString.split(':');
      if (parts.length > 1) {
        String propertyName = parts[0];
        String propertyValue = parts.sublist(1).join(':').trim();
        customProperties[propertyName] = propertyValue;
      }
    } else if (icalString.startsWith('CLASS:')) {
      eventClass = icalString.split('CLASS:').last.trim();
    } else if (icalString.startsWith('ATTACH;')) {
      attachFiles ??= [];
      attachFiles.add(Attachment.fromICalString(icalString));
    }
  }

  return Event(
    uid: uid ?? '',
    summary: summary,
    description: description,
    attachments: attachments,
    attendees: attendees,
    organizer: organizer,
    created: created,
    lastModified: lastModified,
    startDate: startDate,
    endDate: endDate,
    stamp: stamp,
    sequence: sequence,
    status: status,
    timeZone: timezone,
    transparency: transparency,
    recurrenceRule: recurrenceRule,
    xDates: exDates,
    location: location,
    recurrenceId: recurrenceId,
    customProperties: customProperties,
    eventClass: eventClass,
    attachFiles: attachFiles,
  );
}