mirror of
https://github.com/tauri-apps/plugins-workspace.git
synced 2026-06-16 14:30:06 +02:00
Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3cbb55aa7b | |||
| 60765694f5 | |||
| fd75401aee | |||
| ca34972266 | |||
| 179184326b | |||
| d8efd3cd20 | |||
| 5d39ddcf22 | |||
| 2050a3bea2 | |||
| c078f57a09 | |||
| dc5721ac13 | |||
| 1d9741b52b | |||
| 7a37355e17 | |||
| 5cbd593e76 | |||
| f7600b5fff | |||
| fb85e5dd76 | |||
| 6f3f66794a | |||
| 79d6e19c4b | |||
| aebd4f6185 | |||
| 341a5320c3 | |||
| cc03ccf5e0 | |||
| 009299ebec | |||
| 204e5aacad |
@@ -0,0 +1,6 @@
|
||||
---
|
||||
"deep-link": patch
|
||||
---
|
||||
|
||||
Added `DeepLink::on_open_url` function to match the JavaScript API implementation,
|
||||
which wraps the `deep-link://new-url` event and also send the current deep link if there's any.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"barcode-scanner-js": patch
|
||||
---
|
||||
|
||||
Fixed an issue which caused checkPermission and requestPermission to be mixed up.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
"clipboard-manager": patch
|
||||
"clipboard-manager-js": patch
|
||||
---
|
||||
|
||||
Fix warnings and clear implementation on Android below SDK 28.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"fs": patch
|
||||
---
|
||||
|
||||
Fix `scope-app`, `scope-app-recursive` and `scope-index` not properly enabling the application paths.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"window-state": patch
|
||||
---
|
||||
|
||||
Fix can't restore a minimized window's size and position properly
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"window-state": patch
|
||||
---
|
||||
|
||||
Fix deadlock when trying to restore window states on initial load
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"upload": 'patch:bug'
|
||||
---
|
||||
|
||||
fix download content to file when unsuccessful response
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"geolocation": patch
|
||||
---
|
||||
|
||||
No longer request permission automatically and leave to the user how to handle the `checkPermissions` and `requestPermissions` APIs.
|
||||
+12
-1
@@ -7,16 +7,23 @@
|
||||
".changes/consolidate-permission-state.md",
|
||||
".changes/deep-link-event.md",
|
||||
".changes/deep-link-get-current-desktop.md",
|
||||
".changes/deep-link-on-new-url.md",
|
||||
".changes/deep-link-register-all.md",
|
||||
".changes/dialog-asset-scope.md",
|
||||
".changes/dialog-file-response-non-exhaustive.md",
|
||||
".changes/dialog-return-path.md",
|
||||
".changes/fix-barcodae-scanner-imports.md",
|
||||
".changes/fix-clipboard-warnings-sdk.md",
|
||||
".changes/fix-deep-link-config.md",
|
||||
".changes/fix-fs-app-scopes.md",
|
||||
".changes/fix-fs-write-file-android.md",
|
||||
".changes/fix-http-plugin-abort.md",
|
||||
".changes/fix-ios-file-dialog-default-mode.md",
|
||||
".changes/fix-linux-updater-permission-error.md",
|
||||
".changes/fix-restore-minimized-window-position.md",
|
||||
".changes/fix-restore-minimized-window-state.md",
|
||||
".changes/fix-restore-window-state-deadlock.md",
|
||||
".changes/fix-upload-handle-non-success-download.md",
|
||||
".changes/fs-dialog-file-path-methods.md",
|
||||
".changes/fs-dialog-file-path-traits.md",
|
||||
".changes/fs-dialog-non-exhaustive-error.md",
|
||||
@@ -24,6 +31,7 @@
|
||||
".changes/fs-scope-recursive-allow-read-dir.md",
|
||||
".changes/fs-windows-path.md",
|
||||
".changes/fs-write-file-utf8-chars.md",
|
||||
".changes/geolocation-permission-refactor.md",
|
||||
".changes/geolocation-release.md",
|
||||
".changes/global-shortcut-0.6.md",
|
||||
".changes/haptics-release.md",
|
||||
@@ -44,8 +52,11 @@
|
||||
".changes/swift-build-older-versions.md",
|
||||
".changes/tauri-rc-8.md",
|
||||
".changes/update-fs-api-docs.md",
|
||||
".changes/update-geolocation-api.md",
|
||||
".changes/update-tauri-rc-12.md",
|
||||
".changes/update-tauri-rc-3.md",
|
||||
".changes/updater-js-headers-download-crate.md",
|
||||
".changes/updater-js-headers-download.md"
|
||||
".changes/updater-js-headers-download.md",
|
||||
".changes/window-state-physical-size.md"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"geolocation-js": patch
|
||||
---
|
||||
|
||||
Update API to match other plugins.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"notification": patch
|
||||
---
|
||||
|
||||
Update to tauri 2.0.0-rc.12.
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"window-state": patch:breaking
|
||||
---
|
||||
|
||||
Window's size is now stored in physical size instead of logical size
|
||||
+7
-1
@@ -26,9 +26,15 @@ target/
|
||||
# compiled plugins
|
||||
dist-js/
|
||||
|
||||
# plugins .tauri director
|
||||
# plugins .tauri directory
|
||||
/plugins/*/.tauri
|
||||
|
||||
# examples
|
||||
examples/*/dist
|
||||
plugins/*/examples/*/dist
|
||||
examples/*/src-tauri/gen/schemas
|
||||
plugins/*/examples/*/src-tauri/gen/schemas
|
||||
|
||||
# logs
|
||||
logs
|
||||
*.log
|
||||
|
||||
+6
-1
@@ -19,4 +19,9 @@ plugins/*/examples/*/src-tauri/gen/
|
||||
api-iife.js
|
||||
init-iife.js
|
||||
CHANGELOG.md
|
||||
*schema.json
|
||||
*schema.json
|
||||
|
||||
# mobile build
|
||||
**/ios/.build
|
||||
**/.tauri
|
||||
plugins/*/android/build
|
||||
|
||||
Generated
+445
-159
File diff suppressed because it is too large
Load Diff
+4
-4
@@ -11,10 +11,10 @@ resolver = "2"
|
||||
[workspace.dependencies]
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
log = "0.4"
|
||||
tauri = { version = "2.0.0-rc.11", default-features = false }
|
||||
tauri-build = "2.0.0-rc.10"
|
||||
tauri-plugin = "2.0.0-rc.10"
|
||||
tauri-utils = "2.0.0-rc.10"
|
||||
tauri = { version = "2.0.0-rc.14", default-features = false }
|
||||
tauri-build = "2.0.0-rc.11"
|
||||
tauri-plugin = "2.0.0-rc.11"
|
||||
tauri-utils = "2.0.0-rc.11"
|
||||
serde_json = "1"
|
||||
thiserror = "1"
|
||||
url = "2"
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
/dist/*
|
||||
!/dist/.gitkeep
|
||||
@@ -1,5 +1,12 @@
|
||||
# Changelog
|
||||
|
||||
## \[2.0.0-rc.4]
|
||||
|
||||
### Dependencies
|
||||
|
||||
- Upgraded to `barcode-scanner-js@2.0.0-rc.2`
|
||||
- Upgraded to `clipboard-manager-js@2.0.0-rc.2`
|
||||
|
||||
## \[2.0.0-rc.3]
|
||||
|
||||
### Dependencies
|
||||
|
||||
Vendored
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "svelte-app",
|
||||
"private": true,
|
||||
"version": "2.0.0-rc.3",
|
||||
"version": "2.0.0-rc.4",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite --clearScreen false",
|
||||
@@ -10,13 +10,15 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": "2.0.0-rc.4",
|
||||
"@tauri-apps/plugin-barcode-scanner": "2.0.0-rc.1",
|
||||
"@tauri-apps/plugin-barcode-scanner": "2.0.0-rc.2",
|
||||
"@tauri-apps/plugin-biometric": "2.0.0-rc.1",
|
||||
"@tauri-apps/plugin-cli": "2.0.0-rc.1",
|
||||
"@tauri-apps/plugin-clipboard-manager": "2.0.0-rc.1",
|
||||
"@tauri-apps/plugin-clipboard-manager": "2.0.0-rc.2",
|
||||
"@tauri-apps/plugin-dialog": "2.0.0-rc.1",
|
||||
"@tauri-apps/plugin-fs": "2.0.0-rc.2",
|
||||
"@tauri-apps/plugin-geolocation": "2.0.0-rc.1",
|
||||
"@tauri-apps/plugin-global-shortcut": "2.0.0-rc.1",
|
||||
"@tauri-apps/plugin-haptics": "2.0.0-rc.1",
|
||||
"@tauri-apps/plugin-http": "2.0.0-rc.2",
|
||||
"@tauri-apps/plugin-nfc": "2.0.0-rc.1",
|
||||
"@tauri-apps/plugin-notification": "2.0.0-rc.1",
|
||||
@@ -31,7 +33,7 @@
|
||||
"@iconify-json/codicon": "^1.1.37",
|
||||
"@iconify-json/ph": "^1.1.8",
|
||||
"@sveltejs/vite-plugin-svelte": "^3.0.1",
|
||||
"@tauri-apps/cli": "2.0.0-rc.13",
|
||||
"@tauri-apps/cli": "2.0.0-rc.15",
|
||||
"@unocss/extractor-svelte": "^0.62.0",
|
||||
"svelte": "^4.2.19",
|
||||
"unocss": "^0.62.0",
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# Changelog
|
||||
|
||||
## \[2.0.0-rc.7]
|
||||
|
||||
### Dependencies
|
||||
|
||||
- Upgraded to `clipboard-manager@2.0.0-rc.4`
|
||||
- Upgraded to `fs@2.0.0-rc.5`
|
||||
- Upgraded to `notification@2.0.0-rc.5`
|
||||
- Upgraded to `dialog@2.0.0-rc.7`
|
||||
- Upgraded to `http@2.0.0-rc.5`
|
||||
|
||||
## \[2.0.0-rc.6]
|
||||
|
||||
### Dependencies
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "api"
|
||||
publish = false
|
||||
version = "2.0.0-rc.6"
|
||||
version = "2.0.0-rc.7"
|
||||
description = "An example Tauri Application showcasing the api"
|
||||
edition = "2021"
|
||||
rust-version = { workspace = true }
|
||||
@@ -20,15 +20,15 @@ serde = { workspace = true }
|
||||
tiny_http = "0.12"
|
||||
log = { workspace = true }
|
||||
tauri-plugin-log = { path = "../../../plugins/log", version = "2.0.0-rc.2" }
|
||||
tauri-plugin-fs = { path = "../../../plugins/fs", version = "2.0.0-rc.4", features = [
|
||||
tauri-plugin-fs = { path = "../../../plugins/fs", version = "2.0.0-rc.5", features = [
|
||||
"watch",
|
||||
] }
|
||||
tauri-plugin-clipboard-manager = { path = "../../../plugins/clipboard-manager", version = "2.0.0-rc.3" }
|
||||
tauri-plugin-dialog = { path = "../../../plugins/dialog", version = "2.0.0-rc.6" }
|
||||
tauri-plugin-clipboard-manager = { path = "../../../plugins/clipboard-manager", version = "2.0.0-rc.4" }
|
||||
tauri-plugin-dialog = { path = "../../../plugins/dialog", version = "2.0.0-rc.7" }
|
||||
tauri-plugin-http = { path = "../../../plugins/http", features = [
|
||||
"multipart",
|
||||
], version = "2.0.0-rc.4" }
|
||||
tauri-plugin-notification = { path = "../../../plugins/notification", version = "2.0.0-rc.4", features = [
|
||||
], version = "2.0.0-rc.5" }
|
||||
tauri-plugin-notification = { path = "../../../plugins/notification", version = "2.0.0-rc.5", features = [
|
||||
"windows7-compat",
|
||||
] }
|
||||
tauri-plugin-os = { path = "../../../plugins/os", version = "2.0.0-rc.1" }
|
||||
@@ -53,14 +53,14 @@ features = [
|
||||
tauri-plugin-cli = { path = "../../../plugins/cli", version = "2.0.0-rc.1" }
|
||||
tauri-plugin-global-shortcut = { path = "../../../plugins/global-shortcut", version = "2.0.0-rc.2" }
|
||||
tauri-plugin-updater = { path = "../../../plugins/updater", version = "2.0.0-rc.3" }
|
||||
tauri-plugin-window-state = { path = "../../../plugins/window-state", version = "2.0.0-rc.3" }
|
||||
|
||||
[target."cfg(any(target_os = \"android\", target_os = \"ios\"))".dependencies]
|
||||
tauri-plugin-barcode-scanner = { path = "../../../plugins/barcode-scanner/", version = "2.0.0-rc.4" }
|
||||
tauri-plugin-nfc = { path = "../../../plugins/nfc", version = "2.0.0-rc.3" }
|
||||
tauri-plugin-biometric = { path = "../../../plugins/biometric/", version = "2.0.0-rc.3" }
|
||||
|
||||
[target."cfg(target_os = \"windows\")".dependencies]
|
||||
window-shadows = "0.2"
|
||||
tauri-plugin-geolocation = { path = "../../../plugins/geolocation/", version = "2.0.0-rc.3" }
|
||||
tauri-plugin-haptics = { path = "../../../plugins/haptics/", version = "2.0.0-rc.3" }
|
||||
|
||||
[features]
|
||||
prod = ["tauri/custom-protocol"]
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
"barcode-scanner:allow-scan",
|
||||
"barcode-scanner:allow-cancel",
|
||||
"barcode-scanner:allow-request-permissions",
|
||||
"barcode-scanner:allow-check-permissions"
|
||||
"barcode-scanner:allow-check-permissions",
|
||||
"geolocation:allow-check-permissions",
|
||||
"geolocation:allow-request-permissions",
|
||||
"geolocation:allow-watch-position",
|
||||
"geolocation:allow-get-current-position"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -45,6 +45,8 @@ pub fn run() {
|
||||
app.handle().plugin(tauri_plugin_cli::init())?;
|
||||
app.handle()
|
||||
.plugin(tauri_plugin_global_shortcut::Builder::new().build())?;
|
||||
app.handle()
|
||||
.plugin(tauri_plugin_window_state::Builder::new().build())?;
|
||||
app.handle()
|
||||
.plugin(tauri_plugin_updater::Builder::new().build())?;
|
||||
}
|
||||
@@ -53,6 +55,8 @@ pub fn run() {
|
||||
app.handle().plugin(tauri_plugin_barcode_scanner::init())?;
|
||||
app.handle().plugin(tauri_plugin_nfc::init())?;
|
||||
app.handle().plugin(tauri_plugin_biometric::init())?;
|
||||
app.handle().plugin(tauri_plugin_geolocation::init())?;
|
||||
app.handle().plugin(tauri_plugin_haptics::init())?;
|
||||
}
|
||||
|
||||
let mut webview_window_builder =
|
||||
@@ -63,8 +67,7 @@ pub fn run() {
|
||||
.user_agent(&format!("Tauri API - {}", std::env::consts::OS))
|
||||
.title("Tauri API Validation")
|
||||
.inner_size(1000., 800.)
|
||||
.min_inner_size(600., 400.)
|
||||
.content_protected(true);
|
||||
.min_inner_size(600., 400.);
|
||||
}
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"$schema": "../node_modules/@tauri-apps/cli/schema.json",
|
||||
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
|
||||
"productName": "Tauri API",
|
||||
"version": "2.0.0",
|
||||
"identifier": "com.tauri.api",
|
||||
|
||||
+168
-165
@@ -1,203 +1,208 @@
|
||||
<script>
|
||||
import { writable } from "svelte/store";
|
||||
import { open } from "@tauri-apps/plugin-shell";
|
||||
import { getCurrentWindow } from "@tauri-apps/api/window";
|
||||
import { getCurrentWebview } from "@tauri-apps/api/webview";
|
||||
import * as os from "@tauri-apps/plugin-os";
|
||||
import { writable } from 'svelte/store'
|
||||
import { open } from '@tauri-apps/plugin-shell'
|
||||
import { getCurrentWindow } from '@tauri-apps/api/window'
|
||||
import { getCurrentWebview } from '@tauri-apps/api/webview'
|
||||
import * as os from '@tauri-apps/plugin-os'
|
||||
|
||||
import Welcome from "./views/Welcome.svelte";
|
||||
import Cli from "./views/Cli.svelte";
|
||||
import Communication from "./views/Communication.svelte";
|
||||
import Dialog from "./views/Dialog.svelte";
|
||||
import FileSystem from "./views/FileSystem.svelte";
|
||||
import Http from "./views/Http.svelte";
|
||||
import Notifications from "./views/Notifications.svelte";
|
||||
import Shortcuts from "./views/Shortcuts.svelte";
|
||||
import Shell from "./views/Shell.svelte";
|
||||
import Store from "./views/Store.svelte";
|
||||
import Updater from "./views/Updater.svelte";
|
||||
import Clipboard from "./views/Clipboard.svelte";
|
||||
import WebRTC from "./views/WebRTC.svelte";
|
||||
import Scanner from "./views/Scanner.svelte";
|
||||
import Biometric from "./views/Biometric.svelte";
|
||||
import Welcome from './views/Welcome.svelte'
|
||||
import Cli from './views/Cli.svelte'
|
||||
import Communication from './views/Communication.svelte'
|
||||
import Dialog from './views/Dialog.svelte'
|
||||
import FileSystem from './views/FileSystem.svelte'
|
||||
import Http from './views/Http.svelte'
|
||||
import Notifications from './views/Notifications.svelte'
|
||||
import Shortcuts from './views/Shortcuts.svelte'
|
||||
import Shell from './views/Shell.svelte'
|
||||
import Store from './views/Store.svelte'
|
||||
import Updater from './views/Updater.svelte'
|
||||
import Clipboard from './views/Clipboard.svelte'
|
||||
import WebRTC from './views/WebRTC.svelte'
|
||||
import Scanner from './views/Scanner.svelte'
|
||||
import Biometric from './views/Biometric.svelte'
|
||||
import Geolocation from './views/Geolocation.svelte'
|
||||
|
||||
import { onMount, tick } from "svelte";
|
||||
import { ask } from "@tauri-apps/plugin-dialog";
|
||||
import Nfc from "./views/Nfc.svelte";
|
||||
import { onMount, tick } from 'svelte'
|
||||
import { ask } from '@tauri-apps/plugin-dialog'
|
||||
import Nfc from './views/Nfc.svelte'
|
||||
|
||||
const appWindow = getCurrentWindow();
|
||||
const appWindow = getCurrentWindow()
|
||||
|
||||
if (appWindow.label !== "main") {
|
||||
if (appWindow.label !== 'main') {
|
||||
appWindow.onCloseRequested(async (event) => {
|
||||
const confirmed = await confirm("Are you sure?");
|
||||
const confirmed = await confirm('Are you sure?')
|
||||
if (!confirmed) {
|
||||
// user did not confirm closing the window; let's prevent it
|
||||
event.preventDefault();
|
||||
event.preventDefault()
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
getCurrentWebview().onDragDropEvent((event) => {
|
||||
onMessage(`File drop: ${JSON.stringify(event.payload)}`);
|
||||
});
|
||||
onMessage(`File drop: ${JSON.stringify(event.payload)}`)
|
||||
})
|
||||
|
||||
const userAgent = navigator.userAgent.toLowerCase();
|
||||
const isMobile =
|
||||
userAgent.includes("android") || userAgent.includes("iphone");
|
||||
const userAgent = navigator.userAgent.toLowerCase()
|
||||
const isMobile = userAgent.includes('android') || userAgent.includes('iphone')
|
||||
|
||||
const views = [
|
||||
{
|
||||
label: "Welcome",
|
||||
label: 'Welcome',
|
||||
component: Welcome,
|
||||
icon: "i-ph-hand-waving",
|
||||
icon: 'i-ph-hand-waving'
|
||||
},
|
||||
{
|
||||
label: "Communication",
|
||||
label: 'Communication',
|
||||
component: Communication,
|
||||
icon: "i-codicon-radio-tower",
|
||||
icon: 'i-codicon-radio-tower'
|
||||
},
|
||||
!isMobile && {
|
||||
label: "CLI",
|
||||
label: 'CLI',
|
||||
component: Cli,
|
||||
icon: "i-codicon-terminal",
|
||||
icon: 'i-codicon-terminal'
|
||||
},
|
||||
{
|
||||
label: "Dialog",
|
||||
label: 'Dialog',
|
||||
component: Dialog,
|
||||
icon: "i-codicon-multiple-windows",
|
||||
icon: 'i-codicon-multiple-windows'
|
||||
},
|
||||
{
|
||||
label: "File system",
|
||||
label: 'File system',
|
||||
component: FileSystem,
|
||||
icon: "i-codicon-files",
|
||||
icon: 'i-codicon-files'
|
||||
},
|
||||
{
|
||||
label: "HTTP",
|
||||
label: 'HTTP',
|
||||
component: Http,
|
||||
icon: "i-ph-globe-hemisphere-west",
|
||||
icon: 'i-ph-globe-hemisphere-west'
|
||||
},
|
||||
{
|
||||
label: "Notifications",
|
||||
label: 'Notifications',
|
||||
component: Notifications,
|
||||
icon: "i-codicon-bell-dot",
|
||||
icon: 'i-codicon-bell-dot'
|
||||
},
|
||||
!isMobile && {
|
||||
label: "Shortcuts",
|
||||
label: 'Shortcuts',
|
||||
component: Shortcuts,
|
||||
icon: "i-codicon-record-keys",
|
||||
icon: 'i-codicon-record-keys'
|
||||
},
|
||||
{
|
||||
label: "Shell",
|
||||
label: 'Shell',
|
||||
component: Shell,
|
||||
icon: "i-codicon-terminal-bash",
|
||||
icon: 'i-codicon-terminal-bash'
|
||||
},
|
||||
{
|
||||
label: "Store",
|
||||
label: 'Store',
|
||||
component: Store,
|
||||
icon: "i-codicon-file-code",
|
||||
icon: 'i-codicon-file-code'
|
||||
},
|
||||
!isMobile && {
|
||||
label: "Updater",
|
||||
label: 'Updater',
|
||||
component: Updater,
|
||||
icon: "i-codicon-cloud-download",
|
||||
icon: 'i-codicon-cloud-download'
|
||||
},
|
||||
{
|
||||
label: "Clipboard",
|
||||
label: 'Clipboard',
|
||||
component: Clipboard,
|
||||
icon: "i-codicon-clippy",
|
||||
icon: 'i-codicon-clippy'
|
||||
},
|
||||
{
|
||||
label: "WebRTC",
|
||||
label: 'WebRTC',
|
||||
component: WebRTC,
|
||||
icon: "i-ph-broadcast",
|
||||
icon: 'i-ph-broadcast'
|
||||
},
|
||||
isMobile && {
|
||||
label: "Scanner",
|
||||
label: 'Scanner',
|
||||
component: Scanner,
|
||||
icon: "i-ph-scan",
|
||||
icon: 'i-ph-scan'
|
||||
},
|
||||
isMobile && {
|
||||
label: "NFC",
|
||||
label: 'NFC',
|
||||
component: Nfc,
|
||||
icon: "i-ph-nfc",
|
||||
icon: 'i-ph-nfc'
|
||||
},
|
||||
isMobile && {
|
||||
label: "Biometric",
|
||||
label: 'Biometric',
|
||||
component: Biometric,
|
||||
icon: "i-ph-scan",
|
||||
icon: 'i-ph-scan'
|
||||
},
|
||||
];
|
||||
isMobile && {
|
||||
label: 'Geolocation',
|
||||
component: Geolocation,
|
||||
icon: 'i-ph-map-pin'
|
||||
}
|
||||
]
|
||||
|
||||
let selected = views[0];
|
||||
let selected = views[0]
|
||||
function select(view) {
|
||||
selected = view;
|
||||
selected = view
|
||||
}
|
||||
|
||||
// Window controls
|
||||
let isWindowMaximized;
|
||||
let isWindowMaximized
|
||||
onMount(async () => {
|
||||
isWindowMaximized = await appWindow.isMaximized();
|
||||
isWindowMaximized = await appWindow.isMaximized()
|
||||
appWindow.onResized(async () => {
|
||||
isWindowMaximized = await appWindow.isMaximized();
|
||||
});
|
||||
});
|
||||
isWindowMaximized = await appWindow.isMaximized()
|
||||
})
|
||||
})
|
||||
|
||||
function minimize() {
|
||||
appWindow.minimize();
|
||||
appWindow.minimize()
|
||||
}
|
||||
|
||||
async function toggleMaximize() {
|
||||
(await appWindow.isMaximized())
|
||||
;(await appWindow.isMaximized())
|
||||
? appWindow.unmaximize()
|
||||
: appWindow.maximize();
|
||||
: appWindow.maximize()
|
||||
}
|
||||
|
||||
let confirmed_close = false;
|
||||
let confirmed_close = false
|
||||
async function close() {
|
||||
if (!confirmed_close) {
|
||||
confirmed_close = await ask(
|
||||
"Are you sure that you want to close this window?",
|
||||
'Are you sure that you want to close this window?',
|
||||
{
|
||||
title: "Tauri API",
|
||||
title: 'Tauri API'
|
||||
}
|
||||
);
|
||||
)
|
||||
if (confirmed_close) {
|
||||
appWindow.close();
|
||||
appWindow.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// dark/light
|
||||
let isDark;
|
||||
let isDark
|
||||
onMount(() => {
|
||||
isDark = localStorage && localStorage.getItem("theme") == "dark";
|
||||
applyTheme(isDark);
|
||||
});
|
||||
isDark = localStorage && localStorage.getItem('theme') == 'dark'
|
||||
applyTheme(isDark)
|
||||
})
|
||||
function applyTheme(isDark) {
|
||||
const html = document.querySelector("html");
|
||||
isDark ? html.classList.add("dark") : html.classList.remove("dark");
|
||||
localStorage && localStorage.setItem("theme", isDark ? "dark" : "");
|
||||
const html = document.querySelector('html')
|
||||
isDark ? html.classList.add('dark') : html.classList.remove('dark')
|
||||
localStorage && localStorage.setItem('theme', isDark ? 'dark' : '')
|
||||
}
|
||||
function toggleDark() {
|
||||
isDark = !isDark;
|
||||
applyTheme(isDark);
|
||||
isDark = !isDark
|
||||
applyTheme(isDark)
|
||||
}
|
||||
|
||||
// Console
|
||||
let messages = writable([]);
|
||||
let consoleTextEl;
|
||||
let messages = writable([])
|
||||
let consoleTextEl
|
||||
async function onMessage(value) {
|
||||
messages.update((r) => [
|
||||
...r,
|
||||
{
|
||||
html:
|
||||
`<pre><strong class="text-accent dark:text-darkAccent">[${new Date().toLocaleTimeString()}]:</strong> ` +
|
||||
(typeof value === "string" ? value : JSON.stringify(value, null, 1)) +
|
||||
"</pre>",
|
||||
},
|
||||
]);
|
||||
await tick();
|
||||
if (consoleTextEl) consoleTextEl.scrollTop = consoleTextEl.scrollHeight;
|
||||
(typeof value === 'string' ? value : JSON.stringify(value, null, 1)) +
|
||||
'</pre>'
|
||||
}
|
||||
])
|
||||
await tick()
|
||||
if (consoleTextEl) consoleTextEl.scrollTop = consoleTextEl.scrollHeight
|
||||
}
|
||||
|
||||
// this function is renders HTML without sanitizing it so it's insecure
|
||||
@@ -209,111 +214,109 @@
|
||||
html:
|
||||
`<pre><strong class="text-accent dark:text-darkAccent">[${new Date().toLocaleTimeString()}]:</strong> ` +
|
||||
html +
|
||||
"</pre>",
|
||||
},
|
||||
]);
|
||||
await tick();
|
||||
if (consoleTextEl) consoleTextEl.scrollTop = consoleTextEl.scrollHeight;
|
||||
'</pre>'
|
||||
}
|
||||
])
|
||||
await tick()
|
||||
if (consoleTextEl) consoleTextEl.scrollTop = consoleTextEl.scrollHeight
|
||||
}
|
||||
|
||||
function clear() {
|
||||
messages.update(() => []);
|
||||
messages.update(() => [])
|
||||
}
|
||||
|
||||
let consoleEl, consoleH, cStartY;
|
||||
let minConsoleHeight = 50;
|
||||
let consoleEl, consoleH, cStartY
|
||||
let minConsoleHeight = 50
|
||||
function startResizingConsole(e) {
|
||||
cStartY = e.clientY;
|
||||
cStartY = e.clientY
|
||||
|
||||
const styles = window.getComputedStyle(consoleEl);
|
||||
consoleH = parseInt(styles.height, 10);
|
||||
const styles = window.getComputedStyle(consoleEl)
|
||||
consoleH = parseInt(styles.height, 10)
|
||||
|
||||
const moveHandler = (e) => {
|
||||
const dy = e.clientY - cStartY;
|
||||
const newH = consoleH - dy;
|
||||
const dy = e.clientY - cStartY
|
||||
const newH = consoleH - dy
|
||||
consoleEl.style.height = `${
|
||||
newH < minConsoleHeight ? minConsoleHeight : newH
|
||||
}px`;
|
||||
};
|
||||
}px`
|
||||
}
|
||||
const upHandler = () => {
|
||||
document.removeEventListener("mouseup", upHandler);
|
||||
document.removeEventListener("mousemove", moveHandler);
|
||||
};
|
||||
document.addEventListener("mouseup", upHandler);
|
||||
document.addEventListener("mousemove", moveHandler);
|
||||
document.removeEventListener('mouseup', upHandler)
|
||||
document.removeEventListener('mousemove', moveHandler)
|
||||
}
|
||||
document.addEventListener('mouseup', upHandler)
|
||||
document.addEventListener('mousemove', moveHandler)
|
||||
}
|
||||
|
||||
let isWindows;
|
||||
let isWindows
|
||||
onMount(async () => {
|
||||
isWindows = (await os.platform()) === "windows";
|
||||
});
|
||||
isWindows = (await os.platform()) === 'windows'
|
||||
})
|
||||
|
||||
// mobile
|
||||
let isSideBarOpen = false;
|
||||
let sidebar;
|
||||
let sidebarToggle;
|
||||
let isDraggingSideBar = false;
|
||||
let draggingStartPosX = 0;
|
||||
let draggingEndPosX = 0;
|
||||
const clamp = (min, num, max) => Math.min(Math.max(num, min), max);
|
||||
let isSideBarOpen = false
|
||||
let sidebar
|
||||
let sidebarToggle
|
||||
let isDraggingSideBar = false
|
||||
let draggingStartPosX = 0
|
||||
let draggingEndPosX = 0
|
||||
const clamp = (min, num, max) => Math.min(Math.max(num, min), max)
|
||||
|
||||
function toggleSidebar(sidebar, isSideBarOpen) {
|
||||
sidebar.style.setProperty(
|
||||
"--translate-x",
|
||||
`${isSideBarOpen ? "0" : "-18.75"}rem`
|
||||
);
|
||||
'--translate-x',
|
||||
`${isSideBarOpen ? '0' : '-18.75'}rem`
|
||||
)
|
||||
}
|
||||
|
||||
onMount(() => {
|
||||
sidebar = document.querySelector("#sidebar");
|
||||
sidebarToggle = document.querySelector("#sidebarToggle");
|
||||
sidebar = document.querySelector('#sidebar')
|
||||
sidebarToggle = document.querySelector('#sidebarToggle')
|
||||
|
||||
document.addEventListener("click", (e) => {
|
||||
document.addEventListener('click', (e) => {
|
||||
if (sidebarToggle.contains(e.target)) {
|
||||
isSideBarOpen = !isSideBarOpen;
|
||||
isSideBarOpen = !isSideBarOpen
|
||||
} else if (isSideBarOpen && !sidebar.contains(e.target)) {
|
||||
isSideBarOpen = false;
|
||||
isSideBarOpen = false
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
document.addEventListener("touchstart", (e) => {
|
||||
if (sidebarToggle.contains(e.target)) return;
|
||||
document.addEventListener('touchstart', (e) => {
|
||||
if (sidebarToggle.contains(e.target)) return
|
||||
|
||||
const x = e.touches[0].clientX;
|
||||
const x = e.touches[0].clientX
|
||||
if ((0 < x && x < 20 && !isSideBarOpen) || isSideBarOpen) {
|
||||
isDraggingSideBar = true;
|
||||
draggingStartPosX = x;
|
||||
isDraggingSideBar = true
|
||||
draggingStartPosX = x
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
document.addEventListener("touchmove", (e) => {
|
||||
document.addEventListener('touchmove', (e) => {
|
||||
if (isDraggingSideBar) {
|
||||
const x = e.touches[0].clientX;
|
||||
draggingEndPosX = x;
|
||||
const delta = (x - draggingStartPosX) / 10;
|
||||
const x = e.touches[0].clientX
|
||||
draggingEndPosX = x
|
||||
const delta = (x - draggingStartPosX) / 10
|
||||
sidebar.style.setProperty(
|
||||
"--translate-x",
|
||||
'--translate-x',
|
||||
`-${clamp(0, isSideBarOpen ? 0 - delta : 18.75 - delta, 18.75)}rem`
|
||||
);
|
||||
)
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
document.addEventListener("touchend", () => {
|
||||
document.addEventListener('touchend', () => {
|
||||
if (isDraggingSideBar) {
|
||||
const delta = (draggingEndPosX - draggingStartPosX) / 10;
|
||||
isSideBarOpen = isSideBarOpen
|
||||
? delta > -(18.75 / 2)
|
||||
: delta > 18.75 / 2;
|
||||
const delta = (draggingEndPosX - draggingStartPosX) / 10
|
||||
isSideBarOpen = isSideBarOpen ? delta > -(18.75 / 2) : delta > 18.75 / 2
|
||||
}
|
||||
|
||||
isDraggingSideBar = false;
|
||||
});
|
||||
});
|
||||
isDraggingSideBar = false
|
||||
})
|
||||
})
|
||||
|
||||
$: {
|
||||
const sidebar = document.querySelector("#sidebar");
|
||||
const sidebar = document.querySelector('#sidebar')
|
||||
if (sidebar) {
|
||||
toggleSidebar(sidebar, isSideBarOpen);
|
||||
toggleSidebar(sidebar, isSideBarOpen)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -332,7 +335,7 @@
|
||||
children:items-center children:justify-center"
|
||||
>
|
||||
<span
|
||||
title={isDark ? "Switch to Light mode" : "Switch to Dark mode"}
|
||||
title={isDark ? 'Switch to Light mode' : 'Switch to Dark mode'}
|
||||
class="hover:bg-hoverOverlay active:bg-hoverOverlayDarker dark:hover:bg-darkHoverOverlay dark:active:bg-darkHoverOverlayDarker"
|
||||
on:click={toggleDark}
|
||||
>
|
||||
@@ -350,7 +353,7 @@
|
||||
<div class="i-codicon-chrome-minimize" />
|
||||
</span>
|
||||
<span
|
||||
title={isWindowMaximized ? "Restore" : "Maximize"}
|
||||
title={isWindowMaximized ? 'Restore' : 'Maximize'}
|
||||
class="hover:bg-hoverOverlay active:bg-hoverOverlayDarker dark:hover:bg-darkHoverOverlay dark:active:bg-darkHoverOverlayDarker"
|
||||
on:click={toggleMaximize}
|
||||
>
|
||||
@@ -393,7 +396,7 @@
|
||||
bg-darkPrimaryLighter transition-colors-250 overflow-hidden grid select-none px-2"
|
||||
>
|
||||
<img
|
||||
on:click={() => open("https://tauri.app/")}
|
||||
on:click={() => open('https://tauri.app/')}
|
||||
class="self-center p-7 cursor-pointer"
|
||||
src="tauri_logo.png"
|
||||
alt="Tauri logo"
|
||||
@@ -449,8 +452,8 @@
|
||||
href="##"
|
||||
class="nv {selected === view ? 'nv_selected' : ''}"
|
||||
on:click={() => {
|
||||
select(view);
|
||||
isSideBarOpen = false;
|
||||
select(view)
|
||||
isSideBarOpen = false
|
||||
}}
|
||||
>
|
||||
<div class="{view.icon} mr-2" />
|
||||
|
||||
@@ -1,59 +1,59 @@
|
||||
<script>
|
||||
import * as clipboard from "@tauri-apps/plugin-clipboard-manager";
|
||||
import { open } from "@tauri-apps/plugin-dialog";
|
||||
import { arrayBufferToBase64 } from "../lib/utils";
|
||||
import { readFile } from "@tauri-apps/plugin-fs";
|
||||
import * as clipboard from '@tauri-apps/plugin-clipboard-manager'
|
||||
import { open } from '@tauri-apps/plugin-dialog'
|
||||
import { arrayBufferToBase64 } from '../lib/utils'
|
||||
import { readFile } from '@tauri-apps/plugin-fs'
|
||||
|
||||
export let onMessage;
|
||||
export let insecureRenderHtml;
|
||||
let text = "clipboard message";
|
||||
export let onMessage
|
||||
export let insecureRenderHtml
|
||||
let text = 'clipboard message'
|
||||
|
||||
function writeText() {
|
||||
clipboard
|
||||
.writeText(text)
|
||||
.then(() => {
|
||||
onMessage("Wrote to the clipboard");
|
||||
onMessage('Wrote to the clipboard')
|
||||
})
|
||||
.catch(onMessage);
|
||||
.catch(onMessage)
|
||||
}
|
||||
|
||||
async function writeImage() {
|
||||
try {
|
||||
const res = await open({
|
||||
title: "Image to write to clipboard",
|
||||
const path = await open({
|
||||
title: 'Image to write to clipboard',
|
||||
filters: [
|
||||
{
|
||||
name: "Clipboard IMG",
|
||||
extensions: ["png", "jpg", "jpeg"],
|
||||
},
|
||||
],
|
||||
});
|
||||
const bytes = await readFile(res.path);
|
||||
await clipboard.writeImage(bytes);
|
||||
onMessage("wrote image");
|
||||
name: 'Clipboard IMG',
|
||||
extensions: ['png', 'jpg', 'jpeg']
|
||||
}
|
||||
]
|
||||
})
|
||||
const bytes = await readFile(path)
|
||||
await clipboard.writeImage(bytes)
|
||||
onMessage('wrote image')
|
||||
} catch (e) {
|
||||
onMessage(e);
|
||||
onMessage(e)
|
||||
}
|
||||
}
|
||||
|
||||
async function read() {
|
||||
try {
|
||||
const image = await clipboard.readImage();
|
||||
const image = await clipboard.readImage()
|
||||
arrayBufferToBase64(await image.rgba(), function (base64) {
|
||||
const src = "data:image/png;base64," + base64;
|
||||
insecureRenderHtml('<img src="' + src + '"></img>');
|
||||
});
|
||||
return;
|
||||
const src = 'data:image/png;base64,' + base64
|
||||
insecureRenderHtml('<img src="' + src + '"></img>')
|
||||
})
|
||||
return
|
||||
} catch (_) {}
|
||||
|
||||
clipboard
|
||||
.readText()
|
||||
.then((contents) => {
|
||||
onMessage(`Clipboard contents: ${contents}`);
|
||||
onMessage(`Clipboard contents: ${contents}`)
|
||||
})
|
||||
.catch((e) => {
|
||||
onMessage(e);
|
||||
});
|
||||
onMessage(e)
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -65,6 +65,5 @@
|
||||
/>
|
||||
<button class="btn" type="button" on:click={writeText}>Write</button>
|
||||
<button class="btn" type="button" on:click={writeImage}>Pick Image</button>
|
||||
|
||||
<button class="btn" type="button" on:click={read}>Read</button>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
<script>
|
||||
import {
|
||||
checkPermissions,
|
||||
requestPermissions,
|
||||
getCurrentPosition
|
||||
} from '@tauri-apps/plugin-geolocation'
|
||||
|
||||
export let onMessage
|
||||
|
||||
async function getPosition() {
|
||||
let permissions = await checkPermissions()
|
||||
if (
|
||||
permissions.location === 'prompt' ||
|
||||
permissions.location === 'prompt-with-rationale'
|
||||
) {
|
||||
permissions = await requestPermissions(['location'])
|
||||
}
|
||||
|
||||
if (permissions.location === 'granted') {
|
||||
getCurrentPosition().then(onMessage).catch(onMessage)
|
||||
} else {
|
||||
onMessage('permission denied')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<button class="btn" id="cli-matches" on:click={getPosition}>
|
||||
Get Position
|
||||
</button>
|
||||
@@ -295,53 +295,39 @@
|
||||
"type": "string",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "allow-disable -> Enables the disable command without any pre-configured scope.",
|
||||
"description": "Enables the disable command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-disable"
|
||||
]
|
||||
"const": "allow-disable"
|
||||
},
|
||||
{
|
||||
"description": "deny-disable -> Denies the disable command without any pre-configured scope.",
|
||||
"description": "Denies the disable command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-disable"
|
||||
]
|
||||
"const": "deny-disable"
|
||||
},
|
||||
{
|
||||
"description": "allow-enable -> Enables the enable command without any pre-configured scope.",
|
||||
"description": "Enables the enable command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-enable"
|
||||
]
|
||||
"const": "allow-enable"
|
||||
},
|
||||
{
|
||||
"description": "deny-enable -> Denies the enable command without any pre-configured scope.",
|
||||
"description": "Denies the enable command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-enable"
|
||||
]
|
||||
"const": "deny-enable"
|
||||
},
|
||||
{
|
||||
"description": "allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.",
|
||||
"description": "Enables the is_enabled command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-is-enabled"
|
||||
]
|
||||
"const": "allow-is-enabled"
|
||||
},
|
||||
{
|
||||
"description": "deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.",
|
||||
"description": "Denies the is_enabled command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-is-enabled"
|
||||
]
|
||||
"const": "deny-is-enabled"
|
||||
},
|
||||
{
|
||||
"description": "default -> This permission set configures if your\napplication can enable or disable auto\nstarting the application on boot.\n\n#### Granted Permissions\n\nIt allows all to check, enable and\ndisable the automatic start on boot.\n\n",
|
||||
"description": "This permission set configures if your\napplication can enable or disable auto\nstarting the application on boot.\n\n#### Granted Permissions\n\nIt allows all to check, enable and\ndisable the automatic start on boot.\n\n",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"default"
|
||||
]
|
||||
"const": "default"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
# Changelog
|
||||
|
||||
## \[2.0.0-rc.2]
|
||||
|
||||
- [`79d6e19c`](https://github.com/tauri-apps/plugins-workspace/commit/79d6e19c4b38bae0cab29eb88df379e2237d9aac) ([#1777](https://github.com/tauri-apps/plugins-workspace/pull/1777)) Fixed an issue which caused checkPermission and requestPermission to be mixed up.
|
||||
|
||||
## \[2.0.0-rc.4]
|
||||
|
||||
- [`713c54ef`](https://github.com/tauri-apps/plugins-workspace/commit/713c54ef8365d36afd84585dcabed2fbb751223d) ([#1749](https://github.com/tauri-apps/plugins-workspace/pull/1749) by [@olivierlemasle](https://github.com/tauri-apps/plugins-workspace/../../olivierlemasle)) Remove unused Android dependencies.
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
|
||||
import {
|
||||
invoke,
|
||||
requestPermissions as checkPermissions_,
|
||||
checkPermissions as requestPermissions_
|
||||
requestPermissions as requestPermissions_,
|
||||
checkPermissions as checkPermissions_
|
||||
} from '@tauri-apps/api/core'
|
||||
|
||||
export type { PermissionState } from '@tauri-apps/api/core'
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@tauri-apps/plugin-barcode-scanner",
|
||||
"version": "2.0.0-rc.1",
|
||||
"version": "2.0.0-rc.2",
|
||||
"description": "Scan QR codes, EAN-13 and other kinds of barcodes on Android and iOS",
|
||||
"license": "MIT or APACHE-2.0",
|
||||
"authors": [
|
||||
|
||||
@@ -295,95 +295,69 @@
|
||||
"type": "string",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "allow-cancel -> Enables the cancel command without any pre-configured scope.",
|
||||
"description": "Enables the cancel command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-cancel"
|
||||
]
|
||||
"const": "allow-cancel"
|
||||
},
|
||||
{
|
||||
"description": "deny-cancel -> Denies the cancel command without any pre-configured scope.",
|
||||
"description": "Denies the cancel command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-cancel"
|
||||
]
|
||||
"const": "deny-cancel"
|
||||
},
|
||||
{
|
||||
"description": "allow-check-permissions -> Enables the check_permissions command without any pre-configured scope.",
|
||||
"description": "Enables the check_permissions command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-check-permissions"
|
||||
]
|
||||
"const": "allow-check-permissions"
|
||||
},
|
||||
{
|
||||
"description": "deny-check-permissions -> Denies the check_permissions command without any pre-configured scope.",
|
||||
"description": "Denies the check_permissions command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-check-permissions"
|
||||
]
|
||||
"const": "deny-check-permissions"
|
||||
},
|
||||
{
|
||||
"description": "allow-open-app-settings -> Enables the open_app_settings command without any pre-configured scope.",
|
||||
"description": "Enables the open_app_settings command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-open-app-settings"
|
||||
]
|
||||
"const": "allow-open-app-settings"
|
||||
},
|
||||
{
|
||||
"description": "deny-open-app-settings -> Denies the open_app_settings command without any pre-configured scope.",
|
||||
"description": "Denies the open_app_settings command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-open-app-settings"
|
||||
]
|
||||
"const": "deny-open-app-settings"
|
||||
},
|
||||
{
|
||||
"description": "allow-request-permissions -> Enables the request_permissions command without any pre-configured scope.",
|
||||
"description": "Enables the request_permissions command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-request-permissions"
|
||||
]
|
||||
"const": "allow-request-permissions"
|
||||
},
|
||||
{
|
||||
"description": "deny-request-permissions -> Denies the request_permissions command without any pre-configured scope.",
|
||||
"description": "Denies the request_permissions command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-request-permissions"
|
||||
]
|
||||
"const": "deny-request-permissions"
|
||||
},
|
||||
{
|
||||
"description": "allow-scan -> Enables the scan command without any pre-configured scope.",
|
||||
"description": "Enables the scan command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-scan"
|
||||
]
|
||||
"const": "allow-scan"
|
||||
},
|
||||
{
|
||||
"description": "deny-scan -> Denies the scan command without any pre-configured scope.",
|
||||
"description": "Denies the scan command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-scan"
|
||||
]
|
||||
"const": "deny-scan"
|
||||
},
|
||||
{
|
||||
"description": "allow-vibrate -> Enables the vibrate command without any pre-configured scope.",
|
||||
"description": "Enables the vibrate command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-vibrate"
|
||||
]
|
||||
"const": "allow-vibrate"
|
||||
},
|
||||
{
|
||||
"description": "deny-vibrate -> Denies the vibrate command without any pre-configured scope.",
|
||||
"description": "Denies the vibrate command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-vibrate"
|
||||
]
|
||||
"const": "deny-vibrate"
|
||||
},
|
||||
{
|
||||
"description": "default -> This permission set configures which\nbarcode scanning features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all barcode related features.\n\n",
|
||||
"description": "This permission set configures which\nbarcode scanning features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all barcode related features.\n\n",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"default"
|
||||
]
|
||||
"const": "default"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -295,39 +295,29 @@
|
||||
"type": "string",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "allow-authenticate -> Enables the authenticate command without any pre-configured scope.",
|
||||
"description": "Enables the authenticate command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-authenticate"
|
||||
]
|
||||
"const": "allow-authenticate"
|
||||
},
|
||||
{
|
||||
"description": "deny-authenticate -> Denies the authenticate command without any pre-configured scope.",
|
||||
"description": "Denies the authenticate command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-authenticate"
|
||||
]
|
||||
"const": "deny-authenticate"
|
||||
},
|
||||
{
|
||||
"description": "allow-status -> Enables the status command without any pre-configured scope.",
|
||||
"description": "Enables the status command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-status"
|
||||
]
|
||||
"const": "allow-status"
|
||||
},
|
||||
{
|
||||
"description": "deny-status -> Denies the status command without any pre-configured scope.",
|
||||
"description": "Denies the status command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-status"
|
||||
]
|
||||
"const": "deny-status"
|
||||
},
|
||||
{
|
||||
"description": "default -> This permission set configures which\nbiometric features are by default exposed.\n\n#### Granted Permissions\n\nIt allows acccess to all biometric commands.\n\n",
|
||||
"description": "This permission set configures which\nbiometric features are by default exposed.\n\n#### Granted Permissions\n\nIt allows acccess to all biometric commands.\n\n",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"default"
|
||||
]
|
||||
"const": "default"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -295,25 +295,19 @@
|
||||
"type": "string",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "allow-cli-matches -> Enables the cli_matches command without any pre-configured scope.",
|
||||
"description": "Enables the cli_matches command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-cli-matches"
|
||||
]
|
||||
"const": "allow-cli-matches"
|
||||
},
|
||||
{
|
||||
"description": "deny-cli-matches -> Denies the cli_matches command without any pre-configured scope.",
|
||||
"description": "Denies the cli_matches command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-cli-matches"
|
||||
]
|
||||
"const": "deny-cli-matches"
|
||||
},
|
||||
{
|
||||
"description": "default -> Allows reading the CLI matches",
|
||||
"description": "Allows reading the CLI matches",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"default"
|
||||
]
|
||||
"const": "default"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
# Changelog
|
||||
|
||||
## \[2.0.0-rc.2]
|
||||
|
||||
- [`341a5320`](https://github.com/tauri-apps/plugins-workspace/commit/341a5320c33d3c7b041abf7eb0ab7ad8009e6c3f) ([#1771](https://github.com/tauri-apps/plugins-workspace/pull/1771)) Fix warnings and clear implementation on Android below SDK 28.
|
||||
|
||||
## \[2.0.0-rc.1]
|
||||
|
||||
- [`e2e97db5`](https://github.com/tauri-apps/plugins-workspace/commit/e2e97db51983267f5be84d4f6f0278d58834d1f5) ([#1701](https://github.com/tauri-apps/plugins-workspace/pull/1701) by [@lucasfernog](https://github.com/tauri-apps/plugins-workspace/../../lucasfernog)) Update to tauri 2.0.0-rc.8
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "tauri-plugin-clipboard-manager"
|
||||
version = "2.0.0-rc.3"
|
||||
version = "2.0.0-rc.4"
|
||||
description = "Read and write to the system clipboard."
|
||||
edition = { workspace = true }
|
||||
authors = { workspace = true }
|
||||
@@ -29,4 +29,4 @@ tauri = { workspace = true, features = ["wry"] }
|
||||
|
||||
[target."cfg(any(target_os = \"macos\", windows, target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\"))".dependencies]
|
||||
arboard = "3"
|
||||
image = "0.24"
|
||||
image = "0.25"
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
|
||||
package app.tauri.clipboard
|
||||
|
||||
import android.R.attr.value
|
||||
import android.app.Activity
|
||||
import android.content.ClipData
|
||||
import android.content.ClipDescription
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import app.tauri.annotation.Command
|
||||
import app.tauri.annotation.InvokeArg
|
||||
import app.tauri.annotation.TauriPlugin
|
||||
@@ -59,6 +59,9 @@ internal class ReadClipDataSerializer @JvmOverloads constructor(t: Class<ReadCli
|
||||
|
||||
jgen.writeEndObject()
|
||||
}
|
||||
else -> {
|
||||
throw Exception("unimplemented ReadClipData")
|
||||
}
|
||||
}
|
||||
|
||||
jgen.writeEndObject()
|
||||
@@ -93,7 +96,7 @@ class ClipboardPlugin(private val activity: Activity) : Plugin(activity) {
|
||||
is WriteOptions.PlainText -> {
|
||||
ClipData.newPlainText(args.label, args.text)
|
||||
} else -> {
|
||||
invoke.reject("Invalid write options provided")
|
||||
invoke.reject("unimplemented WriteOptions")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -128,7 +131,11 @@ class ClipboardPlugin(private val activity: Activity) : Plugin(activity) {
|
||||
@Command
|
||||
fun clear(invoke: Invoke) {
|
||||
if (manager.hasPrimaryClip()) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
manager.clearPrimaryClip()
|
||||
} else {
|
||||
manager.setPrimaryClip(ClipData.newPlainText("", ""))
|
||||
}
|
||||
}
|
||||
invoke.resolve()
|
||||
}
|
||||
|
||||
@@ -114,6 +114,11 @@ async function writeHtml(html: string, altHtml?: string): Promise<void> {
|
||||
|
||||
/**
|
||||
* Clears the clipboard.
|
||||
*
|
||||
* #### Platform-specific
|
||||
*
|
||||
* - **Android:** Only supported on SDK 28+. For older releases we write an empty string to the clipboard instead.
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* import { clear } from '@tauri-apps/plugin-clipboard-manager';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@tauri-apps/plugin-clipboard-manager",
|
||||
"version": "2.0.0-rc.1",
|
||||
"version": "2.0.0-rc.2",
|
||||
"license": "MIT or APACHE-2.0",
|
||||
"authors": [
|
||||
"Tauri Programme within The Commons Conservancy"
|
||||
|
||||
@@ -295,95 +295,69 @@
|
||||
"type": "string",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "allow-clear -> Enables the clear command without any pre-configured scope.",
|
||||
"description": "Enables the clear command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-clear"
|
||||
]
|
||||
"const": "allow-clear"
|
||||
},
|
||||
{
|
||||
"description": "deny-clear -> Denies the clear command without any pre-configured scope.",
|
||||
"description": "Denies the clear command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-clear"
|
||||
]
|
||||
"const": "deny-clear"
|
||||
},
|
||||
{
|
||||
"description": "allow-read-image -> Enables the read_image command without any pre-configured scope.",
|
||||
"description": "Enables the read_image command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-read-image"
|
||||
]
|
||||
"const": "allow-read-image"
|
||||
},
|
||||
{
|
||||
"description": "deny-read-image -> Denies the read_image command without any pre-configured scope.",
|
||||
"description": "Denies the read_image command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-read-image"
|
||||
]
|
||||
"const": "deny-read-image"
|
||||
},
|
||||
{
|
||||
"description": "allow-read-text -> Enables the read_text command without any pre-configured scope.",
|
||||
"description": "Enables the read_text command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-read-text"
|
||||
]
|
||||
"const": "allow-read-text"
|
||||
},
|
||||
{
|
||||
"description": "deny-read-text -> Denies the read_text command without any pre-configured scope.",
|
||||
"description": "Denies the read_text command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-read-text"
|
||||
]
|
||||
"const": "deny-read-text"
|
||||
},
|
||||
{
|
||||
"description": "allow-write-html -> Enables the write_html command without any pre-configured scope.",
|
||||
"description": "Enables the write_html command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-write-html"
|
||||
]
|
||||
"const": "allow-write-html"
|
||||
},
|
||||
{
|
||||
"description": "deny-write-html -> Denies the write_html command without any pre-configured scope.",
|
||||
"description": "Denies the write_html command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-write-html"
|
||||
]
|
||||
"const": "deny-write-html"
|
||||
},
|
||||
{
|
||||
"description": "allow-write-image -> Enables the write_image command without any pre-configured scope.",
|
||||
"description": "Enables the write_image command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-write-image"
|
||||
]
|
||||
"const": "allow-write-image"
|
||||
},
|
||||
{
|
||||
"description": "deny-write-image -> Denies the write_image command without any pre-configured scope.",
|
||||
"description": "Denies the write_image command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-write-image"
|
||||
]
|
||||
"const": "deny-write-image"
|
||||
},
|
||||
{
|
||||
"description": "allow-write-text -> Enables the write_text command without any pre-configured scope.",
|
||||
"description": "Enables the write_text command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-write-text"
|
||||
]
|
||||
"const": "allow-write-text"
|
||||
},
|
||||
{
|
||||
"description": "deny-write-text -> Denies the write_text command without any pre-configured scope.",
|
||||
"description": "Denies the write_text command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-write-text"
|
||||
]
|
||||
"const": "deny-write-text"
|
||||
},
|
||||
{
|
||||
"description": "default -> No features are enabled by default, as we believe\nthe clipboard can be inherently dangerous and it is \napplication specific if read and/or write access is needed.\n\nClipboard interaction needs to be explicitly enabled.\n",
|
||||
"description": "No features are enabled by default, as we believe\nthe clipboard can be inherently dangerous and it is \napplication specific if read and/or write access is needed.\n\nClipboard interaction needs to be explicitly enabled.\n",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"default"
|
||||
]
|
||||
"const": "default"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ impl<R: Runtime> Clipboard<R> {
|
||||
&image.bytes,
|
||||
image.width as u32,
|
||||
image.height as u32,
|
||||
image::ColorType::Rgba8,
|
||||
image::ExtendedColorType::Rgba8,
|
||||
)?;
|
||||
|
||||
let image = Image::new_owned(buffer, image.width as u32, image.height as u32);
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
# Changelog
|
||||
|
||||
## \[2.0.0-rc.6]
|
||||
|
||||
- [`6f3f6679`](https://github.com/tauri-apps/plugins-workspace/commit/6f3f66794a87ef9d1c16667c425d5ad7091a9c2f) ([#1780](https://github.com/tauri-apps/plugins-workspace/pull/1780)) Added `DeepLink::on_open_url` function to match the JavaScript API implementation,
|
||||
which wraps the `deep-link://new-url` event and also send the current deep link if there's any.
|
||||
|
||||
## \[2.0.0-rc.5]
|
||||
|
||||
- [`984110a9`](https://github.com/tauri-apps/plugins-workspace/commit/984110a978774712bad4d746ed06134d54debcd0) ([#1770](https://github.com/tauri-apps/plugins-workspace/pull/1770) by [@lucasfernog](https://github.com/tauri-apps/plugins-workspace/../../lucasfernog)) Emit the `deep-link://new-url` event on Linux and Windows when the app is executed with a deep link CLI argument,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "tauri-plugin-deep-link"
|
||||
version = "2.0.0-rc.5"
|
||||
version = "2.0.0-rc.6"
|
||||
description = "Set your Tauri application as the default handler for an URL"
|
||||
authors = { workspace = true }
|
||||
license = { workspace = true }
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"@tauri-apps/plugin-deep-link": "2.0.0-rc.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tauri-apps/cli": "2.0.0-rc.13",
|
||||
"@tauri-apps/cli": "2.0.0-rc.15",
|
||||
"typescript": "^5.2.2",
|
||||
"vite": "^5.0.13"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
use tauri::Listener;
|
||||
use tauri_plugin_deep_link::DeepLinkExt;
|
||||
|
||||
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
|
||||
#[tauri::command]
|
||||
@@ -33,16 +33,14 @@ pub fn run() {
|
||||
// ensure deep links are registered on the system
|
||||
// this is useful because AppImages requires additional setup to be available in the system
|
||||
// and calling register() makes the deep links immediately available - without any user input
|
||||
#[cfg(target_os = "linux")]
|
||||
{
|
||||
use tauri_plugin_deep_link::DeepLinkExt;
|
||||
// additionally, we manually register on Windows on debug builds for development
|
||||
#[cfg(any(target_os = "linux", all(debug_assertions, windows)))]
|
||||
app.deep_link().register_all()?;
|
||||
|
||||
app.deep_link().register_all()?;
|
||||
}
|
||||
|
||||
app.listen("deep-link://new-url", |url| {
|
||||
dbg!(url);
|
||||
app.deep_link().on_open_url(|event| {
|
||||
dbg!(event.urls());
|
||||
});
|
||||
|
||||
Ok(())
|
||||
})
|
||||
.invoke_handler(tauri::generate_handler![greet])
|
||||
|
||||
@@ -295,67 +295,49 @@
|
||||
"type": "string",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "allow-get-current -> Enables the get_current command without any pre-configured scope.",
|
||||
"description": "Enables the get_current command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-get-current"
|
||||
]
|
||||
"const": "allow-get-current"
|
||||
},
|
||||
{
|
||||
"description": "deny-get-current -> Denies the get_current command without any pre-configured scope.",
|
||||
"description": "Denies the get_current command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-get-current"
|
||||
]
|
||||
"const": "deny-get-current"
|
||||
},
|
||||
{
|
||||
"description": "allow-is-registered -> Enables the is_registered command without any pre-configured scope.",
|
||||
"description": "Enables the is_registered command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-is-registered"
|
||||
]
|
||||
"const": "allow-is-registered"
|
||||
},
|
||||
{
|
||||
"description": "deny-is-registered -> Denies the is_registered command without any pre-configured scope.",
|
||||
"description": "Denies the is_registered command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-is-registered"
|
||||
]
|
||||
"const": "deny-is-registered"
|
||||
},
|
||||
{
|
||||
"description": "allow-register -> Enables the register command without any pre-configured scope.",
|
||||
"description": "Enables the register command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-register"
|
||||
]
|
||||
"const": "allow-register"
|
||||
},
|
||||
{
|
||||
"description": "deny-register -> Denies the register command without any pre-configured scope.",
|
||||
"description": "Denies the register command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-register"
|
||||
]
|
||||
"const": "deny-register"
|
||||
},
|
||||
{
|
||||
"description": "allow-unregister -> Enables the unregister command without any pre-configured scope.",
|
||||
"description": "Enables the unregister command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-unregister"
|
||||
]
|
||||
"const": "allow-unregister"
|
||||
},
|
||||
{
|
||||
"description": "deny-unregister -> Denies the unregister command without any pre-configured scope.",
|
||||
"description": "Denies the unregister command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-unregister"
|
||||
]
|
||||
"const": "deny-unregister"
|
||||
},
|
||||
{
|
||||
"description": "default -> Allows reading the opened deep link via the get_current command",
|
||||
"description": "Allows reading the opened deep link via the get_current command",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"default"
|
||||
]
|
||||
"const": "default"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -2,9 +2,11 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use tauri::{
|
||||
plugin::{Builder, PluginApi, TauriPlugin},
|
||||
AppHandle, Manager, Runtime,
|
||||
AppHandle, EventId, Listener, Manager, Runtime,
|
||||
};
|
||||
|
||||
mod commands;
|
||||
@@ -57,7 +59,10 @@ fn init_deep_link<R: Runtime>(
|
||||
},
|
||||
)?;
|
||||
|
||||
return Ok(DeepLink(handle));
|
||||
return Ok(DeepLink {
|
||||
app: app.clone(),
|
||||
plugin_handle: handle,
|
||||
});
|
||||
}
|
||||
|
||||
#[cfg(target_os = "ios")]
|
||||
@@ -83,10 +88,9 @@ fn init_deep_link<R: Runtime>(
|
||||
|
||||
#[cfg(target_os = "android")]
|
||||
mod imp {
|
||||
use tauri::{plugin::PluginHandle, Runtime};
|
||||
use tauri::{ipc::Channel, plugin::PluginHandle, AppHandle, Runtime};
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
use tauri::ipc::Channel;
|
||||
|
||||
#[derive(Serialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
@@ -101,7 +105,10 @@ mod imp {
|
||||
}
|
||||
|
||||
/// Access to the deep-link APIs.
|
||||
pub struct DeepLink<R: Runtime>(pub(crate) PluginHandle<R>);
|
||||
pub struct DeepLink<R: Runtime> {
|
||||
pub(crate) app: AppHandle<R>,
|
||||
pub(crate) plugin_handle: PluginHandle<R>,
|
||||
}
|
||||
|
||||
impl<R: Runtime> DeepLink<R> {
|
||||
/// Get the current URLs that triggered the deep link. Use this on app load to check whether your app was started via a deep link.
|
||||
@@ -112,7 +119,7 @@ mod imp {
|
||||
/// Note that you must manually check the arguments when registering deep link schemes dynamically with [`Self::register`].
|
||||
/// Additionally, the deep link might have been provided as a CLI argument so you should check if its format matches what you expect.
|
||||
pub fn get_current(&self) -> crate::Result<Option<Vec<url::Url>>> {
|
||||
self.0
|
||||
self.plugin_handle
|
||||
.run_mobile_plugin::<GetCurrentResponse>("getCurrent", ())
|
||||
.map(|v| v.url.map(|url| vec![url]))
|
||||
.map_err(Into::into)
|
||||
@@ -437,6 +444,7 @@ mod imp {
|
||||
}
|
||||
|
||||
pub use imp::DeepLink;
|
||||
use url::Url;
|
||||
|
||||
/// Extensions to [`tauri::App`], [`tauri::AppHandle`], [`tauri::WebviewWindow`], [`tauri::Webview`] and [`tauri::Window`] to access the deep-link APIs.
|
||||
pub trait DeepLinkExt<R: Runtime> {
|
||||
@@ -449,6 +457,54 @@ impl<R: Runtime, T: Manager<R>> crate::DeepLinkExt<R> for T {
|
||||
}
|
||||
}
|
||||
|
||||
/// Event that is triggered when the app was requested to open a new URL.
|
||||
///
|
||||
/// Typed [`tauri::Event`].
|
||||
pub struct OpenUrlEvent {
|
||||
id: EventId,
|
||||
urls: Vec<Url>,
|
||||
}
|
||||
|
||||
impl OpenUrlEvent {
|
||||
/// The event ID which can be used to stop listening to the event via [`tauri::Listener::unlisten`].
|
||||
pub fn id(&self) -> EventId {
|
||||
self.id
|
||||
}
|
||||
|
||||
/// The event URLs.
|
||||
pub fn urls(self) -> Vec<Url> {
|
||||
self.urls
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: Runtime> DeepLink<R> {
|
||||
/// Handle a new deep link being triggered to open the app.
|
||||
///
|
||||
/// To avoid race conditions, if the app was started with a deep link,
|
||||
/// the closure gets immediately called with the deep link URL.
|
||||
pub fn on_open_url<F: Fn(OpenUrlEvent) + Send + Sync + 'static>(&self, f: F) -> EventId {
|
||||
let f = Arc::new(f);
|
||||
let f_ = f.clone();
|
||||
let event_id = self.app.listen("deep-link://new-url", move |event| {
|
||||
if let Ok(urls) = serde_json::from_str(event.payload()) {
|
||||
f(OpenUrlEvent {
|
||||
id: event.id(),
|
||||
urls,
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
if let Ok(Some(current)) = self.get_current() {
|
||||
f_(OpenUrlEvent {
|
||||
id: event_id,
|
||||
urls: current,
|
||||
})
|
||||
}
|
||||
|
||||
event_id
|
||||
}
|
||||
}
|
||||
|
||||
/// Initializes the plugin.
|
||||
pub fn init<R: Runtime>() -> TauriPlugin<R, Option<config::Config>> {
|
||||
Builder::new("deep-link")
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# Changelog
|
||||
|
||||
## \[2.0.0-rc.7]
|
||||
|
||||
### Dependencies
|
||||
|
||||
- Upgraded to `fs@2.0.0-rc.5`
|
||||
|
||||
## \[2.0.0-rc.6]
|
||||
|
||||
- [`2b898f07`](https://github.com/tauri-apps/plugins-workspace/commit/2b898f078688c57309ca17962bf02e665c406514) ([#1769](https://github.com/tauri-apps/plugins-workspace/pull/1769) by [@lucasfernog](https://github.com/tauri-apps/plugins-workspace/../../lucasfernog)) Update Tauri scopes (asset protocol) when using the `open()` command to select directories.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "tauri-plugin-dialog"
|
||||
version = "2.0.0-rc.6"
|
||||
version = "2.0.0-rc.7"
|
||||
description = "Native system dialogs for opening and saving files along with message dialogs on your Tauri application."
|
||||
edition = { workspace = true }
|
||||
authors = { workspace = true }
|
||||
@@ -27,7 +27,7 @@ tauri = { workspace = true }
|
||||
log = { workspace = true }
|
||||
thiserror = { workspace = true }
|
||||
url = { workspace = true }
|
||||
tauri-plugin-fs = { path = "../fs", version = "2.0.0-rc.4" }
|
||||
tauri-plugin-fs = { path = "../fs", version = "2.0.0-rc.5" }
|
||||
|
||||
[target.'cfg(target_os = "ios")'.dependencies]
|
||||
tauri = { workspace = true, features = ["wry"] }
|
||||
|
||||
@@ -295,81 +295,59 @@
|
||||
"type": "string",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "allow-ask -> Enables the ask command without any pre-configured scope.",
|
||||
"description": "Enables the ask command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-ask"
|
||||
]
|
||||
"const": "allow-ask"
|
||||
},
|
||||
{
|
||||
"description": "deny-ask -> Denies the ask command without any pre-configured scope.",
|
||||
"description": "Denies the ask command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-ask"
|
||||
]
|
||||
"const": "deny-ask"
|
||||
},
|
||||
{
|
||||
"description": "allow-confirm -> Enables the confirm command without any pre-configured scope.",
|
||||
"description": "Enables the confirm command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-confirm"
|
||||
]
|
||||
"const": "allow-confirm"
|
||||
},
|
||||
{
|
||||
"description": "deny-confirm -> Denies the confirm command without any pre-configured scope.",
|
||||
"description": "Denies the confirm command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-confirm"
|
||||
]
|
||||
"const": "deny-confirm"
|
||||
},
|
||||
{
|
||||
"description": "allow-message -> Enables the message command without any pre-configured scope.",
|
||||
"description": "Enables the message command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-message"
|
||||
]
|
||||
"const": "allow-message"
|
||||
},
|
||||
{
|
||||
"description": "deny-message -> Denies the message command without any pre-configured scope.",
|
||||
"description": "Denies the message command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-message"
|
||||
]
|
||||
"const": "deny-message"
|
||||
},
|
||||
{
|
||||
"description": "allow-open -> Enables the open command without any pre-configured scope.",
|
||||
"description": "Enables the open command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-open"
|
||||
]
|
||||
"const": "allow-open"
|
||||
},
|
||||
{
|
||||
"description": "deny-open -> Denies the open command without any pre-configured scope.",
|
||||
"description": "Denies the open command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-open"
|
||||
]
|
||||
"const": "deny-open"
|
||||
},
|
||||
{
|
||||
"description": "allow-save -> Enables the save command without any pre-configured scope.",
|
||||
"description": "Enables the save command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"allow-save"
|
||||
]
|
||||
"const": "allow-save"
|
||||
},
|
||||
{
|
||||
"description": "deny-save -> Denies the save command without any pre-configured scope.",
|
||||
"description": "Denies the save command without any pre-configured scope.",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"deny-save"
|
||||
]
|
||||
"const": "deny-save"
|
||||
},
|
||||
{
|
||||
"description": "default -> This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n",
|
||||
"description": "This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"default"
|
||||
]
|
||||
"const": "default"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
# Changelog
|
||||
|
||||
## \[2.0.0-rc.5]
|
||||
|
||||
- [`cc03ccf5`](https://github.com/tauri-apps/plugins-workspace/commit/cc03ccf5e0e4be8bbf50bbdebe957c84be7f779b) ([#1774](https://github.com/tauri-apps/plugins-workspace/pull/1774)) Fix `scope-app`, `scope-app-recursive` and `scope-index` not properly enabling the application paths.
|
||||
|
||||
## \[2.0.0-rc.4]
|
||||
|
||||
- [`9291e4d2`](https://github.com/tauri-apps/plugins-workspace/commit/9291e4d2caa31c883c71e55f2193bd8754d72f03) ([#1640](https://github.com/tauri-apps/plugins-workspace/pull/1640) by [@SRutile](https://github.com/tauri-apps/plugins-workspace/../../SRutile)) Support any UTF-8 character in the writeFile API.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "tauri-plugin-fs"
|
||||
version = "2.0.0-rc.4"
|
||||
version = "2.0.0-rc.5"
|
||||
description = "Access the file system."
|
||||
authors = { workspace = true }
|
||||
license = { workspace = true }
|
||||
|
||||
+1
-2
@@ -52,7 +52,6 @@ const BASE_DIR_VARS: &[&str] = &[
|
||||
"TEMPLATE",
|
||||
"VIDEO",
|
||||
"RESOURCE",
|
||||
"APP",
|
||||
"LOG",
|
||||
"TEMP",
|
||||
"APPCONFIG",
|
||||
@@ -118,7 +117,7 @@ path = "${upper}/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-{lower}"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `${upper}`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `${upper}` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "${upper}"
|
||||
|
||||
@@ -270,7 +270,7 @@ class FileHandle extends Resource {
|
||||
* @example
|
||||
* ```typescript
|
||||
* import { open, BaseDirectory } from "@tauri-apps/plugin-fs"
|
||||
* // if "$APP/foo/bar.txt" contains the text "hello world":
|
||||
* // if "$APPCONFIG/foo/bar.txt" contains the text "hello world":
|
||||
* const file = await open("foo/bar.txt", { baseDir: BaseDirectory.AppConfig });
|
||||
* const buf = new Uint8Array(100);
|
||||
* const numberOfBytesRead = await file.read(buf); // 11 bytes
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
"$schema" = "schemas/schema.json"
|
||||
|
||||
# Scopes Section
|
||||
# This section contains scopes, which define file level access
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-app-recursive"
|
||||
description = "This scope permits recursive access to the complete application folders, including sub directories and files."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCONFIG"
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCONFIG/**"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPDATA"
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPDATA/**"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOCALDATA"
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOCALDATA/**"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCACHE"
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCACHE/**"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOG"
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOG/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-app"
|
||||
description = "This scope permits access to all files and list content of top level directories in the application folders."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCONFIG"
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCONFIG/*"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPDATA"
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPDATA/*"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOCALDATA"
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOCALDATA/*"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCACHE"
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCACHE/*"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOG"
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOG/*"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-app-index"
|
||||
description = "This scope permits to list all files and folders in the application directories."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCONFIG"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPDATA"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOCALDATA"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCACHE"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOG"
|
||||
|
||||
# Sets Section
|
||||
# This section combines the scope elements with enablement of commands
|
||||
|
||||
[[set]]
|
||||
identifier = "allow-app-read-recursive"
|
||||
description = "This allows full recursive read access to the complete application folders, files and subdirectories."
|
||||
permissions = ["read-all", "scope-app-recursive"]
|
||||
|
||||
[[set]]
|
||||
identifier = "allow-app-write-recursive"
|
||||
description = "This allows full recursive write access to the complete application folders, files and subdirectories."
|
||||
permissions = ["write-all", "scope-app-recursive"]
|
||||
|
||||
[[set]]
|
||||
identifier = "allow-app-read"
|
||||
description = "This allows non-recursive read access to the application folders."
|
||||
permissions = ["read-all", "scope-app"]
|
||||
|
||||
[[set]]
|
||||
identifier = "allow-app-write"
|
||||
description = "This allows non-recursive write access to the application folders."
|
||||
permissions = ["write-all", "scope-app"]
|
||||
|
||||
[[set]]
|
||||
identifier = "allow-app-meta-recursive"
|
||||
description = "This allows full recursive read access to metadata of the application folders, including file listing and statistics."
|
||||
permissions = ["read-meta", "scope-app-recursive"]
|
||||
|
||||
[[set]]
|
||||
identifier = "allow-app-meta"
|
||||
description = "This allows non-recursive read access to metadata of the application folders, including file listing and statistics."
|
||||
permissions = ["read-meta", "scope-app-index"]
|
||||
@@ -1,82 +0,0 @@
|
||||
# Automatically generated - DO NOT EDIT!
|
||||
|
||||
"$schema" = "../../schemas/schema.json"
|
||||
|
||||
# Scopes Section
|
||||
# This section contains scopes, which define file level access
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-app-recursive"
|
||||
description = "This scope permits recursive access to the complete `$APP` folder, including sub directories and files."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APP"
|
||||
[[permission.scope.allow]]
|
||||
path = "$APP/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-app"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$APP`folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APP"
|
||||
[[permission.scope.allow]]
|
||||
path = "$APP/*"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-app-index"
|
||||
description = "This scope permits to list all files and folders in the `$APP`folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APP"
|
||||
|
||||
# Sets Section
|
||||
# This section combines the scope elements with enablement of commands
|
||||
|
||||
[[set]]
|
||||
identifier = "allow-app-read-recursive"
|
||||
description = "This allows full recursive read access to the complete `$APP` folder, files and subdirectories."
|
||||
permissions = [
|
||||
"read-all",
|
||||
"scope-app-recursive"
|
||||
]
|
||||
|
||||
[[set]]
|
||||
identifier = "allow-app-write-recursive"
|
||||
description = "This allows full recursive write access to the complete `$APP` folder, files and subdirectories."
|
||||
permissions = [
|
||||
"write-all",
|
||||
"scope-app-recursive"
|
||||
]
|
||||
|
||||
[[set]]
|
||||
identifier = "allow-app-read"
|
||||
description = "This allows non-recursive read access to the `$APP` folder."
|
||||
permissions = [
|
||||
"read-all",
|
||||
"scope-app"
|
||||
]
|
||||
|
||||
[[set]]
|
||||
identifier = "allow-app-write"
|
||||
description = "This allows non-recursive write access to the `$APP` folder."
|
||||
permissions = [
|
||||
"write-all",
|
||||
"scope-app"
|
||||
]
|
||||
|
||||
[[set]]
|
||||
identifier = "allow-app-meta-recursive"
|
||||
description = "This allows full recursive read access to metadata of the `$APP` folder, including file listing and statistics."
|
||||
permissions = [
|
||||
"read-meta",
|
||||
"scope-app-recursive"
|
||||
]
|
||||
|
||||
[[set]]
|
||||
identifier = "allow-app-meta"
|
||||
description = "This allows non-recursive read access to metadata of the `$APP` folder, including file listing and statistics."
|
||||
permissions = [
|
||||
"read-meta",
|
||||
"scope-app-index"
|
||||
]
|
||||
@@ -16,7 +16,7 @@ path = "$APPCACHE/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-appcache"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCACHE"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$APPCONFIG/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-appconfig"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCONFIG"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$APPDATA/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-appdata"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$APPDATA`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$APPDATA` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPDATA"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$APPLOCALDATA/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-applocaldata"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOCALDATA"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$APPLOG/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-applog"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$APPLOG`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$APPLOG` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOG"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$AUDIO/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-audio"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$AUDIO`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$AUDIO` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$AUDIO"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$CACHE/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-cache"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$CACHE`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$CACHE` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$CACHE"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$CONFIG/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-config"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$CONFIG`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$CONFIG` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$CONFIG"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$DATA/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-data"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$DATA`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$DATA` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$DATA"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$DESKTOP/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-desktop"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$DESKTOP"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$DOCUMENT/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-document"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$DOCUMENT"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$DOWNLOAD/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-download"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$DOWNLOAD"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$EXE/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-exe"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$EXE`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$EXE` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$EXE"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$FONT/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-font"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$FONT`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$FONT` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$FONT"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$HOME/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-home"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$HOME`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$HOME` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$HOME"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$LOCALDATA/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-localdata"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$LOCALDATA"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$LOG/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-log"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$LOG`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$LOG` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$LOG"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$PICTURE/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-picture"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$PICTURE`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$PICTURE` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$PICTURE"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$PUBLIC/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-public"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$PUBLIC"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$RESOURCE/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-resource"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$RESOURCE"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$RUNTIME/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-runtime"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$RUNTIME"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$TEMP/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-temp"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$TEMP`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$TEMP` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$TEMP"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$TEMPLATE/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-template"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$TEMPLATE"
|
||||
|
||||
@@ -16,7 +16,7 @@ path = "$VIDEO/**"
|
||||
|
||||
[[permission]]
|
||||
identifier = "scope-video"
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$VIDEO`folder."
|
||||
description = "This scope permits access to all files and list content of top level directories in the `$VIDEO` folder."
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$VIDEO"
|
||||
|
||||
@@ -47,7 +47,7 @@ On Windows the webview data folder access is denied.
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This allows full recursive read access to the complete `$APP` folder, files and subdirectories.
|
||||
This allows full recursive read access to the complete application folders, files and subdirectories.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -60,7 +60,7 @@ This allows full recursive read access to the complete `$APP` folder, files and
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This allows full recursive write access to the complete `$APP` folder, files and subdirectories.
|
||||
This allows full recursive write access to the complete application folders, files and subdirectories.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -73,7 +73,7 @@ This allows full recursive write access to the complete `$APP` folder, files and
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This allows non-recursive read access to the `$APP` folder.
|
||||
This allows non-recursive read access to the application folders.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -86,7 +86,7 @@ This allows non-recursive read access to the `$APP` folder.
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This allows non-recursive write access to the `$APP` folder.
|
||||
This allows non-recursive write access to the application folders.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -99,7 +99,7 @@ This allows non-recursive write access to the `$APP` folder.
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This allows full recursive read access to metadata of the `$APP` folder, including file listing and statistics.
|
||||
This allows full recursive read access to metadata of the application folders, including file listing and statistics.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -112,7 +112,7 @@ This allows full recursive read access to metadata of the `$APP` folder, includi
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This allows non-recursive read access to metadata of the `$APP` folder, including file listing and statistics.
|
||||
This allows non-recursive read access to metadata of the application folders, including file listing and statistics.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -125,7 +125,7 @@ This allows non-recursive read access to metadata of the `$APP` folder, includin
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits recursive access to the complete `$APP` folder, including sub directories and files.
|
||||
This scope permits recursive access to the complete application folders, including sub directories and files.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -138,7 +138,7 @@ This scope permits recursive access to the complete `$APP` folder, including sub
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$APP`folder.
|
||||
This scope permits access to all files and list content of top level directories in the application folders.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -151,7 +151,7 @@ This scope permits access to all files and list content of top level directories
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits to list all files and folders in the `$APP`folder.
|
||||
This scope permits to list all files and folders in the application directories.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -255,7 +255,7 @@ This scope permits recursive access to the complete `$APPCACHE` folder, includin
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -372,7 +372,7 @@ This scope permits recursive access to the complete `$APPCONFIG` folder, includi
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -489,7 +489,7 @@ This scope permits recursive access to the complete `$APPDATA` folder, including
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$APPDATA` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -606,7 +606,7 @@ This scope permits recursive access to the complete `$APPLOCALDATA` folder, incl
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -723,7 +723,7 @@ This scope permits recursive access to the complete `$APPLOG` folder, including
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$APPLOG` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -840,7 +840,7 @@ This scope permits recursive access to the complete `$AUDIO` folder, including s
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$AUDIO` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -957,7 +957,7 @@ This scope permits recursive access to the complete `$CACHE` folder, including s
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$CACHE`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$CACHE` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1074,7 +1074,7 @@ This scope permits recursive access to the complete `$CONFIG` folder, including
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$CONFIG` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1191,7 +1191,7 @@ This scope permits recursive access to the complete `$DATA` folder, including su
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$DATA`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$DATA` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1308,7 +1308,7 @@ This scope permits recursive access to the complete `$DESKTOP` folder, including
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1425,7 +1425,7 @@ This scope permits recursive access to the complete `$DOCUMENT` folder, includin
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1542,7 +1542,7 @@ This scope permits recursive access to the complete `$DOWNLOAD` folder, includin
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1659,7 +1659,7 @@ This scope permits recursive access to the complete `$EXE` folder, including sub
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$EXE`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$EXE` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1776,7 +1776,7 @@ This scope permits recursive access to the complete `$FONT` folder, including su
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$FONT`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$FONT` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -1893,7 +1893,7 @@ This scope permits recursive access to the complete `$HOME` folder, including su
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$HOME`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$HOME` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -2010,7 +2010,7 @@ This scope permits recursive access to the complete `$LOCALDATA` folder, includi
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -2127,7 +2127,7 @@ This scope permits recursive access to the complete `$LOG` folder, including sub
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$LOG`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$LOG` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -2244,7 +2244,7 @@ This scope permits recursive access to the complete `$PICTURE` folder, including
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$PICTURE` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -2361,7 +2361,7 @@ This scope permits recursive access to the complete `$PUBLIC` folder, including
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -2478,7 +2478,7 @@ This scope permits recursive access to the complete `$RESOURCE` folder, includin
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -2595,7 +2595,7 @@ This scope permits recursive access to the complete `$RUNTIME` folder, including
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -2712,7 +2712,7 @@ This scope permits recursive access to the complete `$TEMP` folder, including su
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$TEMP`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$TEMP` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -2829,7 +2829,7 @@ This scope permits recursive access to the complete `$TEMPLATE` folder, includin
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@@ -2946,7 +2946,7 @@ This scope permits recursive access to the complete `$VIDEO` folder, including s
|
||||
</td>
|
||||
<td>
|
||||
|
||||
This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.
|
||||
This scope permits access to all files and list content of top level directories in the `$VIDEO` folder.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -5,19 +5,4 @@ identifier = "create-app-specific-dirs"
|
||||
description = """
|
||||
This permissions allows to create the application specific directories.
|
||||
"""
|
||||
commands.allow = ["mkdir"]
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCONFIG"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPDATA"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOCALDATA"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCACHE"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOG"
|
||||
commands.allow = ["mkdir", "scope-app-index"]
|
||||
|
||||
@@ -13,19 +13,5 @@ commands.allow = [
|
||||
"read_text_file_lines",
|
||||
"read_text_file_lines_next",
|
||||
"exists",
|
||||
"scope-app-recursive",
|
||||
]
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCONFIG/**"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPDATA/**"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOCALDATA/**"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPCACHE/**"
|
||||
|
||||
[[permission.scope.allow]]
|
||||
path = "$APPLOG/**"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,9 @@
|
||||
# Changelog
|
||||
|
||||
## \[2.0.0-rc.2]
|
||||
|
||||
- [`60765694`](https://github.com/tauri-apps/plugins-workspace/commit/60765694f54875e22b8eb70b1d2e32dbf0c585c7) ([#1773](https://github.com/tauri-apps/plugins-workspace/pull/1773) by [@lucasfernog](https://github.com/tauri-apps/plugins-workspace/../../lucasfernog)) Update API to match other plugins.
|
||||
|
||||
## \[2.0.0-rc.1]
|
||||
|
||||
- [`e2e97db5`](https://github.com/tauri-apps/plugins-workspace/commit/e2e97db51983267f5be84d4f6f0278d58834d1f5) ([#1701](https://github.com/tauri-apps/plugins-workspace/pull/1701) by [@lucasfernog](https://github.com/tauri-apps/plugins-workspace/../../lucasfernog)) Use `PermissionState` from the `tauri` crate, which now also includes a "prompt with rationale" variant for Android (returned when your app must explain to the user why it needs the permission).
|
||||
@@ -21,3 +25,4 @@
|
||||
|
||||
- [`9606089b`](https://github.com/tauri-apps/plugins-workspace/commit/9606089b2add4a17f80ed5a09d59ce94824bd672) ([#1599](https://github.com/tauri-apps/plugins-workspace/pull/1599)) Initial release.
|
||||
- [`9887d1`](https://github.com/tauri-apps/plugins-workspace/commit/9887d14bd0e971c4c0f5c1188fc4005d3fc2e29e) Update to tauri RC.
|
||||
tauri-apps/plugins-workspace/commit/9887d14bd0e971c4c0f5c1188fc4005d3fc2e29e) Update to tauri RC.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "tauri-plugin-geolocation"
|
||||
description = "Get and track the device's current position"
|
||||
version = "2.0.0-rc.3"
|
||||
version = "2.0.0-rc.4"
|
||||
edition = { workspace = true }
|
||||
authors = { workspace = true }
|
||||
license = { workspace = true }
|
||||
|
||||
@@ -87,16 +87,31 @@ fn main() {
|
||||
Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
|
||||
|
||||
```javascript
|
||||
import { getCurrentPosition, watchPosition } from '@tauri-apps/plugin-log'
|
||||
import {
|
||||
checkPermissions,
|
||||
requestPermissions,
|
||||
getCurrentPosition,
|
||||
watchPosition
|
||||
} from '@tauri-apps/plugin-log'
|
||||
|
||||
const pos = await getCurrentPosition()
|
||||
let permissions = await checkPermissions()
|
||||
if (
|
||||
permissions.location === 'prompt' ||
|
||||
permissions.location === 'prompt-with-rationale'
|
||||
) {
|
||||
permissions = await requestPermissions(['location'])
|
||||
}
|
||||
|
||||
await watchPosition(
|
||||
{ enableHighAccuracy: true, timeout: 10000, maximumAge: 0 },
|
||||
(pos) => {
|
||||
console.log(pos)
|
||||
}
|
||||
)
|
||||
if (permissions.location === 'granted') {
|
||||
const pos = await getCurrentPosition()
|
||||
|
||||
await watchPosition(
|
||||
{ enableHighAccuracy: true, timeout: 10000, maximumAge: 0 },
|
||||
(pos) => {
|
||||
console.log(pos)
|
||||
}
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
@@ -60,18 +60,8 @@ private const val ALIAS_COARSE_LOCATION: String = "coarseLocation"
|
||||
]
|
||||
)
|
||||
class GeolocationPlugin(private val activity: Activity): Plugin(activity) {
|
||||
private lateinit var implementation: Geolocation// = Geolocation(activity.applicationContext)
|
||||
private var watchers = hashMapOf<Long, Invoke>()
|
||||
|
||||
// If multiple permissions get requested in quick succession not all callbacks will be fired,
|
||||
// So we'll store all requests ourselves instead of using the callback argument.
|
||||
private var positionRequests = mutableListOf<Invoke>()
|
||||
private var watchRequests = mutableListOf<Invoke>()
|
||||
// If getCurrentPosition or watchPosition are called before a prior call is done requesting permission,
|
||||
// the callback will be called with denied for the prior call(s) so we keep track of them to make sure
|
||||
// to only run the logic on the last request.
|
||||
// TODO: Find a better solution after switching to explicit requestPermissions call - likely needs changes in Tauri
|
||||
private var ongoingPermissionRequests = 0;
|
||||
private lateinit var implementation: Geolocation
|
||||
private var watchers = hashMapOf<Long, Pair<Invoke, WatchArgs>>()
|
||||
|
||||
override fun load(webView: WebView) {
|
||||
super.load(webView)
|
||||
@@ -86,8 +76,9 @@ class GeolocationPlugin(private val activity: Activity): Plugin(activity) {
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
for (watcher in watchers.values) {
|
||||
startWatch(watcher)
|
||||
// resume watchers
|
||||
for ((watcher, args) in watchers.values) {
|
||||
startWatch(watcher, args)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,83 +103,39 @@ class GeolocationPlugin(private val activity: Activity): Plugin(activity) {
|
||||
@Command
|
||||
fun getCurrentPosition(invoke: Invoke) {
|
||||
val args = invoke.parseArgs(PositionOptions::class.java)
|
||||
val alias = getAlias(args.enableHighAccuracy)
|
||||
|
||||
if (getPermissionState(alias) != PermissionState.GRANTED) {
|
||||
Logger.error("NOT GRANTED");
|
||||
this.positionRequests.add(invoke)
|
||||
this.ongoingPermissionRequests += 1
|
||||
requestPermissionForAlias(alias, invoke, "positionPermissionCallback")
|
||||
val location = implementation.getLastLocation(args.maximumAge)
|
||||
if (location != null) {
|
||||
invoke.resolve(convertLocation(location))
|
||||
} else {
|
||||
Logger.error("GRANTED");
|
||||
getPosition(invoke, args)
|
||||
implementation.sendLocation(args.enableHighAccuracy,
|
||||
{ loc -> invoke.resolve(convertLocation(loc)) },
|
||||
{ error -> invoke.reject(error) })
|
||||
}
|
||||
}
|
||||
|
||||
@PermissionCallback
|
||||
private fun positionPermissionCallback(invoke: Invoke) {
|
||||
Logger.error("positionPermissionCallback - ongoingRequests: " + this.ongoingPermissionRequests.toString())
|
||||
|
||||
this.ongoingPermissionRequests -= 1
|
||||
|
||||
if (this.ongoingPermissionRequests > 0) {
|
||||
return
|
||||
}
|
||||
|
||||
val pRequests = this.positionRequests.toTypedArray()
|
||||
val wRequests = this.watchRequests.toTypedArray()
|
||||
this.positionRequests.clear()
|
||||
this.watchRequests.clear()
|
||||
|
||||
// TODO: capacitor only checks for coarse here
|
||||
val permissionGranted = getPermissionState(ALIAS_COARSE_LOCATION) == PermissionState.GRANTED;
|
||||
Logger.error("positionPermissionCallback - permissionGranted: $permissionGranted");
|
||||
|
||||
for (inv in pRequests) {
|
||||
if (permissionGranted) {
|
||||
val args = inv.parseArgs(PositionOptions::class.java)
|
||||
|
||||
implementation.sendLocation(args.enableHighAccuracy,
|
||||
{ location -> inv.resolve(convertLocation(location)) },
|
||||
{ error -> inv.reject(error) })
|
||||
} else {
|
||||
inv.reject("Location permission was denied.")
|
||||
}
|
||||
}
|
||||
|
||||
for (inv in wRequests) {
|
||||
if (permissionGranted) {
|
||||
startWatch(invoke)
|
||||
} else {
|
||||
inv.reject("Location permission was denied.")
|
||||
}
|
||||
}
|
||||
val permissionsResultJSON = JSObject()
|
||||
permissionsResultJSON.put("location", getPermissionState(ALIAS_LOCATION))
|
||||
permissionsResultJSON.put("coarseLocation", getPermissionState(ALIAS_COARSE_LOCATION))
|
||||
invoke.resolve(permissionsResultJSON)
|
||||
}
|
||||
|
||||
@Command
|
||||
fun watchPosition(invoke: Invoke) {
|
||||
val args = invoke.parseArgs(WatchArgs::class.java)
|
||||
val alias = getAlias(args.options.enableHighAccuracy)
|
||||
|
||||
if (getPermissionState(alias) != PermissionState.GRANTED) {
|
||||
this.watchRequests.add(invoke)
|
||||
this.ongoingPermissionRequests += 1
|
||||
requestPermissionForAlias(alias, invoke, "positionPermissionCallback")
|
||||
} else {
|
||||
startWatch(invoke)
|
||||
}
|
||||
startWatch(invoke, args)
|
||||
}
|
||||
|
||||
private fun startWatch(invoke: Invoke) {
|
||||
val args = invoke.parseArgs(WatchArgs::class.java)
|
||||
|
||||
private fun startWatch(invoke: Invoke, args: WatchArgs) {
|
||||
implementation.requestLocationUpdates(
|
||||
args.options.enableHighAccuracy,
|
||||
args.options.timeout,
|
||||
{ location -> args.channel.send(convertLocation(location)) },
|
||||
{ error -> args.channel.sendObject(error) })
|
||||
|
||||
watchers[args.channel.id] = invoke
|
||||
watchers[args.channel.id] = Pair(invoke, args)
|
||||
}
|
||||
|
||||
@Command
|
||||
@@ -204,19 +151,6 @@ class GeolocationPlugin(private val activity: Activity): Plugin(activity) {
|
||||
invoke.resolve()
|
||||
}
|
||||
|
||||
private fun getPosition(invoke: Invoke, options: PositionOptions) {
|
||||
val location = implementation.getLastLocation(options.maximumAge)
|
||||
if (location != null) {
|
||||
Logger.error("getPosition location non-null")
|
||||
invoke.resolve(convertLocation(location))
|
||||
} else {
|
||||
Logger.error("getPosition location null")
|
||||
implementation.sendLocation(options.enableHighAccuracy,
|
||||
{ loc -> invoke.resolve(convertLocation(loc)) },
|
||||
{ error -> invoke.reject(error) })
|
||||
}
|
||||
}
|
||||
|
||||
private fun convertLocation(location: Location): JSObject {
|
||||
val ret = JSObject()
|
||||
val coords = JSObject()
|
||||
@@ -235,14 +169,4 @@ class GeolocationPlugin(private val activity: Activity): Plugin(activity) {
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
private fun getAlias(enableHighAccuracy: Boolean): String {
|
||||
var alias = ALIAS_LOCATION;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||
if (!enableHighAccuracy) {
|
||||
alias = ALIAS_COARSE_LOCATION;
|
||||
}
|
||||
}
|
||||
return alias
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
if("__TAURI__"in window){var __TAURI_PLUGIN_GEOLOCATION__=function(t){"use strict";function r(t,r,e,s){if("a"===e&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof r?t!==r||!s:!r.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===e?s:"a"===e?s.call(t):s?s.value:r.get(t)}function e(t,r,e,s,o){if("function"==typeof r?t!==r||!o:!r.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return r.set(t,e),e}var s,o,i,a;"function"==typeof SuppressedError&&SuppressedError;class n{constructor(){this.__TAURI_CHANNEL_MARKER__=!0,s.set(this,(()=>{})),o.set(this,0),i.set(this,{}),this.id=function(t,r=!1){return window.__TAURI_INTERNALS__.transformCallback(t,r)}((({message:t,id:a})=>{if(a===r(this,o,"f")){e(this,o,a+1),r(this,s,"f").call(this,t);const n=Object.keys(r(this,i,"f"));if(n.length>0){let t=a+1;for(const e of n.sort()){if(parseInt(e)!==t)break;{const o=r(this,i,"f")[e];delete r(this,i,"f")[e],r(this,s,"f").call(this,o),t+=1}}e(this,o,t)}}else r(this,i,"f")[a.toString()]=t}))}set onmessage(t){e(this,s,t)}get onmessage(){return r(this,s,"f")}toJSON(){return`__CHANNEL__:${this.id}`}}async function c(t,r={},e){return window.__TAURI_INTERNALS__.invoke(t,r,e)}s=new WeakMap,o=new WeakMap,i=new WeakMap,function(t){t.WINDOW_RESIZED="tauri://resize",t.WINDOW_MOVED="tauri://move",t.WINDOW_CLOSE_REQUESTED="tauri://close-requested",t.WINDOW_DESTROYED="tauri://destroyed",t.WINDOW_FOCUS="tauri://focus",t.WINDOW_BLUR="tauri://blur",t.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",t.WINDOW_THEME_CHANGED="tauri://theme-changed",t.WINDOW_CREATED="tauri://window-created",t.WEBVIEW_CREATED="tauri://webview-created",t.DRAG_ENTER="tauri://drag-enter",t.DRAG_OVER="tauri://drag-over",t.DRAG_DROP="tauri://drag-drop",t.DRAG_LEAVE="tauri://drag-leave"}(a||(a={}));const u={async getCurrentPosition(t){try{return{status:"ok",data:await c("plugin:geolocation|get_current_position",{options:t})}}catch(t){if(t instanceof Error)throw t;return{status:"error",error:t}}},async watchPosition(t,r){try{return{status:"ok",data:await c("plugin:geolocation|watch_position",{options:t,channel:r})}}catch(t){if(t instanceof Error)throw t;return{status:"error",error:t}}},async clearWatch(t){try{return{status:"ok",data:await c("plugin:geolocation|clear_watch",{channelId:t})}}catch(t){if(t instanceof Error)throw t;return{status:"error",error:t}}},async checkPermissions(){try{return{status:"ok",data:await c("plugin:geolocation|check_permissions")}}catch(t){if(t instanceof Error)throw t;return{status:"error",error:t}}},async requestPermissions(t){try{return{status:"ok",data:await c("plugin:geolocation|request_permissions",{permissions:t})}}catch(t){if(t instanceof Error)throw t;return{status:"error",error:t}}}};const{getCurrentPosition:_,clearWatch:h,checkPermissions:f,requestPermissions:w}=u;return t.checkPermissions=f,t.clearWatch=h,t.getCurrentPosition=_,t.requestPermissions=w,t.watchPosition=async function(t,r){const e=new n;return e.onmessage=r,await u.watchPosition(t,e),e.id},t}({});Object.defineProperty(window.__TAURI__,"geolocation",{value:__TAURI_PLUGIN_GEOLOCATION__})}
|
||||
if("__TAURI__"in window){var __TAURI_PLUGIN_GEOLOCATION__=function(t){"use strict";function e(t,e,n,i){if("a"===n&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!i:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?i:"a"===n?i.call(t):i?i.value:e.get(t)}function n(t,e,n,i,o){if("function"==typeof e?t!==e||!o:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return e.set(t,n),n}var i,o,s;"function"==typeof SuppressedError&&SuppressedError;class r{constructor(){this.__TAURI_CHANNEL_MARKER__=!0,i.set(this,(()=>{})),o.set(this,0),s.set(this,{}),this.id=function(t,e=!1){return window.__TAURI_INTERNALS__.transformCallback(t,e)}((({message:t,id:r})=>{if(r===e(this,o,"f")){n(this,o,r+1),e(this,i,"f").call(this,t);const a=Object.keys(e(this,s,"f"));if(a.length>0){let t=r+1;for(const n of a.sort()){if(parseInt(n)!==t)break;{const o=e(this,s,"f")[n];delete e(this,s,"f")[n],e(this,i,"f").call(this,o),t+=1}}n(this,o,t)}}else e(this,s,"f")[r.toString()]=t}))}set onmessage(t){n(this,i,t)}get onmessage(){return e(this,i,"f")}toJSON(){return`__CHANNEL__:${this.id}`}}async function a(t,e={},n){return window.__TAURI_INTERNALS__.invoke(t,e,n)}return i=new WeakMap,o=new WeakMap,s=new WeakMap,t.checkPermissions=async function(){return await async function(t){return a(`plugin:${t}|check_permissions`)}("geolocation")},t.clearWatch=async function(t){await a("plugin:geolocation|clear_watch",{channelId:t})},t.getCurrentPosition=async function(t){return await a("plugin:geolocation|get_current_position",{options:t})},t.requestPermissions=async function(t){return await a("plugin:geolocation|request_permissions",{permissions:t})},t.watchPosition=async function(t,e){const n=new r;return n.onmessage=t=>{"string"==typeof t?e(null,t):e(t)},await a("plugin:geolocation|watch_position",{options:t,channel:n}),n.id},t}({});Object.defineProperty(window.__TAURI__,"geolocation",{value:__TAURI_PLUGIN_GEOLOCATION__})}
|
||||
|
||||
@@ -7,7 +7,7 @@ const COMMANDS: &[&str] = &[
|
||||
"watch_position",
|
||||
"clear_watch",
|
||||
"check_permissions",
|
||||
"clear_permissions",
|
||||
"request_permissions",
|
||||
];
|
||||
|
||||
fn main() {
|
||||
|
||||
@@ -1,248 +0,0 @@
|
||||
// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
// @ts-nocheck
|
||||
// This file was generated by [tauri-specta](https://github.com/oscartbeaumont/tauri-specta). Do not edit this file manually.
|
||||
|
||||
/** user-defined commands **/
|
||||
|
||||
export const commands = {
|
||||
async getCurrentPosition(
|
||||
options: PositionOptions | null
|
||||
): Promise<Result<Position, Error>> {
|
||||
try {
|
||||
return {
|
||||
status: 'ok',
|
||||
data: await TAURI_INVOKE('plugin:geolocation|get_current_position', {
|
||||
options
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
if (e instanceof Error) throw e
|
||||
else return { status: 'error', error: e as any }
|
||||
}
|
||||
},
|
||||
async watchPosition(
|
||||
options: PositionOptions,
|
||||
channel: any
|
||||
): Promise<Result<null, Error>> {
|
||||
try {
|
||||
return {
|
||||
status: 'ok',
|
||||
data: await TAURI_INVOKE('plugin:geolocation|watch_position', {
|
||||
options,
|
||||
channel
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
if (e instanceof Error) throw e
|
||||
else return { status: 'error', error: e as any }
|
||||
}
|
||||
},
|
||||
async clearWatch(channelId: number): Promise<Result<null, Error>> {
|
||||
try {
|
||||
return {
|
||||
status: 'ok',
|
||||
data: await TAURI_INVOKE('plugin:geolocation|clear_watch', {
|
||||
channelId
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
if (e instanceof Error) throw e
|
||||
else return { status: 'error', error: e as any }
|
||||
}
|
||||
},
|
||||
async checkPermissions(): Promise<Result<PermissionStatus, Error>> {
|
||||
try {
|
||||
return {
|
||||
status: 'ok',
|
||||
data: await TAURI_INVOKE('plugin:geolocation|check_permissions')
|
||||
}
|
||||
} catch (e) {
|
||||
if (e instanceof Error) throw e
|
||||
else return { status: 'error', error: e as any }
|
||||
}
|
||||
},
|
||||
async requestPermissions(
|
||||
permissions: PermissionType[] | null
|
||||
): Promise<Result<PermissionStatus, Error>> {
|
||||
try {
|
||||
return {
|
||||
status: 'ok',
|
||||
data: await TAURI_INVOKE('plugin:geolocation|request_permissions', {
|
||||
permissions
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
if (e instanceof Error) throw e
|
||||
else return { status: 'error', error: e as any }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** user-defined events **/
|
||||
|
||||
/* export const events = __makeEvents__<{
|
||||
randomNumber: RandomNumber;
|
||||
}>({
|
||||
randomNumber: "plugin:geolocation:random-number",
|
||||
}); */
|
||||
|
||||
/** user-defined statics **/
|
||||
|
||||
/** user-defined types **/
|
||||
|
||||
export type Coordinates = {
|
||||
/**
|
||||
* Latitude in decimal degrees.
|
||||
*/
|
||||
latitude: number
|
||||
/**
|
||||
* Longitude in decimal degrees.
|
||||
*/
|
||||
longitude: number
|
||||
/**
|
||||
* Accuracy level of the latitude and longitude coordinates in meters.
|
||||
*/
|
||||
accuracy: number
|
||||
/**
|
||||
* Accuracy level of the altitude coordinate in meters, if available.
|
||||
* Available on all iOS versions and on Android 8 and above.
|
||||
*/
|
||||
altitudeAccuracy: number | null
|
||||
/**
|
||||
* The altitude the user is at, if available.
|
||||
*/
|
||||
altitude: number | null
|
||||
speed: number | null
|
||||
/**
|
||||
* The heading the user is facing, if available.
|
||||
*/
|
||||
heading: number | null
|
||||
}
|
||||
export type Error = never
|
||||
/**
|
||||
* Permission state.
|
||||
*/
|
||||
export type PermissionState =
|
||||
/**
|
||||
* Permission access has been granted.
|
||||
*/
|
||||
| 'granted'
|
||||
/**
|
||||
* Permission access has been denied.
|
||||
*/
|
||||
| 'denied'
|
||||
/**
|
||||
* The end user should be prompted for permission.
|
||||
*/
|
||||
| 'prompt'
|
||||
export type PermissionStatus = {
|
||||
/**
|
||||
* Permission state for the location alias.
|
||||
*
|
||||
* On Android it requests/checks both ACCESS_COARSE_LOCATION and ACCESS_FINE_LOCATION permissions.
|
||||
*
|
||||
* On iOS it requests/checks location permissions.
|
||||
*/
|
||||
location: PermissionState
|
||||
/**
|
||||
* Permissions state for the coarseLoaction alias.
|
||||
*
|
||||
* On Android it requests/checks ACCESS_COARSE_LOCATION.
|
||||
*
|
||||
* On Android 12+, users can choose between Approximate location (ACCESS_COARSE_LOCATION) and Precise location (ACCESS_FINE_LOCATION).
|
||||
*
|
||||
* On iOS it will have the same value as the `location` alias.
|
||||
*/
|
||||
coarseLocation: PermissionState
|
||||
}
|
||||
export type PermissionType = 'location' | 'coarseLocation'
|
||||
export type Position = {
|
||||
/**
|
||||
* Creation time for these coordinates.
|
||||
*/
|
||||
timestamp: number
|
||||
/**
|
||||
* The GPD coordinates along with the accuracy of the data.
|
||||
*/
|
||||
coords: Coordinates
|
||||
}
|
||||
export type PositionOptions = {
|
||||
/**
|
||||
* High accuracy mode (such as GPS, if available)
|
||||
* Will be ignored on Android 12+ if users didn't grant the ACCESS_FINE_LOCATION permission.
|
||||
*/
|
||||
enableHighAccuracy: boolean
|
||||
/**
|
||||
* The maximum wait time in milliseconds for location updates.
|
||||
* On Android the timeout gets ignored for getCurrentPosition.
|
||||
* Ignored on iOS
|
||||
*/
|
||||
timeout: number
|
||||
/**
|
||||
* The maximum age in milliseconds of a possible cached position that is acceptable to return.
|
||||
* Default: 0
|
||||
* Ignored on iOS
|
||||
*/
|
||||
maximumAge: number
|
||||
}
|
||||
//export type RandomNumber = number;
|
||||
|
||||
/** tauri-specta globals **/
|
||||
|
||||
import { invoke as TAURI_INVOKE } from '@tauri-apps/api/core'
|
||||
import * as TAURI_API_EVENT from '@tauri-apps/api/event'
|
||||
import { type WebviewWindow as __WebviewWindow__ } from '@tauri-apps/api/webviewWindow'
|
||||
|
||||
type __EventObj__<T> = {
|
||||
listen: (
|
||||
cb: TAURI_API_EVENT.EventCallback<T>
|
||||
) => ReturnType<typeof TAURI_API_EVENT.listen<T>>
|
||||
once: (
|
||||
cb: TAURI_API_EVENT.EventCallback<T>
|
||||
) => ReturnType<typeof TAURI_API_EVENT.once<T>>
|
||||
emit: T extends null
|
||||
? (payload?: T) => ReturnType<typeof TAURI_API_EVENT.emit>
|
||||
: (payload: T) => ReturnType<typeof TAURI_API_EVENT.emit>
|
||||
}
|
||||
|
||||
export type Result<T, E> =
|
||||
| { status: 'ok'; data: T }
|
||||
| { status: 'error'; error: E }
|
||||
|
||||
function __makeEvents__<T extends Record<string, any>>(
|
||||
mappings: Record<keyof T, string>
|
||||
) {
|
||||
return new Proxy(
|
||||
{} as unknown as {
|
||||
[K in keyof T]: __EventObj__<T[K]> & {
|
||||
(handle: __WebviewWindow__): __EventObj__<T[K]>
|
||||
}
|
||||
},
|
||||
{
|
||||
get: (_, event) => {
|
||||
const name = mappings[event as keyof T]
|
||||
|
||||
return new Proxy((() => {}) as any, {
|
||||
apply: (_, __, [window]: [__WebviewWindow__]) => ({
|
||||
listen: (arg: any) => window.listen(name, arg),
|
||||
once: (arg: any) => window.once(name, arg),
|
||||
emit: (arg: any) => window.emit(name, arg)
|
||||
}),
|
||||
get: (_, command: keyof __EventObj__<any>) => {
|
||||
switch (command) {
|
||||
case 'listen':
|
||||
return (arg: any) => TAURI_API_EVENT.listen(name, arg)
|
||||
case 'once':
|
||||
return (arg: any) => TAURI_API_EVENT.once(name, arg)
|
||||
case 'emit':
|
||||
return (arg: any) => TAURI_API_EVENT.emit(name, arg)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
@@ -2,36 +2,137 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
/* eslint-disable @typescript-eslint/unbound-method */
|
||||
import {
|
||||
Channel,
|
||||
invoke,
|
||||
PermissionState,
|
||||
checkPermissions as checkPluginPermissions
|
||||
} from '@tauri-apps/api/core'
|
||||
|
||||
import { Channel } from '@tauri-apps/api/core'
|
||||
import { commands, type PositionOptions, type Position } from './bindings'
|
||||
export type Coordinates = {
|
||||
/**
|
||||
* Latitude in decimal degrees.
|
||||
*/
|
||||
latitude: number
|
||||
/**
|
||||
* Longitude in decimal degrees.
|
||||
*/
|
||||
longitude: number
|
||||
/**
|
||||
* Accuracy level of the latitude and longitude coordinates in meters.
|
||||
*/
|
||||
accuracy: number
|
||||
/**
|
||||
* Accuracy level of the altitude coordinate in meters, if available.
|
||||
* Available on all iOS versions and on Android 8 and above.
|
||||
*/
|
||||
altitudeAccuracy: number | null
|
||||
/**
|
||||
* The altitude the user is at, if available.
|
||||
*/
|
||||
altitude: number | null
|
||||
speed: number | null
|
||||
/**
|
||||
* The heading the user is facing, if available.
|
||||
*/
|
||||
heading: number | null
|
||||
}
|
||||
|
||||
export type PermissionStatus = {
|
||||
/**
|
||||
* Permission state for the location alias.
|
||||
*
|
||||
* On Android it requests/checks both ACCESS_COARSE_LOCATION and ACCESS_FINE_LOCATION permissions.
|
||||
*
|
||||
* On iOS it requests/checks location permissions.
|
||||
*/
|
||||
location: PermissionState
|
||||
/**
|
||||
* Permissions state for the coarseLoaction alias.
|
||||
*
|
||||
* On Android it requests/checks ACCESS_COARSE_LOCATION.
|
||||
*
|
||||
* On Android 12+, users can choose between Approximate location (ACCESS_COARSE_LOCATION) and Precise location (ACCESS_FINE_LOCATION).
|
||||
*
|
||||
* On iOS it will have the same value as the `location` alias.
|
||||
*/
|
||||
coarseLocation: PermissionState
|
||||
}
|
||||
|
||||
export type PermissionType = 'location' | 'coarseLocation'
|
||||
|
||||
export type Position = {
|
||||
/**
|
||||
* Creation time for these coordinates.
|
||||
*/
|
||||
timestamp: number
|
||||
/**
|
||||
* The GPD coordinates along with the accuracy of the data.
|
||||
*/
|
||||
coords: Coordinates
|
||||
}
|
||||
|
||||
export type PositionOptions = {
|
||||
/**
|
||||
* High accuracy mode (such as GPS, if available)
|
||||
* Will be ignored on Android 12+ if users didn't grant the ACCESS_FINE_LOCATION permission (`coarseLocation` permission).
|
||||
*/
|
||||
enableHighAccuracy: boolean
|
||||
/**
|
||||
* The maximum wait time in milliseconds for location updates.
|
||||
* On Android the timeout gets ignored for getCurrentPosition.
|
||||
* Ignored on iOS
|
||||
*/
|
||||
timeout: number
|
||||
/**
|
||||
* The maximum age in milliseconds of a possible cached position that is acceptable to return.
|
||||
* Default: 0
|
||||
* Ignored on iOS
|
||||
*/
|
||||
maximumAge: number
|
||||
}
|
||||
|
||||
export async function watchPosition(
|
||||
options: PositionOptions,
|
||||
// TODO: This can receive errors too
|
||||
cb: (location: Position | string) => void
|
||||
cb: (location: Position | null, error?: string) => void
|
||||
): Promise<number> {
|
||||
const channel = new Channel<Position>()
|
||||
channel.onmessage = cb
|
||||
await commands.watchPosition(options, channel)
|
||||
const channel = new Channel<Position | string>()
|
||||
channel.onmessage = (message) => {
|
||||
if (typeof message === 'string') {
|
||||
cb(null, message)
|
||||
} else {
|
||||
cb(message)
|
||||
}
|
||||
}
|
||||
await invoke('plugin:geolocation|watch_position', {
|
||||
options,
|
||||
channel
|
||||
})
|
||||
return channel.id
|
||||
}
|
||||
|
||||
export const {
|
||||
getCurrentPosition,
|
||||
clearWatch,
|
||||
checkPermissions,
|
||||
requestPermissions
|
||||
} = commands
|
||||
export async function getCurrentPosition(
|
||||
options?: PositionOptions
|
||||
): Promise<Position> {
|
||||
return await invoke('plugin:geolocation|get_current_position', {
|
||||
options
|
||||
})
|
||||
}
|
||||
|
||||
export type {
|
||||
PermissionState,
|
||||
PermissionStatus,
|
||||
PermissionType,
|
||||
Position,
|
||||
PositionOptions,
|
||||
Coordinates
|
||||
} from './bindings'
|
||||
export async function clearWatch(channelId: number): Promise<void> {
|
||||
await invoke('plugin:geolocation|clear_watch', {
|
||||
channelId
|
||||
})
|
||||
}
|
||||
|
||||
// export { events };
|
||||
export async function checkPermissions(): Promise<PermissionStatus> {
|
||||
return await checkPluginPermissions('geolocation')
|
||||
}
|
||||
|
||||
export async function requestPermissions(
|
||||
permissions: PermissionType[] | null
|
||||
): Promise<PermissionStatus> {
|
||||
return await invoke('plugin:geolocation|request_permissions', {
|
||||
permissions
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@tauri-apps/plugin-geolocation",
|
||||
"version": "2.0.0-rc.1",
|
||||
"version": "2.0.0-rc.2",
|
||||
"license": "MIT or APACHE-2.0",
|
||||
"authors": [
|
||||
"Tauri Programme within The Commons Conservancy"
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
# Automatically generated - DO NOT EDIT!
|
||||
|
||||
"$schema" = "../../schemas/schema.json"
|
||||
|
||||
[[permission]]
|
||||
identifier = "allow-clear-positions"
|
||||
description = "Enables the clear_positions command without any pre-configured scope."
|
||||
commands.allow = ["clear_positions"]
|
||||
|
||||
[[permission]]
|
||||
identifier = "deny-clear-positions"
|
||||
description = "Denies the clear_positions command without any pre-configured scope."
|
||||
commands.deny = ["clear_positions"]
|
||||
@@ -0,0 +1,13 @@
|
||||
# Automatically generated - DO NOT EDIT!
|
||||
|
||||
"$schema" = "../../schemas/schema.json"
|
||||
|
||||
[[permission]]
|
||||
identifier = "allow-request-permissions"
|
||||
description = "Enables the request_permissions command without any pre-configured scope."
|
||||
commands.allow = ["request_permissions"]
|
||||
|
||||
[[permission]]
|
||||
identifier = "deny-request-permissions"
|
||||
description = "Denies the request_permissions command without any pre-configured scope."
|
||||
commands.deny = ["request_permissions"]
|
||||
@@ -63,32 +63,6 @@ Denies the clear_permissions command without any pre-configured scope.
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`geolocation:allow-clear-positions`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Enables the clear_positions command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`geolocation:deny-clear-positions`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Denies the clear_positions command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`geolocation:allow-clear-watch`
|
||||
|
||||
</td>
|
||||
@@ -141,6 +115,32 @@ Denies the get_current_position command without any pre-configured scope.
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`geolocation:allow-request-permissions`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Enables the request_permissions command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`geolocation:deny-request-permissions`
|
||||
|
||||
</td>
|
||||
<td>
|
||||
|
||||
Denies the request_permissions command without any pre-configured scope.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
`geolocation:allow-watch-position`
|
||||
|
||||
</td>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user