|
|
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)}`);
|
|
|
}
|
|
|
}
|