{"version":3,"file":"js/50-f82488dd60999d8f5c51.js","mappings":"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","sources":["webpack://app/./app/javascript/controllers/ sync _controller\\.js$","webpack://app/./app/javascript/controllers/action/active_for_frame_route_controller.js","webpack://app/./app/javascript/controllers/action/no_data_controller.js","webpack://app/./app/javascript/controllers/action/toggle_controller.js","webpack://app/./app/javascript/controllers/collapse/accordion_controller.js","webpack://app/./app/javascript/controllers/collapse/read_more_controller.js","webpack://app/./app/javascript/controllers/dropdown_controller.js","webpack://app/./app/javascript/controllers/form/ages_toggle_controller.js","webpack://app/./app/javascript/controllers/form/auto_complete_controller.js","webpack://app/./app/javascript/controllers/form/city_selector_controller.js","webpack://app/./app/javascript/controllers/form/file_uploader_controller.js","webpack://app/./app/javascript/controllers/form/geolocation_controller.js","webpack://app/./app/javascript/controllers/form/input/autoresize_controller.js","webpack://app/./app/javascript/controllers/form/input/chars_counter_controller.js","webpack://app/./app/javascript/controllers/form/input/clearable_controller.js","webpack://app/./app/javascript/controllers/form/input/collapsable/checkbox_controller.js","webpack://app/./app/javascript/controllers/form/input/collapsable/radio_controller.js","webpack://app/./app/javascript/controllers/form/input/disable_for_user_type_controller.js","webpack://app/./app/javascript/controllers/form/input/password_controller.js","webpack://app/./app/javascript/controllers/form/limit_choice_controller.js","webpack://app/./app/javascript/controllers/form/reset_controller.js","webpack://app/./app/javascript/controllers/form/select/multiple_controller.js","webpack://app/./app/javascript/controllers/form/select/to_textarea_controller.js","webpack://app/./app/javascript/controllers/form/slider/age_controller.js","webpack://app/./app/javascript/controllers/form/slider/distance_controller.js","webpack://app/./app/javascript/controllers/gender_filter_controller.js","webpack://app/./app/javascript/controllers/history_controller.js","webpack://app/./app/javascript/controllers/index.js","webpack://app/./app/javascript/controllers/load_on_intersection_controller.js","webpack://app/./app/javascript/controllers/menu_controller.js","webpack://app/./app/javascript/controllers/modal_controller.js","webpack://app/./app/javascript/controllers/pages/customer-supports_controller.js","webpack://app/./app/javascript/controllers/pages/disclaimer_controller.js","webpack://app/./app/javascript/controllers/pages/manage_renew_controller.js","webpack://app/./app/javascript/controllers/pages/sentenses_controller.js","webpack://app/./app/javascript/controllers/pages/subscriptions_controller.js","webpack://app/./app/javascript/controllers/scroll/active_into_view_controller.js","webpack://app/./app/javascript/controllers/scroll/into_view_controller.js","webpack://app/./app/javascript/controllers/scroll/to_top_controller.js","webpack://app/./app/javascript/controllers/slider/infotainment_controller.js","webpack://app/./app/javascript/controllers/slider/tips_controller.js","webpack://app/./app/javascript/controllers/tabs/profile_controller.js","webpack://app/./app/javascript/controllers/tabs/switch-panel_controller.js","webpack://app/./app/javascript/controllers/toast_controller.js","webpack://app/./app/javascript/controllers/upload-media_controller.js","webpack://app/./app/javascript/controllers/video/layer_controller.js","webpack://app/./app/javascript/controllers/video/player_controller.js","webpack://app/./app/javascript/controllers/vue/chat_status_controller.js","webpack://app/./app/javascript/controllers/vue/notification_bar_controller.js","webpack://app/./app/javascript/libs/dialog.js","webpack://app/./app/javascript/libs/geolocation.js","webpack://app/./app/javascript/libs/toast.js","webpack://app/./app/javascript/locales/i18n.js","webpack://app/./app/javascript/stores/chat_store.js","webpack://app/./app/javascript/stores/common_store.js","webpack://app/./app/javascript/stores/index.js","webpack://app/./app/javascript/stores/notifications_store.js","webpack://app/./app/javascript/turbo_streams/toast.js","webpack://app/./app/javascript/turbo_streams/dialog.js","webpack://app/./app/javascript/turbo_streams/attributes.js","webpack://app/./app/javascript/lib/me/core.js.coffee","webpack://app/./app/javascript/config.js.erb"],"sourcesContent":["var map = {\n\t\"./action/active_for_frame_route_controller.js\": 8115,\n\t\"./action/no_data_controller.js\": 5115,\n\t\"./action/toggle_controller.js\": 1653,\n\t\"./collapse/accordion_controller.js\": 1834,\n\t\"./collapse/read_more_controller.js\": 8384,\n\t\"./dropdown_controller.js\": 9247,\n\t\"./form/ages_toggle_controller.js\": 8732,\n\t\"./form/auto_complete_controller.js\": 1122,\n\t\"./form/city_selector_controller.js\": 7612,\n\t\"./form/file_uploader_controller.js\": 36,\n\t\"./form/geolocation_controller.js\": 5034,\n\t\"./form/input/autoresize_controller.js\": 1795,\n\t\"./form/input/chars_counter_controller.js\": 9488,\n\t\"./form/input/clearable_controller.js\": 2317,\n\t\"./form/input/collapsable/checkbox_controller.js\": 8798,\n\t\"./form/input/collapsable/radio_controller.js\": 6730,\n\t\"./form/input/disable_for_user_type_controller.js\": 8583,\n\t\"./form/input/password_controller.js\": 5881,\n\t\"./form/limit_choice_controller.js\": 4224,\n\t\"./form/reset_controller.js\": 4114,\n\t\"./form/select/multiple_controller.js\": 1376,\n\t\"./form/select/to_textarea_controller.js\": 6708,\n\t\"./form/slider/age_controller.js\": 5370,\n\t\"./form/slider/distance_controller.js\": 1356,\n\t\"./gender_filter_controller.js\": 4640,\n\t\"./history_controller.js\": 6804,\n\t\"./load_on_intersection_controller.js\": 660,\n\t\"./menu_controller.js\": 349,\n\t\"./modal_controller.js\": 9415,\n\t\"./pages/customer-supports_controller.js\": 284,\n\t\"./pages/disclaimer_controller.js\": 3674,\n\t\"./pages/manage_renew_controller.js\": 9828,\n\t\"./pages/sentenses_controller.js\": 8519,\n\t\"./pages/subscriptions_controller.js\": 4043,\n\t\"./scroll/active_into_view_controller.js\": 3380,\n\t\"./scroll/into_view_controller.js\": 3192,\n\t\"./scroll/to_top_controller.js\": 4929,\n\t\"./slider/infotainment_controller.js\": 2434,\n\t\"./slider/tips_controller.js\": 2396,\n\t\"./tabs/profile_controller.js\": 9930,\n\t\"./tabs/switch-panel_controller.js\": 8118,\n\t\"./toast_controller.js\": 4173,\n\t\"./upload-media_controller.js\": 112,\n\t\"./video/layer_controller.js\": 6907,\n\t\"./video/player_controller.js\": 7319,\n\t\"./vue/chat_status_controller.js\": 1322,\n\t\"./vue/notification_bar_controller.js\": 5700,\n\t\"controllers/action/active_for_frame_route_controller.js\": 8115,\n\t\"controllers/action/no_data_controller.js\": 5115,\n\t\"controllers/action/toggle_controller.js\": 1653,\n\t\"controllers/collapse/accordion_controller.js\": 1834,\n\t\"controllers/collapse/read_more_controller.js\": 8384,\n\t\"controllers/dropdown_controller.js\": 9247,\n\t\"controllers/form/ages_toggle_controller.js\": 8732,\n\t\"controllers/form/auto_complete_controller.js\": 1122,\n\t\"controllers/form/city_selector_controller.js\": 7612,\n\t\"controllers/form/file_uploader_controller.js\": 36,\n\t\"controllers/form/geolocation_controller.js\": 5034,\n\t\"controllers/form/input/autoresize_controller.js\": 1795,\n\t\"controllers/form/input/chars_counter_controller.js\": 9488,\n\t\"controllers/form/input/clearable_controller.js\": 2317,\n\t\"controllers/form/input/collapsable/checkbox_controller.js\": 8798,\n\t\"controllers/form/input/collapsable/radio_controller.js\": 6730,\n\t\"controllers/form/input/disable_for_user_type_controller.js\": 8583,\n\t\"controllers/form/input/password_controller.js\": 5881,\n\t\"controllers/form/limit_choice_controller.js\": 4224,\n\t\"controllers/form/reset_controller.js\": 4114,\n\t\"controllers/form/select/multiple_controller.js\": 1376,\n\t\"controllers/form/select/to_textarea_controller.js\": 6708,\n\t\"controllers/form/slider/age_controller.js\": 5370,\n\t\"controllers/form/slider/distance_controller.js\": 1356,\n\t\"controllers/gender_filter_controller.js\": 4640,\n\t\"controllers/history_controller.js\": 6804,\n\t\"controllers/load_on_intersection_controller.js\": 660,\n\t\"controllers/menu_controller.js\": 349,\n\t\"controllers/modal_controller.js\": 9415,\n\t\"controllers/pages/customer-supports_controller.js\": 284,\n\t\"controllers/pages/disclaimer_controller.js\": 3674,\n\t\"controllers/pages/manage_renew_controller.js\": 9828,\n\t\"controllers/pages/sentenses_controller.js\": 8519,\n\t\"controllers/pages/subscriptions_controller.js\": 4043,\n\t\"controllers/scroll/active_into_view_controller.js\": 3380,\n\t\"controllers/scroll/into_view_controller.js\": 3192,\n\t\"controllers/scroll/to_top_controller.js\": 4929,\n\t\"controllers/slider/infotainment_controller.js\": 2434,\n\t\"controllers/slider/tips_controller.js\": 2396,\n\t\"controllers/tabs/profile_controller.js\": 9930,\n\t\"controllers/tabs/switch-panel_controller.js\": 8118,\n\t\"controllers/toast_controller.js\": 4173,\n\t\"controllers/upload-media_controller.js\": 112,\n\t\"controllers/video/layer_controller.js\": 6907,\n\t\"controllers/video/player_controller.js\": 7319,\n\t\"controllers/vue/chat_status_controller.js\": 1322,\n\t\"controllers/vue/notification_bar_controller.js\": 5700\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 5124;","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static values = { frameId: String }\n\n connect() {\n document.getElementById(this.frameIdValue).addEventListener('turbo:frame-render', (event) => {\n const headers = event.detail.fetchResponse.response.headers\n this.activate(headers.get('X-Controller'), headers.get('X-Action'))\n })\n }\n\n activate(controller, action) {\n this.element.querySelectorAll('[data-active-for-route]').forEach((elmnt) => {\n const routes = elmnt.dataset.activeForRoute.split(' ')\n\n routes.some((route) => {\n let c, a\n [c, a] = route.split('#')\n const match = c == controller && (!a || a == action)\n elmnt.toggleAttribute('active', match)\n return match\n })\n })\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n initialize() {\n this.observer = null\n this.checkData()\n }\n\n connect() {\n this.observer = new MutationObserver((_mutationList, _observer) => { this.checkData() })\n this.observer.observe(this.element, { childList: true })\n }\n\n disconnect() {\n this.observer.disconnect()\n }\n\n checkData() {\n this.element.setAttribute('no-data', this.element.childElementCount > 0)\n }\n}\n","/*\n Trigger\n ---------------\n \n\n Target\n ---------------\n \n */\n\nimport { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static values = { target: String }\n\n connect() {\n this.element.addEventListener('click', () => {\n document.querySelector(this.targetValue)?.toggleAttribute('hidden')\n })\n }\n}\n","/*\n UI COMPONENT: Accordion Management\n ---------------------------------------------------\n Triggered by \"open\" attribute on top-level element. Labels, icons, and sizes are controlled by CSS.\n\n \n \n \n \n HTML CONTENT…\n \n\n Status (Attribute as Summary Element)\n ---------------------------------------------------\n Open Accordion - attribute \"open\"\n */\nimport {Controller} from '@hotwired/stimulus';\n\nexport default class extends Controller {\n toggle() {\n this.element.toggleAttribute('open')\n\n if (this.element.hasAttribute('open')) {\n this.element.querySelector('button').scrollIntoView({\n behavior: 'smooth',\n block: 'center'\n })\n }\n }\n}\n","/*\n UI COMPONENT: Agnostic structure read more content\n ---------------------------------------------------\n\n Example: Hidden/Show (content totally hidden)\n
\n // initialize with hidden attribute\n \n\n \n
\n\n Example: Multiline with line-clamp css class\n Display Trigger: add data-collapse--read-more-target=\"trigger\"\n
\n\n // Class line-clamp-[x]\n
\n CONTENT …\n
\n\n \n
\n\n Trigger: automatic label management with data-attribute.\n Icon: V1 has only one variant (+/-)\n \n */\nimport {Controller} from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['content', 'trigger']\n\n connect() {\n this.#checkDisplay()\n }\n\n toggle() {\n this.contentTarget.toggleAttribute('hidden')\n }\n\n toggle_lines() {\n this.contentTarget.classList.toggle('line-clamp-none')\n }\n\n #checkDisplay() {\n if(!this.hasTriggerTarget) return\n\n const isSmaller = this.contentTarget.scrollHeight <= this.contentTarget.clientHeight\n this.triggerTarget.toggleAttribute('hidden', isSmaller)\n }\n}\n","/*\n \n \n \n \n \n \n\n - Open management with \"open\" attribute\n - Direction management with \"direction\" attribute. Cumalative values: top, right, bottom, left\n*/\nimport { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['panel']\n\n connect() {\n document.addEventListener('click', () => this.#clickOutside(event));\n }\n\n disconnect() {\n document.removeEventListener('click', () => this.#clickOutside(event));\n }\n\n toggle() {\n this.element.toggleAttribute('open')\n }\n\n #clickOutside(event) {\n if (!this.element.contains(event.target)) {\n this.element.toggleAttribute('open', false);\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = [ \"toggles\" ]\n\n connect() {\n const toggles = this.togglesTarget.querySelectorAll('label input[type=\"radio\"]')\n toggles.forEach( toggle => toggle.addEventListener( \"click\", (event) => this.#toggle(event) ) )\n }\n\n #toggle(event) {\n this.element.dataset.userType = event.currentTarget.value\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['input', 'list', 'button']\n static values = {\n url: String,\n dataId: String,\n dataLabel: String,\n min: { type: Number, default: 3 }\n }\n\n static selectClasses = ['selected']\n\n connect() {\n const itemTemplate = this.listTarget.querySelector('template')\n this.itemTemplate = itemTemplate.content.cloneNode(true)\n itemTemplate.remove()\n\n this.buttonTarget.addEventListener('click', () => this.toggle())\n\n this.inputTarget.addEventListener('keyup', event => {\n switch (event.key) {\n case 'ArrowDown': this.selectFirst()\n break\n default:\n if (event.key.length != 1 && !['Backspace','Delete'].includes(event.key)) return\n this.search()\n }\n })\n\n this.listTarget.addEventListener('keydown', event => {\n event.preventDefault()\n switch (event.key) {\n case 'ArrowDown': this.selectNext()\n break\n case 'ArrowUp': this.selectPrevious()\n break\n case 'Enter': this.setSelected()\n break\n }\n })\n\n this.listTarget.addEventListener('click', event => {\n this.select(event.target)\n this.setSelected()\n })\n\n this.element.addEventListener('keydown', event => {\n if (event.key != 'Escape') return\n\n event.preventDefault()\n this.close()\n })\n\n document.addEventListener('click', event => this.closeOutside(event))\n\n this.search(false)\n }\n\n disconnect() {\n document.removeEventListener('click', event => this.closeOutside(event))\n }\n\n isOpen = () => !this.listTarget.classList.contains('hidden')\n\n open() {\n if (this.listTarget.childNodes.length === 0) return\n\n this.listTarget.classList.remove('hidden')\n }\n\n close() {\n this.listTarget.classList.add('hidden')\n this.unselect()\n }\n\n toggle = () => (this.isOpen() ? this.close() : this.open())\n\n closeOutside = event => !this.element.contains(event.target) && this.close()\n\n selectFirst() {\n const first = this.listTarget.firstElementChild\n if (!first) return\n\n this.open()\n this.select(first)\n this.listTarget.focus()\n this.listTarget.scrollTo(0,0)\n }\n\n selectPrevious() {\n const previous = this.selected()?.previousElementSibling\n if (!previous) {\n this.unselect()\n this.inputTarget.focus()\n return\n }\n\n this.select(previous)\n\n if (previous.getBoundingClientRect().top < this.listTarget.getBoundingClientRect().top)\n previous.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n }\n\n selectNext() {\n const next = this.selected() ? this.selected().nextElementSibling : this.listTarget.firstElementChild\n if (!next) return\n\n this.select(next)\n\n if (next.getBoundingClientRect().bottom > this.listTarget.getBoundingClientRect().bottom)\n next.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n }\n\n select(item) {\n this.unselect()\n item.classList.add(...this.constructor.selectClasses)\n item.dataset.selected = 'true'\n this.dispacthEvent('select', item, { 'id': item.getAttribute('data-auto-complete-item'), 'label': item.innerHTML })\n }\n\n selected = () => this.listTarget.querySelector('[data-selected]')\n\n unselect() {\n const item = this.selected()\n if (!item) return\n item.classList.remove(...this.constructor.selectClasses)\n delete item.dataset.selected\n this.dispacthEvent('unselect', item, { 'id': item.getAttribute('data-auto-complete-item'), 'label': item.innerHTML })\n }\n\n setSelected() {\n const item = this.selected()\n this.inputTarget.value = item.innerText\n this.listTarget.querySelectorAll('[data-auto-complete-item]:not([data-selected])').forEach(elmt => elmt.remove())\n this.close()\n this.inputTarget.focus()\n this.dispacthEvent('change', this.inputTarget, { 'id': item.getAttribute('data-auto-complete-item'), 'label': item.innerHTML })\n }\n\n search(openList=true) {\n if (this.inputTarget.value === '') {\n this.close()\n this.resetList()\n this.dispacthEvent('search', this.inputTarget, { 'search': '' })\n return\n } else if (this.inputTarget.value.length < this.minValue) {\n return\n }\n\n const url = new URL(this.urlValue)\n const searchParams = new URLSearchParams()\n searchParams.set('search', this.inputTarget.value)\n url.search = searchParams.toString()\n fetch(url, { headers: { 'X-Requested-With': 'XMLHttpRequest' } })\n .then(response => response.json())\n .then(data => {\n this.resetList()\n\n if (data.length <= 0) {\n this.close()\n return\n }\n\n data.forEach(obj => this.addItem(obj[this.dataIdValue], obj[this.dataLabelValue]))\n if (openList) this.open()\n })\n this.dispacthEvent('search', this.inputTarget, { 'search': this.inputTarget.value })\n }\n\n addItem(id, label) {\n const itemNode = this.itemTemplate.cloneNode(true)\n const item = itemNode.querySelector('[data-auto-complete-item]')\n label = label.replace(new RegExp(`(${this.inputTarget.value})`, 'gi'), '$1')\n item.setAttribute('data-auto-complete-item', id)\n item.innerHTML = label\n this.listTarget.appendChild(itemNode)\n }\n\n resetList = () => this.listTarget.innerHTML = ''\n\n dispacthEvent(type, node, detail=null) {\n const event = new CustomEvent(`auto-complete:${type}`, { bubbles: true, detail: detail })\n node.dispatchEvent(event)\n }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport Toast from 'libs/toast'\n\nexport default class extends Controller {\n static values = { url: String }\n static targets = ['country', 'zip', 'city']\n\n connect() {\n this.countryTarget.addEventListener('change', (event) => { this.#reset() })\n this.zipTarget.addEventListener('keyup', (event) => { this.#checkZip() })\n }\n\n #checkZip() {\n if (this.zipTarget.value === '') {\n this.#reset()\n return\n }\n\n const mask = new RegExp(this.countryTarget.querySelector(':checked').dataset.zipCodeMask)\n\n if (this.zipTarget.value.match(mask)) {\n this.zipTarget.blur()\n this.#searchCity()\n } else if (this.zipTarget.value.length == 5) {\n new Toast(I18n.t('js.me_location.unknow'), { type: 'alert' }).show()\n this.#reset()\n }\n }\n\n #searchCity() {\n const url = new URL(this.urlValue)\n url.search = new URLSearchParams({ country_id: this.countryTarget.value, zip_code: this.zipTarget.value }).toString()\n fetch(url, { headers: { 'X-Requested-With': 'XMLHttpRequest' } })\n .then(response => response.json())\n .then(data => {\n this.cityTarget.replaceChildren()\n if (data.length != 1)\n this.cityTarget.add(new Option(I18n.t(data.length == 0 ? 'js.me_location.unknow' : 'common.choose'), ''))\n data.forEach(city => this.cityTarget.add(new Option(city.name, city.id)))\n this.cityTarget.classList.toggle('one-option', data.length <= 1)\n this.cityTarget.removeAttribute('disabled')\n if (data.length > 1) this.cityTarget.focus()\n })\n }\n\n #reset() {\n this.zipTarget.value = ''\n this.cityTarget.replaceChildren()\n this.cityTarget.toggleAttribute('disabled', true)\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\n/*\n Custom progress or Rails progress ?\n let xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url);\n xhr.upload.addEventListener(\"progress\", ({loaded, total}) =>{})\n*/\nexport default class FileUploaderController extends Controller {\n static targets = [ 'file', 'button' ]\n\n connect() {\n this.element.addEventListener('turbo:submit-start', () => this.#submitStart(event))\n this.element.addEventListener('turbo:submit-end', () => this.#submitEnd(event))\n }\n\n browse() {\n this.fileTarget.click()\n }\n\n submit() {\n this.element.requestSubmit()\n }\n\n #submitStart() {\n this.buttonText = this.buttonTarget.innerText\n this.buttonTarget.innerText = I18n.t('js.upload.lock')\n this.buttonTarget.toggleAttribute('disabled', true)\n }\n\n #submitEnd() {\n this.buttonTarget.innerText = this.buttonText\n this.buttonTarget.toggleAttribute('disabled', false)\n }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport geolocation from 'libs/geolocation'\nimport Toast from 'libs/toast'\nimport { i18n } from 'locales/i18n'\n\nclass GeolocationController extends Controller {\n static AVAILABLE = 1\n static UNAVAILABLE = 2\n static DENIED = 3\n static targets = ['geolocation', 'city', 'error', 'citySearch', 'radius']\n static values = { searchCityUrl: String }\n\n positionStatus = GeolocationController.UNAVAILABLE\n #boundPositionUpdated\n #boundPositionDenied\n #boundPositionUnavailable\n\n initialize() {\n this.#boundPositionUpdated = this.#positionUpdated.bind(this)\n this.#boundPositionDenied = this.#positionDenied.bind(this)\n this.#boundPositionUnavailable = this.#positionUnavailable.bind(this)\n }\n\n connect() {\n document.addEventListener('position:updated', this.#boundPositionUpdated)\n document.addEventListener('position:denied', this.#boundPositionDenied)\n document.addEventListener('position:unavailable', this.#boundPositionUnavailable)\n\n if (geolocation.isAvailable())\n this.#updateStatus(GeolocationController.AVAILABLE)\n else\n this.startGeolocation()\n }\n\n disconnect() {\n document.removeEventListener('position:updated', this.#boundPositionUpdated)\n document.removeEventListener('position:denied', this.#boundPositionDenied)\n document.removeEventListener('position:unavailable', this.#boundPositionUnavailable)\n }\n\n geolocationMode(){\n this.geolocationTarget.querySelector('input[type=\"radio\"]').checked = true\n this.citySearchTarget.toggleAttribute('hidden', true)\n if (this.positionStatus == GeolocationController.DENIED)\n this.startGeolocation()\n }\n\n cityMode(){\n this.cityTarget.querySelector('input[type=\"radio\"]').checked = true\n this.citySearchTarget.removeAttribute('hidden')\n this.radiusTarget.dispatchEvent(new CustomEvent('update-radius', { detail: { radius: 50 } }))\n }\n\n startGeolocation() {\n this.geolocationTarget.toggleAttribute('progress', true)\n geolocation.start()\n }\n\n searchCity(event) {\n const keys = /^[a-zA-Z\\s]{1}$/\n if (!event.key?.match(keys)) return\n\n const url = new URL(this.searchCityUrlValue)\n const searchParams = new URLSearchParams()\n searchParams.set('name', this.citySearchTarget.querySelector('input').value)\n url.search = searchParams.toString()\n fetch(url, { headers: { 'X-Requested-With': 'XMLHttpRequest' } })\n .then(response => response.json())\n .then(data => {\n const list = this.citySearchTarget.querySelector('datalist')\n list.replaceChildren()\n data.forEach((city) => {\n let option = document.createElement('option')\n option.value = city.label\n option.dataset.id = city.id\n list.appendChild(option)\n })\n })\n }\n\n updateCityId(event) {\n if (event.inputType && event.inputType != 'insertReplacementText') return\n const cityName = event.currentTarget.value\n const cityId = this.citySearchTarget.querySelector('datalist').querySelector(`option[value=\"${cityName}\"]`)?.dataset?.id\n this.cityTarget.querySelector('input').value = cityId\n }\n\n #updateStatus(status) {\n this.positionStatus = status\n this.geolocationTarget.removeAttribute('progress')\n\n if (this.positionStatus == GeolocationController.AVAILABLE) {\n this.errorTarget.toggleAttribute('hidden', true)\n this.geolocationTarget.removeAttribute('unavailable')\n } else {\n //this.errorTarget.textContent = i18n.t(`js.geolocation.error.${this.positionStatus == GeolocationController.UNAVAILABLE ? 'unavailable' : 'denied'}`)\n this.errorTarget.removeAttribute('hidden')\n //new Toast(i18n.t('js.geolocation.error.toast', 'alert')).show()\n this.geolocationTarget.toggleAttribute('unavailable', true)\n this.cityMode()\n }\n }\n\n #positionUpdated(event) {\n this.#updateStatus(GeolocationController.AVAILABLE)\n }\n\n #positionUnavailable(event) {\n this.#updateStatus(GeolocationController.UNAVAILABLE)\n }\n\n #positionDenied(event) {\n this.#updateStatus(GeolocationController.DENIED)\n }\n}\n\nexport default GeolocationController\n","/*\n CSS is the key. Textarea works with by shadow content ::before to resize easily by CSS and not computed height with JS.\n\n
\n \n
\n*/\n\nimport {Controller} from '@hotwired/stimulus'\n\nexport default class extends Controller {\n connect() {\n const textarea = this.element.querySelector('textarea')\n textarea.addEventListener('input', this.#update)\n this.#update({currentTarget: textarea})\n }\n\n #update({currentTarget}) {\n currentTarget.parentNode.dataset.content = currentTarget.value\n }\n}\n","/*\n\n // Input drive Current and Length (event input + Init connect)\n
\n \n \n 0/0\n \n
\n\n // Need to Reset (example: clearable input)\n \n */\n\nimport {Controller} from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['input', 'current', 'length']\n\n connect() {\n this.lengthTarget.textContent = this.inputTarget.maxLength\n this.update()\n }\n\n update() {\n this.currentTarget.textContent = this.inputTarget.value.length\n }\n\n reset() {\n this.currentTarget.textContent = 0\n }\n}\n","/*\n \n \n \n \n */\n\nimport {Controller} from '@hotwired/stimulus';\n\nexport default class extends Controller {\n\n button = null\n input = null\n wrapper = null\n\n connect() {\n this.button = this.element.querySelector('button')\n this.input = this.button.previousElementSibling\n this.wrapper = this.input.parentNode\n this.button.addEventListener('click', () => this.#clear())\n }\n\n #clear () {\n this.input.value = ''\n this.wrapper.dataset.content = ''\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['panel']\n\n toggle(event) {\n const isHidden = !event.currentTarget.checked\n this.panelTarget.toggleAttribute('hidden', isHidden)\n isHidden && (this.panelTarget.querySelector('input').value = '')\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['panel', 'validator']\n connect() {\n this.element.querySelectorAll('input[type=radio]').forEach( radio => {\n radio.addEventListener('change', (event) => this.#toggle(event))\n })\n }\n\n disconnect() {\n this.element.querySelectorAll('input[type=radio]').forEach( radio => {\n radio.removeEventListener('change', (event) => this.#toggle(event))\n })\n }\n\n #toggle(event) {\n this.panelTarget.toggleAttribute('hidden', event.currentTarget!==this.validatorTarget)\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n initialize() {\n this.form = this.element.closest('form')\n }\n\n connect() {\n this.update()\n }\n\n update() {\n const userTypes = [...this.form.querySelectorAll('[data-user-type-id]:checked')].map(cb => parseInt(cb.dataset.userTypeId))\n\n if (userTypes.length == 1 && userTypes.includes(2)) {\n this.#toggleFemale(false)\n this.#toggleMale(true)\n } else if (!userTypes.includes(1) && !userTypes.includes(2) && userTypes.length > 0) {\n this.#toggleFemale(true)\n this.#toggleMale(false)\n } else {\n this.#toggleFemale(false)\n this.#toggleMale(false)\n }\n }\n\n #toggleFemale(disabled) {\n this.#toggle('female', disabled)\n }\n\n #toggleMale(disabled) {\n this.#toggle('male', disabled)\n }\n\n #toggle(type, disabled) {\n this.form.querySelectorAll(`[data-disabled-for-gender=\"${type}\"]`).forEach(e => e.toggleAttribute('disabled', disabled))\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['input', 'icon']\n\n toggle() {\n const isPassword = this.inputTarget.type === 'password';\n this.inputTarget.type = isPassword ? 'text' : 'password';\n this.iconTarget.classList.toggle('show--off', isPassword);\n this.iconTarget.classList.toggle('show--on', !isPassword);\n\n }\n}\n","/*\n\n data-controller=\"form--limit-choice\"\n data-form--limit-choice-max-value=\"8\"\n\n Example:\n\n \n <% UserDetail::bitfields[:swinging].keys.each_with_index do |swinging_type, i|%>\n \n <% end %>\n \n */\n\nimport { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n\n static values = {\n max: Number\n }\n\n checkboxes = null\n connect() {\n this.checkboxes = [...this.element.querySelectorAll('input[type=\"checkbox\"]')]\n this.element.addEventListener('change', (event) => {\n if (event.target.type === 'checkbox') this.#toggleSwitch()\n })\n this.#toggleSwitch()\n }\n\n #toggleSwitch() {\n this.checkboxes.map(checkbox => {\n checkbox.parentElement.toggleAttribute('disabled', !checkbox.checked && this.#checkMax() >= this.maxValue)\n })\n }\n\n #checkMax() {\n return this.checkboxes\n .filter(checkbox => checkbox.checked)\n .reduce((sum, checkbox) => sum + parseInt(checkbox.value, 10), 0)\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n reset() {\n this.element.reset()\n }\n}\n","import {Controller} from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['switch', 'panel']\n static checkboxes = null\n\n connect() {\n this.checkboxes = this.panelTarget.querySelectorAll('input[type=\"checkbox\"]')\n\n this.switchTarget.addEventListener(\"change\", () => this.#toggleSwitch() )\n this.checkboxes.forEach(checkbox => checkbox.addEventListener('change', () => this.#toggleType(event)))\n\n this.#toggleType()\n }\n\n disconnect() {\n this.switchTarget.removeEventListener(\"change\", () => this.#toggleSwitch() )\n this.checkboxes.forEach(checkbox => checkbox.removeEventListener('change', () => this.#toggleType(event)))\n }\n\n #toggleSwitch () {\n const isChecked = this.switchTarget.checked\n this.panelTarget.toggleAttribute('hidden', !isChecked)\n this.checkboxes.forEach(checkbox => checkbox.checked = isChecked)\n }\n\n #toggleType() {\n const isSomeChecked = [...this.checkboxes].some(checkbox => checkbox.checked)\n this.panelTarget.toggleAttribute('hidden', !isSomeChecked)\n this.switchTarget.checked = isSomeChecked\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static values = { selector: String }\n\n connect() {\n this.element.addEventListener('change', () => this.#populate(event) )\n }\n\n #populate(event) {\n document.querySelector(this.selectorValue).value = event.target.value\n }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport noUiSlider from 'nouislider'\n\nexport default class extends Controller {\n static targets = ['slider', 'inputMin', 'inputMax']\n\n connect() {\n this.slider = noUiSlider.create(this.sliderTarget, {\n start: [this.inputMinTarget.value, this.inputMaxTarget.value],\n connect: true,\n step: 1,\n margin: 5,\n range: { 'min': 18, 'max': 99 }\n })\n\n this.slider.on('update', (values, handle) => {\n this.sliderTarget.querySelector(`[data-handle='${handle}'`).dataset.label = parseInt(values[handle])\n })\n\n this.slider.on('set', (values) => {\n [this.inputMinTarget.value, this.inputMaxTarget.value] = values.map(d => parseInt(d, 10))\n })\n }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport noUiSlider from 'nouislider'\n\nexport default class extends Controller {\n static targets = ['slider', 'input']\n\n connect() {\n this.slider = noUiSlider.create(this.sliderTarget, {\n start: this.inputTarget.value,\n connect: 'lower',\n step: 1,\n margin: 5,\n range: { 'min': 0, 'max': 200 }\n })\n\n this.slider.on('update', (values, handle) => {\n this.sliderTarget.querySelector(`[data-handle='${handle}'`).dataset.label = parseInt(values[handle])\n })\n\n this.slider.on('set', (values) => {\n this.inputTarget.value = parseInt(values[0])\n })\n }\n\n setDefaultRadius(event) {\n const radius = event.detail.radius || 50\n this.slider.set(radius)\n }\n}\n","/*\n UI COMPONENT: Gender Filter Accordion management\n ---------------------------------------------------\n Compound Component : List custom Toggle + Linked Accordion + Toggle list\n All part are linked.\n\n HTML Structure\n ---------------------------------------------------\n \n\n // Part 1 - TOP\n \n
  • \n \n
  • \n [Continue…]\n
    \n\n // Part 2 - BOTTOM\n
    \n
    \">\n gender-filter#togglePanel:prevent\">\n \n \n \n\n // Part 3 - CONTENT (TOGGLE LIST)\n \n \n [Continue…]\n \n
    \n [Continue…]\n
    \n
    \n */\n\nimport { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['typeCheckbox', 'accordion', 'accordionPanel']\n\n connect() {\n this.accordionPanelTargets.forEach(\n (panel, index) => {\n panel.querySelectorAll('.toggle-button').forEach(\n button => button.addEventListener('change', () => this.#toggleChoice(panel, index))\n )\n this.#toggleChoice(panel, index);\n }\n )\n }\n\n toggleType(event) {\n const {index} = event.params\n const checked = event.currentTarget.checked\n const toggles = this.accordionTargets[index]?.querySelectorAll('input[type=\"checkbox\"]')\n toggles?.forEach(toggle => toggle.checked = checked)\n }\n\n #toggleChoice(panel, index) {\n const checkboxes = panel.querySelectorAll('input[type=\"checkbox\"]')\n this.typeCheckboxTargets[index].checked = [...checkboxes].some(checkbox => checkbox.checked)\n this.typeCheckboxTargets[index].dispatchEvent(new Event('change', { bubbles: true }))\n }\n\n togglePanel({params: {index}}) {\n this.accordionTargets.forEach((panel, current) => panel.open = index === current ? !panel.open : false)\n }\n}\n","/*\n History management\n*/\nimport { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n // History\n addAnchorToCurrentState(event) {\n const anchor = event.currentTarget.dataset.anchor\n let url = new URL(window.location.href)\n url.hash = anchor\n // Use Turbo internals to generate a proper restoration state\n Turbo.navigator.history.update(history.replaceState, url)\n }\n}\n","import { Application } from '@hotwired/stimulus'\nimport { definitionsFromContext } from '@hotwired/stimulus-webpack-helpers'\n\nconst application = Application.start()\nconst context = require.context('.', true, /_controller\\.js$/)\napplication.load(definitionsFromContext(context))\n\n// Configure Stimulus development experience\napplication.debug = false\nwindow.Stimulus = application\n\nexport { application }\n","/*\n Load url with Turbo Stream headers when element\n intersect with viewport or custom container\n ---------------------------------------------------\n\n
    \">\n
    \n\n Parameters\n ---------------------------------------------------\n data-load-on-intersection-url-value=\"url\"\n data-load-on-intersection-root-value=\"#selector\" (optional)\n data-load-on-intersection-root-margin-value=\"200px\" (optional)\n*/\nimport { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static values = { url: String, root: String, rootMargin: String }\n\n initialize() {\n const options = {\n root: (this.rootValue ? document.querySelector(this.rootValue) : null),\n rootMargin: this.rootMarginValue || '50%'\n }\n\n this.intersectionObserver = new IntersectionObserver(entries => this.processIntersectionEntries(entries), options)\n }\n\n connect() {\n this.intersectionObserver.observe(this.element)\n }\n\n disconnect() {\n this.intersectionObserver.unobserve(this.element)\n }\n\n processIntersectionEntries(entries) {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n this.load()\n }\n })\n }\n\n load() {\n fetch(this.urlValue, { headers: { accept: 'text/vnd.turbo-stream.html', 'X-Requested-With': 'XMLHttpRequest' } })\n .then(response => response.text())\n .then((data) => {\n Turbo.renderStreamMessage(data)\n })\n .then(_ => history.replaceState(history.state, '', this.urlValue))\n }\n}\n","/*\n UI COMPONENT: Menu open/close management\n ---------------------------------------------------\n */\nimport {Controller} from '@hotwired/stimulus';\n\nexport default class extends Controller {\n\n // $(document).on 'click', '[data-menu-burger]', (e) ->\n // $('body').toggleClass 'navigation-menu--open'\n\n // $(document).on 'click', '[data-menu] a', (e) ->\n // $('body').removeClass 'navigation-menu--open'\n \n toggle() {\n document.body.toggleAttribute('menu-is-open')\n }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport Toast from 'libs/toast'\n\nexport default class extends Controller {\n open() {\n this._toggle(true)\n }\n\n close(event) {\n const response = event.detail?.fetchResponse?.response\n\n if (event.type == 'turbo:submit-end') {\n const headers = response.headers\n if (headers.get('x-message'))\n new Toast(decodeURIComponent(escape(headers.get('x-message'))), { type: headers.get('x-message-type') }).show()\n\n if (!event.detail.success) return\n else if (headers.get('redirect-to')) this.#redirect(headers.get('redirect-to'))\n }\n\n if (response?.status != 206) // Do not close on Partial Content\n this._toggle(false)\n }\n\n #redirect(url) {\n history.pushState(\n { turbo_frame_history: true },\n '',\n url\n )\n\n Turbo.visit(url)\n }\n\n _toggle(state) {\n this.element.toggleAttribute('hidden', !state)\n document.body.classList.toggle('modal-is-open', state) // Main scroll lock\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n\n panels = null\n form = null\n\n connect() {\n this.form = this.element.querySelector('fieldset')\n this.panels = this.element.querySelectorAll('panel-buttons')\n }\n\n toggle() {\n this.panels.forEach(panel => panel.toggleAttribute('hidden'))\n this.form.toggleAttribute('disabled')\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['day', 'month', 'year', 'error']\n\n check(event) {\n const birthDate = new Date(this.yearTarget.value, this.monthTarget.value, this.dayTarget.value)\n birthDate.setFullYear(birthDate.getFullYear() + 18)\n\n if (!this.yearTarget.value) {\n this.errorTarget.classList.remove('hidden')\n event.stopImmediatePropagation()\n } else if (birthDate > new Date()) {\n location.href = 'https://www.google.fr'\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = [ 'product', 'newProduct', 'confirm' ]\n\n connect() {\n this.productTargets.forEach((element) => {\n element.addEventListener('click', () => { this.selectProduct(element) })\n })\n }\n\n selectProduct(product) {\n this.productTargets.forEach((element) => element.firstElementChild.removeAttribute('active'))\n product.firstElementChild.toggleAttribute('active', true)\n\n this.newProductTarget.firstElementChild.replaceWith(product.firstElementChild.cloneNode(true))\n\n this.confirmTarget.querySelector('form').elements['product_id'].value = product.dataset.productId\n this.confirmTarget.removeAttribute('hidden')\n\n //this.confirmTarget.scrollIntoView({ behavior: 'smooth', block: \"end\" })\n\n const elementTop = this.confirmTarget.getBoundingClientRect().top + window.scrollY\n const offset = 55 // 55 = header height - 1px (hr)\n window.scrollTo({ top: elementTop - offset, behavior: 'smooth' })\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static values = {\n target: String,\n backPath: String\n }\n\n use(event) {\n const sentense = document.getElementById(event.currentTarget.dataset.target).innerText\n\n if (this.targetValue) {\n const target = document.getElementById(this.targetValue)\n const [start, end] = [target.selectionStart, target.selectionEnd]\n target.setRangeText(sentense, start, end, 'end')\n target.dispatchEvent(new Event('input'))\n target.focus()\n } else if(this.backPathValue) {\n const frame = this.element.closest('turbo-frame#modal')\n if (!frame) return\n\n frame.src = `${this.backPathValue}?text=${encodeURIComponent(sentense)}`\n frame.reload()\n event.stopImmediatePropagation()\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport { loadStripe } from '@stripe/stripe-js/pure'\nimport { MeConfig } from 'config.js'\n\nexport default class extends Controller {\n static targets = [ 'product', 'stripe', 'stripeElements', 'stripeError', 'stripeSubmit', 'selectedAmount', 'selectedDuration' ]\n\n connect() {\n if (!this.hasProductTarget) return\n\n this.paymentIntent = null\n this.stripeElements = null\n this.stripeOptions = JSON.parse(this.stripeTarget.dataset.options)\n delete this.stripeTarget.dataset.options\n\n loadStripe(MeConfig.stripe.publicKey).then(stripe => this.stripe = stripe)\n\n this.productTargets.forEach((element) => {\n element.addEventListener('click', () => { this.selectProduct(element) })\n })\n }\n\n selectProduct(product) {\n this.productTargets.forEach((element) => element.firstElementChild.removeAttribute('active'))\n product.firstElementChild.toggleAttribute('active', true)\n\n this.#disableStripeSubmit()\n\n const url = new URL(product.dataset.url)\n if (this.paymentIntent) // Reuse existing intent if exists\n url.search = new URLSearchParams({ stripe_pi: this.paymentIntent }).toString()\n\n fetch(url, { headers: { 'X-Requested-With': 'XMLHttpRequest' } })\n .then(response => response.json())\n .then(data => {\n this.selectedDurationTarget.textContent = I18n.t('js.subscriptions.duration')[data.duration]\n this.selectedAmountTarget.textContent = data.amount.toLocaleString(I18n.locale, { style: 'currency', currency: 'EUR', minimumFractionDigits: Math.ceil(data.amount % 1) * 2 })\n\n if (this.stripeElements) {\n this.stripeElements.fetchUpdates().then(() => {\n this.#enableStripeSubmit();\n this.stripeTarget.scrollIntoView({ behavior: 'smooth' })\n })\n } else {\n this.#initStripeElements(data.client_secret)\n }\n })\n }\n\n #initStripeElements(clientSecret){\n this.stripeElements = this.stripe.elements({\n clientSecret,\n appearance: { variables: { colorPrimary: window.getComputedStyle(document.documentElement).getPropertyValue('--color-payment-form') } }\n })\n\n const paymentElements = this.stripeElements.create('payment', { fields: { billingDetails: { name: 'auto', email: 'never', address: 'never' } }, terms: { card: 'never' } });\n paymentElements.on('ready', () => {\n this.stripeTarget.removeAttribute('hidden')\n this.#enableStripeSubmit()\n this.stripeTarget.scrollIntoView({ behavior: 'smooth' })\n })\n paymentElements.mount(this.stripeElementsTarget)\n\n const paymentIntent = clientSecret.split('_secret_')[0]\n\n this.stripeTarget.querySelector('form').addEventListener('submit', (event) => {\n event.preventDefault()\n this.#disableStripeSubmit();\n\n this.stripe.confirmPayment({\n elements: this.stripeElements,\n confirmParams: {\n return_url: this.stripeOptions.returnUrl,\n payment_method_data: {\n billing_details: {\n email: this.stripeOptions.user_email, phone: '',\n address: { city: '', country: this.stripeOptions.user_country, line1: '', line2: '', postal_code: '', state: '' }\n }\n }\n }\n }).then((result) => {\n if (result.error) {\n if (result.error.type !== 'validation_error') { this.stripeError.textContent = result.error.message }\n this.#enableStripeSubmit()\n }\n })\n })\n }\n\n #enableStripeSubmit(){\n this.stripeSubmitTarget.removeAttribute('disabled')\n }\n\n #disableStripeSubmit(){\n this.stripeSubmitTarget.toggleAttribute('disabled', true)\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n\n offset = 24\n\n initialize() {\n this.observer = null\n }\n\n connect() {\n this.#scrollIntoView(this.element.querySelector('[active]'))\n\n this.observer = new MutationObserver((mutationList, _observer) => {\n mutationList.some((mutation) => {\n const match = mutation.type == 'attributes' && mutation.attributeName == 'active' && mutation.target.hasAttribute('active')\n if (match) this.#scrollIntoView(mutation.target)\n return match\n })\n })\n this.observer.observe(this.element, { attributes: true, subtree: true, attributeFilter: ['active'] })\n }\n\n disconnect() {\n this.observer.disconnect()\n }\n\n #scrollIntoView(element) {\n if (!element) return\n\n const container = element.parentNode\n const child_offsetRight = element.offsetLeft + element.offsetWidth;\n const container_scrollRight = container.scrollLeft + container.offsetWidth\n\n if (container.scrollLeft > element.offsetLeft) {\n container.scrollLeft = element.offsetLeft - this.offset\n } else if (container_scrollRight < child_offsetRight) {\n container.scrollLeft += child_offsetRight - container_scrollRight + this.offset\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n connect() {\n this.element.scrollIntoView()\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n\n connect() {\n window.addEventListener('scroll', () => this.#checkScroll())\n }\n\n disconnect() {\n window.removeEventListener('scroll', () => this.#checkScroll())\n }\n\n go () {\n window.scrollTo({\n top: 0,\n behavior: 'smooth'\n })\n }\n\n #checkScroll() {\n this.#display(window.scrollY > window.innerHeight * 2)\n }\n\n #display (toggle) {\n this.element.toggleAttribute('show', toggle)\n }\n}\n","/*\n UI COMPONENT: Slider in Infotainment Cards\n ---------------------------------------------------\n\n Stimulus API in HTML\n ---------------------------------------------------\n data-action=\"slider#prev\"\n data-action=\"slider#next\"\n */\nimport { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n\n imagesDisplay = 2\n imagesLength\n imageWidth\n scrollIndex = 0\n scroller\n prevButton\n nextButton\n\n connect() {\n const images = this.element.querySelectorAll('infotainment-picture > img')\n this.imagesLength = images.length\n this.imageWidth = images[0].clientWidth\n\n this.scroller = this.element.querySelector('infotainment-picture')\n this.scroller.addEventListener('scroll', () => this.#scrollHandler())\n\n this.prevButton = this.element.querySelector('infotainment-pictures > button.start')\n this.nextButton = this.element.querySelector('infotainment-pictures > button.end')\n\n this.#reset()\n }\n\n prev() {\n this.scrollIndex = Math.max(this.scrollIndex - this.imagesDisplay, 0)\n this.#scroll()\n }\n\n next() {\n this.scrollIndex = Math.min(this.scrollIndex + this.imagesDisplay, this.imagesLength - this.imagesDisplay)\n this.#scroll()\n }\n\n #scroll() {\n this.scroller.scrollTo({\n left: this.scrollIndex * this.imageWidth,\n behavior: 'smooth'\n })\n this.#updateButtonState()\n }\n\n #scrollHandler() {\n this.scrollIndex = Math.round(this.scroller.scrollLeft / this.imageWidth)\n this.#updateButtonState()\n }\n\n #updateButtonState() {\n this.prevButton.disabled = this.scrollIndex === 0\n this.nextButton.disabled = this.scrollIndex >= this.imagesLength - this.imagesDisplay\n }\n\n #reset() {\n this.scroller.scrollTo({\n left: 0,\n })\n this.#updateButtonState()\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n\n slider = null\n slideWidth = 0\n slidesCount = 0\n interval = null\n index = 0\n buttons = null\n\n connect() {\n this.slider = this.element.querySelector('slider-stripe')\n this.slideWidth = this.element.clientWidth\n this.slidesCount = this.slider.querySelectorAll('tips-card').length\n\n if (this.slidesCount < 2) return\n\n this.#startAutoSlide()\n this.slider.addEventListener('touchstart', () => this.#stopAutoSlide())\n this.slider.addEventListener('scroll', () => this.#scrollHandler())\n this.slider.addEventListener('wheel', (event) => { if (Math.abs(event.deltaX) > 1) this.#stopAutoSlide() })\n\n this.#createSliderNav(this.slidesCount)\n this.buttons = this.element.querySelectorAll('slider-nav>button')\n }\n\n #scroll() {\n this.slider.scrollTo({\n left: this.index * this.slideWidth,\n behavior: 'smooth'\n })\n }\n\n #startAutoSlide() {\n this.interval = setInterval(() => this.#autoSlide(), 3000)\n }\n\n #stopAutoSlide() {\n clearInterval(this.interval)\n }\n\n #stopAutoSlideAfterLoop() {\n if (this.index === this.slidesCount - 1) this.#stopAutoSlide()\n }\n\n #autoSlide() {\n this.#stopAutoSlideAfterLoop()\n\n this.index = (this.index + 1) % this.buttons.length;\n\n this.#scroll()\n this.#updateButtonState()\n }\n\n #scrollHandler() {\n this.index = Math.round(this.slider.scrollLeft / this.slideWidth)\n this.#updateButtonState()\n }\n\n #buttonHandler(button, index) {\n button.index = index\n button.addEventListener('click', () => {\n this.index = button.index\n this.#stopAutoSlide()\n this.#scroll()\n this.#updateButtonState()\n })\n }\n\n #updateButtonState() {\n this.buttons.forEach((button, index) => button.toggleAttribute('active', index === this.index))\n }\n\n #createButton(label, active=false) {\n const button = document.createElement('button')\n if (active) button.setAttribute('active', '')\n\n const span = document.createElement('span')\n span.classList.add('sr-only')\n span.textContent = label\n button.appendChild(span)\n\n return button;\n }\n\n #createSliderNav(count=1) {\n const nav = document.createElement('slider-nav');\n\n let index = 0;\n while (index < count) {\n const button = this.#createButton(index, index === 0)\n nav.appendChild(button)\n this.#buttonHandler(button, index)\n index++\n }\n\n this.element.appendChild(nav)\n }\n}\n","import { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n\n connect() {\n this.buttons = this.element.querySelectorAll('switch-nav > button')\n this.sections = this.element.querySelectorAll('info-group')\n\n this.buttons.forEach(button => button.addEventListener('click', () => {\n this.#toggleInfos()\n this.#toggleButtons(button.dataset.target)\n }))\n }\n\n #toggleButtons (target) {\n this.buttons.forEach( button => button.toggleAttribute('active', target === button.dataset.target))\n }\n\n #toggleInfos () {\n this.sections.forEach( section => section.toggleAttribute('hidden'))\n }\n}\n","/*\n UI COMPONENT: Switch tabs/panel management\n ---------------------------------------------------\n\n \n \n \n \n \n \n \n \n \n \n\n ---------------------------------------------------\n Open tab - remove attribute \"hidden\"\n Active button - attribute \"active\"\n\n Stimulus API in HTML\n ---------------------------------------------------\n data-tabs--switch-panel-target=\"trigger\"\n data-action=\"tabs--switch-panel#toggle\"\n*/\nimport {Controller} from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['trigger', 'panel'];\n\n toggle({currentTarget}) {\n this.triggerTargets.forEach(button => button.toggleAttribute('active', button === currentTarget))\n this.panelTargets.forEach((panel, index) => panel.toggleAttribute('hidden', this.triggerTargets[index] !== currentTarget))\n }\n}\n","import { Controller } from '@hotwired/stimulus'\nimport Toast from 'libs/toast'\n\nexport default class extends Controller {\n\n connect() {\n new Toast(this.element.textContent, { type: this.element.getAttribute('type') }).show()\n this.element.remove()\n }\n}\n","/*\n\n \n <%= f.file_field :avatar, id: 'uploaded_file', data: { action: 'upload-media#preview' } %>\n <%= f.label :avatar, t('buttons.add_photo'), class: 'my-8 flex justify-center text-neutral-medium icon+text-label-md' do %>\n <%= t 'buttons.download_photo' %>\n <%end %>\n <%= hidden_field_tag :delete_file, false, data: { upload_media_target: 'delete' } %>\n \n \n \n <%= error_message_for f, :avatar %>\n\n*/\n\nimport { Controller } from '@hotwired/stimulus'\n\nexport default class extends Controller {\n static targets = ['preview', 'delete']\n\n connect() {\n this.#setPreviewActive(this.previewTarget.src)\n }\n\n preview(event) {\n const node = event.currentTarget\n const file = node.files[0]\n if (!file) return\n\n if (file.type.startsWith('image/'))\n this.#previewImage(file)\n else if (file.type.startsWith('video/'))\n this.#previewVideo(file, node.dataset.previewFallback)\n else\n this.#setPreviewActive(false)\n }\n\n delete() {\n this.#setPreviewActive(false)\n this.previewTarget.src = ''\n }\n\n #previewImage(file) {\n const reader = new FileReader()\n reader.readAsDataURL(file)\n reader.onload = (event) => {\n this.previewTarget.src = event.target.result\n this.#setPreviewActive(true)\n }\n }\n\n #previewVideo(file, fallback) {\n const video = document.createElement('video')\n\n // Fire a seek event to make it work on Chrome\n video.addEventListener('loadedmetadata', () => {\n video.currentTime = video.duration > 5 ? 5 : video.duration / 2\n })\n\n video.addEventListener('seeked', () => {\n const canvas = document.createElement('canvas')\n canvas.width = video.videoWidth\n canvas.height = video.videoHeight\n const ctx = canvas.getContext('2d')\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height)\n canvas.toBlob((blob) => {\n this.previewTarget.src = URL.createObjectURL(blob)\n }, 'image/jpeg', 0.6)\n this.#setPreviewActive(true)\n }, { once: true })\n\n if (fallback) {\n video.addEventListener('error', () => {\n this.previewTarget.src = fallback\n this.#setPreviewActive(true)\n })\n }\n\n video.src = URL.createObjectURL(file)\n }\n\n #setPreviewActive(active = false) {\n this.element.toggleAttribute('uploaded', active)\n if (!active) this.previewTarget.removeAttribute('src')\n if (this.hasDeleteTarget)\n this.deleteTarget.value = !active\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n\n open({ params: { url} }) {\n const layer = document.createElement('layer-video')\n layer.innerHTML = this.#build(url)\n document.body.appendChild(layer)\n }\n\n #build(url) {\n return `\n \n \n \n `\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n connect() {\n this.element.addEventListener(\"resize\", () => {\n this.#resize()\n })\n }\n\n #resize(){\n const video = this.element\n const width = video.videoWidth\n const height = video.videoHeight\n video.style.maxWidth = `${width}px`\n video.style.maxHeight = `${height}px`\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { pinia } from 'stores'\nimport { mapState } from 'pinia'\nimport { createApp } from 'vue'\nimport { useChatStore } from 'stores/chat_store'\n\nexport default class extends Controller {\n initialize() {\n this.app = createApp({\n name: 'ChatStatus',\n compilerOptions: { isCustomElement: tag => tag.includes('-') },\n computed: mapState(useChatStore, ['isConnected', 'status', 'conversationCount']),\n methods: {\n hide(){\n $.me.chat.hide()\n },\n\n toggle(){\n $.me.chat.toggle()\n },\n\n showNewMessages(){\n $.me.chat.showNewMessages()\n }\n }\n }).use(pinia)\n }\n\n connect() {\n this.app.mount(this.element)\n }\n\n disconnect() {\n this.app.unmount()\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { pinia } from 'stores'\nimport { mapState, mapStores } from 'pinia'\nimport { createApp } from 'vue'\nimport { useNotificationsStore } from 'stores/notifications_store'\nimport { useChatStore } from 'stores/chat_store'\n\nexport default class extends Controller {\n initialize() {\n this.app = createApp({\n name: 'NotificationBar',\n compilerOptions: { isCustomElement: tag => tag.includes('-') },\n computed: {\n ...mapState(useNotificationsStore, ['chatMessages', 'pmessages', 'kisses', 'formViews', 'friendships', 'testimonials', 'socialNotifications', 'events']),\n ...mapStores(useChatStore),\n requests() { return this.friendships + this.testimonials },\n all() { return this.kisses + this.formViews + this.friendships + this.testimonials + this.socialNotifications }\n },\n methods: {\n openChat(e) {\n if (this.chatMessages == 0) return\n e.preventDefault()\n return $.me.chat.selectConversationIfExists()\n },\n\n toggleChat() {\n return $.me.chat.toggle()\n },\n\n hideChat() {\n return $.me.chat.hide()\n },\n\n format(value, max) {\n if (max == null) max = 99\n if (value == 0) return ''\n if (value > max) return `${max}+`\n return value.toString()\n }\n }\n }).use(pinia)\n }\n\n connect() {\n this.app.mount(this.element)\n }\n\n disconnect() {\n this.app.unmount()\n }\n}\n","/*\n Dialog\n */\nimport { i18n } from 'locales/i18n'\n\nexport default class Dialog {\n constructor(message, options = {}) {\n this.message = message\n this.title = options.title\n this.okLabel = options.okLabel || i18n.t('buttons.ok')\n }\n\n show() {\n this.buildNode()\n\n document.body.appendChild(this.element)\n\n return new Promise((resolve, reject) => {\n this.element.querySelectorAll('[data-dialog-resolve]').forEach((button) => {\n button.addEventListener('click', (e) => {\n this.remove()\n resolve(e.target.dataset.dialogResolve === 'true')\n }, { once: true })\n })\n })\n }\n\n remove() {\n this.element.remove()\n }\n\n buildNode() {\n const placeholder = document.createElement('div')\n placeholder.innerHTML = this.template()\n if (this.message instanceof DocumentFragment)\n placeholder.querySelector('[data-dialog-message]').replaceWith(this.message)\n else\n placeholder.querySelector('[data-dialog-message]').innerHTML = this.message\n\n this.element = placeholder.firstElementChild\n }\n\n template() {\n return `\n \n \n \n \n ${this.templateContent()}\n \n \n \n \n `\n }\n\n templateContent() {\n return `\n ${this.templateTitle()}\n
    \n \n \n \n `\n }\n\n templateTitle() {\n return `

    ${this.title || ''}

    `\n }\n}\n","/*\n Geolocation\n*/\n\nclass Geolocation {\n lat = null\n lng = null\n #watcherHandler = null\n #timestamp = null\n\n start() {\n if (this.#watcherHandler) return\n\n this.#watcherHandler = navigator.geolocation.watchPosition(\n (position) => this.#success(position),\n (error) => this.#error(error)\n )\n }\n\n stop() {\n if (!this.#watcherHandler) return\n\n navigator.geolocation.clearWatch(this.#watcherHandler)\n this.#watcherHandler = null\n this.#timestamp = null\n }\n\n restart() {\n this.stop()\n this.start()\n }\n\n isAvailable() {\n return this.#timestamp != null\n }\n\n #success(position) {\n this.lat = position.coords.latitude\n this.lng = position.coords.longitude\n\n if (this.#timestamp && position.timestamp - this.#timestamp < 900000)\n return\n\n this.#timestamp = position.timestamp\n this.#updatePosition()\n\n const event = new CustomEvent('position:updated', { detail: { lat: this.lat, lng: this.lng } })\n document.dispatchEvent(event)\n }\n\n #error(error) {\n if (error.code == error.PERMISSION_DENIED) {\n this.stop()\n document.dispatchEvent(new Event('position:denied'))\n } else if (!this.isAvailable()) {\n document.dispatchEvent(new Event('position:unavailable'))\n }\n }\n\n #updatePosition() {\n fetch('/update_position', {\n method: 'PUT',\n headers: {\n 'X-CSRF-Token': document.querySelector(\"[name='csrf-token']\").content,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-Requested-With': 'XMLHttpRequest'\n },\n body: JSON.stringify({ lat: this.lat, lng: this.lng })\n })\n }\n}\n\nexport default new Geolocation()\n","/*\n Toast message\n*/\n\nexport default class Toast {\n constructor(message, options = {}) {\n this.message = message\n this.type = options.type || 'notice'\n\n this.element = this.buildNode()\n }\n\n show() {\n document.body.appendChild(this.element)\n }\n\n close() {\n this.element.remove()\n }\n\n buildNode() {\n const node = document.createElement('toast-component')\n node.innerHTML = this.#template(this.type)\n node.addEventListener('animationend', () => this.close())\n node.querySelector('button').addEventListener('click', () => this.close())\n return node\n }\n\n #template(type) {\n return `\n \n ${this.message}\n \n \n `\n }\n}\n","import { I18n } from 'i18n-js'\nimport locales from './locales.json'\n\nexport const i18n = new I18n()\ni18n.store(locales)\ni18n.defaultLocale = 'fr'\ni18n.enableFallback = true\ni18n.locale = document.documentElement.lang","import { defineStore } from 'pinia'\n\nexport const useChatStore = defineStore('chat', {\n state: () => {\n return {\n isConnected: false,\n status: 0, // Disconnected, 1: Connected, 2: Conversations 3: New Messages, 4: WebRTC\n conversationCount: 0,\n isOpened: false,\n call: {\n enabled: false,\n kind: null\n }\n }\n },\n actions: {\n setChatOpen(isOpened) {\n this.isOpened = isOpened\n },\n\n setCall(enabled, kind) {\n this.call.enabled = enabled\n if (kind)\n this.call.kind = kind\n }\n }\n})\n","import { defineStore } from 'pinia'\n\nexport const useCommonStore = defineStore('common', {\n state: () => {\n return {\n currentUser: null,\n location: null,\n device: 0\n }\n },\n actions: {\n isDesktopDevice() {\n this.device == 0\n },\n\n isMobileDevice() {\n this.device == 1\n },\n\n isTabletDevice() {\n this.device == 2\n }\n }\n})\n","import { createPinia } from 'pinia'\n\nexport const pinia = createPinia()\n","import { defineStore } from 'pinia'\n\nexport const useNotificationsStore = defineStore('notifications', {\n state: () => {\n return {\n chatMessages: 0,\n pmessages: 0,\n kisses: 0,\n formViews: 0,\n friendships: 0,\n testimonials: 0,\n socialNotifications: 0,\n events: 0\n }\n },\n actions: {\n set(field, value) {\n this[field] = value\n },\n\n increment(field) {\n this[field]++\n return this[field]\n },\n\n decrement(field) {\n if (this[field] > 0)\n this[field]--\n return this[field]\n }\n }\n})\n","import { StreamActions } from '@hotwired/turbo'\nimport Toast from 'libs/toast'\n\nStreamActions.toast = function() {\n const message = this.getAttribute('message')\n const type = this.getAttribute('type')\n new Toast(message, { type: type }).show()\n}\n","import { StreamActions } from '@hotwired/turbo'\nimport Dialog from 'libs/dialog'\n\nStreamActions.dialog = function() {\n const message = this.templateContent\n const title = this.getAttribute('title')\n const redirectTo = this.getAttribute('redirect_to')\n const okLabel = this.getAttribute('ok_label')\n\n new Dialog(message, { title: title, okLabel: okLabel }).show().then(() => {\n if (!redirectTo) return\n\n if (window.ReactNativeWebView) {\n window.location.href = redirectTo\n } else {\n Turbo.visit(redirectTo)\n }\n })\n}\n","import { StreamActions } from '@hotwired/turbo'\n\nStreamActions.toggle_css_class = function() {\n const classes = this.getAttribute('classes')\n let force = this.getAttribute('force')?.toLowerCase()\n if (force) force = force === 'true'\n\n this.targetElements.forEach((e => e.classList.toggle(classes, force)))\n}\n","#\n# Meeting Engine core JS\n#\n\n# import Rails from '@rails/ujs'\n# import { createApp } from 'vue/dist/vue.esm-bundler'\n# import { createStore, mapState } from 'vuex/dist/vuex.esm-bundler'\n# import Toast from 'libs/toast'\n\n$.me = $.me || {}\n$.extend true, $.me, {\n #----------------------------#\n # Execute a function by name #\n #----------------------------#\n executeByName: (name, context=@, args...) ->\n namespaces = name.split '.'\n fn = namespaces.pop()\n\n try\n context = context[namespace] for namespace in namespaces\n throw(false) unless $.isFunction context[fn]\n catch e\n return false\n\n context[fn].apply context, args\n\n #-----------------------------#\n # Execute the action callback #\n #-----------------------------#\n actionCallback: (controller, action) ->\n $.me.executeByName \"#{controller}.#{action}_act\" if controller && action\n\n #---------------------------------------------#\n # Execute the action callback from xhr object #\n #---------------------------------------------#\n # actionCallbackXhr: (xhr) -> @actionCallback xhr.getResponseHeader('X-Controller'), xhr.getResponseHeader('X-Action')\n\n # intersectionObserver: (callback, observe, options = {}) ->\n # return unless IntersectionObserver?\n # vpObserver = new IntersectionObserver callback, options\n # vpObserver.observe observe\n\n # $(document).one 'turbo:before-visit', ->\n # vpObserver.disconnect()\n\n # scrollIntoView: ($elmt, inWindow = true) ->\n # return unless MutationObserver?\n\n # position = $($elmt).position()\n # if position && position.top > $('body').height()\n # observer = new MutationObserver ->\n # if inWindow\n # window.scrollTo\n # top: position.top,\n # left: 0,\n # behavior: 'smooth'\n # else\n # $($elmt).get(0).scrollIntoView\n # behavior: 'smooth'\n\n # observer.disconnect()\n # return\n # observer.observe $('body').get(0),\n # childList: true\n # return\n\n #---------#\n # Storage #\n #---------#\n # TODO : Useless, to be Removed\n # storage:\n # set: (key, value) -> sessionStorage.setItem key, JSON.stringify(value)\n # get: (key) -> JSON.parse sessionStorage.getItem(key)\n # remove: (key) -> sessionStorage.removeItem(key)\n # clear: () -> sessionStorage.clear()\n # keyExists: (key) -> sessionStorage.getItem(key) isnt null\n\n jsonUtils:\n dateTimeFormat: /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?[Z\\+]{1}([\\d\\:]{5})?$/\n\n reviver: (key, value) ->\n if typeof value is 'string' && $.me.jsonUtils.dateTimeFormat.test(value)\n return new Date(value)\n else\n return value\n\n #---------------------------------------------------------------------------#\n # Extend UJS : update DOM on ajax:success with the following actions : #\n # update, prepend, append, replace, remove #\n # A selector should be provided in the data attribute #\n # A replace action without selector will replace the whole template #\n #---------------------------------------------------------------------------#\n # ujsExtended:\n # init: ->\n # $(document).on 'ajax:success', '[data-update],[data-prepend],[data-append],[data-replace],[data-remove],[data-multi-renderer]', (e) =>\n # [data, status, xhr] = e.detail if e.detail\n\n # if $.isPlainObject(data) and elmts = $(e.target).data('multi-renderer')\n # $.each elmts, (verb, selectors) =>\n # $.each selectors.split(','), (index, selector) =>\n # $elmt = $(selector)\n # if $elmt?\n # if verb == 'update' then $elmt.html data[selector.trim()]\n # else if verb == 'prepend' then $elmt.prepend data[selector.trim()]\n # else if verb == 'append' then $elmt.append data[selector.trim()]\n # else if verb == 'replace' then $elmt = $(data[selector.trim()]).replaceAll($elmt)\n\n # @_scroll_and_trigger e, $elmt\n # else if xhr\n # unless xhr.responseText and typeof xhr.responseText is 'string' and xhr.responseText.match(/^Turbo/)\n # if elmt = $(e.target).data 'remove'\n # $(elmt).trigger('me:domRemove').remove()\n # else\n # if (elmt = $(e.target).data 'update')?\n # if elmt\n # $(elmt).html xhr.responseText\n # else\n # elmt = '[data-main-container]'\n # $(elmt).html xhr.responseText\n # window.scrollTo 0,0\n # document.getElementById('container')?.scrollTo 0,0 # TODO : Cleanup this shitty mobile fix\n # $.me.actionCallbackXhr xhr\n # else if elmt = $(e.target).data 'prepend' then $(elmt).prepend xhr.responseText\n # else if elmt = $(e.target).data 'append' then $(elmt).append xhr.responseText\n # else if elmt = $(e.target).data 'replace' then elmt = $(xhr.responseText).replaceAll(elmt)\n\n # @_scroll_and_trigger e, elmt\n\n # _scroll_and_trigger: (e, elmt) ->\n # if elmt\n # if $(e.target).is('[data-scroll-to-elmt]') && $(e.target).data('scroll-to-elmt') != ''\n # scroll_to_elmt = $($(e.target).data('scroll-to-elmt')).get(0)\n # else if $(e.target).is('[data-scroll-to-elmt]')\n # scroll_to_elmt = $(elmt).get(0)\n\n # e.target.reset() if e.target.dataset.formReset\n\n # scroll_to_elmt.scrollIntoView({behavior: 'smooth', block: 'start'}) if scroll_to_elmt\n # $(elmt).trigger 'me:domChanged', elmt\n\n #---------------------------------#\n # Ajax file upload using FormData #\n #---------------------------------#\n # multipart:\n # init: ->\n # $(document).on 'submit', 'form[data-multipart]', (e) ->\n # f = $(e.target)\n # $.ajax({\n # url: f.attr('action'), data: new FormData(f.get(0)), cache: false, contentType : false, processData : false, type: 'POST',\n # beforeSend: (jqXHR, settings) ->\n # if Rails.fire(f.get(0), 'ajax:beforeSend', [jqXHR])\n # $(document).on 'click.lock', (e) ->\n # new Toast(I18n.t('js.upload.lock'), { type: 'alert' }).show()\n # e.preventDefault()\n\n # f.find('button').prop 'disabled', true\n # else\n # false\n # ,\n # complete: (data, status, xhr) ->\n # $(document).off 'click.lock'\n # f.find('button').prop 'disabled', false\n # f.trigger 'ajax:complete', [ data, status, xhr ]\n # $.me.restricted(data) if data.status is 402\n # ,\n # success: (data, status, xhr) ->\n # $(document).off 'click.lock'\n # f.trigger 'ajax:success', [ data, status, xhr ]\n # ,\n # xhr: ->\n # xhr = $.ajaxSettings.xhr()\n # xhr.upload.addEventListener 'progress', (e) ->\n # f.trigger 'me:upload:progress', [ e.loaded, e.total ]\n # , false\n # xhr\n # })\n # false\n\n #--------------#\n # Init objects #\n #--------------#\n init: (objects...) ->\n try\n @[object].init() for object in objects\n catch e\n\n #---------------------#\n # Generic queue class #\n #---------------------#\n # Queue: class\n # constructor: (@_data = []) ->\n # isEmpty: => @_data.length == 0\n # enqueue: (obj) => @_data.push obj\n # shift: => @_data.shift()\n # clear: => @_data = []\n # size: => @_data.length\n\n #------------#\n # Vuex store #\n #------------#\n # store:\n # init: ->\n # $.me.store = createStore()\n\n #---------------#\n # Flash message #\n #---------------#\n # flashMessage:\n # init: ->\n # @reset()\n # $(document).on 'ajax:success', (e) =>\n # return unless e.detail\n\n # xhr = e.detail[2]\n # data = xhr.responseText\n # unless data && typeof data is 'string' && data.match(/^Turbo/)\n # @_createFromXhr(xhr)\n # $(document).on 'ajax:error', (e) => @_createFromXhr(e.detail[2])\n # $(document).on 'click', '[data-flash-message]', (e) =>\n # return unless @_timer\n # clearTimeout(@_timer)\n # @_hide()\n\n # reset: ->\n # @_queue = new $.me.Queue\n # @_displaying = false\n # @\n\n # create: (message, type='notice') ->\n # if @_displaying\n # @_queue.enqueue arguments\n # else\n # @_node().off()\n # @_node().toggleClass 'message-flash--alert', type is 'alert'\n # @_message().text message\n # @_show()\n\n # createFromDom: ->\n # @_show() if !@_displaying && @_message().text()\n\n # _createFromXhr: (xhr) ->\n # if xhr.getResponseHeader('X-Message')\n # @create decodeURIComponent(escape(xhr.getResponseHeader('X-Message'))), xhr.getResponseHeader('X-Message-Type')\n\n # _node: -> $ '[data-flash-message]'\n\n # _message: -> @_node().find 'span'\n\n # _show: ->\n # @_displaying = true\n # @_node().forceDomRendering().addClass('is-show')\n # @_timer = setTimeout =>\n # @_hide()\n # , 3000\n\n # _hide: ->\n # @_timer = null\n # @_node().removeClass 'is-show'\n # @_node().one 'transitionend', => @_onHide()\n\n # _onHide: ->\n # @_node().removeClass 'message-flash--alert'\n # @_message().text ''\n # @_displaying = false\n # @create.apply @, @_queue.shift() unless @_queue.isEmpty()\n\n #------------------#\n # Sticker #\n #------------------#\n # sticker:\n # _$window: $(window),\n # _$html: $('html'),\n # # _trigger: 'is-sticky-subscribe'\n\n # init: ->\n # # @_$window.scroll =>\n # # @_setSticky @_$window, @_$html, @_getOffset(@_$window), @_trigger\n\n # @_$window.resize =>\n # offset = @_getOffset @_$window\n # # @_setSticky @_$window, @_$html, @_getOffset(@_$window), @_trigger\n\n # _getOffset: (viewport) ->\n # value = if viewport.outerWidth() >= 768 then 600 else 480\n # return value\n\n # _setSticky: (viewport, element, offset, trigger) ->\n # if viewport.scrollTop() >= @_getOffset(@_$window)\n # if !element.hasClass(trigger)\n # element.addClass trigger\n # else\n # element.removeClass trigger\n\n #---------#\n # Config #\n #---------#\n # config:\n # init: ->\n # @store = $.me.store\n # @store.registerModule 'config', {\n # state: -> {\n # currentUser: null,\n # location: null,\n # device: 0\n # },\n # mutations: {\n # loadCurrentUser: (state, currentUser) -> state.currentUser = currentUser\n # loadLocation: (state, location) -> state.location = location\n # loadDevice: (state, device) -> state.device = device\n # },\n # actions: {\n # loadCurrentUser: (context, currentUser) -> context.commit('loadCurrentUser', currentUser)\n # loadLocation: (context, location) -> context.commit('loadLocation', location)\n # loadDevice: (context, device) -> context.commit('loadDevice', device)\n # },\n # namespaced: true\n # }\n # @_load()\n\n # _load: ->\n # # Load config\n # $.getJSON '/app_config.json', (data) =>\n # @store.dispatch 'config/loadCurrentUser', data.config.current_user\n # @store.dispatch 'config/loadLocation', data.config.geolocation\n # @store.dispatch 'config/loadDevice', data.config.device\n # $(document).trigger 'me:configLoaded', data\n\n #------------------#\n # Notification bar #\n #------------------#\n # notifications:\n # vues: []\n\n # init: ->\n # @store = $.me.store\n # @store.registerModule 'notifications', {\n # state: -> {\n # chatMessages: 0\n # pmessages: 0\n # kisses: 0\n # formViews: 0\n # friendships: 0\n # testimonials: 0\n # socialNotifications: 0\n # events: 0\n # chat:\n # isOpened: false\n # call:\n # enabled: false\n # kind: null\n # },\n # mutations: {\n # set: (state, payload) -> state[payload.field] = payload.value\n # increment: (state, field) -> state[field] += 1\n # decrement: (state, field) -> state[field] -= 1\n # setChatOpen: (state, isOpened) -> state.chat.isOpened = isOpened\n # setCall: (state, payload) ->\n # state.chat.call.enabled = payload.enabled\n # state.chat.call.kind = payload.kind if payload?.kind\n # },\n # actions: {\n # set: (context, payload) -> context.commit('set', payload)\n # increment: (context, field) -> context.commit('increment', field)\n # decrement: (context, field) -> context.commit('decrement', field)\n # setChatOpen: (context, isOpened) -> context.commit('setChatOpen', isOpened)\n # setCall: (context, payload) -> context.commit('setCall', payload)\n # },\n # namespaced: true\n # }\n\n # @initBars()\n\n # $(document).on 'turbo:load', => @initBars() # Redo this shit\n # $(document).on 'me:configLoaded', (e, data) => @_loadStats(data.stats)\n\n # initBars: () ->\n # @vues.concat $('[data-notification-bar]').map (i, n) =>\n # delete n.dataset.notificationBar\n # createApp({\n # name: \"NotificationBar#{i + @vues.length + 1}\",\n # computed: $.extend(\n # mapState('notifications', ['chatMessages', 'pmessages', 'kisses', 'formViews', 'friendships', 'testimonials', 'socialNotifications', 'events', 'chat'])\n # {\n # requests: -> @friendships + @testimonials,\n # all: -> @kisses + @formViews + @friendships + @testimonials + @events + @socialNotifications,\n # }\n # ),\n # methods: {\n # openChat: (e) ->\n # return if @chatMessages is 0\n # e.preventDefault()\n # $.me.chat.selectConversationIfExists()\n\n # toggleChat: -> $.me.chat.toggle()\n\n # hideChat: -> $.me.chat.hide()\n\n # format: (value, max=100) ->\n # return '' unless value > 0\n # return \"#{max}+\" if value > max\n # value.toString()\n # }\n # }).use(@store).mount(n)\n\n # _loadStats: (stats) ->\n # @store.dispatch 'notifications/set', { field: 'pmessages', value: stats.new_pmessages_count }\n # @store.dispatch 'notifications/set', { field: 'kisses', value: stats.new_kisses_count }\n # @store.dispatch 'notifications/set', { field: 'formViews', value: stats.new_form_views_count }\n # @store.dispatch 'notifications/set', { field: 'friendships', value: stats.new_friends_count }\n # @store.dispatch 'notifications/set', { field: 'testimonials', value: stats.new_testimonials_count }\n # @store.dispatch 'notifications/set', { field: 'socialNotifications', value: stats.new_social_notifications_count }\n # @store.dispatch 'notifications/set', { field: 'events', value: stats.events_count }\n\n #----------------#\n # Trophy #\n #----------------#\n # trophy:\n # init: ->\n # return unless document.querySelector('#trophy')\n # @vue = createApp({\n # name: 'trophy',\n # data: -> {\n # trophy: 0,\n # points: 0,\n # _config: null\n # },\n # computed: {\n # trophyName: -> @_config.stages[@trophy].name if @trophy > 0 && @_config?\n # formatedPoints: ->\n # fp = new Intl.NumberFormat().format(@points) if Intl? && Intl.NumberFormat?\n # I18n.t 'js.trophy.points', { count: @points, points: fp or @points }\n # },\n # watch: {\n # points: (n, o) ->\n # return unless @_config.stages[@trophy + 1]? && n >= @_config.stages[@trophy + 1].points\n # $.ajax(url: '/pages/trophy', method: 'put').done (data) =>\n # if data.updated\n # @trophy = data.trophy\n # else\n # @points = data.points\n # }\n # }).mount('#trophy')\n\n # $(document).on 'me:notification', (e, args) => @_updatePoints(args.type)\n # $(document).on 'me:configLoaded', (e, data) => @_load(data)\n\n # _updatePoints: (type) ->\n # return unless @vue._config?\n # np = @vue._config.reckoner[type]\n\n # return unless np?\n # @vue.points += np\n\n # _load: (data) ->\n # @vue.trophy = data.stats.trophy\n # @vue.points = data.stats.trophy_points\n # @vue._config = data.config.trophy\n\n #--------------------#\n # Sentences #\n #--------------------#\n # sentences:\n # init: ->\n # @store = $.me.store\n # @store.registerModule 'sentences', {\n # state: -> {\n # list: []\n # },\n # mutations: {\n # load: (state, sentences) -> state.list = sentences\n # },\n # actions: {\n # load: (context, sentences) -> context.commit('load', sentences)\n # },\n # namespaced: true\n # }\n\n # $(document).on 'me:configLoaded', (e, data) => @_load(data.config.sentences)\n\n # _load: (sentences) -> @store.dispatch 'sentences/load', sentences\n\n #--------------------#\n # Emoji #\n #--------------------#\n emoji:\n library:\n '😊': \":[\\\\\\)D]{1}\"\n 'πŸ˜‰': \";[\\\\\\)D]{1}\"\n 'πŸ˜‚': \":'[\\\\\\)D]{1}\"\n '😝': \":p\"\n '😍': \"\\\\\\<3\"\n '😲': \":o\"\n 'πŸ˜–': \":\\\\\\|\"\n '😞': \":\\\\\\(\"\n '😒': \":'\\\\\\(\"\n '😸': \"\\\\\\^{2}\"\n\n init: ->\n @library[k] = new RegExp \"(^|\\\\s)(#{e})($|\\\\s)\", 'gi' for k, e of @library\n $(document).on 'keyup', 'textarea[data-emoticonize]', (e) => @_emoticonizeInput(e.currentTarget)\n\n emoticonize: (text) ->\n text = text.replace(e, \"$1#{k}$3\") for k, e of @library\n text\n\n _emoticonizeInput: (node) ->\n text = node.value\n curPos = node.selectionStart\n curLength = text.length\n text = @emoticonize(text)\n node.value = text\n newPos = curPos + text.length - curLength\n node.setSelectionRange(newPos, newPos)\n\n #--------------------#\n # Field char counter #\n #--------------------#\n # fieldCharCounter:\n # _data_attr: 'char-counter'\n # _selector: '[data-char-counter]'\n\n # init: ->\n # $(document).on 'keyup', @_selector, (e) =>\n # @_count($(e.target))\n # return true\n\n # $(document).on 'me:domChanged', (e) =>\n # $(@_selector).each (i, elmt) =>\n # @_count($(elmt))\n # return true\n\n # _count: (target) ->\n # $(target.data(@_data_attr)).text target.val().length\n\n #----------#\n # Dropdown #\n #----------#\n # dropdown:\n # init: ->\n # $(document).on 'click', '[data-dropdown-trigger]', (e) => @_toggle($(e.currentTarget))\n\n # _toggle: (target) ->\n # elmt = if target.attr('data-dropdown-trigger') isnt ''\n # $(target.attr('data-dropdown-trigger'))\n # else\n # target.closest('[data-dropdown]')\n\n # isOpen = elmt.hasClass 'is-open'\n # if isOpen\n # elmt.removeClass 'is-open'\n # else\n # @_closeAll()\n # elmt.addClass 'is-open'\n # $('body').on 'click.me.dropdown', (e) =>\n # return if $(e.target).is('[data-dropdown-panel]') || $(e.target).closest('[data-dropdown-trigger]').length > 0\n # @_closeAll()\n\n # _closeAll: (target) ->\n # $('[data-dropdown],[data-dropdown-panel]').removeClass 'is-open'\n # $('body').off 'click.me.dropdown'\n\n #------------------------#\n # Remove errors messages #\n #------------------------#\n removeFieldWithError:\n _selector: '[data-error-message], [data-field=with-error] input, [data-field=with-error] select, [data-field=with-error] textarea'\n\n init: ->\n $(document).on 'change', @_selector, (e) => @_remove($(e.target))\n\n removeAll: ($container = null) ->\n $nodes = if $container == null then $(@_selector) else $(@_selector, $($container))\n $nodes.each (i, elmt) =>\n @_remove $(elmt)\n\n _remove: ($target) ->\n _id = if $target.data('error-message') then $target.data('error-message') else $target.attr('id')\n\n # Replace error node with its children node\n while $target.closest('.field_with_errors').length > 0\n $_error_node = $target.closest('.field_with_errors')\n $_children_node = $_error_node.children()\n\n $_error_node.replaceWith $_children_node\n\n if _id\n $('[data-field-error=\"' + _id + '\"]').remove() if $('[data-field-error=\"' + _id + '\"]').length > 0\n\n #----------------------#\n # Auto height textarea #\n #----------------------#\n # textareaAutoHeight:\n # _selector: '[data-behavior=textarea-auto-height]'\n\n # init: ->\n # $(document).on 'focus', @_selector, (e) ->\n # $(e.currentTarget).attr('rows', 2)\n\n # $(e.currentTarget).off('input keyup').on 'input keyup', (e) ->\n # $textarea = $(e.currentTarget).get 0\n\n # if $textarea.clientHeight < $textarea.scrollHeight\n # $(e.currentTarget).css 'height', \"#{$textarea.scrollHeight}px\"\n\n # if $textarea.clientHeight < $textarea.scrollHeight\n # $(e.currentTarget).css 'height', \"#{$textarea.scrollHeight * 2 - $textarea.clientHeight}px\"\n\n # $(document).on 'blur', @_selector, (e) ->\n # if $(e.currentTarget).val() is ''\n # $(e.currentTarget).attr('rows', 1).css 'height', 'auto'\n\n #------------------------------------#\n # Auto submit on on textarea #\n #------------------------------------#\n # textareaSubmitOnEnter:\n # _selector: '[data-submit-on-enter]'\n\n # init: ->\n # $(document).on 'keypress', @_selector, (e) ->\n # if e.which is 13\n # e.preventDefault()\n # e.stopImmediatePropagation()\n # Rails.fire $(e.target).blur().closest('form').get(0), 'submit'\n\n #------------------------#\n # OpenMap route #\n #------------------------#\n # route: ($canvas, coords, buttons = null) ->\n # _route = $canvas.openMap(center:\n # lat: coords.from.lat\n # lng: coords.from.lng).show().direction coords\n\n # _route.buttons buttons if buttons?\n\n # return _route\n\n #------------------------------------#\n # Google places address autocomplete #\n #------------------------------------#\n address_autocomplete: ->\n autocompleteNode = $('[data-field=\"location\"]')\n formSubmit = autocompleteNode.data('submit') || false\n autocompleteNode.keydown (e) ->\n if e.keyCode == 13\n e.preventDefault()\n $(e.target).val('').blur()\n autocompleteNode.change ->\n if autocompleteNode.val() is ''\n $('[data-field=\"lat\"]').val ''\n $('[data-field=\"lng\"]').val ''\n autocomplete = new google.maps.places.Autocomplete autocompleteNode.get(0), { componentRestrictions: { country: ['fr', 'be', 'ch', 'mc', 'lu'] } }\n google.maps.event.addListener autocomplete, 'place_changed', ->\n place = autocomplete.getPlace()\n return if !place.geometry\n\n $('[data-field=\"lat\"]').val place.geometry.location.lat()\n $('[data-field=\"lng\"]').val place.geometry.location.lng()\n $('[data-field=\"lnglat_rand\"]').val place['types']? && place['types'].indexOf('locality') > -1\n autocompleteNode.parents('form').submit() if formSubmit\n}\n\n#------------------------#\n# Document events #\n#------------------------#\n# $(document).on 'submit', 'form[method=get]:not([data-remote])', (e) ->\n# e.preventDefault()\n# Turbo.visit(@action + (if @action.indexOf('?') == -1 then '?' else '&') + $(@).serialize())\n\n# $(document).on 'ajax:beforeSend', 'form[data-multipart][data-me-progress]', (e) ->\n# if $(':file', $(e.target)).val() != ''\n# if $(':file', $(e.target)).get(0).files[0].size <= 367001600\n# $(e.target).on 'me:upload:progress', (e, loaded, total) ->\n# percents = Math.floor((loaded / total) * 1000)/10\n\n# if $.browser.mobile && !$('body').hasClass('tablet')\n# $progress_bar.val percents\n# else\n# $progress_bar.css 'width', \"#{percents}%\"\n\n# $progress_percent.html \"#{percents}%\"\n\n# return\n\n# if $.browser.mobile && !$('body').hasClass('tablet')\n# content = $('[data-me=upload-progress]').detach().first().html()\n# (new $.me.Modal 'content', {content: content}).show()\n\n# $progress_bar = $('[data-me=progress] progress')\n# $progress_percent = $('[data-me=progress] strong')\n# else\n# $('[data-me=upload-progress] div').css 'width', 0\n# $('[data-me=upload-progress]').show()\n\n# $progress_bar = $('[data-me=upload-progress] div')\n# $progress_percent = $('[data-me=upload-progress] span')\n\n# else\n# $.me.alert I18n.t('js.common.title_alert'), I18n.t('js.file_max_size', mb_size: 350)\n# return false\n\n# return true\n\n# $(document).on 'me:layoutLoaded', ->\n# $.me.init 'store', 'config', 'notifications', 'trophy', 'sentences'\n\n# Active for Route\n# $(document).on 'turbo:load', ->\n# controller = document.body.dataset.controller\n# action = document.body.dataset.action\n# document.querySelectorAll('[data-active-for-route]').forEach (e) ->\n# e.classList.remove('active')\n# routes = e.dataset.activeForRoute.split(',')\n# routes.forEach (r) ->\n# [c, a] = r.split('#')\n# e.classList.add('active') if c is controller && (!a? || a is action)\n\n# $(document).on 'turbo:frame-render', (event) ->\n# headers = event.detail.fetchResponse.response.headers\n# $.me.actionCallback headers.get('x-controller'), headers.get('x-action')\n\n#------------------------#\n# On DOM Loaded #\n#------------------------#\n$ ->\n $.me.init 'emoji', 'removeFieldWithError'\n #$.me.init 'dropdown', 'emoji', 'fieldCharCounter', 'sticker', 'removeFieldWithError', 'multipart', 'textareaAutoHeight', 'textareaSubmitOnEnter'\n # $(document).trigger 'me:domChanged', $(document)\n\n # $(document).on 'ajax:error', (e, xhr) ->\n # [data, status, xhr] = e.detail if e.detail\n # if xhr.status is 402\n # $.me.restricted xhr\n # else if xhr.status is 423\n # $.me.privated xhr\n\n # # Remove selector\n # $(document).on 'click', '[data-remove-block]', (e) ->\n # e.preventDefault()\n # $($(e.currentTarget).data('remove-block')).remove()\n\n # # Dirty fix to keep scroll positions\n # $.me.scrollPositions = {\n # online: 0,\n # chat: 0\n # }\n\n # TODO : Check what is that shit for\n # $(document).on 'turbo:before-visit', ->\n # $.me.scrollPositions.online = $('#online-users-container').scrollTop()\n # $.me.scrollPositions.chat = $('#nlv2ChatScrollBox').scrollTop()\n # $(document).on 'turbo:load', ->\n # $('#online-users-container').scrollTop($.me.scrollPositions.online)\n # $('#nlv2ChatScrollBox').scrollTop($.me.scrollPositions.chat)\n\n#---------#\n# Global #\n#---------#\n\n# Subscriber restriction modal\n# $.me.restricted = (xhr) ->\n# lscope = \"js.restrict.actions.#{xhr.getResponseHeader('X-Controller')}.#{xhr.getResponseHeader('X-Action')}\"\n# title = I18n.t('js.restrict.title')\n# message = I18n.t('js.restrict.message')\n# redirect = '/account/subscriptions'\n# $.me.alert title, message, ->\n# $.me.chat.hide()\n# if window.ReactNativeWebView\n# window.location.href = redirect\n# else\n# Turbo.visit redirect, { action: xhr.getResponseHeader('Turbo-Action') }\n\n# # Private restriction modal\n# $.me.privated = (delegate) ->\n# xhr = delegate.xhr or delegate\n# lscope = \"js.private.actions.#{xhr.getResponseHeader('X-Controller')}.#{xhr.getResponseHeader('X-Action')}\"\n# title = I18n.t(\"#{lscope}.title\", { defaultValue: I18n.t('js.private.title') })\n# message = I18n.t(\"#{lscope}.message\", { defaultValue: I18n.t('js.private.message') })\n# $.me.alert title, message, ->\n# Turbo.visit(delegate.referrer, { action: 'replace' }) if delegate.referrer\n\n# Monkey patch Turbolinks to render 404 & 500 normally and to manage special 4xx\n# Turbolinks.HttpRequest.prototype.requestLoaded = ->\n # @endRequest =>\n # if 200 <= @xhr.status < 300 or @xhr.status is 404 or @xhr.status is 500\n # @delegate.requestCompletedWithResponse(@xhr.responseText, @xhr.getResponseHeader('Turbolinks-Location'))\n # else if @xhr.status is 402\n # $.me.restricted @xhr\n # else if @xhr.status is 423\n # $.me.privated @\n # else\n # @failed = true\n # @delegate.requestFailedWithStatusCode(@xhr.status, @xhr.responseText)\n\n# history.scrollRestoration = 'manual' if history.scrollRestoration\n","\nimport { pinia } from 'stores'\nimport { createApp } from 'vue'\nimport { useCommonStore } from 'stores/common_store'\nimport { useNotificationsStore } from 'stores/notifications_store'\n\nexport const MeConfig = {\n locale: \"fr\",\n stripe: {\n publicKey: \"pk_live_51LDrHeF8hBqvIjcaDiZFtm5ot9b20E1SBpnil3cjqLFLkOGTnr8Cw2HQM9Q3TavmyPgrfPYsMLgqReHysGImP5Ho000FPBJ5uz\"\n }\n}\n\nexport const LeafletConfig = {\n markerIconUrl: \"/assets/v21/icons/pin-pink-d0dabc30b0497239a0a0df4853db924b549c79be1606e8d769c408577ef087bd.svg\"\n}\n\nexport function setup() {\n I18n.defaultLocale = \"fr\"\n\n // Load config\n fetch('/app_config.json', { headers: { 'X-Requested-With': 'XMLHttpRequest' } })\n .then(response => response.json())\n .then(appConfig => {\n initStores(appConfig)\n })\n\n document.addEventListener('contextmenu', event => event.preventDefault())\n}\n\nfunction initStores(appConfig) {\n const app = createApp({})\n app.use(pinia)\n\n const common = useCommonStore()\n common.currentUser = appConfig.config.current_user\n common.device = appConfig.config.device\n\n const notifications = useNotificationsStore()\n notifications.pmessages = appConfig.stats.new_pmessages_count\n notifications.kisses = appConfig.stats.new_kisses_count\n notifications.formViews = appConfig.stats.new_form_views_count\n notifications.friendships = appConfig.stats.new_friends_count\n notifications.testimonials = appConfig.stats.new_testimonials_count\n notifications.socialNotifications = appConfig.stats.new_social_notifications_count\n notifications.events = appConfig.stats.events_count\n}\n"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","Controller","static","frameId","String","connect","document","getElementById","this","frameIdValue","addEventListener","event","headers","detail","fetchResponse","response","activate","get","controller","action","element","querySelectorAll","forEach","elmnt","dataset","activeForRoute","split","some","route","c","a","match","toggleAttribute","initialize","observer","checkData","MutationObserver","_mutationList","_observer","observe","childList","disconnect","setAttribute","childElementCount","target","querySelector","targetValue","toggle","hasAttribute","scrollIntoView","behavior","block","contentTarget","toggle_lines","classList","hasTriggerTarget","isSmaller","scrollHeight","clientHeight","triggerTarget","removeEventListener","contains","togglesTarget","userType","currentTarget","value","url","dataId","dataLabel","min","type","Number","default","itemTemplate","listTarget","content","cloneNode","remove","buttonTarget","inputTarget","key","selectFirst","length","includes","search","preventDefault","selectNext","selectPrevious","setSelected","select","close","closeOutside","isOpen","open","childNodes","add","unselect","first","firstElementChild","focus","scrollTo","previous","selected","previousElementSibling","getBoundingClientRect","top","next","nextElementSibling","bottom","item","constructor","selectClasses","dispacthEvent","getAttribute","innerHTML","innerText","elmt","openList","resetList","minValue","URL","urlValue","searchParams","URLSearchParams","set","toString","fetch","then","json","data","obj","addItem","dataIdValue","dataLabelValue","label","itemNode","replace","RegExp","appendChild","node","CustomEvent","bubbles","dispatchEvent","countryTarget","zipTarget","mask","zipCodeMask","blur","Toast","I18n","t","show","country_id","zip_code","cityTarget","replaceChildren","Option","city","name","removeAttribute","FileUploaderController","browse","fileTarget","click","submit","requestSubmit","buttonText","GeolocationController","searchCityUrl","positionStatus","UNAVAILABLE","bind","geolocation","isAvailable","AVAILABLE","startGeolocation","geolocationMode","geolocationTarget","checked","citySearchTarget","DENIED","cityMode","radiusTarget","radius","start","searchCity","searchCityUrlValue","list","option","createElement","updateCityId","inputType","cityName","cityId","status","errorTarget","textarea","parentNode","lengthTarget","textContent","maxLength","update","reset","button","input","wrapper","isHidden","panelTarget","radio","validatorTarget","form","closest","userTypes","cb","parseInt","userTypeId","disabled","isPassword","iconTarget","max","checkboxes","checkbox","parentElement","maxValue","filter","reduce","sum","switchTarget","isChecked","isSomeChecked","selector","selectorValue","slider","noUiSlider","sliderTarget","inputMinTarget","inputMaxTarget","step","margin","range","on","values","handle","d","setDefaultRadius","accordionPanelTargets","panel","index","toggleType","params","toggles","accordionTargets","typeCheckboxTargets","Event","togglePanel","current","addAnchorToCurrentState","anchor","window","location","href","hash","Turbo","navigator","history","replaceState","application","Application","context","require","load","definitionsFromContext","debug","Stimulus","root","rootMargin","options","rootValue","rootMarginValue","intersectionObserver","IntersectionObserver","entries","processIntersectionEntries","unobserve","entry","isIntersecting","accept","text","renderStreamMessage","_","state","body","_toggle","decodeURIComponent","escape","success","pushState","turbo_frame_history","visit","panels","check","birthDate","Date","yearTarget","monthTarget","dayTarget","setFullYear","getFullYear","stopImmediatePropagation","productTargets","selectProduct","product","newProductTarget","replaceWith","confirmTarget","elements","productId","elementTop","scrollY","backPath","use","sentense","end","selectionStart","selectionEnd","setRangeText","backPathValue","frame","src","encodeURIComponent","reload","hasProductTarget","paymentIntent","stripeElements","stripeOptions","JSON","parse","stripeTarget","loadStripe","MeConfig","stripe","publicKey","stripe_pi","selectedDurationTarget","duration","selectedAmountTarget","amount","toLocaleString","locale","style","currency","minimumFractionDigits","Math","ceil","fetchUpdates","client_secret","clientSecret","appearance","variables","colorPrimary","getComputedStyle","documentElement","getPropertyValue","paymentElements","create","fields","billingDetails","email","address","terms","card","mount","stripeElementsTarget","confirmPayment","confirmParams","return_url","returnUrl","payment_method_data","billing_details","user_email","phone","country","user_country","line1","line2","postal_code","result","error","stripeError","message","stripeSubmitTarget","offset","mutationList","mutation","attributeName","attributes","subtree","attributeFilter","container","child_offsetRight","offsetLeft","offsetWidth","container_scrollRight","scrollLeft","go","innerHeight","imagesDisplay","imagesLength","imageWidth","scrollIndex","scroller","prevButton","nextButton","images","clientWidth","prev","left","round","slideWidth","slidesCount","interval","buttons","abs","deltaX","setInterval","clearInterval","active","span","count","nav","sections","section","triggerTargets","panelTargets","previewTarget","preview","file","files","startsWith","previewFallback","delete","reader","FileReader","readAsDataURL","onload","fallback","video","currentTime","canvas","width","videoWidth","height","videoHeight","getContext","drawImage","toBlob","blob","createObjectURL","once","hasDeleteTarget","deleteTarget","layer","maxWidth","maxHeight","app","createApp","compilerOptions","isCustomElement","tag","computed","mapState","useChatStore","methods","hide","$","me","chat","showNewMessages","pinia","unmount","useNotificationsStore","mapStores","requests","friendships","testimonials","all","kisses","formViews","socialNotifications","openChat","chatMessages","selectConversationIfExists","toggleChat","hideChat","format","Dialog","title","okLabel","i18n","buildNode","Promise","reject","dialogResolve","placeholder","template","DocumentFragment","templateContent","templateTitle","lat","lng","watchPosition","position","stop","clearWatch","restart","coords","latitude","longitude","timestamp","PERMISSION_DENIED","method","stringify","store","locales","defaultLocale","enableFallback","lang","defineStore","isConnected","conversationCount","isOpened","call","enabled","kind","actions","setChatOpen","setCall","useCommonStore","currentUser","device","isDesktopDevice","isMobileDevice","isTabletDevice","createPinia","pmessages","events","field","increment","decrement","StreamActions","toast","dialog","redirectTo","ReactNativeWebView","toggle_css_class","classes","force","toLowerCase","targetElements","extend","executeByName","args","fn","j","len","namespaces","pop","isFunction","apply","actionCallback","jsonUtils","dateTimeFormat","reviver","test","init","objects","object","results","emoji","library","k","ref","_emoticonizeInput","emoticonize","curLength","curPos","newPos","setSelectionRange","removeFieldWithError","_selector","_remove","removeAll","$container","each","i","$target","$_children_node","$_error_node","_id","attr","children","address_autocomplete","autocomplete","autocompleteNode","formSubmit","keydown","keyCode","val","change","google","maps","places","Autocomplete","componentRestrictions","addListener","place","getPlace","geometry","indexOf","parents","LeafletConfig","markerIconUrl","setup","appConfig","common","config","current_user","notifications","stats","new_pmessages_count","new_kisses_count","new_form_views_count","new_friends_count","new_testimonials_count","new_social_notifications_count","events_count","initStores"],"sourceRoot":""}