{"version":3,"file":"main.cFgxer.js","sources":["theme-46/virtual:theme","theme-46/discourse/connectors/above-site-header/pull-to-refresh.gjs","theme-46/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(46);\n\nexport function themePrefix(key) {\n  return `theme_translations.46.${key}`;\n}\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport { action } from \"@ember/object\";\nimport { tracked } from \"@glimmer/tracking\";\nimport discourseLater from \"discourse/lib/later\";\nimport { trustHTML } from \"@ember/template\";\nimport concatClass from \"discourse/helpers/concat-class\";\n\nexport default class PwaPullToRefresh extends Component {\n  @service capabilities;\n  @service router;\n\n  @tracked isPulling = false;\n  @tracked startY = 0;\n  @tracked currentY = 0;\n  @tracked pullDistance = 0;\n  @tracked isRefreshing = false;\n  @tracked pullProgress = 0;\n  @tracked highlightPosition = 0;\n  @tracked isReloading = false;\n  \n  LINE_COUNT = 8;\n  THRESHOLD = 100;\n  MAX_PULL = 150;\n  mainOutlet = null;\n\n  get shouldShow() {\n    const isChat = this.router.currentRouteName.startsWith(\"chat\");\n    const isAppWebview = this.capabilities.isAppWebview;\n    const isiOSPWA = this.capabilities.isiOSPWA;\n\n    return !isChat && (isAppWebview || isiOSPWA);\n  }\n\n  get spinnerSvg() {\n    const lines = Array.from({ length: this.LINE_COUNT }, (_, index) => {\n      const baseRotation = (index * 360) / this.LINE_COUNT;\n      let opacity = 0;\n      \n      if (this.isRefreshing) {\n        opacity = 0.85;\n      } else {\n        opacity = Math.max(0, Math.min(1, (this.pullProgress * 2) - (index / this.LINE_COUNT)));\n      }\n\n      return `<line\n        x1=\"32\"\n        y1=\"14\"\n        x2=\"32\"\n        y2=\"22\"\n        stroke=\"${settings.spinner_color}\"\n        stroke-width=\"5\"\n        stroke-linecap=\"round\"\n        style=\"transform: rotate(${baseRotation}deg); opacity: ${opacity.toFixed(2)}; transform-origin: center;\"\n        class=\"spinner-line\"\n      />`;\n    }).join('');\n\n    return trustHTML(`\n      <svg\n        viewBox=\"0 0 64 64\"\n        class=\"safari-spinner ${this.isRefreshing ? 'spinning' : ''}\"\n      >\n        ${lines}\n      </svg>\n    `);\n  }\n\n  @action\n  startAnimation() {\n    const spinner = document.querySelector(\".safari-spinner\");\n    if (spinner) {\n      spinner.classList.add(\"spinning\");\n    }\n  }\n\n  @action\n  stopAnimation() {\n    const spinner = document.querySelector(\".safari-spinner\");\n    if (spinner) {\n      spinner.classList.remove(\"spinning\");\n    }\n  }\n\n  constructor() {\n    super(...arguments);\n    if (this.shouldShow) {\n      this.setupListeners();\n    }\n  }\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    if (this.shouldShow) {\n      this.removeListeners();\n      this.stopAnimation();\n    }\n  }\n\n  @action\n  setupListeners() {\n    const attemptSetup = () => {\n      this.mainOutlet = document.querySelector(\"#main-outlet\");\n      if (this.mainOutlet) {\n        this.mainOutlet.addEventListener(\n          \"touchstart\",\n          this.handleTouchStart.bind(this),\n          { passive: true }\n        );\n        this.mainOutlet.addEventListener(\n          \"touchmove\",\n          this.handleTouchMove.bind(this),\n          { passive: false }\n        );\n        this.mainOutlet.addEventListener(\n          \"touchend\",\n          this.handleTouchEnd.bind(this),\n          { passive: true }\n        );\n      } else {\n        discourseLater(attemptSetup, 100);\n      }\n    };\n  \n    attemptSetup();\n  }\n\n  @action\n  removeListeners() {\n    if (this.mainOutlet) {\n      this.mainOutlet.removeEventListener(\n        \"touchstart\",\n        this.handleTouchStart.bind(this)\n      );\n      this.mainOutlet.removeEventListener(\n        \"touchmove\",\n        this.handleTouchMove.bind(this)\n      );\n      this.mainOutlet.removeEventListener(\n        \"touchend\",\n        this.handleTouchEnd.bind(this)\n      );\n    }\n  }\n\n  isMainOutletTouch(event) {\n    let element = event.target;\n    while (element) {\n      if (element.id === \"main-outlet\") {\n        return true;\n      }\n      element = element.parentElement;\n    }\n    return false;\n  }\n\n  @action\n  handleTouchStart(event) {\n    if (!this.shouldShow || !this.isMainOutletTouch(event)) {\n      return;\n    }\n    \n    if (window.scrollY === 0) {\n      this.startY = event.touches[0].clientY;\n      this.currentY = event.touches[0].clientY;\n      this.isPulling = true;\n      this.pullDistance = 0;\n      this.pullProgress = 0;\n      this.highlightPosition = 0;\n      this.isReloading = false;\n    }\n  }\n\n  @action\n  handleTouchMove(event) {\n    if (\n      !this.shouldShow ||\n      !this.isPulling ||\n      !this.isMainOutletTouch(event) ||\n      window.scrollY > 0\n    ) {\n      return;\n    }\n  \n    this.currentY = event.touches[0].clientY;\n    const delta = this.currentY - this.startY;\n  \n    if (delta > 0) {\n      const damping = 0.5;\n      this.pullDistance = Math.min(delta * damping, this.MAX_PULL);\n      this.pullProgress = Math.min(this.pullDistance / this.THRESHOLD, 1);\n  \n      const loader = document.querySelector(\".pwa-pull-loader\");\n  \n      if (loader) {\n        loader.style.opacity = \"1\";\n  \n        if (this.pullDistance >= this.THRESHOLD) {\n          loader.classList.add(\"ready\");\n  \n          if (!this.isRefreshing) {\n            this.isRefreshing = true;\n            this.startAnimation();\n          }\n        } else {\n          loader.classList.remove(\"ready\");\n        }\n      }\n    }\n  }\n  \n  @action\n  handleTouchEnd(event) {\n    if (\n      !this.shouldShow ||\n      !this.isPulling ||\n      !this.isMainOutletTouch(event)\n    ) {\n      return;\n    }\n    \n    const loader = document.querySelector(\".pwa-pull-loader\");\n    \n    if (this.pullDistance >= this.THRESHOLD) {\n      this.isRefreshing = true;\n      this.isReloading = true;\n      \n      if (loader) {\n        loader.classList.add(\"loading\");\n      }\n            \n      discourseLater(() => {\n        window.location.reload();\n      }, 1000);\n    } else {\n      this.isRefreshing = false;\n      this.isReloading = false;\n      this.stopAnimation();\n      \n      if (loader) {\n        loader.style.opacity = \"0\";\n        loader.classList.remove(\"ready\", \"loading\");\n      }\n    }\n    \n    this.isPulling = false;\n    this.pullDistance = 0;\n  }\n\n  <template>\n    {{#if this.shouldShow}}\n      <div class=\"pwa-pull-loader\">\n        <div class={{concatClass \"pwa-loader-content\" (if this.isPulling \"is-pulling\")}}>\n          {{{this.spinnerSvg}}}\n        </div>\n      </div>\n    {{/if}}\n  </template>\n}\n","import * as Mod1 from \"./discourse/connectors/above-site-header/pull-to-refresh.gjs\";\nconst compatModules = {\n  \"discourse/connectors/above-site-header/pull-to-refresh\": Mod1,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","PwaPullToRefresh","Component","dt7948","g","this","prototype","service","capabilities","i","router","tracked","isPulling","startY","currentY","pullDistance","isRefreshing","pullProgress","highlightPosition","isReloading","LINE_COUNT","THRESHOLD","MAX_PULL","mainOutlet","shouldShow","isChat","currentRouteName","startsWith","isAppWebview","isiOSPWA","spinnerSvg","lines","Array","from","length","_","index","baseRotation","opacity","Math","max","min","spinner_color","toFixed","join","trustHTML","startAnimation","spinner","document","querySelector","classList","add","n","action","stopAnimation","remove","constructor","super","arguments","setupListeners","willDestroy","removeListeners","attemptSetup","addEventListener","handleTouchStart","bind","passive","handleTouchMove","handleTouchEnd","discourseLater","removeEventListener","isMainOutletTouch","event","element","target","id","parentElement","window","scrollY","touches","clientY","delta","damping","loader","style","location","reload","setComponentTemplate","createTemplateFactory","block","moduleName","scope","concatClass","isStrictMode","compatModules"],"mappings":"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"}