{"version":3,"file":"main.uik_Sf.js","sources":["theme-409/virtual:theme","theme-409/discourse/components/ad-between-nested-roots.gjs","theme-409/discourse/components/ad-between-posts.gjs","theme-409/discourse/api-initializers/topic-ad-connector.gjs","theme-409/discourse/components/ad-between-topics.gjs","theme-409/discourse/api-initializers/topic-list-ad-connector.gjs","theme-409/discourse/services/ad-configurator.js","theme-409/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(409);\n\nexport function themePrefix(key) {\n  return `theme_translations.409.${key}`;\n}\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport willDestroy from \"@ember/render-modifiers/modifiers/will-destroy\";\nimport { service } from \"@ember/service\";\nimport { bind } from \"discourse/lib/decorators\";\nimport Category from \"discourse/models/category\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class AdBetweenNestedRoots extends Component {\n  @service adConfigurator;\n  @service router;\n\n  currentAdData =\n    settings.show_between_nested_roots !== 0\n      ? this.adConfigurator.getAdForSlot(\n          (this.args.index + 1) % settings.show_between_nested_roots === 0,\n          { ad_placement: \"between_posts\" }\n        )\n      : null;\n\n  intersectionObserver = null;\n  adElement = null;\n\n  get linkClasses() {\n    const page = this.router.currentURL?.split(\"?\")[0].replace(/^\\//, \"\");\n    const plausibleClass = `plausible-event-page=${page}`;\n    return [plausibleClass, this.currentAdData?.customClasses]\n      .filter(Boolean)\n      .join(\" \");\n  }\n\n  get shouldShow() {\n    const categoryId = this.args.topic?.category_id;\n    const category = Category.findById(categoryId);\n\n    if (\n      this.adConfigurator.shouldExcludeCategory(\n        categoryId,\n        category?.parent_category_id\n      )\n    ) {\n      return false;\n    }\n\n    return !!this.currentAdData;\n  }\n\n  @bind\n  handleAdIntersection(entries, observer) {\n    entries.forEach((entry) => {\n      if (entry.isIntersecting && this.currentAdData?.finalLink) {\n        const adDataForAnalytics = {\n          ad_id: this.currentAdData.id,\n          ad_text_snippet: this.currentAdData.text,\n          ad_link: this.currentAdData.finalLink,\n        };\n\n        this.adConfigurator.trackImpression(adDataForAnalytics);\n\n        observer.unobserve(this.adElement);\n      }\n    });\n  }\n\n  @action\n  setupAdImpressionTracking(element) {\n    this.adElement = element;\n    this.intersectionObserver?.disconnect();\n\n    if (this.currentAdData && this.adElement) {\n      const observerOptions = {\n        root: null,\n        rootMargin: \"0px\",\n        threshold: 0.7, // 70% visible\n      };\n\n      this.intersectionObserver = new IntersectionObserver(\n        this.handleAdIntersection,\n        observerOptions\n      );\n      this.intersectionObserver.observe(this.adElement);\n    }\n  }\n\n  @action\n  cleanUp() {\n    this.intersectionObserver?.disconnect();\n    this.adElement = null;\n  }\n\n  <template>\n    {{#if this.shouldShow}}\n      <div\n        {{didInsert this.setupAdImpressionTracking}}\n        {{willDestroy this.cleanUp}}\n        class=\"discourse-custom-ad-component --between-nested-roots\"\n      >\n        <div>\n          {{#if this.currentAdData.link}}\n            <a\n              href={{this.currentAdData.finalLink}}\n              target=\"_blank\"\n              rel=\"noopener noreferrer nofollow sponsored\"\n              class={{this.linkClasses}}\n            >\n              <span class=\"disclosure\">\n                {{i18n (themePrefix \"disclosure\")}}\n              </span>\n              <span class=\"text-content\">{{this.currentAdData.text}}</span>\n            </a>\n          {{/if}}\n        </div>\n      </div>\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { action } from \"@ember/object\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport willDestroy from \"@ember/render-modifiers/modifiers/will-destroy\";\nimport { service } from \"@ember/service\";\nimport { bind } from \"discourse/lib/decorators\";\nimport Category from \"discourse/models/category\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class AdBetweenPosts extends Component {\n  // The nested replies view renders the `post-article` outlet for every post\n  // at every depth; ads between its top-level replies are handled by\n  // `AdBetweenNestedRoots` instead.\n  static shouldRender(args) {\n    return !args.nestedReplyView;\n  }\n\n  @service adConfigurator;\n  @service router;\n\n  @tracked currentAdData;\n\n  intersectionObserver = null;\n  adElement = null;\n\n  constructor() {\n    super(...arguments);\n\n    if (settings.show_between_posts !== 0) {\n      this.currentAdData = this.adConfigurator.getAdForSlot(\n        this.args.post?.post_number === 1 ||\n          this.args.post?.post_number % settings.show_between_posts === 0,\n        { ad_placement: \"between_posts\" }\n      );\n    }\n  }\n\n  get linkClasses() {\n    const page = this.router.currentURL?.split(\"?\")[0].replace(/^\\//, \"\");\n    const plausibleClass = `plausible-event-page=${page}`;\n    return [plausibleClass, this.currentAdData?.customClasses]\n      .filter(Boolean)\n      .join(\" \");\n  }\n\n  get shouldShow() {\n    const categoryId = this.args.post?.topic?.category_id;\n    const category = Category.findById(categoryId);\n    const parentCategoryId = category?.parent_category_id;\n\n    if (settings.exclude_categories) {\n      const excludedCategories = settings.exclude_categories\n        .split(\"|\")\n        .map((cat) => parseInt(cat, 10));\n      if (\n        excludedCategories.includes(categoryId) ||\n        excludedCategories.includes(parentCategoryId)\n      ) {\n        return false;\n      }\n    }\n\n    return !!this.currentAdData;\n  }\n\n  get afterLastPost() {\n    return (\n      this.args.post?.topic.highest_post_number === this.args.post?.post_number\n    );\n  }\n\n  @bind\n  handleAdIntersection(entries, observer) {\n    entries.forEach((entry) => {\n      if (entry.isIntersecting && this.currentAdData?.finalLink) {\n        const adDataForAnalytics = {\n          ad_id: this.currentAdData.id,\n          ad_text_snippet: this.currentAdData.text,\n          ad_link: this.currentAdData.finalLink,\n        };\n\n        this.adConfigurator.trackImpression(adDataForAnalytics);\n\n        observer.unobserve(this.adElement);\n      }\n    });\n  }\n\n  @action\n  setupAdImpressionTracking(element) {\n    this.adElement = element;\n    this.intersectionObserver?.disconnect();\n\n    if (this.currentAdData && this.adElement) {\n      const observerOptions = {\n        root: null,\n        rootMargin: \"0px\",\n        threshold: 0.7, // 70% visible\n      };\n\n      this.intersectionObserver = new IntersectionObserver(\n        this.handleAdIntersection,\n        observerOptions\n      );\n      this.intersectionObserver.observe(this.adElement);\n    }\n  }\n\n  @action\n  cleanUp() {\n    this.intersectionObserver?.disconnect();\n    this.adElement = null;\n  }\n\n  <template>\n    {{#if this.shouldShow}}\n      <div\n        {{didInsert this.setupAdImpressionTracking}}\n        {{willDestroy this.cleanUp}}\n        class=\"discourse-custom-ad-component --between-posts\n          {{if this.afterLastPost '--last-post'}}\"\n      >\n        <div>\n          {{#if this.currentAdData.link}}\n            <a\n              href={{this.currentAdData.finalLink}}\n              target=\"_blank\"\n              rel=\"noopener noreferrer nofollow sponsored\"\n              class={{this.linkClasses}}\n            >\n              <span class=\"disclosure\">\n                {{i18n (themePrefix \"disclosure\")}}\n              </span>\n              <span class=\"text-content\">{{this.currentAdData.text}}</span>\n            </a>\n          {{/if}}\n        </div>\n      </div>\n    {{/if}}\n  </template>\n}\n","import { apiInitializer } from \"discourse/lib/api\";\nimport AdBetweenNestedRoots from \"../components/ad-between-nested-roots\";\nimport AdBetweenPosts from \"../components/ad-between-posts\";\n\nexport default apiInitializer((api) => {\n  api.renderAfterWrapperOutlet(\"post-article\", AdBetweenPosts);\n  api.renderInOutlet(\"nested-roots-between\", AdBetweenNestedRoots);\n});\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport willDestroy from \"@ember/render-modifiers/modifiers/will-destroy\";\nimport { service } from \"@ember/service\";\nimport { bind } from \"discourse/lib/decorators\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class AdBetweenTopics extends Component {\n  @service adConfigurator;\n  @service router;\n\n  currentAdData = this.adConfigurator.getAdForSlot(\n    (this.args.index + 1) % settings.show_between_topics === 0,\n    { ad_placement: \"between_topics\" }\n  );\n\n  intersectionObserver = null;\n  adElement = null;\n\n  get linkClasses() {\n    const page = this.router.currentURL?.split(\"?\")[0].replace(/^\\//, \"\");\n    const plausibleClass = `plausible-event-page=${page}`;\n    return [plausibleClass, this.currentAdData?.customClasses]\n      .filter(Boolean)\n      .join(\" \");\n  }\n\n  get shouldShow() {\n    const isDiscovery = this.router.currentRouteName.includes(\"discovery\");\n    if (!isDiscovery) {\n      return false;\n    }\n\n    const categoryId = this.router.currentRoute.attributes?.category?.id;\n    const parentCategoryId =\n      this.router.currentRoute.attributes?.category?.parent_category_id;\n\n    if (\n      this.adConfigurator.shouldExcludeCategory(categoryId, parentCategoryId)\n    ) {\n      return false;\n    }\n\n    return !!this.currentAdData;\n  }\n\n  @bind\n  handleAdIntersection(entries, observer) {\n    entries.forEach((entry) => {\n      if (entry.isIntersecting && this.currentAdData?.finalLink) {\n        const adDataForAnalytics = {\n          ad_id: this.currentAdData.id,\n          ad_text_snippet: this.currentAdData.text,\n          ad_link: this.currentAdData.finalLink,\n        };\n\n        this.adConfigurator.trackImpression(adDataForAnalytics);\n\n        observer.unobserve(this.adElement);\n      }\n    });\n  }\n\n  @action\n  setupAdImpressionTracking(element) {\n    this.adElement = element;\n    this.intersectionObserver?.disconnect();\n\n    if (this.currentAdData && this.adElement) {\n      const observerOptions = {\n        root: null,\n        rootMargin: \"0px\",\n        threshold: 0.7, // 70% visible\n      };\n\n      this.intersectionObserver = new IntersectionObserver(\n        this.handleAdIntersection,\n        observerOptions\n      );\n      this.intersectionObserver.observe(this.adElement);\n    }\n  }\n\n  @action\n  cleanUp() {\n    this.intersectionObserver?.disconnect();\n    this.adElement = null;\n  }\n\n  <template>\n    {{#if this.shouldShow}}\n      <tr\n        class=\"discourse-custom-ad-component --between-topics\"\n        {{didInsert this.setupAdImpressionTracking}}\n        {{willDestroy this.cleanUp}}\n      >\n        <td colspan=\"100%\">\n          {{#if this.currentAdData.link}}\n            <a\n              href={{this.currentAdData.finalLink}}\n              target=\"_blank\"\n              rel=\"noopener noreferrer nofollow sponsored\"\n              class={{this.linkClasses}}\n            >\n              <span class=\"disclosure\">\n                {{i18n (themePrefix \"disclosure\")}}\n              </span>\n              <span class=\"text-content\">{{this.currentAdData.text}}</span>\n            </a>\n          {{/if}}\n        </td>\n      </tr>\n    {{/if}}\n  </template>\n}\n","import { apiInitializer } from \"discourse/lib/api\";\nimport AdBetweenTopics from \"../components/ad-between-topics\";\n\nexport default apiInitializer((api) => {\n  api.renderInOutlet(\"after-topic-list-item\", AdBetweenTopics);\n});\n","import { tracked } from \"@glimmer/tracking\";\nimport Service, { service } from \"@ember/service\";\n\nfunction _doesUserMatchGroupCriteria(\n  groupString,\n  currentUserGroups,\n  isUserAnon,\n  isUserStaff\n) {\n  if (!groupString || groupString.trim() === \"\") {\n    return false;\n  }\n\n  const adRuleGroups = groupString\n    .split(\",\")\n    .map((g) => g.trim().toLowerCase());\n\n  if (adRuleGroups.includes(\"anon\") && isUserAnon) {\n    return true;\n  }\n  if (adRuleGroups.includes(\"staff\") && isUserStaff) {\n    return true;\n  }\n  if (currentUserGroups.some((userGroup) => adRuleGroups.includes(userGroup))) {\n    return true;\n  }\n  return false;\n}\n\nfunction parseCustomClasses(ad) {\n  if (ad.custom_class && ad.custom_class.trim() !== \"\") {\n    return ad.custom_class\n      .split(\",\")\n      .map((customClass) => customClass.trim())\n      .filter((customClass) => customClass.length > 0)\n      .join(\" \");\n  }\n}\n\nexport default class AdConfigurator extends Service {\n  @service currentUser;\n\n  @tracked _eligibleAds = [];\n\n  _randomStartIndex = 0;\n  _currentIndex = 0;\n  _isInitialized = false;\n\n  initializeIfNeeded() {\n    if (this._isInitialized) {\n      return;\n    }\n\n    const allAdsConfig = settings.ads || [];\n\n    if (!allAdsConfig.length) {\n      this._isInitialized = true;\n      return;\n    }\n\n    const currentUserGroups =\n      this.currentUser?.groups.map((g) => g.name.toLowerCase()) ?? [];\n    const isUserStaff = this.currentUser?.staff ?? false;\n    const isUserAnon = !this.currentUser;\n\n    this._eligibleAds = allAdsConfig\n      .filter((ad) => {\n        let shouldBeIncluded;\n        let shouldBeExcluded = false;\n\n        if (ad.include_groups?.trim() !== \"\") {\n          shouldBeIncluded = _doesUserMatchGroupCriteria(\n            ad.include_groups,\n            currentUserGroups,\n            isUserAnon,\n            isUserStaff\n          );\n        } else {\n          shouldBeIncluded = true; // if no group, include by default\n        }\n\n        if (ad.exclude_groups?.trim() !== \"\") {\n          shouldBeExcluded = _doesUserMatchGroupCriteria(\n            ad.exclude_groups,\n            currentUserGroups,\n            isUserAnon,\n            isUserStaff\n          );\n        }\n\n        return shouldBeIncluded && !shouldBeExcluded;\n      })\n      .map((ad) => {\n        return {\n          ...ad,\n          finalLink: this._buildFinalLink(ad),\n          customClasses: parseCustomClasses(ad),\n        };\n      });\n\n    if (this._eligibleAds.length > 0) {\n      this._randomStartIndex = Math.floor(\n        Math.random() * this._eligibleAds.length\n      );\n      this._currentSequentialIndex = this._randomStartIndex;\n    }\n\n    this._isInitialized = true;\n  }\n\n  getNextAd() {\n    if (this._eligibleAds.length === 0) {\n      return;\n    }\n\n    const adToServe = this._eligibleAds[this._currentIndex];\n\n    this._currentIndex = (this._currentIndex + 1) % this._eligibleAds.length;\n\n    return adToServe;\n  }\n\n  _buildFinalLink(adData, extraParams = {}) {\n    if (!adData || !adData.link) {\n      return null;\n    }\n\n    try {\n      const url = new URL(adData.link);\n\n      Object.keys(adData).forEach((key) => {\n        if (key.startsWith(\"utm_\") && adData[key]) {\n          url.searchParams.append(key, adData[key]);\n        }\n      });\n\n      Object.entries(extraParams).forEach(([key, value]) => {\n        if (value) {\n          url.searchParams.append(key, value);\n        }\n      });\n\n      return url.toString();\n    } catch {\n      return null;\n    }\n  }\n\n  getAdForSlot(shouldGet, trackingParams = {}) {\n    this.initializeIfNeeded();\n\n    if (shouldGet && this._eligibleAds.length > 0) {\n      const ad = this.getNextAd();\n\n      return {\n        ...ad,\n        finalLink: this._buildFinalLink(ad, trackingParams),\n      };\n    } else {\n      return null;\n    }\n  }\n\n  shouldExcludeCategory(categoryId, parentCategoryId) {\n    if (!settings.exclude_categories) {\n      return false;\n    }\n\n    const excluded = settings.exclude_categories\n      .split(\"|\")\n      .map((id) => parseInt(id, 10));\n    return excluded.includes(categoryId) || excluded.includes(parentCategoryId);\n  }\n\n  trackImpression(adData) {\n    if (settings.plausible_integration_enabled && window.plausible) {\n      window.plausible(settings.ads_impression_event_name, { props: adData });\n    } else {\n      // eslint-disable-next-line no-console\n      console.log(\n        `Ad with text '${adData.ad_text_snippet?.slice(0, 30)}' is visible!`\n      );\n    }\n  }\n}\n","import * as Mod1 from \"./discourse/api-initializers/topic-ad-connector\";\nimport * as Mod2 from \"./discourse/api-initializers/topic-list-ad-connector\";\nimport * as Mod3 from \"./discourse/components/ad-between-nested-roots\";\nimport * as Mod4 from \"./discourse/components/ad-between-posts\";\nimport * as Mod5 from \"./discourse/components/ad-between-topics\";\nimport * as Mod6 from \"./discourse/services/ad-configurator\";\nconst compatModules = {\n  \"discourse/api-initializers/topic-ad-connector\": Mod1,\n  \"discourse/api-initializers/topic-list-ad-connector\": Mod2,\n  \"discourse/components/ad-between-nested-roots\": Mod3,\n  \"discourse/components/ad-between-posts\": Mod4,\n  \"discourse/components/ad-between-topics\": Mod5,\n  \"discourse/services/ad-configurator\": Mod6,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","themePrefix","key","AdBetweenNestedRoots","Component","dt7948","g","this","prototype","service","adConfigurator","i","router","currentAdData","show_between_nested_roots","getAdForSlot","args","index","ad_placement","intersectionObserver","adElement","linkClasses","page","currentURL","split","replace","customClasses","filter","Boolean","join","shouldShow","categoryId","topic","category_id","category","Category","findById","shouldExcludeCategory","parent_category_id","handleAdIntersection","entries","observer","forEach","entry","isIntersecting","finalLink","adDataForAnalytics","ad_id","id","ad_text_snippet","text","ad_link","trackImpression","unobserve","n","bind","setupAdImpressionTracking","element","disconnect","observerOptions","root","rootMargin","threshold","IntersectionObserver","observe","action","cleanUp","setComponentTemplate","createTemplateFactory","block","moduleName","scope","didInsert","willDestroy","i18n","isStrictMode","AdBetweenPosts","shouldRender","nestedReplyView","tracked","constructor","super","arguments","show_between_posts","post","post_number","parentCategoryId","exclude_categories","excludedCategories","map","cat","parseInt","includes","afterLastPost","highest_post_number","topicAdConnector","apiInitializer","api","renderAfterWrapperOutlet","renderInOutlet","AdBetweenTopics","show_between_topics","currentRouteName","currentRoute","attributes","topicListAdConnector","_doesUserMatchGroupCriteria","groupString","currentUserGroups","isUserAnon","isUserStaff","trim","adRuleGroups","toLowerCase","some","userGroup","parseCustomClasses","ad","custom_class","customClass","length","AdConfigurator","Service","currentUser","_eligibleAds","_randomStartIndex","_currentIndex","_isInitialized","initializeIfNeeded","allAdsConfig","ads","groups","name","staff","shouldBeIncluded","shouldBeExcluded","include_groups","exclude_groups","_buildFinalLink","Math","floor","random","_currentSequentialIndex","getNextAd","adToServe","adData","extraParams","link","url","URL","Object","keys","startsWith","searchParams","append","value","toString","shouldGet","trackingParams","excluded","plausible_integration_enabled","window","plausible","ads_impression_event_name","props","console","log","slice","compatModules","Mod1","Mod2","Mod3","Mod4","Mod5"],"mappings":"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"}