feat: use PermissionState type from tauri, closes #979 (#1701)

This commit is contained in:
Lucas Fernandes Nogueira
2024-08-29 15:40:38 -03:00
committed by GitHub
parent 9ea9e05944
commit e2e97db519
17 changed files with 55 additions and 89 deletions
+3 -5
View File
@@ -15,6 +15,8 @@ import {
addPluginListener,
} from "@tauri-apps/api/core";
export type { PermissionState } from "@tauri-apps/api/core";
/**
* Options to send a notification.
*
@@ -304,9 +306,6 @@ interface Channel {
visibility?: Visibility;
}
/** Possible permission values. */
type Permission = "granted" | "denied" | "default";
/**
* Checks if the permission to send notifications is granted.
* @example
@@ -340,7 +339,7 @@ async function isPermissionGranted(): Promise<boolean> {
*
* @since 2.0.0
*/
async function requestPermission(): Promise<Permission> {
async function requestPermission(): Promise<NotificationPermission> {
return await window.Notification.requestPermission();
}
@@ -570,7 +569,6 @@ async function onAction(
export type {
Attachment,
Options,
Permission,
Action,
ActionType,
PendingNotification,
+7 -8
View File
@@ -3,6 +3,7 @@
// SPDX-License-Identifier: MIT
import { invoke } from "@tauri-apps/api/core";
import type { PermissionState } from "@tauri-apps/api/core";
import type { Options } from "./index";
(function () {
@@ -19,23 +20,21 @@ import type { Options } from "./index";
return await invoke("plugin:notification|is_permission_granted");
}
function setNotificationPermission(
value: "granted" | "denied" | "default",
): void {
function setNotificationPermission(value: NotificationPermission): void {
permissionSettable = true;
// @ts-expect-error we can actually set this value on the webview
window.Notification.permission = value;
permissionSettable = false;
}
async function requestPermission(): Promise<
"default" | "denied" | "granted" | "prompt"
> {
return await invoke<"prompt" | "default" | "granted" | "denied">(
async function requestPermission(): Promise<PermissionState> {
return await invoke<PermissionState>(
"plugin:notification|request_permission",
).then((permission) => {
setNotificationPermission(
permission === "prompt" ? "default" : permission,
permission === "prompt" || permission === "prompt-with-rationale"
? "default"
: permission,
);
return permission;
});
+3 -3
View File
@@ -2,9 +2,9 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
use tauri::{command, AppHandle, Runtime, State};
use tauri::{command, plugin::PermissionState, AppHandle, Runtime, State};
use crate::{Notification, NotificationData, PermissionState, Result};
use crate::{Notification, NotificationData, Result};
#[command]
pub(crate) async fn is_permission_granted<R: Runtime>(
@@ -15,7 +15,7 @@ pub(crate) async fn is_permission_granted<R: Runtime>(
match state {
PermissionState::Granted => Ok(Some(true)),
PermissionState::Denied => Ok(Some(false)),
PermissionState::Unknown => Ok(None),
PermissionState::Unknown | PermissionState::PromptWithRationale => Ok(None),
}
}
+5 -2
View File
@@ -3,9 +3,12 @@
// SPDX-License-Identifier: MIT
use serde::de::DeserializeOwned;
use tauri::{plugin::PluginApi, AppHandle, Runtime};
use tauri::{
plugin::{PermissionState, PluginApi},
AppHandle, Runtime,
};
use crate::{models::*, NotificationBuilder};
use crate::NotificationBuilder;
pub fn init<R: Runtime, C: DeserializeOwned>(
app: &AppHandle<R>,
+1 -1
View File
@@ -1 +1 @@
!function(){"use strict";async function i(i,n={},t){return window.__TAURI_INTERNALS__.invoke(i,n,t)}"function"==typeof SuppressedError&&SuppressedError,function(){let n=!1,t="default";function o(i){n=!0,window.Notification.permission=i,n=!1}window.Notification=function(n,t){const o=t||{};!async function(n){"object"==typeof n&&Object.freeze(n),await i("plugin:notification|notify",{options:"string"==typeof n?{title:n}:n})}(Object.assign(o,{title:n}))},window.Notification.requestPermission=async function(){return await i("plugin:notification|request_permission").then((i=>(o("prompt"===i?"default":i),i)))},Object.defineProperty(window.Notification,"permission",{enumerable:!0,get:()=>t,set:i=>{if(!n)throw new Error("Readonly property");t=i}}),async function(){return"default"!==window.Notification.permission||__TEMPLATE_windows__?await Promise.resolve("granted"===window.Notification.permission):await i("plugin:notification|is_permission_granted")}().then((function(i){o(null===i?"default":i?"granted":"denied")}))}()}();
!function(){"use strict";async function i(i,n={},t){return window.__TAURI_INTERNALS__.invoke(i,n,t)}"function"==typeof SuppressedError&&SuppressedError,function(){let n=!1,t="default";function o(i){n=!0,window.Notification.permission=i,n=!1}window.Notification=function(n,t){const o=t||{};!async function(n){"object"==typeof n&&Object.freeze(n),await i("plugin:notification|notify",{options:"string"==typeof n?{title:n}:n})}(Object.assign(o,{title:n}))},window.Notification.requestPermission=async function(){return await i("plugin:notification|request_permission").then((i=>(o("prompt"===i||"prompt-with-rationale"===i?"default":i),i)))},Object.defineProperty(window.Notification,"permission",{enumerable:!0,get:()=>t,set:i=>{if(!n)throw new Error("Readonly property");t=i}}),async function(){return"default"!==window.Notification.permission||__TEMPLATE_windows__?await Promise.resolve("granted"===window.Notification.permission):await i("plugin:notification|is_permission_granted")}().then((function(i){o(null===i?"default":i?"granted":"denied")}))}()}();
+1
View File
@@ -22,6 +22,7 @@ use tauri::{
};
pub use models::*;
pub use tauri::plugin::PermissionState;
#[cfg(desktop)]
mod desktop;
+1 -1
View File
@@ -4,7 +4,7 @@
use serde::{de::DeserializeOwned, Deserialize};
use tauri::{
plugin::{PluginApi, PluginHandle},
plugin::{PermissionState, PluginApi, PluginHandle},
AppHandle, Runtime,
};
-45
View File
@@ -209,51 +209,6 @@ impl Default for NotificationData {
}
}
/// Permission state.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PermissionState {
/// Permission access has been granted.
Granted,
/// Permission access has been denied.
Denied,
/// Unknown state. Must request permission.
Unknown,
}
impl Display for PermissionState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Granted => write!(f, "granted"),
Self::Denied => write!(f, "denied"),
Self::Unknown => write!(f, "Unknown"),
}
}
}
impl Serialize for PermissionState {
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(self.to_string().as_ref())
}
}
impl<'de> Deserialize<'de> for PermissionState {
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
match s.to_lowercase().as_str() {
"granted" => Ok(Self::Granted),
"denied" => Ok(Self::Denied),
"prompt" => Ok(Self::Unknown),
_ => Err(DeError::custom(format!("unknown permission state '{s}'"))),
}
}
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PendingNotification {