import type { AllChannelReceiverOptions, TransactionMethod, TransactionsHandlers, TransactionsMethods, } from "./channel" import { ChannelReceiver } from "./channel" import type { APITransactions, ClientTransactions } from "./types" import { APIRequestType, ClientRequestType } from "./types" export type SimulatorAPIOptions = { activeSliceAPI: boolean sliceZoneSizeAPI: boolean } export const simulatorAPIDefaultOptions: Partial & SimulatorAPIOptions = { requestIDPrefix: "api-", activeSliceAPI: false, sliceZoneSizeAPI: false, } export class SimulatorAPI extends ChannelReceiver implements TransactionsMethods { constructor( requestHandlers: Omit, ClientRequestType.Ping> & Partial, ClientRequestType.Ping>>, options?: Partial, ) { // True if `options.debug` is true or `debug=true` is among query parameters const debug = options?.debug || /[?&]debug=true/i.test(decodeURIComponent(window.location.search)) super( { [ClientRequestType.Ping]: (_req, res) => { return res.success("pong") }, ...requestHandlers, }, { ...simulatorAPIDefaultOptions, ...options, debug, }, ) // Append API to window object if (debug) { window.prismic ||= {} window.prismic.sliceSimulator ||= {} window.prismic.sliceSimulator.api ||= [] window.prismic.sliceSimulator.api.push(this) } } [APIRequestType.SetActiveSlice]: TransactionMethod< APITransactions[APIRequestType.SetActiveSlice] > = async (data) => { return await this.postFormattedRequest(APIRequestType.SetActiveSlice, data) }; [APIRequestType.SetSliceZoneSize]: TransactionMethod< APITransactions[APIRequestType.SetSliceZoneSize] > = async (data) => { return await this.postFormattedRequest(APIRequestType.SetSliceZoneSize, data) } }