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 { try { await emit(MAIN_TICKET_EVENT, payload); } catch (error) { throw new Error(`发送票号事件失败: ${String(error)}`); } } /** * 订阅来自票号列表页的动作事件。 */ export async function listenTicketAction( handler: (event: Event) => void, ): Promise<() => void> { try { return await listen(MAIN_TICKET_EVENT, handler); } catch (error) { throw new Error(`订阅票号事件失败: ${String(error)}`); } } /** * 向主叫号页发送呼叫动作。 */ export async function emitCallAction(payload: Omit): Promise { try { await emit(TICKET_MAIN_EVENT, { action: "call", ...payload }); } catch (error) { throw new Error(`发送主窗口事件失败: ${String(error)}`); } } /** * 向主叫号页发送评价动作。 */ export async function emitEvaluateAction( payload: Omit, ): Promise { 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) => void, ): Promise<() => void> { try { return await listen(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 { 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 { 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(TRANSFER_MAIN_EVENT, (event) => { handler(event.payload); }); } catch (error) { throw new Error(`订阅转移结果事件失败: ${String(error)}`); } } /** * 向办税员窗口广播当前呼叫票号上下文。 */ export async function emitTaxerTicketContext(payload: TaxerTicketContextPayload): Promise { 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(TAXER_TICKET_CONTEXT_EVENT, (event) => { handler(event.payload ?? {}); }); } catch (error) { throw new Error(`订阅办税员票号上下文失败: ${String(error)}`); } } /** 主窗口开始办理成功后通知办税员页加载纳税人 URL */ export async function emitTaxerTicketStart( payload: TaxerTicketContextPayload, ): Promise { 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(TAXER_TICKET_START_EVENT, (event) => { handler(event.payload ?? {}); }); } catch (error) { throw new Error(`订阅办税员开始办理事件失败: ${String(error)}`); } } /** 办结/弃号等场景清空纳税人内嵌页 */ export async function emitTaxerNsrClear(): Promise { 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)}`); } }