Skip to content

Commit d735b18

Browse files
committed
refactor(tauri): use imported event and dialog APIs
1 parent 3d575f4 commit d735b18

7 files changed

Lines changed: 26 additions & 81 deletions

File tree

package-lock.json

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/ui/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"@suid/material": "^0.19.0",
2020
"@suid/system": "^0.14.0",
2121
"@tauri-apps/api": "^2.10.1",
22+
"@tauri-apps/plugin-dialog": "^2.6.0",
2223
"@tauri-apps/plugin-notification": "^2.3.3",
2324
"@tauri-apps/plugin-opener": "^2.5.3",
2425
"ansi-sequence-parser": "^1.1.3",

packages/ui/src/lib/native/desktop-file-drop.ts

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { listen } from "@tauri-apps/api/event"
12
import { getLogger } from "../logger"
23
import { runtimeEnv } from "../runtime-env"
34

@@ -107,13 +108,8 @@ export async function listenForNativeFolderDrops(onDrop: (paths: string[]) => vo
107108
return () => {}
108109
}
109110

110-
const eventApi = window.__TAURI__?.event
111-
if (!eventApi?.listen) {
112-
return () => {}
113-
}
114-
115111
try {
116-
const unlisten = await eventApi.listen("desktop:folder-drop", (event) => {
112+
const unlisten = await listen("desktop:folder-drop", (event) => {
117113
const payload = (event.payload ?? {}) as TauriFolderDropPayload
118114
const paths = normalizePathList(payload.paths)
119115
if (paths.length > 0) {
@@ -134,15 +130,10 @@ export async function listenForNativeFolderDropState(onState: (state: NativeFold
134130
return () => {}
135131
}
136132

137-
const eventApi = window.__TAURI__?.event
138-
if (!eventApi?.listen) {
139-
return () => {}
140-
}
141-
142133
try {
143134
const [unlistenEnter, unlistenLeave] = await Promise.all([
144-
eventApi.listen("desktop:folder-drag-enter", () => onState("enter")),
145-
eventApi.listen("desktop:folder-drag-leave", () => onState("leave")),
135+
listen("desktop:folder-drag-enter", () => onState("enter")),
136+
listen("desktop:folder-drag-leave", () => onState("leave")),
146137
])
147138
return () => {
148139
unlistenEnter()

packages/ui/src/lib/native/tauri/functions.ts

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,21 @@
1+
import { open } from "@tauri-apps/plugin-dialog"
12
import type { NativeDialogOptions } from "../native-functions"
23
import { getLogger } from "../../logger"
34
const log = getLogger("actions")
45

5-
6-
interface TauriDialogModule {
7-
open?: (
8-
options: {
9-
title?: string
10-
defaultPath?: string
11-
filters?: { name?: string; extensions: string[] }[]
12-
directory?: boolean
13-
multiple?: boolean
14-
},
15-
) => Promise<string | string[] | null>
16-
}
17-
18-
interface TauriBridge {
19-
dialog?: TauriDialogModule
20-
}
21-
226
export async function openTauriNativeDialog(options: NativeDialogOptions): Promise<string | null> {
237
if (typeof window === "undefined") {
248
return null
259
}
2610

27-
const tauriBridge = (window as Window & { __TAURI__?: TauriBridge }).__TAURI__
28-
const dialogApi = tauriBridge?.dialog
29-
if (!dialogApi?.open) {
30-
return null
31-
}
32-
3311
try {
34-
const response = await dialogApi.open({
12+
const response = await open({
3513
title: options.title,
3614
defaultPath: options.defaultPath,
3715
directory: options.mode === "directory",
3816
multiple: false,
3917
filters: options.filters?.map((filter) => ({
40-
name: filter.name,
18+
name: filter.name ?? "Files",
4119
extensions: filter.extensions,
4220
})),
4321
})

packages/ui/src/lib/runtime-env.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,6 @@ declare global {
1717
electronAPI?: unknown
1818
__TAURI__?: {
1919
core?: TauriCoreModule
20-
event?: {
21-
listen: (event: string, handler: (payload: { payload: unknown }) => void) => Promise<() => void>
22-
}
23-
dialog?: {
24-
open?: (options: Record<string, unknown>) => Promise<string | string[] | null>
25-
save?: (options: Record<string, unknown>) => Promise<string | null>
26-
}
2720
}
2821
}
2922
}

packages/ui/src/renderer/loading/main.tsx

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { invoke } from "@tauri-apps/api/core"
2+
import { listen } from "@tauri-apps/api/event"
13
import { Show, createSignal, onCleanup, onMount } from "solid-js"
24
import { render } from "solid-js/web"
35
import iconUrl from "../../images/CodeNomad-Icon.png"
@@ -27,13 +29,6 @@ interface CliStatus {
2729
error?: string | null
2830
}
2931

30-
interface TauriBridge {
31-
invoke?: <T = unknown>(cmd: string, args?: Record<string, unknown>) => Promise<T>
32-
event?: {
33-
listen: (event: string, handler: (payload: { payload: unknown }) => void) => Promise<() => void>
34-
}
35-
}
36-
3732
function pickPhraseKey(previous?: PhraseKey) {
3833
const filtered = phraseKeys.filter((key) => key !== previous)
3934
const source = filtered.length > 0 ? filtered : phraseKeys
@@ -46,17 +41,6 @@ function navigateTo(url?: string | null) {
4641
window.location.replace(url)
4742
}
4843

49-
function getTauriBridge(): TauriBridge | null {
50-
if (typeof window === "undefined") {
51-
return null
52-
}
53-
const bridge = (window as { __TAURI__?: TauriBridge }).__TAURI__
54-
if (!bridge || !bridge.event || !bridge.invoke) {
55-
return null
56-
}
57-
return bridge
58-
}
59-
6044
function annotateDocument() {
6145
if (typeof document === "undefined") {
6246
return
@@ -77,25 +61,22 @@ function LoadingApp() {
7761
setPhraseKey(pickPhraseKey())
7862
const unsubscribers: Array<() => void> = []
7963

80-
async function bootstrapTauri(tauriBridge: TauriBridge | null) {
81-
if (!tauriBridge || !tauriBridge.event || !tauriBridge.invoke) {
82-
return
83-
}
64+
async function bootstrapTauri() {
8465
try {
85-
const readyUnlisten = await tauriBridge.event.listen("cli:ready", (event) => {
66+
const readyUnlisten = await listen("cli:ready", (event) => {
8667
const payload = (event?.payload as CliStatus) || {}
8768
setError(null)
8869
setStatusKey(null)
8970
navigateTo(payload.url)
9071
})
91-
const errorUnlisten = await tauriBridge.event.listen("cli:error", (event) => {
72+
const errorUnlisten = await listen("cli:error", (event) => {
9273
const payload = (event?.payload as CliStatus) || {}
9374
if (payload.error) {
9475
setError(payload.error)
9576
setStatusKey("loadingScreen.status.issue")
9677
}
9778
})
98-
const statusUnlisten = await tauriBridge.event.listen("cli:status", (event) => {
79+
const statusUnlisten = await listen("cli:status", (event) => {
9980
const payload = (event?.payload as CliStatus) || {}
10081
if (payload.state === "error" && payload.error) {
10182
setError(payload.error)
@@ -109,7 +90,7 @@ function LoadingApp() {
10990
})
11091
unsubscribers.push(readyUnlisten, errorUnlisten, statusUnlisten)
11192

112-
const result = await tauriBridge.invoke<CliStatus>("cli_get_status")
93+
const result = await invoke<CliStatus>("cli_get_status")
11394
if (result?.state === "ready" && result.url) {
11495
navigateTo(result.url)
11596
} else if (result?.state === "error" && result.error) {
@@ -123,7 +104,7 @@ function LoadingApp() {
123104
}
124105

125106
if (isTauriHost()) {
126-
void bootstrapTauri(getTauriBridge())
107+
void bootstrapTauri()
127108
}
128109

129110
onCleanup(() => {

packages/ui/src/types/global.d.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,10 @@ declare global {
4747
webkitGetAsEntry?: () => FileSystemEntry | null
4848
}
4949

50-
interface TauriDialogModule {
51-
open?: (options: Record<string, unknown>) => Promise<string | string[] | null>
52-
save?: (options: Record<string, unknown>) => Promise<string | null>
53-
}
54-
5550
interface TauriBridge {
5651
core?: {
5752
invoke: <T = unknown>(cmd: string, args?: Record<string, unknown>) => Promise<T>
5853
}
59-
dialog?: TauriDialogModule
60-
event?: {
61-
listen: (event: string, handler: (payload: { payload: unknown }) => void) => Promise<() => void>
62-
}
6354
}
6455

6556
interface Window {

0 commit comments

Comments
 (0)