{"version":3,"file":"chunk.1102.1f0728109ab5aaed15d1.js","names":["getExtension","name","split","pop","trim","getFileSize","size","i","Math","floor","log","toFixed","downloadFile","async","link","options","sanitizeLink","res","fetch","ok","window","open","blobURL","URL","createObjectURL","blob","a","document","createElement","href","download","getFileName","fallback","pathname","_","fallbackName","click","SyncWithStore","proto","propName","connectedCallback","disconnectedCallback","host","getElement","this","value","uiStore","storeValue","state","appendElement","storeResponseListener","event","requestId","_storeRequestId","detail","store","componentOnReady","then","removeElement","addEventListener","tagName","Date","now","random","requestEvent","CustomEvent","element","bubbles","composed","dispatchEvent","storeReadyListener","newRequestId","toString","retryRequestEvent","call","removeEventListener","__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","RtkImageViewer","constructor","hostRef","registerInstance","close","createEvent","t","useLanguage","iconPack","defaultIconPack","keypressListener","e","emit","handleOutsideClick","render","h","Host","class","onClick","stopPropagation","formatName","shorten","image","displayName","icon","slot","kind","variant","dismiss","src","prototype","style","str","maxLength","substring","hasOnlyEmojis","test","toLowerCase","startsWith","whiteSpace","RegExp","space","getInitials","maxInitials","replace","slice","map","word","charAt","join","toUpperCase"],"sources":["webpack://__ember_auto_import__/./node_modules/@cloudflare/realtimekit-ui/dist/esm/file-6114f1a9.js","webpack://__ember_auto_import__/./node_modules/@cloudflare/realtimekit-ui/dist/esm/index-8be19fcf.js","webpack://__ember_auto_import__/./node_modules/@cloudflare/realtimekit-ui/dist/esm/rtk-image-viewer.entry.js","webpack://__ember_auto_import__/./node_modules/@cloudflare/realtimekit-ui/dist/esm/string-068ce30a.js"],"sourcesContent":["import { s as sanitizeLink } from './string-068ce30a.js';\n\nconst getExtension = (name) => {\n    // split query and hash from url, then get the filename\n    return name.split(/[#?]/)[0].split('.').pop().trim();\n};\n/**\n * Formats size in bytes to human readable formats\n * @param size Size in bytes\n * @returns Human readable file size\n */\nconst getFileSize = (size) => {\n    if (!size)\n        return '0 B';\n    const i = Math.floor(Math.log(size) / Math.log(1024));\n    return `${(size / 1024 ** i).toFixed(2)} ${['B', 'kB', 'MB', 'GB', 'TB'][i]}`;\n};\n/**\n * Extracts the file name from a URL.\n * @param link The URL of the file\n * @param fallback Fallback filename\n * @returns File name\n */\nconst getFileName = (link, fallback = 'file') => {\n    try {\n        const url = new URL(link);\n        const name = url.pathname.split('/').pop();\n        return name !== '/' ? name : fallback;\n    }\n    catch (_) {\n        return fallback;\n    }\n};\n/**\n * Downloads file from a given URL without leaving the current page\n * @param link URL of the file to download\n * @param options Optional Options for file download - `name` and `fallbackName`\n */\nconst downloadFile = async (link, options) => {\n    link = sanitizeLink(link);\n    let name = options === null || options === void 0 ? void 0 : options.name;\n    const res = await fetch(link);\n    if (!res.ok) {\n        // if unable to download file (CORS or some other error)\n        // open the URL in new tab\n        window.open(link, '_blank');\n        return;\n    }\n    const blobURL = URL.createObjectURL(await res.blob());\n    // Creates an anchor tag and simulates download\n    const a = document.createElement('a');\n    a.href = blobURL;\n    a.download = name !== null && name !== void 0 ? name : getFileName(link, options === null || options === void 0 ? void 0 : options.fallbackName);\n    a.click();\n};\n\nexport { getFileSize as a, downloadFile as d, getExtension as g };\n","import { g as getElement } from './index-55463a54.js';\nimport { u as uiStore, I as appendElement, J as removeElement } from './ui-store-4fbabb78.js';\n\nfunction SyncWithStore() {\n    return function (proto, propName) {\n        const { connectedCallback, disconnectedCallback } = proto;\n        proto.connectedCallback = function () {\n            const host = getElement(this);\n            const value = host[propName];\n            host[`_rtkStoreToCleanup-${propName}`] = uiStore;\n            /**\n             * NOTE(ravindra-cloudflare):\n             * For backward compatibility, let's use global store.\n             * If rtk-ui-provider in parent hierarchy is available, we will use peer specific store.\n             * If provider is found, All states will be solely controlled by RtkUiProvider.\n             */\n            if (!value) {\n                const storeValue = uiStore.state[propName];\n                host[propName] = storeValue;\n                appendElement(propName, host, uiStore);\n            }\n            // Listen for provider response\n            const storeResponseListener = (event) => {\n                const requestId = host._storeRequestId;\n                if (event.detail.requestId === requestId) {\n                    // Blindly put peer specific store's value for propName in host propName\n                    const storeValue = event.detail.store.state[propName];\n                    host.componentOnReady().then(() => {\n                        /**\n                         * NOTE(ravindra-cloudflare):\n                         * https://stenciljs.com/docs/api#componentonready\n                         * This psudo ready callback is to ensure that the component is ready to accept props\n                         * Without this, changing the prop would not trigger @Watch of prop in the initial mount phase\n                         *  */\n                        host[propName] = storeValue;\n                    });\n                    appendElement(propName, host, event.detail.store);\n                    host[`_rtkStoreToCleanup-${propName}`] = event.detail.store;\n                    // Since peer specific store is available, remove element prop from global store\n                    removeElement(propName, host, uiStore);\n                }\n            };\n            // Store listener reference for cleanup\n            host[`_rtkStoreResponseListener-${propName}`] = storeResponseListener;\n            document.addEventListener('rtkProvideStore', storeResponseListener);\n            // Generate unique request ID\n            const requestId = `${host.tagName}-${Date.now()}-${Math.random()}`;\n            host._storeRequestId = requestId;\n            // Request store from provider\n            const requestEvent = new CustomEvent('rtkRequestStore', {\n                detail: { element: host, propName, requestId },\n                bubbles: true,\n                composed: true, // Allow event to cross shadow DOM boundaries\n            });\n            host.dispatchEvent(requestEvent);\n            // Listen for peer specific store ready event to use the correct store\n            const storeReadyListener = () => {\n                // Re-request store (peer specific store should now be available)\n                const newRequestId = `${host.tagName}-${Date.now()}-${Math.random().toString(36)}`;\n                host._storeRequestId = newRequestId;\n                const retryRequestEvent = new CustomEvent('rtkRequestStore', {\n                    detail: { element: host, propName, requestId: newRequestId },\n                    bubbles: true,\n                    composed: true,\n                });\n                host.dispatchEvent(retryRequestEvent);\n            };\n            // Store listener reference for cleanup\n            host[`_rtkStoreReadyListener-${propName}`] = storeReadyListener;\n            document.addEventListener('rtkPeerStoreReady', storeReadyListener);\n            return connectedCallback === null || connectedCallback === void 0 ? void 0 : connectedCallback.call(this);\n        };\n        proto.disconnectedCallback = function () {\n            const host = getElement(this);\n            removeElement(propName, host, host[`_rtkStoreToCleanup-${propName}`]);\n            // Clean up event listeners to prevent memory leaks\n            const storeResponseListener = host[`_rtkStoreResponseListener-${propName}`];\n            if (storeResponseListener) {\n                document.removeEventListener('rtkProvideStore', storeResponseListener);\n                delete host[`_rtkStoreResponseListener-${propName}`];\n            }\n            const storeReadyListener = host[`_rtkStoreReadyListener-${propName}`];\n            if (storeReadyListener) {\n                document.removeEventListener('rtkPeerStoreReady', storeReadyListener);\n                delete host[`_rtkStoreReadyListener-${propName}`];\n            }\n            return disconnectedCallback === null || disconnectedCallback === void 0 ? void 0 : disconnectedCallback.call(this);\n        };\n    };\n}\n\nexport { SyncWithStore as S };\n","import { r as registerInstance, d as createEvent, h, a as Host } from './index-55463a54.js';\nimport { i as useLanguage, e as defaultIconPack } from './ui-store-4fbabb78.js';\nimport { d as downloadFile } from './file-6114f1a9.js';\nimport { S as SyncWithStore } from './index-8be19fcf.js';\nimport { f as formatName, a as shorten } from './string-068ce30a.js';\n\nconst rtkImageViewerCss = \":host{line-height:initial;font-family:var(--rtk-font-family, sans-serif);font-feature-settings:normal;font-variation-settings:normal}p{margin:var(--rtk-space-0, 0px);padding:var(--rtk-space-0, 0px)}.scrollbar{scrollbar-width:thin;scrollbar-color:var(--rtk-scrollbar-color, rgb(var(--rtk-colors-background-600, 60 60 60)))\\n    var(--rtk-scrollbar-background, transparent)}.scrollbar::-webkit-scrollbar{height:var(--rtk-space-1\\\\.5, 6px);width:var(--rtk-space-1\\\\.5, 6px);border-radius:9999px;background-color:var(--rtk-scrollbar-background, transparent)}.scrollbar::-webkit-scrollbar-thumb{border-radius:9999px;background-color:var(--rtk-scrollbar-color, rgb(var(--rtk-colors-background-600, 60 60 60)))}:host{width:1140px;max-width:100%;box-sizing:border-box;display:flex;flex-direction:column;padding:var(--rtk-space-6, 24px);padding-top:var(--rtk-space-5, 20px);overflow-y:auto;color:rgb(var(--rtk-colors-text-1000, 255 255 255));z-index:40;border-radius:var(--rtk-border-radius-md, 8px);--tw-bg-opacity:1;background-color:rgba(var(--rtk-colors-background-900, 26 26 26) / var(--tw-bg-opacity))}.displayName{font-weight:700}.image-ctr{margin-top:var(--rtk-space-2, 8px);box-sizing:border-box;display:flex;justify-content:center;overflow:hidden}.actions{display:flex;align-items:center;justify-content:flex-end;gap:var(--rtk-space-2, 8px)}img{box-sizing:border-box;display:block;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.header{display:flex;align-items:center;justify-content:space-between;padding-bottom:var(--rtk-space-4, 16px)}.shared-by-user{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}:host([size='sm']) .header{flex-direction:column}:host([size='sm']) .header .actions{margin-top:var(--rtk-space-4, 16px)}\";\nconst RtkImageViewerStyle0 = rtkImageViewerCss;\n\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\")\n        r = Reflect.decorate(decorators, target, key, desc);\n    else\n        for (var i = decorators.length - 1; i >= 0; i--)\n            if (d = decorators[i])\n                r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nconst RtkImageViewer = class {\n    constructor(hostRef) {\n        registerInstance(this, hostRef);\n        this.close = createEvent(this, \"close\", 7);\n        /** Language */\n        this.t = useLanguage();\n        /** Icon pack */\n        this.iconPack = defaultIconPack;\n        this.keypressListener = (e) => {\n            if (e.key === 'Escape') {\n                this.close.emit();\n            }\n        };\n        this.handleOutsideClick = () => this.close.emit();\n    }\n    connectedCallback() {\n        document.addEventListener('keydown', this.keypressListener);\n        document.addEventListener('click', this.handleOutsideClick);\n    }\n    disconnectedCallback() {\n        document.removeEventListener('keydown', this.keypressListener);\n        document.removeEventListener('click', this.handleOutsideClick);\n    }\n    render() {\n        return (h(Host, { key: '6f8bcc73b18fd868c085d6447ced2ecb24e42325', class: \"scrollbar\", onClick: (e) => e.stopPropagation() }, h(\"div\", { key: '11f7ad8c7e89442c0d257c57144a5408d90a178a', class: \"header\" }, h(\"div\", { key: 'e9d10589aa9ceb961a34e55f74238a17632c4baf', class: \"shared-by-user\" }, this.t('chat.img.shared_by'), ' ', h(\"span\", { key: '3d37f78f6f9c7a92a91bdc18086e24d2818e9ed8', class: \"displayName\" }, formatName(shorten(this.image.displayName)))), h(\"div\", { key: 'c551cd3d122d1be1076963de15b3f1d76520151c', class: \"actions\" }, h(\"rtk-button\", { key: '5433bb1fb5e6dac6925d3116d4836b00cb4c69e1', onClick: () => downloadFile(this.image.link, { fallbackName: 'image' }) }, h(\"rtk-icon\", { key: '93ed055d68686903014fd5ebaee3330643a91859', icon: this.iconPack.download, slot: \"start\" }), \"Download\"), h(\"rtk-button\", { key: 'e77e1d1cbd4daaa09f133cf4ca54efcea74fd7b2', kind: \"icon\", variant: \"secondary\", onClick: () => this.close.emit() }, h(\"rtk-icon\", { key: '8884eb7345fd6903e00c1c7f86c51abe499066e9', icon: this.iconPack.dismiss })))), h(\"div\", { key: 'b223cb91a00ce7967efe5ebcd1f0c680567ba098', class: \"image-ctr\" }, h(\"img\", { key: 'b4ffa73bd05908314cb164302e51621a64fa074e', src: this.image.link }))));\n    }\n};\n__decorate([\n    SyncWithStore()\n], RtkImageViewer.prototype, \"t\", void 0);\n__decorate([\n    SyncWithStore()\n], RtkImageViewer.prototype, \"iconPack\", void 0);\nRtkImageViewer.style = RtkImageViewerStyle0;\n\nexport { RtkImageViewer as rtk_image_viewer };\n","/**\n * Shorten a string upto a maximum length of characters and add `...` as suffix if it exceeds the maximum length\n * @param str The The string you want to shorten\n * @param maxLength Maximum length of character\n * @returns Formatted shortedned string\n */\nconst shorten = (str, maxLength = 20) => {\n    if (str == null)\n        return '';\n    if (str.length > maxLength) {\n        return `${str.substring(0, maxLength)}...`;\n    }\n    return str;\n};\n/**\n * Checks if a given string consists of only emojis.\n *\n * However this classifies a string with numbers as emoji as well.\n * Which works in our favour for now in chat as it enlarges messages with just numbers.\n * @param str String on which to perform the check on\n * @returns A Boolean value which indicates if string consists of only emojis\n */\nconst hasOnlyEmojis = (str) => {\n    const num = /^\\d+$/;\n    const re = /^\\p{Emoji}+$/u;\n    return re.test(str) && !num.test(str);\n};\nconst sanitizeLink = (link) => {\n    // TODO: needs more work\n    if (link === null || link === void 0 ? void 0 : link.trim().toLowerCase().startsWith('javascript:')) {\n        return 'https://realtime.cloudflare.com';\n    }\n    return link;\n};\n/**\n * Formats a given name and returns **Participant** for unnamed participants.\n * @param name Name of participant\n * @returns Name to use in the UI\n */\nconst formatName = (name) => {\n    name = name === null || name === void 0 ? void 0 : name.trim();\n    if (name === '')\n        return 'Participant';\n    return name;\n};\nconst whiteSpace = new RegExp(/[^\\u00BF-\\u1FFF\\u2C00-\\uD7FF\\w\\s]/, 'g');\nconst space = new RegExp(/\\s+/);\nfunction getInitials(name, maxInitials = 2) {\n    // removes any character that is not a letter, number or whitespace\n    const cleanedName = name.replace(whiteSpace, '');\n    const words = cleanedName.trim().split(space).slice(0, maxInitials);\n    return words\n        .map((word) => word.charAt(0))\n        .join('')\n        .toUpperCase();\n}\n\nexport { shorten as a, formatName as f, getInitials as g, hasOnlyEmojis as h, sanitizeLink as s };\n"],"mappings":"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"}