48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import { apiRequest } from '@/lib/api'
|
|
|
|
import type { Ticket, TicketComment, TicketInput, TicketListParams, TicketListResponse, TicketStatus } from './types'
|
|
|
|
export function listTickets(params: TicketListParams = {}) {
|
|
const query = new URLSearchParams()
|
|
Object.entries(params).forEach(([key, value]) => {
|
|
if (value !== undefined && value !== null && value !== '') {
|
|
query.set(key, String(value))
|
|
}
|
|
})
|
|
const suffix = query.toString() ? `?${query}` : ''
|
|
return apiRequest<TicketListResponse>(`/tickets${suffix}`)
|
|
}
|
|
|
|
export function createTicket(payload: TicketInput) {
|
|
return apiRequest<Ticket>('/tickets', {
|
|
method: 'POST',
|
|
body: JSON.stringify(payload)
|
|
})
|
|
}
|
|
|
|
export function getTicket(ticketId: number) {
|
|
return apiRequest<Ticket>(`/tickets/${ticketId}`)
|
|
}
|
|
|
|
export function transitionTicket(ticketId: number, status: TicketStatus, remark = '') {
|
|
return apiRequest<Ticket>(`/tickets/${ticketId}/status`, {
|
|
method: 'POST',
|
|
body: JSON.stringify({ status, remark })
|
|
})
|
|
}
|
|
|
|
export function addTicketComment(
|
|
ticketId: number,
|
|
content: string,
|
|
options: { comment_type?: string; visibility?: string } = {}
|
|
) {
|
|
return apiRequest<TicketComment>(`/tickets/${ticketId}/comments`, {
|
|
method: 'POST',
|
|
body: JSON.stringify({
|
|
content,
|
|
comment_type: options.comment_type ?? 'internal_note',
|
|
visibility: options.visibility ?? 'internal'
|
|
})
|
|
})
|
|
}
|