You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

191 lines
5.6 KiB
TypeScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { emit, listen, type Event } from "@tauri-apps/api/event";
import type {
TaxerTicketContextPayload,
TicketActionPayload,
TransferDonePayload,
} from "./types";
const MAIN_TICKET_EVENT = "main:ticket-action";
const TICKET_MAIN_EVENT = "ticket:main-action";
const TRANSFER_MAIN_EVENT = "transfer:main-action";
const TRANSFER_OPEN_EVENT = "transfer:open-context";
const TAXER_TICKET_CONTEXT_EVENT = "taxer:ticket-context";
const TAXER_NSR_CLEAR_EVENT = "taxer:nsr-clear";
const TAXER_TICKET_START_EVENT = "taxer:ticket-start";
/**
* 向主叫号页发送票号动作事件。
*/
export async function emitTicketAction(payload: TicketActionPayload): Promise<void> {
try {
await emit(MAIN_TICKET_EVENT, payload);
} catch (error) {
throw new Error(`发送票号事件失败: ${String(error)}`);
}
}
/**
* 订阅来自票号列表页的动作事件。
*/
export async function listenTicketAction(
handler: (event: Event<TicketActionPayload>) => void,
): Promise<() => void> {
try {
return await listen<TicketActionPayload>(MAIN_TICKET_EVENT, handler);
} catch (error) {
throw new Error(`订阅票号事件失败: ${String(error)}`);
}
}
/**
* 向主叫号页发送呼叫动作。
*/
export async function emitCallAction(payload: Omit<TicketActionPayload, "action">): Promise<void> {
try {
await emit(TICKET_MAIN_EVENT, { action: "call", ...payload });
} catch (error) {
throw new Error(`发送主窗口事件失败: ${String(error)}`);
}
}
/**
* 向主叫号页发送评价动作。
*/
export async function emitEvaluateAction(
payload: Omit<TicketActionPayload, "action">,
): Promise<void> {
try {
await emit(TICKET_MAIN_EVENT, { action: "evaluate", ...payload });
} catch (error) {
throw new Error(`发送主窗口事件失败: ${String(error)}`);
}
}
/**
* 订阅来自票号列表页的主叫号动作。
*/
export async function listenMainAction(
handler: (action: "call" | "evaluate", payload?: Omit<TicketActionPayload, "action">) => void,
): Promise<() => void> {
try {
return await listen<TicketActionPayload>(TICKET_MAIN_EVENT, (event) => {
handler(event.payload.action, {
ticketUid: event.payload.ticketUid,
tktNum: event.payload.tktNum,
});
});
} catch (error) {
throw new Error(`订阅主窗口事件失败: ${String(error)}`);
}
}
/** 主窗口打开转移子窗口时广播当前票 UID子窗口每次显示时重新拉取 */
export async function emitTransferOpen(payload: { ticketUid: number }): Promise<void> {
try {
await emit(TRANSFER_OPEN_EVENT, payload);
} catch (error) {
throw new Error(`发送转移打开事件失败: ${String(error)}`);
}
}
export async function listenTransferOpen(
handler: (payload: { ticketUid: number }) => void,
): Promise<() => void> {
try {
return await listen<{ ticketUid: number }>(TRANSFER_OPEN_EVENT, (event) => {
handler(event.payload);
});
} catch (error) {
throw new Error(`订阅转移打开事件失败: ${String(error)}`);
}
}
/** 转移子窗口通知主窗口转移结果 */
export async function emitTransferDone(payload: TransferDonePayload): Promise<void> {
try {
await emit(TRANSFER_MAIN_EVENT, payload);
} catch (error) {
throw new Error(`发送转移结果事件失败: ${String(error)}`);
}
}
export async function listenTransferDone(
handler: (payload: TransferDonePayload) => void,
): Promise<() => void> {
try {
return await listen<TransferDonePayload>(TRANSFER_MAIN_EVENT, (event) => {
handler(event.payload);
});
} catch (error) {
throw new Error(`订阅转移结果事件失败: ${String(error)}`);
}
}
/**
* 向办税员窗口广播当前呼叫票号上下文。
*/
export async function emitTaxerTicketContext(payload: TaxerTicketContextPayload): Promise<void> {
try {
await emit(TAXER_TICKET_CONTEXT_EVENT, payload);
} catch (error) {
throw new Error(`发送办税员票号上下文失败: ${String(error)}`);
}
}
/**
* 订阅呼叫票号上下文更新。
*/
export async function listenTaxerTicketContext(
handler: (payload: TaxerTicketContextPayload) => void,
): Promise<() => void> {
try {
return await listen<TaxerTicketContextPayload>(TAXER_TICKET_CONTEXT_EVENT, (event) => {
handler(event.payload ?? {});
});
} catch (error) {
throw new Error(`订阅办税员票号上下文失败: ${String(error)}`);
}
}
/** 主窗口开始办理成功后通知办税员页加载纳税人 URL */
export async function emitTaxerTicketStart(
payload: TaxerTicketContextPayload,
): Promise<void> {
try {
await emit(TAXER_TICKET_START_EVENT, payload);
} catch (error) {
throw new Error(`发送办税员开始办理事件失败: ${String(error)}`);
}
}
export async function listenTaxerTicketStart(
handler: (payload: TaxerTicketContextPayload) => void,
): Promise<() => void> {
try {
return await listen<TaxerTicketContextPayload>(TAXER_TICKET_START_EVENT, (event) => {
handler(event.payload ?? {});
});
} catch (error) {
throw new Error(`订阅办税员开始办理事件失败: ${String(error)}`);
}
}
/** 办结/弃号等场景清空纳税人内嵌页 */
export async function emitTaxerNsrClear(): Promise<void> {
try {
await emit(TAXER_NSR_CLEAR_EVENT, {});
} catch (error) {
throw new Error(`发送办税员清空纳税人页事件失败: ${String(error)}`);
}
}
export async function listenTaxerNsrClear(handler: () => void): Promise<() => void> {
try {
return await listen(TAXER_NSR_CLEAR_EVENT, () => {
handler();
});
} catch (error) {
throw new Error(`订阅办税员清空纳税人页事件失败: ${String(error)}`);
}
}