pull/317/head
Lucas Nogueira 2 years ago
parent 6f65b98697
commit 03c858bc34
No known key found for this signature in database
GPG Key ID: FFEA6C72E73482F1

@ -8,17 +8,20 @@ In the future, this app will be used on Tauri's integration tests.
## Running the example ## Running the example
- Install dependencies and build packages (Run inside of the repository root) - Install dependencies and build packages (Run inside of the repository root)
```bash ```bash
$ pnpm install $ pnpm install
$ pnpm build $ pnpm build
``` ```
- Run the app in development mode (Run inside of this folder `examples/api/`) - Run the app in development mode (Run inside of this folder `examples/api/`)
```bash ```bash
$ pnpm tauri dev $ pnpm tauri dev
``` ```
- Build an run the release app (Run inside of this folder `examples/api/`) - Build an run the release app (Run inside of this folder `examples/api/`)
```bash ```bash
$ pnpm tauri build $ pnpm tauri build
$ ./src-tauri/target/release/app $ ./src-tauri/target/release/app

@ -3,5 +3,5 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
window.__TAURI_ISOLATION_HOOK__ = (payload) => { window.__TAURI_ISOLATION_HOOK__ = (payload) => {
return payload return payload;
} };

@ -29,4 +29,4 @@
"unocss": "^0.39.3", "unocss": "^0.39.3",
"vite": "^3.0.9" "vite": "^3.0.9"
} }
} }

@ -26,11 +26,7 @@
"name": "theme", "name": "theme",
"takesValue": true, "takesValue": true,
"description": "App theme", "description": "App theme",
"possibleValues": [ "possibleValues": ["light", "dark", "system"]
"light",
"dark",
"system"
]
}, },
{ {
"short": "v", "short": "v",
@ -92,14 +88,8 @@
"all": true, "all": true,
"fs": { "fs": {
"scope": { "scope": {
"allow": [ "allow": ["$APPDATA/db/**", "$DOWNLOAD/**", "$RESOURCE/**"],
"$APPDATA/db/**", "deny": ["$APPDATA/db/*.stronghold"]
"$DOWNLOAD/**",
"$RESOURCE/**"
],
"deny": [
"$APPDATA/db/*.stronghold"
]
} }
}, },
"shell": { "shell": {
@ -130,28 +120,19 @@
"protocol": { "protocol": {
"asset": true, "asset": true,
"assetScope": { "assetScope": {
"allow": [ "allow": ["$APPDATA/db/**", "$RESOURCE/**"],
"$APPDATA/db/**", "deny": ["$APPDATA/db/*.stronghold"]
"$RESOURCE/**"
],
"deny": [
"$APPDATA/db/*.stronghold"
]
} }
}, },
"http": { "http": {
"scope": [ "scope": ["http://localhost:3003"]
"http://localhost:3003"
]
} }
}, },
"windows": [], "windows": [],
"security": { "security": {
"csp": { "csp": {
"default-src": "'self' customprotocol: asset:", "default-src": "'self' customprotocol: asset:",
"font-src": [ "font-src": ["https://fonts.gstatic.com"],
"https://fonts.gstatic.com"
],
"img-src": "'self' asset: https://asset.localhost blob: data:", "img-src": "'self' asset: https://asset.localhost blob: data:",
"style-src": "'unsafe-inline' 'self' https://fonts.googleapis.com" "style-src": "'unsafe-inline' 'self' https://fonts.googleapis.com"
}, },
@ -163,4 +144,4 @@
"menuOnLeftClick": false "menuOnLeftClick": false
} }
} }
} }

