import {z} from 'zod' export type DashboardSettingsKpiDTO = {visible?: boolean | undefined, enabled: Array<'clicks' | 'uniqueClicks' | 'installs' | 'leads' | 'firstSales' | 'repeatedSales' | 'totalEvents' | 'blockedEvents' | 'uniqueUsers' | 'repeatBuyers' | 'nonUniqueClicks' | 'whiteClicks' | 'blackClicks'>, order: Array<'clicks' | 'uniqueClicks' | 'installs' | 'leads' | 'firstSales' | 'repeatedSales' | 'totalEvents' | 'blockedEvents' | 'uniqueUsers' | 'repeatBuyers' | 'nonUniqueClicks' | 'whiteClicks' | 'blackClicks'>}; export type DashboardSettingsChartDTO = {visible?: boolean | undefined, metrics: Array<'clicks' | 'uniqueClicks' | 'installs' | 'leads' | 'firstSales' | 'repeatedSales' | 'totalEvents' | 'blockedEvents' | 'whiteClicks' | 'blackClicks'>}; export type DashboardSettingsBreakdownDTO = {visible?: boolean | undefined, enabled: Array<'unique-click-install' | 'unique-click-registration' | 'unique-click-deposit' | 'install-registration' | 'registration-deposit' | 'clicks-per-unique' | 'install-deposit' | 'click-deposit' | 'deposit-repeated' | 'block-rate' | 'clicks-per-user' | 'white-rate' | 'push-ctr' | 'push-delivery'>, order?: (Array<'unique-click-install' | 'unique-click-registration' | 'unique-click-deposit' | 'install-registration' | 'registration-deposit' | 'clicks-per-unique' | 'install-deposit' | 'click-deposit' | 'deposit-repeated' | 'block-rate' | 'clicks-per-user' | 'white-rate' | 'push-ctr' | 'push-delivery'>) | undefined}; export type DashboardSettingsRecentActivityDTO = {visible?: boolean | undefined, limit?: number | undefined, entityTypes: Array<'stream' | 'offer' | 'pwa' | 'landing' | 'domain' | 'pixel' | 'push'>}; export type DashboardSettingsResourcesDTO = {visible?: boolean | undefined, enabled: Array<'streams' | 'balance' | 'pwa' | 'landings' | 'domains' | 'pixels'>, order: Array<'streams' | 'balance' | 'pwa' | 'landings' | 'domains' | 'pixels'>}; export type DashboardSettingsPushSummaryDTO = {visible?: boolean | undefined, enabled?: (Array<'subscribers' | 'sent' | 'views' | 'clicks'>) | undefined, order?: (Array<'subscribers' | 'sent' | 'views' | 'clicks'>) | undefined}; export type DashboardSettingsRecommendationsDTO = {dismissed?: Array | undefined}; export type DashboardSettingsDTO = {defaultPeriod?: ('today' | 'last_24h' | 'last_7d' | 'this_week' | 'last_30d' | 'this_month' | 'last_90d' | 'this_year') | undefined, kpi: DashboardSettingsKpiDTO, chart: DashboardSettingsChartDTO, breakdown: DashboardSettingsBreakdownDTO, recentActivity: DashboardSettingsRecentActivityDTO, resources: DashboardSettingsResourcesDTO, pushSummary?: DashboardSettingsPushSummaryDTO | undefined, recommendations?: DashboardSettingsRecommendationsDTO | undefined}; export type UpdateApiApiV1DashboardSettingsArgs = {body: DashboardSettingsDTO}; export type UpdateApiApiV1DashboardSettingsOptions = {baseUrl: string, OAuth2PasswordBearer?: string | undefined, fetch?: typeof fetch | undefined}; export const dashboardSettingsKpiDTO = z.object({visible: z.boolean().optional(), enabled: z.array(z.enum(["clicks", "uniqueClicks", "installs", "leads", "firstSales", "repeatedSales", "totalEvents", "blockedEvents", "uniqueUsers", "repeatBuyers", "nonUniqueClicks", "whiteClicks", "blackClicks"])), order: z.array(z.enum(["clicks", "uniqueClicks", "installs", "leads", "firstSales", "repeatedSales", "totalEvents", "blockedEvents", "uniqueUsers", "repeatBuyers", "nonUniqueClicks", "whiteClicks", "blackClicks"]))}); export const dashboardSettingsChartDTO = z.object({visible: z.boolean().optional(), metrics: z.array(z.enum(["clicks", "uniqueClicks", "installs", "leads", "firstSales", "repeatedSales", "totalEvents", "blockedEvents", "whiteClicks", "blackClicks"]))}); export const dashboardSettingsBreakdownDTO = z.object({visible: z.boolean().optional(), enabled: z.array(z.enum(["unique-click-install", "unique-click-registration", "unique-click-deposit", "install-registration", "registration-deposit", "clicks-per-unique", "install-deposit", "click-deposit", "deposit-repeated", "block-rate", "clicks-per-user", "white-rate", "push-ctr", "push-delivery"])), order: z.array(z.enum(["unique-click-install", "unique-click-registration", "unique-click-deposit", "install-registration", "registration-deposit", "clicks-per-unique", "install-deposit", "click-deposit", "deposit-repeated", "block-rate", "clicks-per-user", "white-rate", "push-ctr", "push-delivery"])).optional()}); export const dashboardSettingsRecentActivityDTO = z.object({visible: z.boolean().optional(), limit: z.number().int().gte(1).lte(50).optional(), entityTypes: z.array(z.enum(["stream", "offer", "pwa", "landing", "domain", "pixel", "push"]))}); export const dashboardSettingsResourcesDTO = z.object({visible: z.boolean().optional(), enabled: z.array(z.enum(["streams", "balance", "pwa", "landings", "domains", "pixels"])), order: z.array(z.enum(["streams", "balance", "pwa", "landings", "domains", "pixels"]))}); export const dashboardSettingsPushSummaryDTO = z.object({visible: z.boolean().optional(), enabled: z.array(z.enum(["subscribers", "sent", "views", "clicks"])).optional(), order: z.array(z.enum(["subscribers", "sent", "views", "clicks"])).optional()}); export const dashboardSettingsRecommendationsDTO = z.object({dismissed: z.array(z.string()).optional()}); export const dashboardSettingsDTO = z.object({defaultPeriod: z.enum(["today", "last_24h", "last_7d", "this_week", "last_30d", "this_month", "last_90d", "this_year"]).optional(), kpi: dashboardSettingsKpiDTO, chart: dashboardSettingsChartDTO, breakdown: dashboardSettingsBreakdownDTO, recentActivity: dashboardSettingsRecentActivityDTO, resources: dashboardSettingsResourcesDTO, pushSummary: dashboardSettingsPushSummaryDTO.optional(), recommendations: dashboardSettingsRecommendationsDTO.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 }; /** * Replace dashboard settings * * PUT /api/v1/dashboard/settings */ export const updateApiApiV1DashboardSettings = async (args: UpdateApiApiV1DashboardSettingsArgs, options: UpdateApiApiV1DashboardSettingsOptions) => { const {baseUrl, fetch: fetchFn = fetch, OAuth2PasswordBearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (OAuth2PasswordBearer !== undefined) headers.set('authorization', `Bearer ${OAuth2PasswordBearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/dashboard/settings${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PUT", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(dashboardSettingsDTO, await res.json()) };