{"version":3,"file":"webresto-components-configurable-component.mjs","sources":["../../../projects/components/configurable-component/ecommerce.ts","../../../projects/components/configurable-component/configurable-component.ts","../../../projects/components/configurable-component/webresto-components-configurable-component.ts"],"sourcesContent":["import { isValue } from '@axrl/common';\nimport { Dish, Order, OrderDish } from '@webresto/ng-gql';\n\nexport type EcommerceActionTypes =\n  /** просмотр списка товаров; */\n  | 'impression'\n  /** клик по товару в списке; */\n  | 'click'\n  /** просмотр товара; */\n  | 'detail'\n  /** добавление товара в корзину; */\n  | 'add'\n  /** удаление товара из корзины; */\n  | 'remove'\n  /** покупка; */\n  | 'purchase'\n  /** просмотр внутренней рекламы; */\n  | 'promoView'\n  /** клик по внутренней рекламе. */\n  | 'promoClick';\n\nexport class EcommerceProduct {\n  /** Идентификатор товара. Например, SKU.\n  Необходимо обязательно указать или id или name */\n  id?: string;\n  /**\n   * Название товара. Например, \"Футболка\"\n  Необходимо обязательно указать или name или id\n   */\n  name?: string;\n  /**\n   * Бренд, торговая марка, ассоциированная с товаром. Например, \"Яндекс / Яndex\"\n   */\n  brand?: string;\n  /**\n   * Категория, к которой относится товар. Поддерживается иерархия категорий до 5 уровней вложенности. Разделителем уровней является символ /. Например, \"Одежда/Мужская одежда/Футболки\"\n   */\n  category?: string;\n  /** Промокод ассоциированный с товаром. Например, \"PARTNER_SITE_15\"\n   */\n  coupon?: string;\n  /**Размер скидки на товар (указывается как число). */\n  discount: number;\n  /** Список, к которому относится товар. Чтобы оценивать эффективность списка на разных этапах взаимодействия пользователя\n   * с товаром, рекомендуем указывать список товара во всех событиях, которые были после просмотра списка.\n   */\n  list: string;\n  /** Позиция товара в списке. Например, 2 */\n  position?: number;\n  /** Цена единицы товара */\n  price?: number;\n  /**Количество единиц товара */\n  quantity?: number;\n  /**Разновидность товара. Например, \"Красный цвет\" */\n  variant?: string;\n\n  constructor(dish: Partial<OrderDish<Dish>>, listName: string);\n  constructor(\n    dish: Partial<Dish>,\n    listName: string,\n    amount: number,\n    position: number\n  );\n  constructor(\n    dishOrOrderDish: Partial<Dish | OrderDish<Dish>>,\n    listName: string,\n    amount?: number,\n    position?: number\n  ) {\n    const dish =\n      'dish' in dishOrOrderDish\n        ? dishOrOrderDish.dish\n        : <Partial<Dish>>dishOrOrderDish;\n\n    this.id = dish?.id;\n    this.name = dish?.name;\n    /** this.category = dish.parentGroup. */\n    this.price = dish?.price;\n    this.discount =\n      isValue(dish) && isValue(dish?.salePrice) && isValue(dish?.price)\n        ? dish.price - dish.salePrice\n        : 0;\n    this.list = listName;\n    this.position = 'dish' in dishOrOrderDish ? dishOrOrderDish.id : position;\n    this.quantity = 'dish' in dishOrOrderDish ? dishOrOrderDish.amount : amount;\n  }\n}\n\nexport interface EcommerceAction {\n  products: EcommerceProduct[];\n}\n\nexport interface EcommercePurchaseAction extends EcommerceAction {\n  actionField: {\n    /* Идентификатор покупки. Обязательно для заполнения. Пример: TRX#54321\n     */\n    id?: string;\n    /* Промокод, ассоциированный со всей покупкой целиком\n     */\n    coupon?: string;\n    /* Номер цели. Указывается в том случае, если данное действие и было целью. Цель должна задаваться условием типа JavaScript-событие.\n    Номер цели доступен в веб-интерфейсе Яндекс Метрики, в разделе Настройка (вкладка Цели).\n    */\n    goal_id?: number;\n    /* Полученный доход. Если не указан, вычисляется автоматически как сумма цен всех товаров, ассоциированных с покупкой\n     */\n    revenue?: number;\n  };\n}\n\nexport type EcommerceItem = {\n  currencyCode: 'RUB';\n} & Pick<\n  {\n    [K in EcommerceActionTypes]: K extends 'purchase'\n      ? EcommercePurchaseAction\n      : EcommerceAction;\n  },\n  EcommerceActionTypes\n>;\n\nexport function ecommerceItemFactory<\n  A extends Exclude<EcommerceActionTypes, 'purchase'>\n>(\n  actionName: A,\n  listName: string,\n  dish: Partial<Dish>,\n  amount: number,\n  position: number\n): EcommerceItem;\nexport function ecommerceItemFactory<A extends EcommerceActionTypes>(\n  actionName: 'purchase',\n  listName: string,\n  order: Partial<Order>\n): EcommerceItem;\nexport function ecommerceItemFactory<A extends EcommerceActionTypes>(\n  actionName: A,\n  listName: string,\n  orderOrDish: Partial<Dish | Order>,\n  amount?: number,\n  position?: number\n): EcommerceItem {\n  const products: EcommerceProduct[] =\n    actionName === 'purchase'\n      ? (<Partial<Order>>orderOrDish)?.dishes?.map(\n          (orderDish) => new EcommerceProduct(orderDish, listName)\n        ) ?? []\n      : [\n          new EcommerceProduct(\n            <Partial<Dish>>orderOrDish,\n            listName,\n            <number>amount,\n            <number>position\n          ),\n        ];\n\n  const actionObj: EcommercePurchaseAction | EcommerceAction = {\n    products,\n  };\n\n  if (actionName === 'purchase') {\n    (<EcommercePurchaseAction>actionObj).actionField = {\n      coupon: undefined,\n      id: orderOrDish?.id,\n      revenue: (<Order>orderOrDish)?.total,\n      goal_id: undefined,\n    };\n  }\n\n  return <EcommerceItem>{\n    currencyCode: 'RUB',\n    [actionName]: actionObj,\n  };\n}\n\nexport interface EcommerceEvent {\n  ecommerce: EcommerceItem;\n}\n","import {\n  Directive,\n  ElementRef,\n  InjectionToken,\n  QueryList,\n  Renderer2,\n  ViewChildren,\n  effect,\n  inject,\n  input\n} from '@angular/core';\nimport { objectEntries } from '@axrl/common';\nimport { Dish, Order } from '@webresto/ng-gql';\nimport {\n  EcommerceActionTypes,\n  EcommerceEvent,\n  ecommerceItemFactory,\n} from './ecommerce';\n\nexport type ColorsVariablesConfig = Record<string, string>;\nexport interface Config {\n  useDarkTheme: boolean;\n}\n\nexport interface ComponentReceiptData<T extends Config> {\n  config: T;\n  colors: ColorsVariablesConfig;\n}\n\nexport const APP_RECEIPT = new InjectionToken<\n  Record<string, ComponentReceiptData<Config>>\n>('APP_RECEIPT');\n\n@Directive({\n  host: {\n    '[class.dark-theme]': 'useDarkTheme',\n  },\n})\nexport class ConfigurableComponent<T extends Config> {\n  @ViewChildren(ConfigurableComponent) configurableComponents!: QueryList<ConfigurableComponent<any>>;\n  \n  // @Input() overrideConfig?: Partial<T>;\n  overrideConfig = input<Partial<Config>>();\n\n  protected _elementRef: ElementRef<HTMLElement>;\n  protected _renderer: Renderer2;\n  protected _receiptData: ComponentReceiptData<T>;\n  protected _isLayout: boolean\n  protected get config(): T {\n    return { ...this._receiptData.config, ...this.overrideConfig() };\n  }  \n\n  protected get _colorsConfig(): ColorsVariablesConfig {\n    return this._receiptData.colors;\n  }\n\n  get useDarkTheme(): boolean {\n    return this.config.useDarkTheme;\n  }\n\n  constructor(componentSlug: string, isLayout: boolean = false) {\n    this._renderer = inject(Renderer2);\n    this._elementRef = inject(ElementRef<HTMLElement>);\n    this._receiptData = <ComponentReceiptData<T>>(\n      inject(APP_RECEIPT)[componentSlug]\n    );\n    this._isLayout = isLayout;\n\n    effect(() => {\n      if(this.overrideConfig()?.useDarkTheme) {\n        this.applyColors(this._colorsConfig);\n      }\n    });\n    this.applyColors(this._colorsConfig);\n  }\n\n  applyColors(colors: ColorsVariablesConfig): void {\n    const target = this._isLayout ? document.documentElement : this._elementRef.nativeElement\n    objectEntries(colors).forEach(([property, value]) => {\n      const propertyValue = typeof value === 'string' && value.includes('$')\n        ? document.documentElement.style.getPropertyValue(`--${value.replace('$', '')}`)\n        : value;\n      target.style.setProperty(`--${property}`, propertyValue);\n    });\n\n    if(!this._isLayout) {\n      this.configurableComponents?.forEach((component) => {\n        component.applyColors(colors); \n      });\n    }\n    \n    const isDark = this.config.useDarkTheme;\n    target.style.setProperty(`--use-dark-theme`, isDark ? \"1\" : \"0\");\n    target.style.setProperty(`--primary-text-color`, isDark ? \"var(--readable-primary-light, #fafafa)\" : \"var(--readable-primary-dark, #010101)\");\n    target.style.setProperty(`--secondary-text-color`, isDark ? \"var(--readable-secondary-light, #f1f1f1)\" : \"var(--readable-secondary-dark, #252525)\");\n  }\n\n  protected dispatchAnalyticsEvent<\n    A extends Exclude<EcommerceActionTypes, 'purchase'>\n  >(\n    eventName: A,\n    listName: string,\n    payload: {\n      dish: Partial<Dish>;\n      amount: number;\n      position: number;\n    }\n  ): void;\n  protected dispatchAnalyticsEvent<A extends 'purchase'>(\n    eventName: A,\n    listName: string,\n    payload: Partial<Order>\n  ): void;\n  protected dispatchAnalyticsEvent<A extends EcommerceActionTypes>(\n    eventName: A,\n    listName: string,\n    payload:\n      | Partial<Order>\n      | {\n          dish: Partial<Dish>;\n          amount: number;\n          position: number;\n        }\n  ): void {\n    const detail: EcommerceEvent = {\n      ecommerce:\n        'position' in payload\n          ? ecommerceItemFactory(\n              <Exclude<EcommerceActionTypes, 'purchase'>>eventName,\n              listName,\n              payload.dish,\n              payload.amount,\n              payload.position\n            )\n          : ecommerceItemFactory(<'purchase'>eventName, listName, payload),\n    };\n    const event = new CustomEvent('webresto-analytics', {\n      detail,\n    });\n\n    window.dispatchEvent(event);\n  }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}