Skip to content

Commit 01e85b7

Browse files
authored
Merge pull request #196 from ebarooni/topic/feat(ios)_delete_reminder_with_prompt
feat(ios): delete reminder with prompt
2 parents 7cdfad2 + db33552 commit 01e85b7

File tree

11 files changed

+191
-1
lines changed

11 files changed

+191
-1
lines changed

CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
## Contents
99

1010
- [Version 7.x.x](#version-7xx)
11+
- [7.2.0](#720)
1112
- [7.1.0](#710)
1213
- [7.0.0](#700)
1314
- [Version 6.x.x](#version-6xx)
@@ -36,6 +37,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3637

3738
Changelogs for the versions supporting Capacitor 7.
3839

40+
## 7.2.0
41+
42+
### Added
43+
44+
- `modifyCalendar` on Android and iOS
45+
- `deleteReminderWithPrompt` on iOS
46+
3947
## 7.1.0
4048

4149
### Added

README.md

+31
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ See [CHANGELOG.md](CHANGELOG.md) for the latest updates and release history.
102102
- [`modifyReminder(...)`](#modifyreminder)
103103
- [`getReminderById(...)`](#getreminderbyid)
104104
- [`getRemindersFromLists(...)`](#getremindersfromlists)
105+
- [`deleteReminderWithPrompt(...)`](#deletereminderwithprompt)
105106
- [Interfaces](#interfaces)
106107
- [Type Aliases](#type-aliases)
107108
- [Enums](#enums)
@@ -740,6 +741,26 @@ Retrieves reminders from multiple lists.
740741

741742
---
742743

744+
### deleteReminderWithPrompt(...)
745+
746+
```typescript
747+
deleteReminderWithPrompt(options: DeleteReminderWithPromptOptions) => Promise<{ deleted: boolean; }>
748+
```
749+
750+
Opens a dialog to delete a reminder.
751+
752+
| Param | Type |
753+
| ------------- | ------------------------------------------------------------------------------------------- |
754+
| **`options`** | <code><a href="#deletereminderwithpromptoptions">DeleteReminderWithPromptOptions</a></code> |
755+
756+
**Returns:** <code>Promise&lt;{ deleted: boolean; }&gt;</code>
757+
758+
**Since:** 7.2.0
759+
760+
**Platform:** iOS
761+
762+
---
763+
743764
### Interfaces
744765

745766
#### CreateEventWithPromptOptions
@@ -1044,6 +1065,16 @@ Retrieves reminders from multiple lists.
10441065
| ------------- | --------------------- | ----- |
10451066
| **`listIds`** | <code>string[]</code> | 7.1.0 |
10461067

1068+
#### DeleteReminderWithPromptOptions
1069+
1070+
| Prop | Type | Description | Default | Since |
1071+
| ----------------------- | ------------------- | ----------------------------------- | --------------------- | ----- |
1072+
| **`id`** | <code>string</code> | | | 7.2.0 |
1073+
| **`title`** | <code>string</code> | Title of the dialog. | | 7.2.0 |
1074+
| **`message`** | <code>string</code> | Message of the dialog. | | 7.2.0 |
1075+
| **`confirmButtonText`** | <code>string</code> | Text to show on the confirm button. | <code>'Delete'</code> | 7.2.0 |
1076+
| **`cancelButtonText`** | <code>string</code> | Text to show on the cancel button. | <code>'Cancel'</code> | 7.2.0 |
1077+
10471078
### Type Aliases
10481079

10491080
#### PermissionState

android/src/main/java/dev/barooni/capacitor/calendar/CapacitorCalendarPlugin.kt

+5
Original file line numberDiff line numberDiff line change
@@ -435,4 +435,9 @@ class CapacitorCalendarPlugin : Plugin() {
435435
call.reject(error.message)
436436
}
437437
}
438+
439+
@PluginMethod
440+
fun deleteReminderWithPrompt(call: PluginCall) {
441+
call.unimplemented(PluginError.Unimplemented(::deleteReminderWithPrompt.name).message)
442+
}
438443
}

ios/Sources/CapacitorCalendarPlugin/CapacitorCalendarPlugin.swift

+16
Original file line numberDiff line numberDiff line change
@@ -355,4 +355,20 @@ public class CapacitorCalendarPlugin: CAPPlugin, CAPBridgedPlugin {
355355
call.reject(error.localizedDescription)
356356
}
357357
}
358+
359+
@objc public func deleteReminderWithPrompt(_ call: CAPPluginCall) {
360+
do {
361+
let input = try DeleteReminderWithPromptInput(call: call)
362+
try implementation.deleteReminderWithPrompt(input) { result in
363+
switch result {
364+
case .success(let obj):
365+
call.resolve(obj.toJSON())
366+
case .failure(let error):
367+
call.reject(error.localizedDescription)
368+
}
369+
}
370+
} catch let error {
371+
call.reject(error.localizedDescription)
372+
}
373+
}
358374
}

ios/Sources/CapacitorCalendarPlugin/Implementation/CapacitorCalendar.swift

+29
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,35 @@ class CapacitorCalendar: NSObject, EKEventEditViewDelegate, EKCalendarChooserDel
499499
try eventStore.saveCalendar(calendar, commit: true)
500500
}
501501

502+
func deleteReminderWithPrompt(_ input: DeleteReminderWithPromptInput, completion: @escaping (Result<DeleteEventWithPromptResult, Error>) -> Void) throws {
503+
guard let viewController = plugin.bridge?.viewController else {
504+
throw PluginError.viewControllerMissing
505+
}
506+
guard let reminder = eventStore.calendarItem(withIdentifier: input.getId()) as? EKReminder else {
507+
throw PluginError.reminderNotFound
508+
}
509+
510+
Task { @MainActor in
511+
let alert = UIAlertController(
512+
title: input.getTitle(),
513+
message: input.getMessage(),
514+
preferredStyle: .alert
515+
)
516+
alert.addAction(UIAlertAction(title: input.getCancelButtonText(), style: .cancel, handler: { _ in
517+
completion(.success(DeleteEventWithPromptResult(deleted: false)))
518+
}))
519+
alert.addAction(UIAlertAction(title: input.getConfirmButtonText(), style: .destructive, handler: { _ in
520+
do {
521+
try ImplementationHelper.deleteReminder(reminderId: input.getId(), eventStore: self.eventStore)
522+
completion(.success(DeleteEventWithPromptResult(deleted: true)))
523+
} catch let error {
524+
completion(.failure(error))
525+
}
526+
}))
527+
viewController.present(alert, animated: true)
528+
}
529+
}
530+
502531
func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) {
503532
var createEventWithPromptCancellable: AnyCancellable?
504533
createEventWithPromptCancellable = self.createEventWithPromptResultEmitter.sink { promise in
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import Capacitor
2+
3+
struct DeleteReminderWithPromptInput {
4+
private let id: String
5+
private let title: String
6+
private let message: String
7+
private let confirmButtonText: String
8+
private let cancelButtonText: String
9+
10+
init(call: CAPPluginCall) throws {
11+
guard let id = call.getString("id") else {
12+
throw PluginError.idMissing
13+
}
14+
self.id = id
15+
guard let title = call.getString("title") else {
16+
throw PluginError.titleMissing
17+
}
18+
self.title = title
19+
guard let message = call.getString("message") else {
20+
throw PluginError.messageMissing
21+
}
22+
self.message = message
23+
self.confirmButtonText = call.getString("confirmButtonText", "Delete")
24+
self.cancelButtonText = call.getString("cancelButtonText", "Cancel")
25+
}
26+
27+
func getId() -> String {
28+
return id
29+
}
30+
31+
func getTitle() -> String {
32+
return title
33+
}
34+
35+
func getMessage() -> String {
36+
return message
37+
}
38+
39+
func getConfirmButtonText() -> String {
40+
return confirmButtonText
41+
}
42+
43+
func getCancelButtonText() -> String {
44+
return cancelButtonText
45+
}
46+
}

ios/Sources/CapacitorCalendarPlugin/PluginConfig.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ struct PluginConfig {
3838
CAPPluginMethod(name: "getReminderById", returnType: CAPPluginReturnPromise),
3939
CAPPluginMethod(name: "deleteEvent", returnType: CAPPluginReturnPromise),
4040
CAPPluginMethod(name: "deleteEventWithPrompt", returnType: CAPPluginReturnPromise),
41-
CAPPluginMethod(name: "modifyCalendar", returnType: CAPPluginReturnPromise)
41+
CAPPluginMethod(name: "modifyCalendar", returnType: CAPPluginReturnPromise),
42+
CAPPluginMethod(name: "deleteReminderWithPrompt", returnType: CAPPluginReturnPromise)
4243
]
4344
}

src/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import type { DeleteEventWithPromptOptions } from "./schemas/interfaces/delete-e
2323
import type { DeleteEventsByIdOptions } from "./schemas/interfaces/delete-events-by-id-options";
2424
import type { DeleteEventsByIdResult } from "./sub-definitions/event-operations";
2525
import type { DeleteReminderOptions } from "./schemas/interfaces/delete-reminder-options";
26+
import type { DeleteReminderWithPromptOptions } from "./schemas/interfaces/delete-reminder-with-prompt-options";
2627
import type { DeleteRemindersByIdOptions } from "./schemas/interfaces/delete-reminders-by-id-options";
2728
import type { DeleteRemindersByIdResult } from "./sub-definitions/reminders-operations";
2829
import { EventAvailability } from "./schemas/enums/event-availability";
@@ -88,6 +89,7 @@ export type {
8889
ListEventsInRangeOptions,
8990
CalendarEvent,
9091
ModifyCalendarOptions,
92+
DeleteReminderWithPromptOptions,
9193
};
9294
export {
9395
CalendarPermissionScope,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* @since 7.2.0
3+
*/
4+
export interface DeleteReminderWithPromptOptions {
5+
/**
6+
* @since 7.2.0
7+
*/
8+
id: string;
9+
/**
10+
* Title of the dialog.
11+
*
12+
* @since 7.2.0
13+
*/
14+
title: string;
15+
/**
16+
* Message of the dialog.
17+
*
18+
* @since 7.2.0
19+
*/
20+
message: string;
21+
/**
22+
* Text to show on the confirm button.
23+
*
24+
* @default 'Delete'
25+
* @since 7.2.0
26+
*/
27+
confirmButtonText?: string;
28+
/**
29+
* Text to show on the cancel button.
30+
*
31+
* @default 'Cancel'
32+
* @since 7.2.0
33+
*/
34+
cancelButtonText?: string;
35+
}

src/sub-definitions/reminders-operations.ts

+10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { CalendarSource } from "../schemas/interfaces/calendar-source";
22
import type { CreateReminderOptions } from "../schemas/interfaces/create-reminder-options";
33
import type { DeleteReminderOptions } from "../schemas/interfaces/delete-reminder-options";
4+
import type { DeleteReminderWithPromptOptions } from "../schemas/interfaces/delete-reminder-with-prompt-options";
45
import type { DeleteRemindersByIdOptions } from "../schemas/interfaces/delete-reminders-by-id-options";
56
import type { GetReminderByIdOptions } from "../schemas/interfaces/get-reminder-by-id-options";
67
import type { GetRemindersFromListsOptions } from "../schemas/interfaces/get-reminders-from-lists-options";
@@ -87,6 +88,15 @@ export interface RemindersOperations {
8788
getRemindersFromLists(
8889
options: GetRemindersFromListsOptions,
8990
): Promise<{ result: Reminder[] }>;
91+
/**
92+
* Opens a dialog to delete a reminder.
93+
*
94+
* @platform iOS
95+
* @since 7.2.0
96+
*/
97+
deleteReminderWithPrompt(
98+
options: DeleteReminderWithPromptOptions,
99+
): Promise<{ deleted: boolean }>;
90100
}
91101

92102
/**

src/web.ts

+7
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import type { DeleteEventWithPromptOptions } from "./schemas/interfaces/delete-e
1818
import type { DeleteEventsByIdOptions } from "./schemas/interfaces/delete-events-by-id-options";
1919
import type { DeleteEventsByIdResult } from "./sub-definitions/event-operations";
2020
import type { DeleteReminderOptions } from "./schemas/interfaces/delete-reminder-options";
21+
import type { DeleteReminderWithPromptOptions } from "./schemas/interfaces/delete-reminder-with-prompt-options";
2122
import type { DeleteRemindersByIdOptions } from "./schemas/interfaces/delete-reminders-by-id-options";
2223
import type { DeleteRemindersByIdResult } from "./sub-definitions/reminders-operations";
2324
import type { EventEditAction } from "./schemas/types/event-edit-action";
@@ -209,6 +210,12 @@ export class CapacitorCalendarWeb
209210
return this.throwUnimplemented(this.modifyCalendar.name);
210211
}
211212

213+
public deleteReminderWithPrompt(
214+
_options: DeleteReminderWithPromptOptions,
215+
): Promise<{ deleted: boolean }> {
216+
return this.throwUnimplemented(this.deleteReminderWithPrompt.name);
217+
}
218+
212219
private throwUnimplemented<T>(methodName: string): Promise<T> {
213220
return Promise.reject(
214221
this.unimplemented(`${methodName} is not implemented on the web.`),

0 commit comments

Comments
 (0)