import { createFetchWrapper } from '@KTXC' import type { ApiRequest, ApiResponse } from '@MailManager/types/common' import type { CompositionAttachmentAddRequest, CompositionAttachmentAddResponse, CompositionAttachmentRemoveRequest, CompositionAttachmentRemoveResponse, CompositionDiscardRequest, CompositionDiscardResponse, CompositionPatchRequest, CompositionPatchResponse, CompositionSendRequest, CompositionSendResponse, CompositionStageRequest, CompositionStageResponse, } from '@/types/composition' const fetchWrapper = createFetchWrapper() const API_URL = '/m/mail/compose/v1' const API_VERSION = 1 function generateTransactionId(): string { return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}` } async function post(operation: string, data: TRequest): Promise { const request: ApiRequest = { version: API_VERSION, transaction: generateTransactionId(), operation, data, } const response: ApiResponse = await fetchWrapper.post(API_URL, request) if (response.status === 'error') { const errorMessage = `[${operation}] ${response.data.message}${response.data.code ? ` (code: ${response.data.code})` : ''}` throw new Error(errorMessage) } return response.data } const compositionService = { async stage(request: CompositionStageRequest): Promise { return await post('stage', request) }, async patch(request: CompositionPatchRequest): Promise { return await post('patch', request) }, async discard(request: CompositionDiscardRequest): Promise { return await post('discard', request) }, async send(request: CompositionSendRequest): Promise { return await post('send', request) }, async attachmentAdd(request: CompositionAttachmentAddRequest): Promise { return await post('attachment.add', request) }, async attachmentRemove(request: CompositionAttachmentRemoveRequest): Promise { return await post('attachment.remove', request) } } export default compositionService