import {z} from 'zod' export type DepartmentPageSelection = Record; export type ViewType = 0 | 1; export type GetApiV1ChatRoomsArgs = {Id?: number | undefined, DepartmentId?: number | undefined, ChatId?: number | undefined, Content?: string | undefined, ChatTags?: Array | undefined, AssignedTo?: number | undefined, Channel?: string | undefined, ClosedActorType?: number | undefined, ClosedBy?: string | undefined, FromClosingTime?: string | undefined, ToClosingTime?: string | undefined, ContactId?: number | undefined, CompanyId?: number | undefined, IsResolved?: number | undefined, Status?: string | undefined, Url?: string | undefined, CountryCode?: string | undefined, City?: string | undefined, Referrer?: string | undefined, IpAddress?: string | undefined, UtmSource?: string | undefined, UtmMedium?: string | undefined, UtmCampaign?: string | undefined, UtmContent?: string | undefined, UtmTerm?: string | undefined, FromLogTime?: string | undefined, ToLogTime?: string | undefined, FromNextSlaBreach?: string | undefined, ToNextSlaBreach?: string | undefined, SlaId?: number | undefined, Q?: string | undefined, Fields?: string | undefined, IncludeTranscript?: boolean | undefined, MinCsatRate?: number | undefined, MaxCsatRate?: number | undefined, ContactPhone?: string | undefined, UnlinkedToTicket?: boolean | undefined, IncludeFeedback?: boolean | undefined, DepartmentScope?: DepartmentPageSelection | undefined, ItemsPerPage?: number | undefined, ViewType?: ViewType | undefined, Page?: number | undefined, ReturnTotalItems?: boolean | undefined, sortCol?: string | undefined, sortDir?: string | undefined, isExport?: boolean | undefined}; export type GetApiV1ChatRoomsOptions = {baseUrl: string, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const channelType = z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5), z.literal(8), z.literal(10), z.literal(11), z.literal(13), z.literal(14), z.literal(15), z.literal(16)]); export const slaStats = z.object({id: z.number().int().optional(), departmentId: z.number().int().optional(), slaId: z.number().int().optional(), linkedType: z.number().int().optional(), linkedId: z.number().int().optional(), dueBy: z.string().nullable().optional(), resolveTime: z.string().nullable().optional(), dueEscalated: z.boolean().optional(), frDueBy: z.string().nullable().optional(), frTime: z.string().nullable().optional(), frEscalated: z.boolean().optional(), nrDueBy: z.string().nullable().optional(), nrTime: z.string().nullable().optional(), nrEscalated: z.boolean().optional(), accountId: z.number().int().optional()}); export const chatRoom = z.object({id: z.number().int().optional(), userRatingId: z.number().int().nullable().optional(), userRatingScore: z.number().nullable().optional(), accountId: z.number().int().optional(), departmentId: z.number().int().optional(), companyName: z.string().nullable().optional(), departmentName: z.string().nullable().optional(), widgetLanguage: z.string().nullable().optional(), chatId: z.number().int().optional(), roomId: z.number().int().optional(), rootId: z.number().int().optional(), channel: channelType.optional(), channelId: z.number().int().nullable().optional(), channelName: z.string().nullable().optional(), visitor: z.string().nullable().optional(), visitorName: z.string().nullable().optional(), visitorPhoto: z.string().nullable().optional(), assignedTo: z.number().int().optional(), assignedToGroup: z.number().int().optional(), assignedAgentType: z.string().nullable().optional(), chatBotId: z.number().int().optional(), contactId: z.number().int().optional(), companyId: z.number().int().nullable().optional(), status: z.string().nullable().optional(), isResolved: z.number().int().optional(), closingTime: z.string().nullable().optional(), lastMessage: z.string().nullable().optional(), logTime: z.string().optional(), lastMessageTime: z.string().optional(), lastMessageIsAgent: z.number().int().optional(), chatTagIds: z.string().nullable().optional(), mentionedUserIds: z.string().nullable().optional(), firstAssignTimeSec: z.number().int().nullable().optional(), pageUrl: z.string().nullable().optional(), fullUrl: z.string().nullable().optional(), referrer: z.string().nullable().optional(), ipAddress: z.string().nullable().optional(), city: z.string().nullable().optional(), countryCode: z.string().nullable().optional(), clientOs: z.string().nullable().optional(), closedActorType: z.number().int().nullable().optional(), browserType: z.string().nullable().optional(), browserVer: z.string().nullable().optional(), browserLang: z.string().nullable().optional(), timezoneOffset: z.number().optional(), latitude: z.number().optional(), longitude: z.number().optional(), utm: z.string().nullable().optional(), feedBackRate: z.number().nullable().optional(), feedBackContent: z.string().nullable().optional(), ticketId: z.number().int().optional(), dealId: z.number().int().optional(), slaId: z.number().int().nullable().optional(), widgetId: z.number().int().nullable().optional(), nextSlaBreach: z.string().nullable().optional(), slaStats: slaStats.optional(), translatedBy: z.string().nullable().optional(), sessionStartTime: z.string().nullable().optional(), sessionCloseTime: z.string().nullable().optional(), botTransferTime: z.string().nullable().optional(), frTimeSec: z.number().int().nullable().optional(), firstResponseTime: z.string().nullable().optional(), resolveTimeSec: z.number().int().nullable().optional(), frTimeBusinessSec: z.number().int().nullable().optional(), resolveTimeBusinessSec: z.number().int().nullable().optional(), resolvedInFirstContact: z.number().int().nullable().optional()}); export const chatRoomQueryResult = z.object({totalItems: z.number().int().optional(), items: z.array(chatRoom).nullable().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * List all chat rooms * * GET /v1/chat/rooms * * Also accepts auth: API Key */ export const getApiV1ChatRooms = async (args: GetApiV1ChatRoomsArgs, options: GetApiV1ChatRoomsOptions) => { const {baseUrl, fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.Id != null) query.append("Id", String(args.Id)) if (args.DepartmentId != null) query.append("DepartmentId", String(args.DepartmentId)) if (args.ChatId != null) query.append("ChatId", String(args.ChatId)) if (args.Content != null) query.append("Content", String(args.Content)) for (const item of args.ChatTags ?? []) query.append("ChatTags", String(item)) if (args.AssignedTo != null) query.append("AssignedTo", String(args.AssignedTo)) if (args.Channel != null) query.append("Channel", String(args.Channel)) if (args.ClosedActorType != null) query.append("ClosedActorType", String(args.ClosedActorType)) if (args.ClosedBy != null) query.append("ClosedBy", String(args.ClosedBy)) if (args.FromClosingTime != null) query.append("FromClosingTime", String(args.FromClosingTime)) if (args.ToClosingTime != null) query.append("ToClosingTime", String(args.ToClosingTime)) if (args.ContactId != null) query.append("ContactId", String(args.ContactId)) if (args.CompanyId != null) query.append("CompanyId", String(args.CompanyId)) if (args.IsResolved != null) query.append("IsResolved", String(args.IsResolved)) if (args.Status != null) query.append("Status", String(args.Status)) if (args.Url != null) query.append("Url", String(args.Url)) if (args.CountryCode != null) query.append("CountryCode", String(args.CountryCode)) if (args.City != null) query.append("City", String(args.City)) if (args.Referrer != null) query.append("Referrer", String(args.Referrer)) if (args.IpAddress != null) query.append("IpAddress", String(args.IpAddress)) if (args.UtmSource != null) query.append("UtmSource", String(args.UtmSource)) if (args.UtmMedium != null) query.append("UtmMedium", String(args.UtmMedium)) if (args.UtmCampaign != null) query.append("UtmCampaign", String(args.UtmCampaign)) if (args.UtmContent != null) query.append("UtmContent", String(args.UtmContent)) if (args.UtmTerm != null) query.append("UtmTerm", String(args.UtmTerm)) if (args.FromLogTime != null) query.append("FromLogTime", String(args.FromLogTime)) if (args.ToLogTime != null) query.append("ToLogTime", String(args.ToLogTime)) if (args.FromNextSlaBreach != null) query.append("FromNextSlaBreach", String(args.FromNextSlaBreach)) if (args.ToNextSlaBreach != null) query.append("ToNextSlaBreach", String(args.ToNextSlaBreach)) if (args.SlaId != null) query.append("SlaId", String(args.SlaId)) if (args.Q != null) query.append("Q", String(args.Q)) if (args.Fields != null) query.append("Fields", String(args.Fields)) if (args.IncludeTranscript != null) query.append("IncludeTranscript", String(args.IncludeTranscript)) if (args.MinCsatRate != null) query.append("MinCsatRate", String(args.MinCsatRate)) if (args.MaxCsatRate != null) query.append("MaxCsatRate", String(args.MaxCsatRate)) if (args.ContactPhone != null) query.append("ContactPhone", String(args.ContactPhone)) if (args.UnlinkedToTicket != null) query.append("UnlinkedToTicket", String(args.UnlinkedToTicket)) if (args.IncludeFeedback != null) query.append("IncludeFeedback", String(args.IncludeFeedback)) if (args.DepartmentScope != null) query.append("DepartmentScope", JSON.stringify(args.DepartmentScope)) if (args.ItemsPerPage != null) query.append("ItemsPerPage", String(args.ItemsPerPage)) if (args.ViewType != null) query.append("ViewType", String(args.ViewType)) if (args.Page != null) query.append("Page", String(args.Page)) if (args.ReturnTotalItems != null) query.append("ReturnTotalItems", String(args.ReturnTotalItems)) if (args.sortCol != null) query.append("sortCol", String(args.sortCol)) if (args.sortDir != null) query.append("sortDir", String(args.sortDir)) if (args.isExport != null) query.append("isExport", String(args.isExport)) if (Bearer !== undefined) headers.set('authorization', `Bearer ${Bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/chat/rooms${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(chatRoomQueryResult, await res.json()) };