{"id":31558026,"url":"https://github.com/ahmtydn/calendar_bridge","last_synced_at":"2026-04-14T04:02:15.061Z","repository":{"id":317609401,"uuid":"1068122601","full_name":"ahmtydn/calendar_bridge","owner":"ahmtydn","description":"A comprehensive Flutter plugin for accessing and managing device calendars on Android, iOS, and macOS with clean architecture principles.","archived":false,"fork":false,"pushed_at":"2026-01-23T22:58:09.000Z","size":359,"stargazers_count":1,"open_issues_count":2,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-24T10:57:40.530Z","etag":null,"topics":["android","attendee-management","calendar","calendar-api","calendar-events","clean-architecture","cross-platform","dart","event-manamen","flutter","ios","macos","native-calendar","permissions","plugin","pub-package","recurring-events","reminders","rrule","timezone-support"],"latest_commit_sha":null,"homepage":"https://pub.dev/packages/calendar_bridge","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ahmtydn.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-01T22:20:34.000Z","updated_at":"2026-01-23T22:03:38.000Z","dependencies_parsed_at":"2025-10-02T00:29:29.545Z","dependency_job_id":null,"html_url":"https://github.com/ahmtydn/calendar_bridge","commit_stats":null,"previous_names":["ahmtydn/calendar_bridge"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ahmtydn/calendar_bridge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahmtydn%2Fcalendar_bridge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahmtydn%2Fcalendar_bridge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahmtydn%2Fcalendar_bridge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahmtydn%2Fcalendar_bridge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ahmtydn","download_url":"https://codeload.github.com/ahmtydn/calendar_bridge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahmtydn%2Fcalendar_bridge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31781292,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T02:24:21.117Z","status":"ssl_error","status_checked_at":"2026-04-14T02:24:20.627Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","attendee-management","calendar","calendar-api","calendar-events","clean-architecture","cross-platform","dart","event-manamen","flutter","ios","macos","native-calendar","permissions","plugin","pub-package","recurring-events","reminders","rrule","timezone-support"],"created_at":"2025-10-05T00:11:46.850Z","updated_at":"2026-04-14T04:02:15.026Z","avatar_url":"https://github.com/ahmtydn.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Calendar Bridge\n\n[![pub package](https://img.shields.io/pub/v/calendar_bridge.svg)](https://pub.dev/packages/calendar_bridge)\n[![Platform](https://img.shields.io/badge/platform-android%20%7C%20ios%20%7C%20macos-lightgrey)](https://pub.dev/packages/calendar_bridge)\n\nA comprehensive Flutter plugin for accessing and managing device calendars on Android, iOS, and macOS with clean architecture principles.\n\n## Table of Contents\n\n- [Features](#features)\n- [Platform Support](#platform-support)\n- [Installation](#installation)\n- [Platform Setup](#platform-setup)\n- [Usage](#usage)\n  - [Basic Setup](#basic-setup)\n  - [Permission Handling](#permission-handling)\n  - [Working with Calendars](#working-with-calendars)\n  - [Working with Events](#working-with-events)\n  - [Recurring Events](#recurring-events)\n  - [Calendar Colors](#calendar-colors)\n- [Error Handling](#error-handling)\n- [Models](#models)\n- [Example App](#example-app)\n- [Testing](#testing)\n- [Architecture](#architecture)\n- [Contributing](#contributing)\n- [License](#license)\n- [Support](#support)\n\n## Features\n\n- **Calendar Management**: Create, retrieve, and delete calendars\n- **Event CRUD Operations**: Full create, read, update, delete support for events\n- **Recurring Events**: Support for recurring events using RRULE format\n- **Timezone Support**: Full timezone handling with TZDateTime\n- **Attendee Management**: Add and manage event attendees\n- **Reminders**: Set and manage event reminders\n- **Permission Handling**: Proper permission management across platforms\n- **Calendar Colors**: Support for calendar and event colors\n- **Clean Architecture**: Built with domain-driven design principles\n- **Well Tested**: Comprehensive test coverage\n\n## Platform Support\n\n| Platform | Supported | Notes |\n|----------|-----------|-------|\n| Android  | Yes | API 21+ |\n| iOS      | Yes | iOS 13+ |\n| macOS    | Yes | macOS 11+ |\n\n## Installation\n\nAdd this to your package's `pubspec.yaml` file:\n\n```yaml\ndependencies:\n  calendar_bridge: ^1.0.0\n```\n\nThen run:\n\n```bash\nflutter pub get\n```\n\n## Platform Setup\n\n### iOS \u0026 macOS\n\nAdd the following keys to your `Info.plist` file:\n\n```xml\n\u003ckey\u003eNSCalendarsUsageDescription\u003c/key\u003e\n\u003cstring\u003eThis app requires access to your calendar to manage your events.\u003c/string\u003e\n\u003c!-- Full access for macOS 14+ --\u003e\n\u003ckey\u003eNSCalendarsFullAccessUsageDescription\u003c/key\u003e\n\u003cstring\u003eThis app requires full calendar access to create, edit, and delete your events.\u003c/string\u003e\n\u003c!-- Additional write access --\u003e\n\u003ckey\u003eNSCalendarsWriteOnlyAccessUsageDescription\u003c/key\u003e\n\u003cstring\u003eThis app requires access to create calendar events.\u003c/string\u003e\n\u003ckey\u003eNSRemindersUsageDescription\u003c/key\u003e\n\u003cstring\u003eThis app needs access to reminders to set event notifications\u003c/string\u003e\n```\n\n### Android\n\nAdd the following permissions to your `android/app/src/main/AndroidManifest.xml`:\n\n```xml\n\u003cuses-permission android:name=\"android.permission.READ_CALENDAR\" /\u003e\n\u003cuses-permission android:name=\"android.permission.WRITE_CALENDAR\" /\u003e\n```\n\n## Usage\n\n### Basic Setup\n\n```dart\nimport 'package:calendar_bridge/calendar_bridge.dart';\n\nfinal calendarApi = CalendarBridge();\n```\n\n### Permission Handling\n\nAlways request permissions before accessing calendar data:\n\n```dart\n// Check if permissions are granted\nfinal hasPermissions = await calendarApi.hasPermissions();\nif (hasPermissions != PermissionStatus.granted) {\n  // Request permissions\n  final granted = await calendarApi.requestPermissions();\n  if (!granted) {\n    // Handle permission denied\n    return;\n  }\n}\n```\n\n### Working with Calendars\n\n#### Get All Calendars\n\n```dart\ntry {\n  final calendars = await calendarApi.getCalendars();\n  for (final calendar in calendars) {\n    print('Calendar: ${calendar.name} (${calendar.id})');\n  }\n} catch (e) {\n  print('Error getting calendars: $e');\n}\n```\n\n#### Create a New Calendar\n\n```dart\ntry {\n  final newCalendar = await calendarApi.createCalendar(\n    name: 'My Custom Calendar',\n    color: 0xFF2196F3, // Blue color\n    localAccountName: 'Local',\n  );\n  print('Created calendar: ${newCalendar.name}');\n} catch (e) {\n  print('Error creating calendar: $e');\n}\n```\n\n#### Get Default Calendar\n\n```dart\ntry {\n  final defaultCalendar = await calendarApi.getDefaultCalendar();\n  print('Default calendar: ${defaultCalendar.name}');\n} catch (e) {\n  print('Error getting default calendar: $e');\n}\n```\n\n### Working with Events\n\n#### Create a Simple Event\n\n```dart\ntry {\n  final eventId = await calendarApi.createSimpleEvent(\n    calendarId: calendar.id,\n    title: 'Team Meeting',\n    start: DateTime.now().add(Duration(hours: 1)),\n    end: DateTime.now().add(Duration(hours: 2)),\n    description: 'Weekly team sync',\n    location: 'Conference Room A',\n  );\n  print('Created event with ID: $eventId');\n} catch (e) {\n  print('Error creating event: $e');\n}\n```\n\n#### Create a Complex Event with Attendees and Reminders\n\n```dart\nfinal event = CalendarEvent(\n  calendarId: calendar.id,\n  title: 'Project Review',\n  description: 'Quarterly project review meeting',\n  start: TZDateTime.from(DateTime.now().add(Duration(days: 1)), UTC),\n  end: TZDateTime.from(DateTime.now().add(Duration(days: 1, hours: 2)), UTC),\n  location: 'Meeting Room B',\n  attendees: [\n    Attendee(\n      name: 'John Doe',\n      email: 'john@example.com',\n      role: AttendeeRole.required,\n    ),\n    Attendee(\n      name: 'Jane Smith',\n      email: 'jane@example.com',\n      role: AttendeeRole.optional,\n    ),\n  ],\n  reminders: [\n    Reminder(minutes: 15), // 15 minutes before\n    Reminder(minutes: 60), // 1 hour before\n  ],\n);\n\ntry {\n  final eventId = await calendarApi.createEvent(event);\n  print('Created complex event with ID: $eventId');\n} catch (e) {\n  print('Error creating event: $e');\n}\n```\n\n#### Get Events from a Calendar\n\n```dart\ntry {\n  // Get all events\n  final allEvents = await calendarApi.getEvents(calendar.id);\n  \n  // Get events in a date range\n  final eventsInRange = await calendarApi.getEvents(\n    calendar.id,\n    startDate: DateTime.now(),\n    endDate: DateTime.now().add(Duration(days: 30)),\n  );\n  \n  // Get today's events\n  final todaysEvents = await calendarApi.getTodaysEvents(calendar.id);\n  \n  // Get upcoming events (next 7 days by default)\n  final upcomingEvents = await calendarApi.getUpcomingEvents(calendar.id);\n  \n  print('Found ${allEvents.length} total events');\n} catch (e) {\n  print('Error getting events: $e');\n}\n```\n\n#### Update an Event\n\n```dart\n// First, get the event\nfinal events = await calendarApi.getEvents(calendar.id);\nif (events.isNotEmpty) {\n  final eventToUpdate = events.first.copyWith(\n    title: 'Updated Event Title',\n    description: 'Updated description',\n  );\n  \n  try {\n    await calendarApi.updateEvent(eventToUpdate);\n    print('Event updated successfully');\n  } catch (e) {\n    print('Error updating event: $e');\n  }\n}\n```\n\n#### Delete an Event\n\n```dart\ntry {\n  final success = await calendarApi.deleteEvent(calendar.id, eventId);\n  if (success) {\n    print('Event deleted successfully');\n  }\n} catch (e) {\n  print('Error deleting event: $e');\n}\n```\n\n### Recurring Events\n\nCalendar Bridge supports recurring events using the RRULE standard:\n\n```dart\nimport 'package:rrule/rrule.dart';\n\nfinal recurringEvent = CalendarEvent(\n  calendarId: calendar.id,\n  title: 'Daily Standup',\n  start: TZDateTime.from(DateTime.now(), UTC),\n  end: TZDateTime.from(DateTime.now().add(Duration(minutes: 30)), UTC),\n  recurrenceRule: RecurrenceRule(\n    frequency: Frequency.daily,\n    count: 30, // Repeat 30 times\n  ),\n);\n\nawait calendarApi.createEvent(recurringEvent);\n```\n\n### Calendar Colors\n\nGet and set calendar colors:\n\n```dart\n// Get available calendar colors\nfinal calendarColors = await calendarApi.getCalendarColors();\nprint('Available calendar colors: $calendarColors');\n\n// Get available event colors for a calendar\nfinal eventColors = await calendarApi.getEventColors(calendar.id);\nprint('Available event colors: $eventColors');\n\n// Update calendar color\nif (calendarColors != null \u0026\u0026 calendarColors.isNotEmpty) {\n  final colorKey = calendarColors.keys.first;\n  await calendarApi.updateCalendarColor(calendar.id, colorKey);\n}\n```\n\n## Error Handling\n\nCalendar Bridge provides specific exception types for better error handling:\n\n```dart\ntry {\n  final calendars = await calendarApi.getCalendars();\n} on PermissionDeniedException {\n  print('Calendar permissions are required');\n} on CalendarNotFoundException {\n  print('Calendar not found');\n} on EventNotFoundException {\n  print('Event not found');\n} on InvalidArgumentException {\n  print('Invalid arguments provided');\n} catch (e) {\n  print('Unexpected error: $e');\n}\n```\n\n## Models\n\n### Calendar\n\n```dart\nclass Calendar {\n  final String id;\n  final String name;\n  final int? color;\n  final String? accountName;\n  final String? accountType;\n  final bool isReadOnly;\n  final bool isDefault;\n}\n```\n\n### CalendarEvent\n\n```dart\nclass CalendarEvent {\n  final String calendarId;\n  final String? eventId;\n  final String? title;\n  final String? description;\n  final TZDateTime? start;\n  final TZDateTime? end;\n  final bool allDay;\n  final String? location;\n  final String? url;\n  final RecurrenceRule? recurrenceRule;\n  final List\u003cAttendee\u003e attendees;\n  final List\u003cReminder\u003e reminders;\n  final EventStatus? eventStatus;\n  final Availability? availability;\n  final String? organizer;\n  final String? eventColor;\n}\n```\n\n### Attendee\n\n```dart\nclass Attendee {\n  final String? name;\n  final String? email;\n  final AttendeeRole? role;\n  final AttendeeStatus? status;\n}\n```\n\n### Reminder\n\n```dart\nclass Reminder {\n  final int minutes; // Minutes before event start\n}\n```\n\n## Example App\n\nThe plugin comes with a comprehensive example app that demonstrates all features. To run the example:\n\n```bash\ncd example\nflutter run\n```\n\nThe example app includes:\n- Calendar list view\n- Event management (create, edit, delete)\n- Calendar view with monthly grid\n- Settings and permissions handling\n\n## Testing\n\nCalendar Bridge includes comprehensive test coverage. Run tests with:\n\n```bash\nflutter test\n```\n\nFor integration tests:\n\n```bash\ncd example\nflutter test integration_test/\n```\n\n## Architecture\n\nThis plugin follows clean architecture principles:\n\n- **Domain Layer**: Contains business logic, entities, and use cases\n- **Infrastructure Layer**: Platform-specific implementations\n- **API Layer**: Simple, clean interface for consumers\n\n## Contributing\n\nContributions are welcome! Please read the contributing guidelines and submit pull requests to the [GitHub repository](https://github.com/ahmtydn/calendar_bridge).\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for a detailed list of changes.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Support\n\nIf you encounter any issues or have questions, please [file an issue](https://github.com/ahmtydn/calendar_bridge/issues) on GitHub.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fahmtydn%2Fcalendar_bridge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fahmtydn%2Fcalendar_bridge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fahmtydn%2Fcalendar_bridge/lists"}