Section 7/181 menit

7. Parameter Resolution dan Disambiguation

7. Parameter Resolution dan Disambiguation

requestValue: Minta Input dari User

swift
struct AddTaskIntent: AppIntent {
    static var title: LocalizedStringResource = "Tambah Tugas"
    
    @Parameter(title: "Judul Tugas")
    var title: String
    
    @Parameter(title: "Prioritas", default: .medium)
    var priority: PriorityLevel
    
    @Parameter(title: "Tenggat")
    var dueDate: Date?
    
    func perform() async throws -> some IntentResult & ProvidesDialog {
        // Minta nilai jika parameter belum terisi (misalnya via Shortcuts tanpa parameter)
        if title.trimmingCharacters(in: .whitespaces).isEmpty {
            title = try await $title.requestValue("Apa judul tugasnya?")
        }
        
        let task = try await TaskRepository.shared.create(
            title: title,
            priority: priority,
            dueDate: dueDate
        )
        
        return .result(dialog: "Tugas '\(task.title)' berhasil ditambahkan.")
    }
}

Disambiguation: Pilih dari Multiple Matches

swift
struct CompleteTaskIntent: AppIntent {
    static var title: LocalizedStringResource = "Selesaikan Tugas"
    
    @Parameter(title: "Tugas")
    var task: TaskEntity
    
    func perform() async throws -> some IntentResult & ProvidesDialog {
        // Skenario: user bilang "Selesaikan tugas meeting" → ada 2 task dengan "meeting"
        // Kita bisa lakukan disambiguation manual:
        let matchingTasks = try await TaskRepository.shared.search(query: "meeting")
        
        if matchingTasks.count > 1 {
            // Tampilkan daftar untuk user pilih
            let entities = matchingTasks.map { TaskEntity(task: $0) }
            task = try await $task.requestDisambiguation(
                among: entities,
                dialog: "Tugas 'meeting' mana yang ingin diselesaikan?"
            )
        } else if let single = matchingTasks.first {
            task = TaskEntity(task: single)
        }
        
        try await TaskRepository.shared.markCompleted(id: task.id)
        return .result(dialog: "Tugas '\(task.title)' sudah selesai!")
    }
}

requestConfirmation: Konfirmasi Sebelum Aksi Destruktif

swift
struct DeleteAllCompletedIntent: AppIntent {
    static var title: LocalizedStringResource = "Hapus Semua Tugas Selesai"
    
    func perform() async throws -> some IntentResult & ProvidesDialog {
        let completedTasks = try await TaskRepository.shared.fetchCompleted()
        
        guard !completedTasks.isEmpty else {
            return .result(dialog: "Tidak ada tugas selesai untuk dihapus.")
        }
        
        // Minta konfirmasi sebelum hapus
        try await requestConfirmation(
            result: .result(dialog: "Hapus \(completedTasks.count) tugas selesai?"),
            confirmationActionName: .delete
        )
        
        // Eksekusi setelah dikonfirmasi
        try await TaskRepository.shared.deleteCompleted()
        return .result(dialog: "\(completedTasks.count) tugas selesai dihapus.")
    }
}