@ -5,7 +5,7 @@
* { * {
box-sizing: border-box; box-sizing: border-box;
font-family: 'Rubik', sans-serif; font-family: "Rubik", sans-serif;
} }
::-webkit-scrollbar { ::-webkit-scrollbar {

@ -2,12 +2,12 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
import 'uno.css' import "uno.css";
import './app.css' import "./app.css";
import App from './App.svelte' import App from "./App.svelte";
const app = new App({ const app = new App({
target: document.querySelector('#app') target: document.querySelector("#app"),
}) });
export default app export default app;

@ -7,43 +7,43 @@ import {
presetIcons, presetIcons,
presetUno, presetUno,
extractorSvelte, extractorSvelte,
presetWebFonts presetWebFonts,
} from 'unocss' } from "unocss";
export default defineConfig({ export default defineConfig({
theme: { theme: {
colors: { colors: {
primary: '#FFFFFF', primary: "#FFFFFF",
primaryLighter: '#e9ecef', primaryLighter: "#e9ecef",
darkPrimary: '#1B1B1D', darkPrimary: "#1B1B1D",
darkPrimaryLighter: '#242526', darkPrimaryLighter: "#242526",
primaryText: '#1C1E21', primaryText: "#1C1E21",
darkPrimaryText: '#E3E3E3', darkPrimaryText: "#E3E3E3",
secondaryText: '#858A91', secondaryText: "#858A91",
darkSecondaryText: '#C2C5CA', darkSecondaryText: "#C2C5CA",
accent: '#3578E5', accent: "#3578E5",
accentDark: '#306cce', accentDark: "#306cce",
accentDarker: '#2d66c3', accentDarker: "#2d66c3",
accentDarkest: '#2554a0', accentDarkest: "#2554a0",
accentLight: '#538ce9', accentLight: "#538ce9",
accentLighter: '#72a1ed', accentLighter: "#72a1ed",
accentLightest: '#9abcf2', accentLightest: "#9abcf2",
accentText: '#FFFFFF', accentText: "#FFFFFF",
darkAccent: '#67d6ed', darkAccent: "#67d6ed",
darkAccentDark: '#49cee9', darkAccentDark: "#49cee9",
darkAccentDarker: '#39cae8', darkAccentDarker: "#39cae8",
darkAccentDarkest: '#19b5d5', darkAccentDarkest: "#19b5d5",
darkAccentLight: '#85def1', darkAccentLight: "#85def1",
darkAccentLighter: '#95e2f2', darkAccentLighter: "#95e2f2",
darkAccentLightest: '#c2eff8', darkAccentLightest: "#c2eff8",
darkAccentText: '#1C1E21', darkAccentText: "#1C1E21",
code: '#d6d8da', code: "#d6d8da",
codeDark: '#282a2e', codeDark: "#282a2e",
hoverOverlay: 'rgba(0,0,0,.05)', hoverOverlay: "rgba(0,0,0,.05)",
hoverOverlayDarker: 'rgba(0,0,0,.1)', hoverOverlayDarker: "rgba(0,0,0,.1)",
darkHoverOverlay: 'hsla(0,0%,100%,.05)', darkHoverOverlay: "hsla(0,0%,100%,.05)",
darkHoverOverlayDarker: 'hsla(0,0%,100%,.1)' darkHoverOverlayDarker: "hsla(0,0%,100%,.1)",
} },
}, },
preflights: [ preflights: [
{ {
@ -59,7 +59,7 @@ export default defineConfig({
code { code {
font-size: ${theme.fontSize.xs[0]}; font-size: ${theme.fontSize.xs[0]};
font-family: ${theme.fontFamily.mono}; font-family: ${theme.fontFamily.mono};
border-radius: ${theme.borderRadius['DEFAULT']}; border-radius: ${theme.borderRadius["DEFAULT"]};
background-color: ${theme.colors.code}; background-color: ${theme.colors.code};
} }
@ -71,8 +71,8 @@ export default defineConfig({
.dark code { .dark code {
background-color: ${theme.colors.codeDark}; background-color: ${theme.colors.codeDark};
} }
` `,
} },
], ],
shortcuts: { shortcuts: {
btn: `select-none outline-none shadow-md p-2 rd-1 text-primaryText border-none font-400 dark:font-600 btn: `select-none outline-none shadow-md p-2 rd-1 text-primaryText border-none font-400 dark:font-600
@ -86,20 +86,20 @@ export default defineConfig({
note: `decoration-none flex-inline items-center relative p-2 rd-1 note: `decoration-none flex-inline items-center relative p-2 rd-1
border-l-4 border-accent dark:border-darkAccent border-l-4 border-accent dark:border-darkAccent
bg-accent/10 dark:bg-darkAccent/10`, bg-accent/10 dark:bg-darkAccent/10`,
'note-red': "note-red":
'note bg-red-700/10 dark:bg-red-700/10 after:bg-red-700 dark:after:bg-red-700', "note bg-red-700/10 dark:bg-red-700/10 after:bg-red-700 dark:after:bg-red-700",
input: input:
'h-10 flex items-center outline-none border-none p-2 rd-1 shadow-md bg-primaryLighter dark:bg-darkPrimaryLighter text-primaryText dark:text-darkPrimaryText' "h-10 flex items-center outline-none border-none p-2 rd-1 shadow-md bg-primaryLighter dark:bg-darkPrimaryLighter text-primaryText dark:text-darkPrimaryText",
}, },
presets: [ presets: [
presetUno(), presetUno(),
presetIcons(), presetIcons(),
presetWebFonts({ presetWebFonts({
fonts: { fonts: {
sans: 'Rubik', sans: "Rubik",
mono: ['Fira Code', 'Fira Mono:400,700'] mono: ["Fira Code", "Fira Mono:400,700"],
} },
}) }),
], ],
extractors: [extractorSvelte] extractors: [extractorSvelte],
}) });

@ -2,14 +2,18 @@
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
import { defineConfig } from 'vite' import { defineConfig } from "vite";
import Unocss from 'unocss/vite' import Unocss from "unocss/vite";
import { svelte } from '@sveltejs/vite-plugin-svelte' import { svelte } from "@sveltejs/vite-plugin-svelte";
import { internalIpV4 } from 'internal-ip' import { internalIpV4 } from "internal-ip";
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig(async ({ command, mode }) => { export default defineConfig(async ({ command, mode }) => {
const host = process.env.TAURI_PLATFORM === 'android' || process.env.TAURI_PLATFORM === 'ios' ? (await internalIpV4()) : 'localhost' const host =
process.env.TAURI_PLATFORM === "android" ||
process.env.TAURI_PLATFORM === "ios"
? await internalIpV4()
: "localhost";
return { return {
plugins: [Unocss(), svelte()], plugins: [Unocss(), svelte()],
build: { build: {
@ -17,22 +21,22 @@ export default defineConfig(async ({ command, mode }) => {
output: { output: {
entryFileNames: `assets/[name].js`, entryFileNames: `assets/[name].js`,
chunkFileNames: `assets/[name].js`, chunkFileNames: `assets/[name].js`,
assetFileNames: `assets/[name].[ext]` assetFileNames: `assets/[name].[ext]`,
} },
} },
}, },
server: { server: {
host: '0.0.0.0', host: "0.0.0.0",
port: 5173, port: 5173,
strictPort: true, strictPort: true,
hmr: { hmr: {
protocol: 'ws', protocol: "ws",
host, host,
port: 5183 port: 5183,
}, },
fs: { fs: {
allow: ['.', '../../tooling/api/dist'] allow: [".", "../../tooling/api/dist"],
} },
} },
} };
}) });

@ -24,7 +24,7 @@
* @module * @module
*/ */
import { invoke, transformCallback } from '@tauri-apps/api/tauri' import { invoke, transformCallback } from "@tauri-apps/api/tauri";
/** /**
* Options to send a notification. * Options to send a notification.
@ -35,116 +35,116 @@ interface Options {
/** /**
* The notification identifier to reference this object later. Must be a 32-bit integer. * The notification identifier to reference this object later. Must be a 32-bit integer.
*/ */
id?: number id?: number;
/** /**
* Identifier of the {@link Channel} that deliveres this notification. * Identifier of the {@link Channel} that deliveres this notification.
* *
* If the channel does not exist, the notification won't fire. * If the channel does not exist, the notification won't fire.
* Make sure the channel exists with {@link listChannels} and {@link createChannel}. * Make sure the channel exists with {@link listChannels} and {@link createChannel}.
*/ */
channelId?: string channelId?: string;
/** /**
* Notification title. * Notification title.
*/ */
title: string title: string;
/** /**
* Optional notification body. * Optional notification body.
* */ * */
body?: string body?: string;
/** /**
* Schedule this notification to fire on a later time or a fixed interval. * Schedule this notification to fire on a later time or a fixed interval.
*/ */
schedule?: Schedule schedule?: Schedule;
/** /**
* Multiline text. * Multiline text.
* Changes the notification style to big text. * Changes the notification style to big text.
* Cannot be used with `inboxLines`. * Cannot be used with `inboxLines`.
*/ */
largeBody?: string largeBody?: string;
/** /**
* Detail text for the notification with `largeBody`, `inboxLines` or `groupSummary`. * Detail text for the notification with `largeBody`, `inboxLines` or `groupSummary`.
*/ */
summary?: string summary?: string;
/** /**
* Defines an action type for this notification. * Defines an action type for this notification.
*/ */
actionTypeId?: string actionTypeId?: string;
/** /**
* Identifier used to group multiple notifications. * Identifier used to group multiple notifications.
* *
* https://developer.apple.com/documentation/usernotifications/unmutablenotificationcontent/1649872-threadidentifier * https://developer.apple.com/documentation/usernotifications/unmutablenotificationcontent/1649872-threadidentifier
*/ */
group?: string group?: string;
/** /**
* Instructs the system that this notification is the summary of a group on Android. * Instructs the system that this notification is the summary of a group on Android.
*/ */
groupSummary?: boolean groupSummary?: boolean;
/** /**
* The sound resource name. Only available on mobile. * The sound resource name. Only available on mobile.
*/ */
sound?: string sound?: string;
/** /**
* List of lines to add to the notification. * List of lines to add to the notification.
* Changes the notification style to inbox. * Changes the notification style to inbox.
* Cannot be used with `largeBody`. * Cannot be used with `largeBody`.
* *
* Only supports up to 5 lines. * Only supports up to 5 lines.
*/ */
inboxLines?: string[] inboxLines?: string[];
/** /**
* Notification icon. * Notification icon.
* *
* On Android the icon must be placed in the app's `res/drawable` folder. * On Android the icon must be placed in the app's `res/drawable` folder.
*/ */
icon?: string icon?: string;
/** /**
* Notification large icon (Android). * Notification large icon (Android).
* *
* The icon must be placed in the app's `res/drawable` folder. * The icon must be placed in the app's `res/drawable` folder.
*/ */
largeIcon?: string largeIcon?: string;
/** /**
* Icon color on Android. * Icon color on Android.
*/ */
iconColor?: string iconColor?: string;
/** /**
* Notification attachments. * Notification attachments.
*/ */
attachments?: Attachment[] attachments?: Attachment[];
/** /**
* Extra payload to store in the notification. * Extra payload to store in the notification.
*/ */
extra?: { [key: string]: unknown } extra?: { [key: string]: unknown };
/** /**
* If true, the notification cannot be dismissed by the user on Android. * If true, the notification cannot be dismissed by the user on Android.
* *
* An application service must manage the dismissal of the notification. * An application service must manage the dismissal of the notification.
* It is typically used to indicate a background task that is pending (e.g. a file download) * It is typically used to indicate a background task that is pending (e.g. a file download)
* or the user is engaged with (e.g. playing music). * or the user is engaged with (e.g. playing music).
*/ */
ongoing?: boolean ongoing?: boolean;
/** /**
* Automatically cancel the notification when the user clicks on it. * Automatically cancel the notification when the user clicks on it.
*/ */
autoCancel?: boolean autoCancel?: boolean;
/** /**
* Changes the notification presentation to be silent on iOS (no badge, no sound, not listed). * Changes the notification presentation to be silent on iOS (no badge, no sound, not listed).
*/ */
silent?: boolean silent?: boolean;
/** /**
* Notification visibility. * Notification visibility.
*/ */
visibility?: Visibility visibility?: Visibility;
/** /**
* Sets the number of items this notification represents on Android. * Sets the number of items this notification represents on Android.
*/ */
number?: number number?: number;
} }
type ScheduleInterval = { type ScheduleInterval = {
year?: number year?: number;
month?: number month?: number;
day?: number day?: number;
/** /**
* 1 - Sunday * 1 - Sunday
* 2 - Monday * 2 - Monday
@ -154,61 +154,64 @@ type ScheduleInterval = {
* 6 - Friday * 6 - Friday
* 7 - Saturday * 7 - Saturday
*/ */
weekday?: number weekday?: number;
hour?: number hour?: number;
minute?: number minute?: number;
second?: number second?: number;
} };
enum ScheduleEvery { enum ScheduleEvery {
Year = 'Year', Year = "Year",
Month = 'Month', Month = "Month",
TwoWeeks = 'TwoWeeks', TwoWeeks = "TwoWeeks",
Week = 'Week', Week = "Week",
Day = 'Day', Day = "Day",
Hour = 'Hour', Hour = "Hour",
Minute = 'Minute', Minute = "Minute",
/** /**
* Not supported on iOS. * Not supported on iOS.
*/ */
Second = 'Second' Second = "Second",
} }
type ScheduleData = { type ScheduleData =
kind: 'At', | {
data: { kind: "At";
date: Date data: {
repeating: boolean date: Date;
} repeating: boolean;
} | { };
kind: 'Interval', }
data: ScheduleInterval | {
} | { kind: "Interval";
kind: 'Every', data: ScheduleInterval;
data: { }
interval: ScheduleEvery | {
} kind: "Every";
} data: {
interval: ScheduleEvery;
};
};
class Schedule { class Schedule {
kind: string kind: string;
data: unknown data: unknown;
private constructor(schedule: ScheduleData) { private constructor(schedule: ScheduleData) {
this.kind = schedule.kind this.kind = schedule.kind;
this.data = schedule.data this.data = schedule.data;
} }
static at(date: Date, repeating = false) { static at(date: Date, repeating = false) {
return new Schedule({ kind: 'At', data: { date, repeating } }) return new Schedule({ kind: "At", data: { date, repeating } });
} }
static interval(interval: ScheduleInterval) { static interval(interval: ScheduleInterval) {
return new Schedule({ kind: 'Interval', data: interval }) return new Schedule({ kind: "Interval", data: interval });
} }
static every(kind: ScheduleEvery) { static every(kind: ScheduleEvery) {
return new Schedule({ kind: 'Every', data: { interval: kind } }) return new Schedule({ kind: "Every", data: { interval: kind } });
} }
} }
@ -217,58 +220,58 @@ class Schedule {
*/ */
interface Attachment { interface Attachment {
/** Attachment identifier. */ /** Attachment identifier. */
id: string id: string;
/** Attachment URL. Accepts the `asset` and `file` protocols. */ /** Attachment URL. Accepts the `asset` and `file` protocols. */
url: string url: string;
} }
interface Action { interface Action {
id: string id: string;
title: string title: string;
requiresAuthentication?: boolean requiresAuthentication?: boolean;
foreground?: boolean foreground?: boolean;
destructive?: boolean destructive?: boolean;
input?: boolean input?: boolean;
inputButtonTitle?: string inputButtonTitle?: string;
inputPlaceholder?: string inputPlaceholder?: string;
} }
interface ActionType { interface ActionType {
/** /**
* The identifier of this action type * The identifier of this action type
*/ */
id: string id: string;
/** /**
* The list of associated actions * The list of associated actions
*/ */
actions: Action[] actions: Action[];
hiddenPreviewsBodyPlaceholder?: string, hiddenPreviewsBodyPlaceholder?: string;
customDismissAction?: boolean, customDismissAction?: boolean;
allowInCarPlay?: boolean, allowInCarPlay?: boolean;
hiddenPreviewsShowTitle?: boolean, hiddenPreviewsShowTitle?: boolean;
hiddenPreviewsShowSubtitle?: boolean, hiddenPreviewsShowSubtitle?: boolean;
} }
interface PendingNotification { interface PendingNotification {
id: number id: number;
title?: string title?: string;
body?: string body?: string;
schedule: Schedule schedule: Schedule;
} }
interface ActiveNotification { interface ActiveNotification {
id: number id: number;
tag?: string tag?: string;
title?: string title?: string;
body?: string body?: string;
group?: string group?: string;
groupSummary: boolean groupSummary: boolean;
data: Record<string, string> data: Record<string, string>;
extra: Record<string, unknown> extra: Record<string, unknown>;
attachments: Attachment[] attachments: Attachment[];
actionTypeId?: string actionTypeId?: string;
schedule?: Schedule schedule?: Schedule;
sound?: string sound?: string;
} }
enum Importance { enum Importance {
@ -276,25 +279,25 @@ enum Importance {
Min, Min,
Low, Low,
Default, Default,
High High,
} }
enum Visibility { enum Visibility {
Secret = -1, Secret = -1,
Private, Private,
Public Public,
} }
interface Channel { interface Channel {
id: string id: string;
name: string name: string;
description?: string description?: string;
sound?: string sound?: string;
lights?: boolean lights?: boolean;
lightColor?: string lightColor?: string;
vibration?: boolean vibration?: boolean;
importance?: Importance importance?: Importance;
visibility?: Visibility visibility?: Visibility;
} }
/** Possible permission values. */ /** Possible permission values. */
@ -367,7 +370,7 @@ function sendNotification(options: Options | string): void {
/** /**
* Register actions that are performed when the user clicks on the notification. * Register actions that are performed when the user clicks on the notification.
* *
* @example * @example
* ```typescript * ```typescript
* import { registerActionTypes } from '@tauri-apps/api/notification'; * import { registerActionTypes } from '@tauri-apps/api/notification';
@ -385,12 +388,12 @@ function sendNotification(options: Options | string): void {
* @since 2.0.0 * @since 2.0.0
*/ */
async function registerActionTypes(types: ActionType[]): Promise<void> { async function registerActionTypes(types: ActionType[]): Promise<void> {
return invoke('plugin:notification|register_action_types', { types }) return invoke("plugin:notification|register_action_types", { types });
} }
/** /**
* Retrieves the list of pending notifications. * Retrieves the list of pending notifications.
* *
* @example * @example
* ```typescript * ```typescript
* import { pending } from '@tauri-apps/api/notification'; * import { pending } from '@tauri-apps/api/notification';
@ -402,12 +405,12 @@ async function registerActionTypes(types: ActionType[]): Promise<void> {
* @since 2.0.0 * @since 2.0.0
*/ */
async function pending(): Promise<PendingNotification[]> { async function pending(): Promise<PendingNotification[]> {
return invoke('plugin:notification|get_pending') return invoke("plugin:notification|get_pending");
} }
/** /**
* Cancels the pending notifications with the given list of identifiers. * Cancels the pending notifications with the given list of identifiers.
* *
* @example * @example
* ```typescript * ```typescript
* import { cancel } from '@tauri-apps/api/notification'; * import { cancel } from '@tauri-apps/api/notification';
@ -419,12 +422,12 @@ async function pending(): Promise<PendingNotification[]> {
* @since 2.0.0 * @since 2.0.0
*/ */
async function cancel(notifications: number[]): Promise<void> { async function cancel(notifications: number[]): Promise<void> {
return invoke('plugin:notification|cancel', { notifications }) return invoke("plugin:notification|cancel", { notifications });
} }
/** /**
* Cancels all pending notifications. * Cancels all pending notifications.
* *
* @example * @example
* ```typescript * ```typescript
* import { cancelAll } from '@tauri-apps/api/notification'; * import { cancelAll } from '@tauri-apps/api/notification';
@ -436,12 +439,12 @@ async function cancel(notifications: number[]): Promise<void> {
* @since 2.0.0 * @since 2.0.0
*/ */
async function cancelAll(): Promise<void> { async function cancelAll(): Promise<void> {
return invoke('plugin:notification|cancel') return invoke("plugin:notification|cancel");
} }
/** /**
* Retrieves the list of active notifications. * Retrieves the list of active notifications.
* *
* @example * @example
* ```typescript * ```typescript
* import { active } from '@tauri-apps/api/notification'; * import { active } from '@tauri-apps/api/notification';
@ -453,12 +456,12 @@ async function cancelAll(): Promise<void> {
* @since 2.0.0 * @since 2.0.0
*/ */
async function active(): Promise<ActiveNotification[]> { async function active(): Promise<ActiveNotification[]> {
return invoke('plugin:notification|get_active') return invoke("plugin:notification|get_active");
} }
/** /**
* Removes the active notifications with the given list of identifiers. * Removes the active notifications with the given list of identifiers.
* *
* @example * @example
* ```typescript * ```typescript
* import { cancel } from '@tauri-apps/api/notification'; * import { cancel } from '@tauri-apps/api/notification';
@ -470,12 +473,12 @@ async function active(): Promise<ActiveNotification[]> {
* @since 2.0.0 * @since 2.0.0
*/ */
async function removeActive(notifications: number[]): Promise<void> { async function removeActive(notifications: number[]): Promise<void> {
return invoke('plugin:notification|remove_active', { notifications }) return invoke("plugin:notification|remove_active", { notifications });
} }
/** /**
* Removes all active notifications. * Removes all active notifications.
* *
* @example * @example
* ```typescript * ```typescript
* import { removeAllActive } from '@tauri-apps/api/notification'; * import { removeAllActive } from '@tauri-apps/api/notification';
@ -487,12 +490,12 @@ async function removeActive(notifications: number[]): Promise<void> {
* @since 2.0.0 * @since 2.0.0
*/ */
async function removeAllActive(): Promise<void> { async function removeAllActive(): Promise<void> {
return invoke('plugin:notification|remove_active') return invoke("plugin:notification|remove_active");
} }
/** /**
* Removes all active notifications. * Removes all active notifications.
* *
* @example * @example
* ```typescript * ```typescript
* import { createChannel, Importance, Visibility } from '@tauri-apps/api/notification'; * import { createChannel, Importance, Visibility } from '@tauri-apps/api/notification';
@ -511,12 +514,12 @@ async function removeAllActive(): Promise<void> {
* @since 2.0.0 * @since 2.0.0
*/ */
async function createChannel(channel: Channel): Promise<void> { async function createChannel(channel: Channel): Promise<void> {
return invoke('plugin:notification|create_channel', { ...channel }) return invoke("plugin:notification|create_channel", { ...channel });
} }
/** /**
* Removes the channel with the given identifier. * Removes the channel with the given identifier.
* *
* @example * @example
* ```typescript * ```typescript
* import { removeChannel } from '@tauri-apps/api/notification'; * import { removeChannel } from '@tauri-apps/api/notification';
@ -528,12 +531,12 @@ async function createChannel(channel: Channel): Promise<void> {
* @since 2.0.0 * @since 2.0.0
*/ */
async function removeChannel(id: string): Promise<void> { async function removeChannel(id: string): Promise<void> {
return invoke('plugin:notification|delete_channel', { id }) return invoke("plugin:notification|delete_channel", { id });
} }
/** /**
* Retrieves the list of notification channels. * Retrieves the list of notification channels.
* *
* @example * @example
* ```typescript * ```typescript
* import { channels } from '@tauri-apps/api/notification'; * import { channels } from '@tauri-apps/api/notification';
@ -545,43 +548,74 @@ async function removeChannel(id: string): Promise<void> {
* @since 2.0.0 * @since 2.0.0
*/ */
async function channels(): Promise<Channel[]> { async function channels(): Promise<Channel[]> {
return invoke('plugin:notification|getActive') return invoke("plugin:notification|getActive");
} }
class EventChannel { class EventChannel {
id: number id: number;
unregisterFn: (channel: EventChannel) => Promise<void> unregisterFn: (channel: EventChannel) => Promise<void>;
constructor(id: number, unregisterFn: (channel: EventChannel) => Promise<void>) { constructor(
this.id = id id: number,
this.unregisterFn = unregisterFn unregisterFn: (channel: EventChannel) => Promise<void>
) {
this.id = id;
this.unregisterFn = unregisterFn;
} }
toJSON(): string { toJSON(): string {
return `__CHANNEL__:${this.id}` return `__CHANNEL__:${this.id}`;
} }
async unregister(): Promise<void> { async unregister(): Promise<void> {
return this.unregisterFn(this) return this.unregisterFn(this);
} }
} }
// TODO: use addPluginListener API on @tauri-apps/api/tauri 2.0.0-alpha.4 // TODO: use addPluginListener API on @tauri-apps/api/tauri 2.0.0-alpha.4
async function onNotificationReceived(cb: (notification: Options) => void): Promise<EventChannel> { async function onNotificationReceived(
const channelId = transformCallback(cb) cb: (notification: Options) => void
const handler = new EventChannel(channelId, (channel) => invoke('plugin:notification|remove_listener', { event: 'notification', channelId: channel.id })) ): Promise<EventChannel> {
return invoke('plugin:notification|register_listener', { event: 'notification', handler }).then(() => handler) const channelId = transformCallback(cb);
const handler = new EventChannel(channelId, (channel) =>
invoke("plugin:notification|remove_listener", {
event: "notification",
channelId: channel.id,
})
);
return invoke("plugin:notification|register_listener", {
event: "notification",
handler,
}).then(() => handler);
} }
// TODO: use addPluginListener API on @tauri-apps/api/tauri 2.0.0-alpha.4 // TODO: use addPluginListener API on @tauri-apps/api/tauri 2.0.0-alpha.4
async function onAction(cb: (notification: Options) => void): Promise<EventChannel> { async function onAction(
const channelId = transformCallback(cb) cb: (notification: Options) => void
const handler = new EventChannel(channelId, (channel) => invoke('plugin:notification|remove_listener', { event: 'actionPerformed', channelId: channel.id })) ): Promise<EventChannel> {
return invoke('plugin:notification|register_listener', { event: 'actionPerformed', handler }).then(() => handler) const channelId = transformCallback(cb);
const handler = new EventChannel(channelId, (channel) =>
invoke("plugin:notification|remove_listener", {
event: "actionPerformed",
channelId: channel.id,
})
);
return invoke("plugin:notification|register_listener", {
event: "actionPerformed",
handler,
}).then(() => handler);
} }
export type {
export type { Attachment, Options, Permission, Action, ActionType, PendingNotification, ActiveNotification, Channel } Attachment,
Options,
Permission,
Action,
ActionType,
PendingNotification,
ActiveNotification,
Channel,
};
export { export {
Importance, Importance,
@ -599,7 +633,6 @@ export {
createChannel, createChannel,
removeChannel, removeChannel,
channels, channels,
onNotificationReceived, onNotificationReceived,
onAction onAction,
} };

Loading…
Cancel
Save