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.

143 lines
4.2 KiB
TypeScript

import { emit, listen, type Event } from "@tauri-apps/api/event";
import type { TaxerTicketContextPayload, TicketActionPayload } from "./types";
const MAIN_TICKET_EVENT = "main:ticket-action";
const TICKET_MAIN_EVENT = "ticket:main-action";
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)}`);
}
}
/**
* 向办税员窗口广播当前呼叫票号上下文。
*/
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)}`);
}
}