import {z} from 'zod' export type GetApiV1ChatWidgetArgs = {apiKey?: string | undefined, url?: string | undefined, iosKey?: string | undefined, androidKey?: string | undefined, visitorId?: string | undefined, email?: string | undefined, phone?: string | undefined, userHash?: string | undefined}; export type GetApiV1ChatWidgetOptions = {baseUrl: string, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const chatHomepageWidget = z.object({component: z.string().nullable().optional(), props: z.string().nullable().optional()}); export const chatHomePage = z.object({id: z.number().int().optional(), enabled: z.boolean().optional(), logo: z.string().nullable().optional(), title: z.string().nullable().optional(), subtitle: z.string().nullable().optional(), chatStarterTitle: z.string().nullable().optional(), chatStarterSubtitle: z.string().nullable().optional(), desk: z.string().nullable().optional(), widgets: z.array(chatHomepageWidget).nullable().optional()}); export const chatDesk = z.object({_id: z.string().nullable().optional(), domain: z.string().nullable().optional(), slug: z.string().nullable().optional()}); export const table = z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(5), z.literal(6), z.literal(7), z.literal(10), z.literal(11), z.literal(12), z.literal(13), z.literal(14), z.literal(15), z.literal(16), z.literal(19), z.literal(20), z.literal(21), z.literal(22), z.literal(23), z.literal(25), z.literal(26), z.literal(27), z.literal(31), z.literal(32), z.literal(34), z.literal(35), z.literal(36), z.literal(37), z.literal(38), z.literal(39), z.literal(40), z.literal(41), z.literal(42), z.literal(43), z.literal(44), z.literal(45), z.literal(46), z.literal(47), z.literal(48), z.literal(50), z.literal(51), z.literal(52), z.literal(53), z.literal(55), z.literal(60), z.literal(61), z.literal(62), z.literal(63), z.literal(64), z.literal(65), z.literal(66), z.literal(67), z.literal(68), z.literal(69), z.literal(72)]); export const surveyType = z.union([z.literal(1), z.literal(2), z.literal(3)]); export const surveyInputType = z.union([z.literal(1), z.literal(2)]); export const surveyLink = z.object({id: z.number().int().optional(), linkedId: z.number().int().optional(), linkedTable: table.optional()}); export const survey = z.object({id: z.number().int().optional(), accountId: z.number().int().optional(), departmentId: z.number().int().optional(), name: z.string().max(100).nullable().optional(), message: z.string().max(10000).nullable().optional(), linkedId: z.number().int().optional(), linkedTable: table.optional(), type: surveyType.optional(), inputType: surveyInputType.optional(), options: z.string().max(10000).nullable().optional(), sipServerId: z.number().int().optional(), createdDate: z.string().optional(), links: z.array(surveyLink).nullable().optional()}); export const chatWidgetModelPublic = z.object({privateKey: z.string().nullable().optional(), apiKey: z.string().nullable().optional(), iosKey: z.string().nullable().optional(), androidKey: z.string().nullable().optional(), id: z.number().int().optional(), accountId: z.number().int().optional(), departmentId: z.number().int().optional(), name: z.string().min(1).max(32), domain: z.string().min(1).max(120), workingHourType: z.number().int().optional(), offlineMsg: z.string().max(1000).nullable().optional(), onlineMsg: z.string().max(1000).nullable().optional(), chatTitle: z.string().max(60).nullable().optional(), chatSubtitle: z.string().max(120).nullable().optional(), chatTitleOffline: z.string().max(60).nullable().optional(), chatSubtitleOffline: z.string().max(120).nullable().optional(), botLogo: z.string().max(1000).nullable().optional(), language: z.string().max(3).nullable().optional(), status: z.boolean().optional(), contactInfo: z.string().nullable().optional(), messages: z.string().nullable().optional(), showEmojiButton: z.boolean().optional(), allowVisitorCloseChat: z.boolean().optional(), showAttachmentButton: z.boolean().optional(), showChatHistory: z.boolean().optional(), otpEnabled: z.boolean().optional(), otpEmailRawHtml: z.boolean().optional(), mailId: z.number().int().optional(), removeBranding: z.boolean().optional(), identityVerification: z.boolean().optional(), primaryColor: z.string().nullable().optional(), contactInfoEnabled: z.boolean().optional(), integrations: z.string().nullable().optional(), chatHomePage: chatHomePage.optional(), desk: chatDesk.optional(), survey: survey.optional()}); export const outboundMessageType = z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5), z.literal(6), z.literal(7), z.literal(8), z.literal(9), z.literal(10)]); export const outboundMessageSendType = z.union([z.literal(1), z.literal(2)]); export const outboundMessageData = z.object({id: z.number().int().optional(), departmentId: z.number().int().optional(), type: outboundMessageType, name: z.string().min(1).max(128), message: z.string().nullable().optional(), runCount: z.number().int().optional(), workingHourType: z.number().int().optional(), sendType: outboundMessageSendType.optional(), status: z.number().int().optional(), settings: z.unknown(), startTime: z.string().nullable().optional(), endTime: z.string().nullable().optional(), createdAt: z.string().nullable().optional(), updatedAt: z.string().nullable().optional(), lastRunAt: z.string().nullable().optional()}); export const outboundMessageFilterType = z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5), z.literal(6), z.literal(7), z.literal(8), z.literal(9)]); export const outboundMessageFilter = z.object({id: z.number().int().optional(), messageId: z.number().int().optional(), filterType: outboundMessageFilterType.optional(), filterColumn: z.string().nullable().optional(), filterValue: z.string().nullable().optional(), filterOperation: z.string().nullable().optional(), filterPrefix: z.string().nullable().optional()}); export const outboundMessage = z.object({data: outboundMessageData, filters: z.array(outboundMessageFilter)}); export const publicChatbotModel = z.object({id: z.number().int().optional(), name: z.string().nullable().optional(), avatar: z.string().nullable().optional(), firstMessage: z.string().nullable().optional(), publishedVersionId: z.number().int().optional(), workingHourType: z.number().int().optional(), departmentId: z.number().int().optional()}); export const publicChatCustomFieldModel = z.object({id: z.number().int().optional(), fieldName: z.string().nullable().optional(), fieldType: z.string().nullable().optional(), fieldOptions: z.string().nullable().optional()}); export const chatVisitorDataItem = z.object({id: z.string().nullable().optional(), firstName: z.string().nullable().optional(), lastName: z.string().nullable().optional(), email: z.string().nullable().optional(), phone: z.string().nullable().optional(), photoUrl: z.string().nullable().optional(), userHash: z.string().nullable().optional(), createdAt: z.string().nullable().optional(), customFields: z.string().nullable().optional(), company: z.string().nullable().optional(), roomTokens: z.string().nullable().optional()}); export const resultCode = z.union([z.literal(0), z.literal(-3314), z.literal(-3313), z.literal(-3312), z.literal(-3311), z.literal(-3282), z.literal(-3281), z.literal(-3280), z.literal(-3279), z.literal(-3278), z.literal(-3277), z.literal(-3276), z.literal(-3275), z.literal(-3274), z.literal(-3273), z.literal(-3272), z.literal(-3271), z.literal(-3270), z.literal(-3269), z.literal(-3268), z.literal(-3267), z.literal(-3266), z.literal(-3265), z.literal(-3264), z.literal(-3263), z.literal(-3262), z.literal(-3261), z.literal(-3260), z.literal(-3259), z.literal(-3258), z.literal(-3257), z.literal(-3256), z.literal(-3255), z.literal(-3254), z.literal(-3253), z.literal(-3252), z.literal(-3251), z.literal(-3250), z.literal(-3249), z.literal(-3248), z.literal(-3247), z.literal(-3246), z.literal(-3245), z.literal(-3244), z.literal(-3243), z.literal(-3242), z.literal(-3241), z.literal(-3240), z.literal(-3239), z.literal(-3238), z.literal(-3237), z.literal(-3236), z.literal(-3235), z.literal(-3234), z.literal(-3233), z.literal(-3232), z.literal(-3231), z.literal(-3230), z.literal(-3229), z.literal(-3228), z.literal(-3227), z.literal(-3226), z.literal(-3225), z.literal(-3224), z.literal(-3223), z.literal(-3222), z.literal(-3221), z.literal(-3220), z.literal(-3219), z.literal(-3218), z.literal(-3217), z.literal(-3216), z.literal(-3215), z.literal(-3214), z.literal(-3213), z.literal(-3212), z.literal(-3211), z.literal(-3210), z.literal(-3202), z.literal(-3201), z.literal(-3200), z.literal(-3121), z.literal(-3120), z.literal(-3119), z.literal(-3118), z.literal(-3117), z.literal(-3116), z.literal(-3115), z.literal(-3114), z.literal(-3113), z.literal(-3112), z.literal(-3111), z.literal(-3110), z.literal(-3109), z.literal(-3108), z.literal(-3107), z.literal(-3106), z.literal(-3105), z.literal(-3104), z.literal(-3103), z.literal(-3102), z.literal(-3101), z.literal(-3012), z.literal(-3011), z.literal(-3010), z.literal(-3009), z.literal(-3008), z.literal(-3007), z.literal(-3006), z.literal(-3005), z.literal(-3004), z.literal(-3003), z.literal(-3001), z.literal(-3000), z.literal(-2954), z.literal(-2953), z.literal(-2952), z.literal(-2951), z.literal(-2950), z.literal(-2912), z.literal(-2911), z.literal(-2910), z.literal(-2909), z.literal(-2908), z.literal(-2907), z.literal(-2905), z.literal(-2904), z.literal(-2903), z.literal(-2902), z.literal(-2901), z.literal(-2900), z.literal(-2849), z.literal(-2848), z.literal(-2847), z.literal(-2846), z.literal(-2845), z.literal(-2844), z.literal(-2843), z.literal(-2842), z.literal(-2841), z.literal(-2840), z.literal(-2839), z.literal(-2838), z.literal(-2837), z.literal(-2836), z.literal(-2835), z.literal(-2834), z.literal(-2833), z.literal(-2832), z.literal(-2831), z.literal(-2830), z.literal(-2829), z.literal(-2828), z.literal(-2827), z.literal(-2826), z.literal(-2825), z.literal(-2824), z.literal(-2823), z.literal(-2822), z.literal(-2821), z.literal(-2820), z.literal(-2819), z.literal(-2818), z.literal(-2817), z.literal(-2816), z.literal(-2815), z.literal(-2814), z.literal(-2813), z.literal(-2812), z.literal(-2811), z.literal(-2810), z.literal(-2802), z.literal(-2801), z.literal(-2800), z.literal(-2702), z.literal(-2701), z.literal(-2700), z.literal(-2699), z.literal(-2698), z.literal(-2697), z.literal(-2696), z.literal(-2695), z.literal(-2694), z.literal(-2693), z.literal(-2692), z.literal(-2691), z.literal(-2690), z.literal(-2681), z.literal(-2680), z.literal(-2670), z.literal(-2660), z.literal(-2650), z.literal(-2640), z.literal(-2630), z.literal(-2620), z.literal(-2611), z.literal(-2610), z.literal(-2602), z.literal(-2601), z.literal(-2600), z.literal(-2500), z.literal(-2400), z.literal(-2300), z.literal(-2201), z.literal(-2200), z.literal(-2100), z.literal(-2002), z.literal(-2001), z.literal(-2000), z.literal(-1951), z.literal(-1950), z.literal(-1930), z.literal(-1926), z.literal(-1925), z.literal(-1924), z.literal(-1923), z.literal(-1922), z.literal(-1921), z.literal(-1920), z.literal(-1919), z.literal(-1918), z.literal(-1917), z.literal(-1916), z.literal(-1915), z.literal(-1914), z.literal(-1913), z.literal(-1912), z.literal(-1911), z.literal(-1910), z.literal(-1909), z.literal(-1908), z.literal(-1907), z.literal(-1906), z.literal(-1905), z.literal(-1904), z.literal(-1903), z.literal(-1902), z.literal(-1901), z.literal(-1900), z.literal(-1803), z.literal(-1802), z.literal(-1801), z.literal(-1203), z.literal(-1202), z.literal(-1201), z.literal(-1200), z.literal(-905), z.literal(-822), z.literal(-821), z.literal(-820), z.literal(-819), z.literal(-818), z.literal(-817), z.literal(-816), z.literal(-815), z.literal(-814), z.literal(-813), z.literal(-812), z.literal(-811), z.literal(-421), z.literal(-417), z.literal(-416), z.literal(-415), z.literal(-413), z.literal(-412), z.literal(-411), z.literal(-409), z.literal(-408), z.literal(-406), z.literal(-405), z.literal(-404), z.literal(-403), z.literal(-402), z.literal(-401), z.literal(-400), z.literal(-341), z.literal(-340), z.literal(-339), z.literal(-338), z.literal(-337), z.literal(-336), z.literal(-335), z.literal(-334), z.literal(-333), z.literal(-332), z.literal(-331), z.literal(-329), z.literal(-328), z.literal(-327), z.literal(-325), z.literal(-324), z.literal(-323), z.literal(-322), z.literal(-321), z.literal(-320), z.literal(-319), z.literal(-318), z.literal(-317), z.literal(-316), z.literal(-315), z.literal(-314), z.literal(-313), z.literal(-312), z.literal(-311), z.literal(-309), z.literal(-308), z.literal(-302), z.literal(-301), z.literal(-214), z.literal(-213), z.literal(-212), z.literal(-209), z.literal(-202), z.literal(-195), z.literal(-194), z.literal(-151), z.literal(-97), z.literal(-96), z.literal(-95), z.literal(-91), z.literal(-90), z.literal(-89), z.literal(-88), z.literal(-87), z.literal(-86), z.literal(-83), z.literal(-82), z.literal(-81), z.literal(-80), z.literal(-64), z.literal(-63), z.literal(-60), z.literal(-23), z.literal(-22), z.literal(-21), z.literal(-13), z.literal(-12), z.literal(-9), z.literal(-8), z.literal(-7), z.literal(-4), z.literal(-1)]); export const chatModeModel = z.object({status: z.number().int().optional(), settings: chatWidgetModelPublic.optional(), triggers: z.array(outboundMessage).nullable().optional(), chatbots: z.array(publicChatbotModel).nullable().optional(), customFields: z.array(publicChatCustomFieldModel).nullable().optional(), visitor: chatVisitorDataItem.optional(), statusCode: resultCode.optional(), allowedExtensions: z.string().nullable().optional()}); export const chatModeResponse = z.object({statusCode: z.number().int().nullable().optional(), success: z.boolean().optional(), message: z.string().nullable().optional(), resource: chatModeModel.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 }; /** * Get the current chat widget information (status, settings, etc.) * * GET /v1/chat/widget * * Also accepts auth: API Key */ export const getApiV1ChatWidget = async (args: GetApiV1ChatWidgetArgs, options: GetApiV1ChatWidgetOptions) => { const {baseUrl, fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.apiKey != null) query.append("apiKey", String(args.apiKey)) if (args.url != null) query.append("url", String(args.url)) if (args.iosKey != null) query.append("iosKey", String(args.iosKey)) if (args.androidKey != null) query.append("androidKey", String(args.androidKey)) if (args.visitorId != null) query.append("visitorId", String(args.visitorId)) if (args.email != null) query.append("email", String(args.email)) if (args.phone != null) query.append("phone", String(args.phone)) if (args.userHash != null) query.append("userHash", String(args.userHash)) if (Bearer !== undefined) headers.set('authorization', `Bearer ${Bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/chat/widget${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(chatModeResponse, await res.json()) };