mirror of
https://github.com/luminous-devs/lume.git
synced 2024-09-29 16:30:55 +00:00
fix: memory leak in image component
This commit is contained in:
parent
38d6c51921
commit
7c7b082b3a
BIN
apps/desktop2/public/404.jpg
Normal file
BIN
apps/desktop2/public/404.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
@ -102,7 +102,7 @@ export function NoteContent({
|
|||||||
<div className="flex flex-col gap-2">
|
<div className="flex flex-col gap-2">
|
||||||
<div
|
<div
|
||||||
className={cn(
|
className={cn(
|
||||||
"select-text text-[15px] text-pretty overflow-hidden",
|
"select-text text-[15px] text-pretty content-break overflow-hidden",
|
||||||
event.content.length > 500 ? "max-h-[300px] gradient-mask-b-0" : "",
|
event.content.length > 500 ? "max-h-[300px] gradient-mask-b-0" : "",
|
||||||
className,
|
className,
|
||||||
)}
|
)}
|
||||||
|
@ -145,7 +145,9 @@ export function NoteContentLarge({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={cn("select-text", className)}>
|
<div className={cn("select-text", className)}>
|
||||||
<div className="text-[15px] text-pretty leading-normal">{content}</div>
|
<div className="text-[15px] text-pretty content-break leading-normal">
|
||||||
|
{content}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ export function MentionNote({
|
|||||||
</User.Provider>
|
</User.Provider>
|
||||||
<div
|
<div
|
||||||
className={cn(
|
className={cn(
|
||||||
"px-3 select-text whitespace-normal text-pretty leading-normal",
|
"px-3 select-text whitespace-normal text-pretty content-break leading-normal",
|
||||||
data.content.length > 100 ? "max-h-[150px] gradient-mask-b-0" : "",
|
data.content.length > 100 ? "max-h-[150px] gradient-mask-b-0" : "",
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
|
@ -1,61 +1,44 @@
|
|||||||
import { CheckCircleIcon, DownloadIcon } from "@lume/icons";
|
|
||||||
import { downloadDir } from "@tauri-apps/api/path";
|
|
||||||
import { WebviewWindow } from "@tauri-apps/api/webviewWindow";
|
import { WebviewWindow } from "@tauri-apps/api/webviewWindow";
|
||||||
import { download } from "@tauri-apps/plugin-upload";
|
|
||||||
import { type SyntheticEvent, useState } from "react";
|
|
||||||
|
|
||||||
export function ImagePreview({ url }: { url: string }) {
|
export function ImagePreview({ url }: { url: string }) {
|
||||||
const [downloaded, setDownloaded] = useState(false);
|
const open = async (url: string) => {
|
||||||
|
const name = new URL(url).pathname
|
||||||
|
.split("/")
|
||||||
|
.pop()
|
||||||
|
.replace(/[^a-zA-Z ]/g, "");
|
||||||
|
const label = `viewer-${name}`;
|
||||||
|
const window = WebviewWindow.getByLabel(label);
|
||||||
|
|
||||||
const downloadImage = async (e: { stopPropagation: () => void }) => {
|
if (!window) {
|
||||||
try {
|
const newWindow = new WebviewWindow(label, {
|
||||||
e.stopPropagation();
|
url,
|
||||||
|
title: "Image Viewer",
|
||||||
|
width: 800,
|
||||||
|
height: 800,
|
||||||
|
titleBarStyle: "overlay",
|
||||||
|
});
|
||||||
|
|
||||||
const downloadDirPath = await downloadDir();
|
return newWindow;
|
||||||
const filename = url.substring(url.lastIndexOf("/") + 1);
|
|
||||||
await download(url, `${downloadDirPath}/${filename}`);
|
|
||||||
|
|
||||||
setDownloaded(true);
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
const open = async () => {
|
return await window.setFocus();
|
||||||
const name = new URL(url).pathname.split("/").pop();
|
|
||||||
return new WebviewWindow("image-viewer", {
|
|
||||||
url,
|
|
||||||
title: name,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const fallback = (event: SyntheticEvent<HTMLImageElement, Event>) => {
|
|
||||||
event.currentTarget.src = "/fallback-image.jpg";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
// biome-ignore lint/a11y/useKeyWithClickEvents: <explanation>
|
<div className="group relative my-1">
|
||||||
<div onClick={() => open()} className="group relative my-1">
|
|
||||||
<img
|
<img
|
||||||
src={url}
|
src={url}
|
||||||
alt={url}
|
alt={url}
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
decoding="async"
|
decoding="async"
|
||||||
style={{ contentVisibility: "auto" }}
|
style={{ contentVisibility: "auto" }}
|
||||||
onError={fallback}
|
|
||||||
className="max-h-[600px] w-auto object-cover rounded-lg outline outline-1 -outline-offset-1 outline-black/15"
|
className="max-h-[600px] w-auto object-cover rounded-lg outline outline-1 -outline-offset-1 outline-black/15"
|
||||||
|
onClick={() => open(url)}
|
||||||
|
onError={({ currentTarget }) => {
|
||||||
|
currentTarget.onerror = null;
|
||||||
|
currentTarget.src = "/404.jpg";
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
onClick={(e) => downloadImage(e)}
|
|
||||||
className="absolute right-2 top-2 z-20 hidden size-8 items-center justify-center rounded-md bg-white/10 text-white/70 backdrop-blur-2xl hover:bg-blue-500 hover:text-white group-hover:inline-flex"
|
|
||||||
>
|
|
||||||
{downloaded ? (
|
|
||||||
<CheckCircleIcon className="size-4" />
|
|
||||||
) : (
|
|
||||||
<DownloadIcon className="size-4" />
|
|
||||||
)}
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,10 @@ export function Images({ urls }: { urls: string[] }) {
|
|||||||
style={{ contentVisibility: "auto" }}
|
style={{ contentVisibility: "auto" }}
|
||||||
className="max-h-[400px] w-auto object-cover rounded-lg outline outline-1 -outline-offset-1 outline-black/15"
|
className="max-h-[400px] w-auto object-cover rounded-lg outline outline-1 -outline-offset-1 outline-black/15"
|
||||||
onClick={() => open(urls[0])}
|
onClick={() => open(urls[0])}
|
||||||
|
onError={({ currentTarget }) => {
|
||||||
|
currentTarget.onerror = null;
|
||||||
|
currentTarget.src = "/404.jpg";
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@ -54,6 +58,10 @@ export function Images({ urls }: { urls: string[] }) {
|
|||||||
style={{ contentVisibility: "auto" }}
|
style={{ contentVisibility: "auto" }}
|
||||||
className="w-full h-full object-cover rounded-lg outline outline-1 -outline-offset-1 outline-black/15"
|
className="w-full h-full object-cover rounded-lg outline outline-1 -outline-offset-1 outline-black/15"
|
||||||
onClick={() => open(item)}
|
onClick={() => open(item)}
|
||||||
|
onError={({ currentTarget }) => {
|
||||||
|
currentTarget.onerror = null;
|
||||||
|
currentTarget.src = "/404.jpg";
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</CarouselItem>
|
</CarouselItem>
|
||||||
)}
|
)}
|
||||||
|
@ -57,7 +57,10 @@ function Screen() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="relative flex h-full w-full items-center justify-center">
|
<div
|
||||||
|
data-tauri-drag-region
|
||||||
|
className="relative flex h-full w-full items-center justify-center"
|
||||||
|
>
|
||||||
<div className="relative z-20 flex flex-col items-center gap-16">
|
<div className="relative z-20 flex flex-col items-center gap-16">
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<h2 className="text-xl text-neutral-700 dark:text-neutral-300">
|
<h2 className="text-xl text-neutral-700 dark:text-neutral-300">
|
||||||
|
@ -1,404 +1,596 @@
|
|||||||
// This file was generated by [tauri-specta](https://github.com/oscartbeaumont/tauri-specta). Do not edit this file manually.
|
// This file was generated by [tauri-specta](https://github.com/oscartbeaumont/tauri-specta). Do not edit this file manually.
|
||||||
|
|
||||||
export const commands = {
|
/** user-defined commands **/
|
||||||
async getRelays() : Promise<Result<Relays, null>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_relays") };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async connectRelay(relay: string) : Promise<Result<boolean, null>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("connect_relay", { relay }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async removeRelay(relay: string) : Promise<Result<boolean, null>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("remove_relay", { relay }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getAccounts() : Promise<Result<string[], string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_accounts") };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async createAccount() : Promise<Result<Account, null>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("create_account") };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async saveAccount(nsec: string, password: string) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("save_account", { nsec, password }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getEncryptedKey(npub: string, password: string) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_encrypted_key", { npub, password }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async connectRemoteAccount(uri: string) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("connect_remote_account", { uri }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async loadAccount(npub: string, bunker: string | null) : Promise<Result<boolean, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("load_account", { npub, bunker }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async eventToBech32(id: string, relays: string[]) : Promise<Result<string, null>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("event_to_bech32", { id, relays }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async userToBech32(key: string, relays: string[]) : Promise<Result<string, null>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("user_to_bech32", { key, relays }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async verifyNip05(key: string, nip05: string) : Promise<Result<boolean, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("verify_nip05", { key, nip05 }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getActivities(account: string, kind: string) : Promise<Result<string[], string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_activities", { account, kind }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getCurrentUserProfile() : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_current_user_profile") };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getProfile(id: string) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_profile", { id }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getContactList() : Promise<Result<string[], string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_contact_list") };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async setContactList(pubkeys: string[]) : Promise<Result<boolean, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("set_contact_list", { pubkeys }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async createProfile(name: string, displayName: string, about: string, picture: string, banner: string, nip05: string, lud16: string, website: string) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("create_profile", { name, displayName, about, picture, banner, nip05, lud16, website }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async follow(id: string, alias: string | null) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("follow", { id, alias }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async unfollow(id: string) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("unfollow", { id }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getNstore(key: string) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_nstore", { key }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async setNstore(key: string, content: string) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("set_nstore", { key, content }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async setNwc(uri: string) : Promise<Result<boolean, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("set_nwc", { uri }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async loadNwc() : Promise<Result<boolean, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("load_nwc") };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getBalance() : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_balance") };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async zapProfile(id: string, amount: string, message: string) : Promise<Result<boolean, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("zap_profile", { id, amount, message }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async zapEvent(id: string, amount: string, message: string) : Promise<Result<boolean, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("zap_event", { id, amount, message }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async friendToFriend(npub: string) : Promise<Result<boolean, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("friend_to_friend", { npub }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getEvent(id: string) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_event", { id }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getReplies(id: string) : Promise<Result<string[], string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_replies", { id }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getEventsBy(publicKey: string, asOf: string | null) : Promise<Result<string[], string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_events_by", { publicKey, asOf }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getLocalEvents(pubkeys: string[], until: string | null) : Promise<Result<string[], string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_local_events", { pubkeys, until }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getGlobalEvents(until: string | null) : Promise<Result<string[], string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_global_events", { until }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async getHashtagEvents(hashtags: string[], until: string | null) : Promise<Result<string[], string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("get_hashtag_events", { hashtags, until }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async publish(content: string, tags: string[][]) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("publish", { content, tags }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async repost(raw: string) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("repost", { raw }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async showInFolder(path: string) : Promise<void> {
|
|
||||||
await TAURI_INVOKE("show_in_folder", { path });
|
|
||||||
},
|
|
||||||
async createColumn(label: string, x: number, y: number, width: number, height: number, url: string) : Promise<Result<string, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("create_column", { label, x, y, width, height, url }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async closeColumn(label: string) : Promise<Result<boolean, null>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("close_column", { label }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async repositionColumn(label: string, x: number, y: number) : Promise<Result<null, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("reposition_column", { label, x, y }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async resizeColumn(label: string, width: number, height: number) : Promise<Result<null, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("resize_column", { label, width, height }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async openWindow(label: string, title: string, url: string, width: number, height: number) : Promise<Result<null, string>> {
|
|
||||||
try {
|
|
||||||
return { status: "ok", data: await TAURI_INVOKE("open_window", { label, title, url, width, height }) };
|
|
||||||
} catch (e) {
|
|
||||||
if(e instanceof Error) throw e;
|
|
||||||
else return { status: "error", error: e as any };
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async setBadge(count: number) : Promise<void> {
|
|
||||||
await TAURI_INVOKE("set_badge", { count });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
export const commands = {
|
||||||
|
async getRelays(): Promise<Result<Relays, null>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("get_relays") };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectRelay(relay: string): Promise<Result<boolean, null>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("connect_relay", { relay }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async removeRelay(relay: string): Promise<Result<boolean, null>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("remove_relay", { relay }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getAccounts(): Promise<Result<string[], string>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("get_accounts") };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async createAccount(): Promise<Result<Account, null>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("create_account") };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async saveAccount(
|
||||||
|
nsec: string,
|
||||||
|
password: string,
|
||||||
|
): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("save_account", { nsec, password }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getEncryptedKey(
|
||||||
|
npub: string,
|
||||||
|
password: string,
|
||||||
|
): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("get_encrypted_key", { npub, password }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async connectRemoteAccount(uri: string): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("connect_remote_account", { uri }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async loadAccount(
|
||||||
|
npub: string,
|
||||||
|
bunker: string | null,
|
||||||
|
): Promise<Result<boolean, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("load_account", { npub, bunker }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async eventToBech32(
|
||||||
|
id: string,
|
||||||
|
relays: string[],
|
||||||
|
): Promise<Result<string, null>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("event_to_bech32", { id, relays }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async userToBech32(
|
||||||
|
key: string,
|
||||||
|
relays: string[],
|
||||||
|
): Promise<Result<string, null>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("user_to_bech32", { key, relays }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async verifyNip05(
|
||||||
|
key: string,
|
||||||
|
nip05: string,
|
||||||
|
): Promise<Result<boolean, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("verify_nip05", { key, nip05 }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getActivities(
|
||||||
|
account: string,
|
||||||
|
kind: string,
|
||||||
|
): Promise<Result<string[], string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("get_activities", { account, kind }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getCurrentUserProfile(): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("get_current_user_profile"),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getProfile(id: string): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("get_profile", { id }) };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getContactList(): Promise<Result<string[], string>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("get_contact_list") };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async setContactList(pubkeys: string[]): Promise<Result<boolean, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("set_contact_list", { pubkeys }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async createProfile(
|
||||||
|
name: string,
|
||||||
|
displayName: string,
|
||||||
|
about: string,
|
||||||
|
picture: string,
|
||||||
|
banner: string,
|
||||||
|
nip05: string,
|
||||||
|
lud16: string,
|
||||||
|
website: string,
|
||||||
|
): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("create_profile", {
|
||||||
|
name,
|
||||||
|
displayName,
|
||||||
|
about,
|
||||||
|
picture,
|
||||||
|
banner,
|
||||||
|
nip05,
|
||||||
|
lud16,
|
||||||
|
website,
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async follow(
|
||||||
|
id: string,
|
||||||
|
alias: string | null,
|
||||||
|
): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("follow", { id, alias }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async unfollow(id: string): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("unfollow", { id }) };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getNstore(key: string): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("get_nstore", { key }) };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async setNstore(
|
||||||
|
key: string,
|
||||||
|
content: string,
|
||||||
|
): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("set_nstore", { key, content }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async setNwc(uri: string): Promise<Result<boolean, string>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("set_nwc", { uri }) };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async loadNwc(): Promise<Result<boolean, string>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("load_nwc") };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getBalance(): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("get_balance") };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async zapProfile(
|
||||||
|
id: string,
|
||||||
|
amount: string,
|
||||||
|
message: string,
|
||||||
|
): Promise<Result<boolean, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("zap_profile", { id, amount, message }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async zapEvent(
|
||||||
|
id: string,
|
||||||
|
amount: string,
|
||||||
|
message: string,
|
||||||
|
): Promise<Result<boolean, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("zap_event", { id, amount, message }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async friendToFriend(npub: string): Promise<Result<boolean, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("friend_to_friend", { npub }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getEvent(id: string): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("get_event", { id }) };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getReplies(id: string): Promise<Result<string[], string>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("get_replies", { id }) };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getEventsBy(
|
||||||
|
publicKey: string,
|
||||||
|
asOf: string | null,
|
||||||
|
): Promise<Result<string[], string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("get_events_by", { publicKey, asOf }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getLocalEvents(
|
||||||
|
pubkeys: string[],
|
||||||
|
until: string | null,
|
||||||
|
): Promise<Result<string[], string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("get_local_events", { pubkeys, until }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getGlobalEvents(
|
||||||
|
until: string | null,
|
||||||
|
): Promise<Result<string[], string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("get_global_events", { until }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async getHashtagEvents(
|
||||||
|
hashtags: string[],
|
||||||
|
until: string | null,
|
||||||
|
): Promise<Result<string[], string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("get_hashtag_events", { hashtags, until }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async publish(
|
||||||
|
content: string,
|
||||||
|
tags: string[][],
|
||||||
|
): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("publish", { content, tags }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async repost(raw: string): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return { status: "ok", data: await TAURI_INVOKE("repost", { raw }) };
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async showInFolder(path: string): Promise<void> {
|
||||||
|
await TAURI_INVOKE("show_in_folder", { path });
|
||||||
|
},
|
||||||
|
async createColumn(
|
||||||
|
label: string,
|
||||||
|
x: number,
|
||||||
|
y: number,
|
||||||
|
width: number,
|
||||||
|
height: number,
|
||||||
|
url: string,
|
||||||
|
): Promise<Result<string, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("create_column", {
|
||||||
|
label,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
url,
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async closeColumn(label: string): Promise<Result<boolean, null>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("close_column", { label }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async repositionColumn(
|
||||||
|
label: string,
|
||||||
|
x: number,
|
||||||
|
y: number,
|
||||||
|
): Promise<Result<null, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("reposition_column", { label, x, y }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async resizeColumn(
|
||||||
|
label: string,
|
||||||
|
width: number,
|
||||||
|
height: number,
|
||||||
|
): Promise<Result<null, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("resize_column", { label, width, height }),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async openWindow(
|
||||||
|
label: string,
|
||||||
|
title: string,
|
||||||
|
url: string,
|
||||||
|
width: number,
|
||||||
|
height: number,
|
||||||
|
): Promise<Result<null, string>> {
|
||||||
|
try {
|
||||||
|
return {
|
||||||
|
status: "ok",
|
||||||
|
data: await TAURI_INVOKE("open_window", {
|
||||||
|
label,
|
||||||
|
title,
|
||||||
|
url,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof Error) throw e;
|
||||||
|
else return { status: "error", error: e as any };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async setBadge(count: number): Promise<void> {
|
||||||
|
await TAURI_INVOKE("set_badge", { count });
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/** user-defined events **/
|
||||||
|
|
||||||
|
/** user-defined statics **/
|
||||||
|
|
||||||
/** user-defined types **/
|
/** user-defined types **/
|
||||||
|
|
||||||
export type Account = { npub: string; nsec: string }
|
export type Account = { npub: string; nsec: string };
|
||||||
export type Relays = { connected: string[]; read: string[] | null; write: string[] | null; both: string[] | null }
|
export type Relays = {
|
||||||
|
connected: string[];
|
||||||
|
read: string[] | null;
|
||||||
|
write: string[] | null;
|
||||||
|
both: string[] | null;
|
||||||
|
};
|
||||||
|
|
||||||
/** tauri-specta globals **/
|
/** tauri-specta globals **/
|
||||||
|
|
||||||
import { invoke as TAURI_INVOKE } from "@tauri-apps/api/core";
|
import { invoke as TAURI_INVOKE } from "@tauri-apps/api/core";
|
||||||
import * as TAURI_API_EVENT from "@tauri-apps/api/event";
|
import * as TAURI_API_EVENT from "@tauri-apps/api/event";
|
||||||
import { type WebviewWindow as __WebviewWindow__ } from "@tauri-apps/api/webviewWindow";
|
import { type WebviewWindow as __WebviewWindow__ } from "@tauri-apps/api/webviewWindow";
|
||||||
|
|
||||||
type __EventObj__<T> = {
|
type __EventObj__<T> = {
|
||||||
listen: (
|
listen: (
|
||||||
cb: TAURI_API_EVENT.EventCallback<T>
|
cb: TAURI_API_EVENT.EventCallback<T>,
|
||||||
) => ReturnType<typeof TAURI_API_EVENT.listen<T>>;
|
) => ReturnType<typeof TAURI_API_EVENT.listen<T>>;
|
||||||
once: (
|
once: (
|
||||||
cb: TAURI_API_EVENT.EventCallback<T>
|
cb: TAURI_API_EVENT.EventCallback<T>,
|
||||||
) => ReturnType<typeof TAURI_API_EVENT.once<T>>;
|
) => ReturnType<typeof TAURI_API_EVENT.once<T>>;
|
||||||
emit: T extends null
|
emit: T extends null
|
||||||
? (payload?: T) => ReturnType<typeof TAURI_API_EVENT.emit>
|
? (payload?: T) => ReturnType<typeof TAURI_API_EVENT.emit>
|
||||||
: (payload: T) => ReturnType<typeof TAURI_API_EVENT.emit>;
|
: (payload: T) => ReturnType<typeof TAURI_API_EVENT.emit>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type Result<T, E> =
|
export type Result<T, E> =
|
||||||
| { status: "ok"; data: T }
|
| { status: "ok"; data: T }
|
||||||
| { status: "error"; error: E };
|
| { status: "error"; error: E };
|
||||||
|
|
||||||
function __makeEvents__<T extends Record<string, any>>(
|
function __makeEvents__<T extends Record<string, any>>(
|
||||||
mappings: Record<keyof T, string>
|
mappings: Record<keyof T, string>,
|
||||||
) {
|
) {
|
||||||
return new Proxy(
|
return new Proxy(
|
||||||
{} as unknown as {
|
{} as unknown as {
|
||||||
[K in keyof T]: __EventObj__<T[K]> & {
|
[K in keyof T]: __EventObj__<T[K]> & {
|
||||||
(handle: __WebviewWindow__): __EventObj__<T[K]>;
|
(handle: __WebviewWindow__): __EventObj__<T[K]>;
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
get: (_, event) => {
|
get: (_, event) => {
|
||||||
const name = mappings[event as keyof T];
|
const name = mappings[event as keyof T];
|
||||||
|
|
||||||
return new Proxy((() => {}) as any, {
|
return new Proxy((() => {}) as any, {
|
||||||
apply: (_, __, [window]: [__WebviewWindow__]) => ({
|
apply: (_, __, [window]: [__WebviewWindow__]) => ({
|
||||||
listen: (arg: any) => window.listen(name, arg),
|
listen: (arg: any) => window.listen(name, arg),
|
||||||
once: (arg: any) => window.once(name, arg),
|
once: (arg: any) => window.once(name, arg),
|
||||||
emit: (arg: any) => window.emit(name, arg),
|
emit: (arg: any) => window.emit(name, arg),
|
||||||
}),
|
}),
|
||||||
get: (_, command: keyof __EventObj__<any>) => {
|
get: (_, command: keyof __EventObj__<any>) => {
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case "listen":
|
case "listen":
|
||||||
return (arg: any) => TAURI_API_EVENT.listen(name, arg);
|
return (arg: any) => TAURI_API_EVENT.listen(name, arg);
|
||||||
case "once":
|
case "once":
|
||||||
return (arg: any) => TAURI_API_EVENT.once(name, arg);
|
return (arg: any) => TAURI_API_EVENT.once(name, arg);
|
||||||
case "emit":
|
case "emit":
|
||||||
return (arg: any) => TAURI_API_EVENT.emit(name, arg);
|
return (arg: any) => TAURI_API_EVENT.emit(name, arg);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
8
src-tauri/Cargo.lock
generated
8
src-tauri/Cargo.lock
generated
@ -5841,8 +5841,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tauri-specta"
|
name = "tauri-specta"
|
||||||
version = "2.0.0-rc.10"
|
version = "2.0.0-rc.11"
|
||||||
source = "git+https://github.com/cloudcad/tauri-specta?branch=main#806eb18e50d7015a5ff27f800b5fc5a74a4d41a6"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "85f26e4ded13fbeab2216dcb5a59b5cf8b475740afea932918888402bcc62a02"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heck 0.5.0",
|
"heck 0.5.0",
|
||||||
"indoc",
|
"indoc",
|
||||||
@ -5857,7 +5858,8 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "tauri-specta-macros"
|
name = "tauri-specta-macros"
|
||||||
version = "2.0.0-rc.5"
|
version = "2.0.0-rc.5"
|
||||||
source = "git+https://github.com/cloudcad/tauri-specta?branch=main#806eb18e50d7015a5ff27f800b5fc5a74a4d41a6"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e6f9e90bf2012877e2c4029a1bf756277183e9c7c77b850ef965711553998012"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heck 0.5.0",
|
"heck 0.5.0",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
|
@ -37,10 +37,8 @@ tauri-plugin-decorum = "0.1.0"
|
|||||||
webpage = { version = "2.0", features = ["serde"] }
|
webpage = { version = "2.0", features = ["serde"] }
|
||||||
keyring = "2"
|
keyring = "2"
|
||||||
keyring-search = "0.2.0"
|
keyring-search = "0.2.0"
|
||||||
specta = "=2.0.0-rc.12"
|
specta = "^2.0.0-rc.12"
|
||||||
tauri-specta = { git = "https://github.com/cloudcad/tauri-specta", branch = "main", features = [
|
tauri-specta = { version = "^2.0.0-rc.11", features = ["typescript"] }
|
||||||
"typescript",
|
|
||||||
] }
|
|
||||||
tauri-plugin-theme = "0.4.1"
|
tauri-plugin-theme = "0.4.1"
|
||||||
|
|
||||||
[target.'cfg(target_family = "unix")'.dependencies]
|
[target.'cfg(target_family = "unix")'.dependencies]
|
||||||
|
Loading…
Reference in New Issue
Block a user