{"version":3,"file":"placement.mjs","sources":["../../../src/frame/placement.ts"],"sourcesContent":["import type { MessageManager } from './message'\nimport type { MessageInitData } from '../types/auth'\nimport { MessageCommands } from './message'\nimport { Type } from '../tools/type'\n\n/**\n * Placement Manager\n *\n * @see https://apidocs.bitrix24.com/api-reference/widgets/ui-interaction/index.html\n */\nexport class PlacementManager {\n  #messageManager: MessageManager\n  #placement: string = ''\n  #options: object = {}\n\n  constructor(messageManager: MessageManager) {\n    this.#messageManager = messageManager\n  }\n\n  /**\n   * Initializes the data received from the parent window message.\n   * @param data\n   */\n  initData(data: MessageInitData): PlacementManager {\n    this.#placement = data.PLACEMENT || 'DEFAULT'\n    this.#options = Object.freeze(data.PLACEMENT_OPTIONS)\n\n    return this\n  }\n\n  /**\n   * Symlink on `placement`\n   * For backward compatibility\n   */\n  get title(): string {\n    return this.#placement\n  }\n\n  get placement(): string {\n    return this.#placement\n  }\n\n  get isDefault(): boolean {\n    return this.placement === 'DEFAULT'\n  }\n\n  get options(): any {\n    return this.#options\n  }\n\n  get isSliderMode(): boolean {\n    return this.options?.IFRAME === 'Y'\n  }\n\n  /**\n   * Get Information About the JS Interface of the Current Embedding Location\n   *\n   * @return {Promise<any>}\n   *\n   * @link https://apidocs.bitrix24.com/api-reference/widgets/ui-interaction/bx24-placement-get-interface.html\n   */\n  async getInterface(): Promise<any> {\n    return this.#messageManager.send(\n      MessageCommands.getInterface,\n      {\n        isSafely: true\n      }\n    )\n  }\n\n  /**\n   * Set Up the Interface Event Handler\n   * @param {string} eventName\n   * @param {(...args: any[]) => void} callBack\n   * @return {Promise<any>}\n   *\n   * @link https://apidocs.bitrix24.com/api-reference/widgets/ui-interaction/bx24-placement-bind-event.html\n   */\n  async bindEvent(\n    eventName: string,\n    callBack: (...args: any[]) => void\n  ): Promise<any> {\n    return this.#messageManager.send(\n      MessageCommands.placementBindEvent,\n      {\n        event: eventName,\n        callBack,\n        isSafely: true\n      }\n    )\n  }\n\n  /**\n   * Call the Registered Interface Command\n   *\n   * @link https://apidocs.bitrix24.com/api-reference/widgets/ui-interaction/bx24-placement-call.html\n   *\n   * @memo The `setValue` command is special: the parent window calls `JSON.parse(value)`\n   *       on the received payload, so `value` MUST be a JSON-serialized string\n   *       (e.g. `JSON.stringify('test')` or `JSON.stringify({ a: 1 })`).\n   *       Prefer {@link PlacementManager.setValue} which serializes for you.\n   *\n   * @throws {TypeError} when `command === 'setValue'` and `parameters.value` is not a string.\n   */\n  async call(command: 'setValue', parameters: { value: string }): Promise<any>\n  async call(command: string, parameters?: Record<string, any>): Promise<any>\n  async call(command: string, parameters: Record<string, any> = {}): Promise<any> {\n    if (command === 'setValue' && !Type.isString(parameters?.['value'])) {\n      throw new TypeError(\n        'placement.call(\\'setValue\\', { value }) expects `value` to be a JSON-serialized string. '\n        + 'Use placement.setValue(value) to serialize automatically, or call JSON.stringify yourself.'\n      )\n    }\n\n    return this.#messageManager.send(\n      command,\n      {\n        ...parameters,\n        isSafely: true,\n        isRawValue: ['setValue'].includes(command)\n      }\n    )\n  }\n\n  /**\n   * Set Value for the Current Embedding Location\n   *\n   * Convenience wrapper around `placement.call('setValue', ...)` that handles\n   * JSON serialization. Pass any value (string, number, boolean, object, array)\n   * — it will be serialized via `JSON.stringify` before being sent to the\n   * parent window, which performs `JSON.parse` on receipt.\n   *\n   * @param { unknown } value Any JSON-serializable value\n   * @return { Promise<any> }\n   *\n   * @link https://apidocs.bitrix24.com/api-reference/widgets/ui-interaction/bx24-placement-call.html\n   *\n   * @example\n   * await b24.placement.setValue('test')\n   * await b24.placement.setValue({ id: 1, title: 'demo' })\n   */\n  async setValue(value: unknown): Promise<any> {\n    return this.#messageManager.send(\n      'setValue',\n      {\n        value: JSON.stringify(value),\n        isSafely: true,\n        isRawValue: true\n      }\n    )\n  }\n\n  /**\n   * Set Up the Interface Event Handler\n   * @param {string} command\n   * @param {null | string | Record<string, any>} parameters\n   * @param {(...args: any[]) => void} callBack\n   *\n   * @return {Promise<any>}\n   */\n  async callCustomBind(\n    command: string,\n    parameters: null | string | Record<string, any> = null,\n    callBack: (...args: any[]) => void\n  ): Promise<any> {\n    let options: Record<string, any> = {}\n    if (Type.isString(parameters)) {\n      options['singleOption'] = parameters\n    } else if (Type.isObjectLike(parameters)) {\n      options = { ...(parameters as object) }\n    }\n\n    return this.#messageManager.send(\n      command,\n      {\n        ...options,\n        callBack,\n        isSafely: true\n      }\n    )\n  }\n}\n"],"names":[],"mappings":"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"}