tauri-plugin-notifications 0.4.6

A Tauri v2 plugin for sending notifications on desktop and mobile platforms with support for system notifications and push delivery via FCM and APNs.
Documentation
import Tauri
import UserNotifications

internal func makeCategories(_ actionTypes: [ActionType]) {
  var createdCategories = [UNNotificationCategory]()

  let generalCategory = UNNotificationCategory(
    identifier: "GENERAL",
    actions: [],
    intentIdentifiers: [],
    options: .customDismissAction)

  createdCategories.append(generalCategory)
  for type in actionTypes {
    let newActions = makeActions(type.actions)

    // Create the custom actions for the TIMER_EXPIRED category.
    var newCategory: UNNotificationCategory?

    newCategory = UNNotificationCategory(
      identifier: type.id,
      actions: newActions,
      intentIdentifiers: [],
      hiddenPreviewsBodyPlaceholder: type.hiddenBodyPlaceholder ?? "",
      options: makeCategoryOptions(type))

    createdCategories.append(newCategory!)
  }

  let center = UNUserNotificationCenter.current()
  center.setNotificationCategories(Set(createdCategories))
}

func makeActions(_ actions: [Action]) -> [UNNotificationAction] {
  var createdActions = [UNNotificationAction]()

  for action in actions {
    var newAction: UNNotificationAction
    if action.input ?? false {
      if action.inputButtonTitle != nil {
        newAction = UNTextInputNotificationAction(
          identifier: action.id,
          title: action.title,
          options: makeActionOptions(action),
          textInputButtonTitle: action.inputButtonTitle ?? "",
          textInputPlaceholder: action.inputPlaceholder ?? "")
      } else {
        newAction = UNTextInputNotificationAction(
          identifier: action.id, title: action.title, options: makeActionOptions(action))
      }
    } else {
      // Create the custom actions for the TIMER_EXPIRED category.
      newAction = UNNotificationAction(
        identifier: action.id,
        title: action.title,
        options: makeActionOptions(action))
    }
    createdActions.append(newAction)
  }

  return createdActions
}

func makeActionOptions(_ action: Action) -> UNNotificationActionOptions {
  if action.foreground ?? false {
    return .foreground
  }
  if action.destructive ?? false {
    return .destructive
  }
  if action.requiresAuthentication ?? false {
    return .authenticationRequired
  }
  return UNNotificationActionOptions(rawValue: 0)
}

func makeCategoryOptions(_ type: ActionType) -> UNNotificationCategoryOptions {
  if type.customDismissAction ?? false {
    return .customDismissAction
  }
  if type.allowInCarPlay ?? false {
    return .allowInCarPlay
  }

  if type.hiddenPreviewsShowTitle ?? false {
    return .hiddenPreviewsShowTitle
  }
  if type.hiddenPreviewsShowSubtitle ?? false {
    return .hiddenPreviewsShowSubtitle
  }

  return UNNotificationCategoryOptions(rawValue: 0)
}