refactor(tauri): use imported event and dialog APIs
This commit is contained in:
10
package-lock.json
generated
10
package-lock.json
generated
@@ -3322,6 +3322,15 @@
|
|||||||
"node": ">= 10"
|
"node": ">= 10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@tauri-apps/plugin-dialog": {
|
||||||
|
"version": "2.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.6.0.tgz",
|
||||||
|
"integrity": "sha512-q4Uq3eY87TdcYzXACiYSPhmpBA76shgmQswGkSVio4C82Sz2W4iehe9TnKYwbq7weHiL88Yw19XZm7v28+Micg==",
|
||||||
|
"license": "MIT OR Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@tauri-apps/api": "^2.8.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@tauri-apps/plugin-notification": {
|
"node_modules/@tauri-apps/plugin-notification": {
|
||||||
"version": "2.3.3",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-notification/-/plugin-notification-2.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/@tauri-apps/plugin-notification/-/plugin-notification-2.3.3.tgz",
|
||||||
@@ -12091,6 +12100,7 @@
|
|||||||
"@suid/material": "^0.19.0",
|
"@suid/material": "^0.19.0",
|
||||||
"@suid/system": "^0.14.0",
|
"@suid/system": "^0.14.0",
|
||||||
"@tauri-apps/api": "^2.10.1",
|
"@tauri-apps/api": "^2.10.1",
|
||||||
|
"@tauri-apps/plugin-dialog": "^2.6.0",
|
||||||
"@tauri-apps/plugin-notification": "^2.3.3",
|
"@tauri-apps/plugin-notification": "^2.3.3",
|
||||||
"@tauri-apps/plugin-opener": "^2.5.3",
|
"@tauri-apps/plugin-opener": "^2.5.3",
|
||||||
"ansi-sequence-parser": "^1.1.3",
|
"ansi-sequence-parser": "^1.1.3",
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
"@suid/material": "^0.19.0",
|
"@suid/material": "^0.19.0",
|
||||||
"@suid/system": "^0.14.0",
|
"@suid/system": "^0.14.0",
|
||||||
"@tauri-apps/api": "^2.10.1",
|
"@tauri-apps/api": "^2.10.1",
|
||||||
|
"@tauri-apps/plugin-dialog": "^2.6.0",
|
||||||
"@tauri-apps/plugin-notification": "^2.3.3",
|
"@tauri-apps/plugin-notification": "^2.3.3",
|
||||||
"@tauri-apps/plugin-opener": "^2.5.3",
|
"@tauri-apps/plugin-opener": "^2.5.3",
|
||||||
"ansi-sequence-parser": "^1.1.3",
|
"ansi-sequence-parser": "^1.1.3",
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { listen } from "@tauri-apps/api/event"
|
||||||
import { getLogger } from "../logger"
|
import { getLogger } from "../logger"
|
||||||
import { runtimeEnv } from "../runtime-env"
|
import { runtimeEnv } from "../runtime-env"
|
||||||
|
|
||||||
@@ -107,13 +108,8 @@ export async function listenForNativeFolderDrops(onDrop: (paths: string[]) => vo
|
|||||||
return () => {}
|
return () => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
const eventApi = window.__TAURI__?.event
|
|
||||||
if (!eventApi?.listen) {
|
|
||||||
return () => {}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const unlisten = await eventApi.listen("desktop:folder-drop", (event) => {
|
const unlisten = await listen("desktop:folder-drop", (event) => {
|
||||||
const payload = (event.payload ?? {}) as TauriFolderDropPayload
|
const payload = (event.payload ?? {}) as TauriFolderDropPayload
|
||||||
const paths = normalizePathList(payload.paths)
|
const paths = normalizePathList(payload.paths)
|
||||||
if (paths.length > 0) {
|
if (paths.length > 0) {
|
||||||
@@ -134,15 +130,10 @@ export async function listenForNativeFolderDropState(onState: (state: NativeFold
|
|||||||
return () => {}
|
return () => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
const eventApi = window.__TAURI__?.event
|
|
||||||
if (!eventApi?.listen) {
|
|
||||||
return () => {}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const [unlistenEnter, unlistenLeave] = await Promise.all([
|
const [unlistenEnter, unlistenLeave] = await Promise.all([
|
||||||
eventApi.listen("desktop:folder-drag-enter", () => onState("enter")),
|
listen("desktop:folder-drag-enter", () => onState("enter")),
|
||||||
eventApi.listen("desktop:folder-drag-leave", () => onState("leave")),
|
listen("desktop:folder-drag-leave", () => onState("leave")),
|
||||||
])
|
])
|
||||||
return () => {
|
return () => {
|
||||||
unlistenEnter()
|
unlistenEnter()
|
||||||
|
|||||||
@@ -1,43 +1,21 @@
|
|||||||
|
import { open } from "@tauri-apps/plugin-dialog"
|
||||||
import type { NativeDialogOptions } from "../native-functions"
|
import type { NativeDialogOptions } from "../native-functions"
|
||||||
import { getLogger } from "../../logger"
|
import { getLogger } from "../../logger"
|
||||||
const log = getLogger("actions")
|
const log = getLogger("actions")
|
||||||
|
|
||||||
|
|
||||||
interface TauriDialogModule {
|
|
||||||
open?: (
|
|
||||||
options: {
|
|
||||||
title?: string
|
|
||||||
defaultPath?: string
|
|
||||||
filters?: { name?: string; extensions: string[] }[]
|
|
||||||
directory?: boolean
|
|
||||||
multiple?: boolean
|
|
||||||
},
|
|
||||||
) => Promise<string | string[] | null>
|
|
||||||
}
|
|
||||||
|
|
||||||
interface TauriBridge {
|
|
||||||
dialog?: TauriDialogModule
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function openTauriNativeDialog(options: NativeDialogOptions): Promise<string | null> {
|
export async function openTauriNativeDialog(options: NativeDialogOptions): Promise<string | null> {
|
||||||
if (typeof window === "undefined") {
|
if (typeof window === "undefined") {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
const tauriBridge = (window as Window & { __TAURI__?: TauriBridge }).__TAURI__
|
|
||||||
const dialogApi = tauriBridge?.dialog
|
|
||||||
if (!dialogApi?.open) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await dialogApi.open({
|
const response = await open({
|
||||||
title: options.title,
|
title: options.title,
|
||||||
defaultPath: options.defaultPath,
|
defaultPath: options.defaultPath,
|
||||||
directory: options.mode === "directory",
|
directory: options.mode === "directory",
|
||||||
multiple: false,
|
multiple: false,
|
||||||
filters: options.filters?.map((filter) => ({
|
filters: options.filters?.map((filter) => ({
|
||||||
name: filter.name,
|
name: filter.name ?? "Files",
|
||||||
extensions: filter.extensions,
|
extensions: filter.extensions,
|
||||||
})),
|
})),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -17,13 +17,6 @@ declare global {
|
|||||||
electronAPI?: unknown
|
electronAPI?: unknown
|
||||||
__TAURI__?: {
|
__TAURI__?: {
|
||||||
core?: TauriCoreModule
|
core?: TauriCoreModule
|
||||||
event?: {
|
|
||||||
listen: (event: string, handler: (payload: { payload: unknown }) => void) => Promise<() => void>
|
|
||||||
}
|
|
||||||
dialog?: {
|
|
||||||
open?: (options: Record<string, unknown>) => Promise<string | string[] | null>
|
|
||||||
save?: (options: Record<string, unknown>) => Promise<string | null>
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import { invoke } from "@tauri-apps/api/core"
|
||||||
|
import { listen } from "@tauri-apps/api/event"
|
||||||
import { Show, createSignal, onCleanup, onMount } from "solid-js"
|
import { Show, createSignal, onCleanup, onMount } from "solid-js"
|
||||||
import { render } from "solid-js/web"
|
import { render } from "solid-js/web"
|
||||||
import iconUrl from "../../images/CodeNomad-Icon.png"
|
import iconUrl from "../../images/CodeNomad-Icon.png"
|
||||||
@@ -27,13 +29,6 @@ interface CliStatus {
|
|||||||
error?: string | null
|
error?: string | null
|
||||||
}
|
}
|
||||||
|
|
||||||
interface TauriBridge {
|
|
||||||
invoke?: <T = unknown>(cmd: string, args?: Record<string, unknown>) => Promise<T>
|
|
||||||
event?: {
|
|
||||||
listen: (event: string, handler: (payload: { payload: unknown }) => void) => Promise<() => void>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function pickPhraseKey(previous?: PhraseKey) {
|
function pickPhraseKey(previous?: PhraseKey) {
|
||||||
const filtered = phraseKeys.filter((key) => key !== previous)
|
const filtered = phraseKeys.filter((key) => key !== previous)
|
||||||
const source = filtered.length > 0 ? filtered : phraseKeys
|
const source = filtered.length > 0 ? filtered : phraseKeys
|
||||||
@@ -46,17 +41,6 @@ function navigateTo(url?: string | null) {
|
|||||||
window.location.replace(url)
|
window.location.replace(url)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTauriBridge(): TauriBridge | null {
|
|
||||||
if (typeof window === "undefined") {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
const bridge = (window as { __TAURI__?: TauriBridge }).__TAURI__
|
|
||||||
if (!bridge || !bridge.event || !bridge.invoke) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
return bridge
|
|
||||||
}
|
|
||||||
|
|
||||||
function annotateDocument() {
|
function annotateDocument() {
|
||||||
if (typeof document === "undefined") {
|
if (typeof document === "undefined") {
|
||||||
return
|
return
|
||||||
@@ -77,25 +61,22 @@ function LoadingApp() {
|
|||||||
setPhraseKey(pickPhraseKey())
|
setPhraseKey(pickPhraseKey())
|
||||||
const unsubscribers: Array<() => void> = []
|
const unsubscribers: Array<() => void> = []
|
||||||
|
|
||||||
async function bootstrapTauri(tauriBridge: TauriBridge | null) {
|
async function bootstrapTauri() {
|
||||||
if (!tauriBridge || !tauriBridge.event || !tauriBridge.invoke) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
const readyUnlisten = await tauriBridge.event.listen("cli:ready", (event) => {
|
const readyUnlisten = await listen("cli:ready", (event) => {
|
||||||
const payload = (event?.payload as CliStatus) || {}
|
const payload = (event?.payload as CliStatus) || {}
|
||||||
setError(null)
|
setError(null)
|
||||||
setStatusKey(null)
|
setStatusKey(null)
|
||||||
navigateTo(payload.url)
|
navigateTo(payload.url)
|
||||||
})
|
})
|
||||||
const errorUnlisten = await tauriBridge.event.listen("cli:error", (event) => {
|
const errorUnlisten = await listen("cli:error", (event) => {
|
||||||
const payload = (event?.payload as CliStatus) || {}
|
const payload = (event?.payload as CliStatus) || {}
|
||||||
if (payload.error) {
|
if (payload.error) {
|
||||||
setError(payload.error)
|
setError(payload.error)
|
||||||
setStatusKey("loadingScreen.status.issue")
|
setStatusKey("loadingScreen.status.issue")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
const statusUnlisten = await tauriBridge.event.listen("cli:status", (event) => {
|
const statusUnlisten = await listen("cli:status", (event) => {
|
||||||
const payload = (event?.payload as CliStatus) || {}
|
const payload = (event?.payload as CliStatus) || {}
|
||||||
if (payload.state === "error" && payload.error) {
|
if (payload.state === "error" && payload.error) {
|
||||||
setError(payload.error)
|
setError(payload.error)
|
||||||
@@ -109,7 +90,7 @@ function LoadingApp() {
|
|||||||
})
|
})
|
||||||
unsubscribers.push(readyUnlisten, errorUnlisten, statusUnlisten)
|
unsubscribers.push(readyUnlisten, errorUnlisten, statusUnlisten)
|
||||||
|
|
||||||
const result = await tauriBridge.invoke<CliStatus>("cli_get_status")
|
const result = await invoke<CliStatus>("cli_get_status")
|
||||||
if (result?.state === "ready" && result.url) {
|
if (result?.state === "ready" && result.url) {
|
||||||
navigateTo(result.url)
|
navigateTo(result.url)
|
||||||
} else if (result?.state === "error" && result.error) {
|
} else if (result?.state === "error" && result.error) {
|
||||||
@@ -123,7 +104,7 @@ function LoadingApp() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isTauriHost()) {
|
if (isTauriHost()) {
|
||||||
void bootstrapTauri(getTauriBridge())
|
void bootstrapTauri()
|
||||||
}
|
}
|
||||||
|
|
||||||
onCleanup(() => {
|
onCleanup(() => {
|
||||||
|
|||||||
9
packages/ui/src/types/global.d.ts
vendored
9
packages/ui/src/types/global.d.ts
vendored
@@ -47,19 +47,10 @@ declare global {
|
|||||||
webkitGetAsEntry?: () => FileSystemEntry | null
|
webkitGetAsEntry?: () => FileSystemEntry | null
|
||||||
}
|
}
|
||||||
|
|
||||||
interface TauriDialogModule {
|
|
||||||
open?: (options: Record<string, unknown>) => Promise<string | string[] | null>
|
|
||||||
save?: (options: Record<string, unknown>) => Promise<string | null>
|
|
||||||
}
|
|
||||||
|
|
||||||
interface TauriBridge {
|
interface TauriBridge {
|
||||||
core?: {
|
core?: {
|
||||||
invoke: <T = unknown>(cmd: string, args?: Record<string, unknown>) => Promise<T>
|
invoke: <T = unknown>(cmd: string, args?: Record<string, unknown>) => Promise<T>
|
||||||
}
|
}
|
||||||
dialog?: TauriDialogModule
|
|
||||||
event?: {
|
|
||||||
listen: (event: string, handler: (payload: { payload: unknown }) => void) => Promise<() => void>
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Window {
|
interface Window {
|
||||||
|
|||||||
Reference in New Issue
Block a user