element-web-synapse01pim.gr.jp

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

9602.js.map (84766B)


      1 {"version":3,"file":"bundles/12c8185ea2689492c07b/9602.js","mappings":"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","sources":["webpack://element-web/./src/models/RoomUpload.ts","webpack://element-web/./src/components/views/dialogs/UploadFailureDialog.tsx","webpack://element-web/./src/ContentMessages.ts","webpack://element-web/./src/components/views/settings/KeyboardShortcut.tsx","webpack://element-web/./src/hooks/useFocus.ts","webpack://element-web/./src/sendTimePerformanceMetrics.ts","webpack://element-web/javascript/node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/@vector-im+compound-design-tokens@10.2.1_@types+react@19.2.14_react@19.2.7/node_modules/@vector-im/compound-design-tokens/assets/web/icons/attachment.js","webpack://element-web/./src/viewmodels/room/RoomUploadViewModel.tsx","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/crc-32@0.3.0/node_modules/crc-32/crc32.js","webpack://element-web/../node_modules/.pnpm/source-map-loader@5.0.0_webpack@5.108.4/node_modules/source-map-loader/dist/node_modules/.pnpm/png-chunks-extract@1.0.0/node_modules/png-chunks-extract/index.js"],"sourcesContent":["/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type IEventRelation, type UploadProgress } from \"matrix-js-sdk/src/matrix\";\nimport { type EncryptedFile } from \"matrix-js-sdk/src/types\";\n\nexport class RoomUpload {\n    public readonly abortController = new AbortController();\n    public promise?: Promise<{ url?: string; file?: EncryptedFile }>;\n    private uploaded = 0;\n\n    public constructor(\n        public readonly roomId: string,\n        public readonly fileName: string,\n        public readonly relation?: IEventRelation,\n        public fileSize = 0,\n    ) {}\n\n    public onProgress(progress: UploadProgress): void {\n        this.uploaded = progress.loaded;\n        this.fileSize = progress.total;\n    }\n\n    public abort(): void {\n        this.abortController.abort();\n    }\n\n    public get cancelled(): boolean {\n        return this.abortController.signal.aborted;\n    }\n\n    public get total(): number {\n        return this.fileSize;\n    }\n\n    public get loaded(): number {\n        return this.uploaded;\n    }\n}\n","/*\nCopyright 2019-2024 New Vector Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React from \"react\";\n\nimport { _t } from \"../../../languageHandler\";\nimport type ContentMessages from \"../../../ContentMessages\";\nimport BaseDialog from \"./BaseDialog\";\nimport DialogButtons from \"../elements/DialogButtons\";\nimport { fileSize } from \"../../../utils/FileUtils\";\n\ninterface IProps {\n    badFiles: File[];\n    totalFiles: number;\n    contentMessages: ContentMessages;\n    onFinished(upload?: boolean): void;\n}\n\n/*\n * Tells the user about files we know cannot be uploaded before we even try uploading\n * them. This is named fairly generically but the only thing we check right now is\n * the size of the file.\n */\nexport default class UploadFailureDialog extends React.Component<IProps> {\n    private onCancelClick = (): void => {\n        this.props.onFinished(false);\n    };\n\n    private onUploadClick = (): void => {\n        this.props.onFinished(true);\n    };\n\n    public render(): React.ReactNode {\n        let message;\n        let buttons;\n        if (this.props.totalFiles === 1 && this.props.badFiles.length === 1) {\n            message = _t(\n                \"upload_file|error_file_too_large\",\n                {\n                    limit: fileSize(this.props.contentMessages.getUploadLimit()!),\n                    sizeOfThisFile: fileSize(this.props.badFiles[0].size),\n                },\n                {\n                    b: (sub) => <strong>{sub}</strong>,\n                },\n            );\n            buttons = (\n                <DialogButtons\n                    primaryButton={_t(\"action|ok\")}\n                    hasCancel={false}\n                    onPrimaryButtonClick={this.onCancelClick}\n                    focus={true}\n                />\n            );\n        } else if (this.props.totalFiles === this.props.badFiles.length) {\n            message = _t(\n                \"upload_file|error_files_too_large\",\n                {\n                    limit: fileSize(this.props.contentMessages.getUploadLimit()!),\n                },\n                {\n                    b: (sub) => <strong>{sub}</strong>,\n                },\n            );\n            buttons = (\n                <DialogButtons\n                    primaryButton={_t(\"action|ok\")}\n                    hasCancel={false}\n                    onPrimaryButtonClick={this.onCancelClick}\n                    focus={true}\n                />\n            );\n        } else {\n            message = _t(\n                \"upload_file|error_some_files_too_large\",\n                {\n                    limit: fileSize(this.props.contentMessages.getUploadLimit()!),\n                },\n                {\n                    b: (sub) => <strong>{sub}</strong>,\n                },\n            );\n            const howManyOthers = this.props.totalFiles - this.props.badFiles.length;\n            buttons = (\n                <DialogButtons\n                    primaryButton={_t(\"upload_file|upload_n_others_button\", { count: howManyOthers })}\n                    onPrimaryButtonClick={this.onUploadClick}\n                    hasCancel={true}\n                    cancelButton={_t(\"upload_file|cancel_all_button\")}\n                    onCancel={this.onCancelClick}\n                    focus={true}\n                />\n            );\n        }\n\n        return (\n            <BaseDialog\n                className=\"mx_UploadFailureDialog\"\n                onFinished={this.onCancelClick}\n                title={_t(\"upload_file|error_title\")}\n                contentId=\"mx_Dialog_content\"\n            >\n                <div id=\"mx_Dialog_content\">{message}</div>\n\n                {buttons}\n            </BaseDialog>\n        );\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2020 The Matrix.org Foundation C.I.C.\nCopyright 2019 New Vector Ltd\nCopyright 2015, 2016 OpenMarket Ltd\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport {\n    type MatrixClient,\n    MsgType,\n    HTTPError,\n    type IEventRelation,\n    type ISendEventResponse,\n    type MatrixEvent,\n    type UploadOpts,\n    type UploadProgress,\n    THREAD_RELATION_TYPE,\n} from \"matrix-js-sdk/src/matrix\";\nimport {\n    type ImageInfo,\n    type AudioInfo,\n    type VideoInfo,\n    type EncryptedFile,\n    type MediaEventContent,\n    type MediaEventInfo,\n} from \"matrix-js-sdk/src/types\";\nimport encrypt from \"matrix-encrypt-attachment\";\nimport extractPngChunks from \"png-chunks-extract\";\nimport { logger } from \"matrix-js-sdk/src/logger\";\nimport { removeElement } from \"matrix-js-sdk/src/utils\";\n\nimport dis from \"./dispatcher/dispatcher\";\nimport { _t } from \"./languageHandler\";\nimport Modal from \"./Modal\";\nimport Spinner from \"./components/views/elements/Spinner\";\nimport { Action } from \"./dispatcher/actions\";\nimport {\n    type UploadCanceledPayload,\n    type UploadErrorPayload,\n    type UploadFinishedPayload,\n    type UploadProgressPayload,\n    type UploadStartedPayload,\n} from \"./dispatcher/payloads/UploadPayload\";\nimport { RoomUpload } from \"./models/RoomUpload\";\nimport SettingsStore from \"./settings/SettingsStore\";\nimport { decorateStartSendingTime, sendRoundTripMetric } from \"./sendTimePerformanceMetrics\";\nimport { TimelineRenderingType } from \"./contexts/RoomContext\";\nimport { addReplyToMessageContent } from \"./utils/Reply\";\nimport ErrorDialog from \"./components/views/dialogs/ErrorDialog\";\nimport UploadFailureDialog from \"./components/views/dialogs/UploadFailureDialog\";\nimport UploadConfirmDialog from \"./components/views/dialogs/UploadConfirmDialog\";\nimport { createThumbnail } from \"./utils/image-media\";\nimport { attachMentions, attachRelation } from \"./utils/messages.ts\";\nimport { doMaybeLocalRoomAction } from \"./utils/local-room\";\nimport { blobIsAnimated } from \"./utils/Image.ts\";\n\n// scraped out of a macOS hidpi (5660ppm) screenshot png\n//                  5669 px (x-axis)      , 5669 px (y-axis)      , per metre\nconst PHYS_HIDPI = [0x00, 0x00, 0x16, 0x25, 0x00, 0x00, 0x16, 0x25, 0x01];\n\nexport class UploadCanceledError extends Error {}\nexport class UploadFailedError extends Error {\n    public constructor(cause: any) {\n        super();\n        this.cause = cause;\n    }\n}\n\ninterface IMediaConfig {\n    \"m.upload.size\"?: number;\n}\n\n/**\n * Load a file into a newly created image element.\n *\n * @param {File} imageFile The file to load in an image element.\n * @returns {Promise} A promise that resolves with the html image element.\n */\nasync function loadImageElement(imageFile: File): Promise<{\n    width: number;\n    height: number;\n    img: HTMLImageElement;\n}> {\n    // Load the file into an html element\n    const img = new Image();\n    const objectUrl = URL.createObjectURL(imageFile);\n    const imgPromise = new Promise((resolve, reject) => {\n        img.onload = function (): void {\n            URL.revokeObjectURL(objectUrl);\n            resolve(img);\n        };\n        img.onerror = function (e): void {\n            reject(e);\n        };\n    });\n    img.src = objectUrl;\n\n    // check for hi-dpi PNGs and fudge display resolution as needed.\n    // this is mainly needed for macOS screencaps\n    let parsePromise = Promise.resolve(false);\n    if (imageFile.type === \"image/png\") {\n        // in practice macOS happens to order the chunks so they fall in\n        // the first 0x1000 bytes (thanks to a massive ICC header).\n        // Thus we could slice the file down to only sniff the first 0x1000\n        // bytes (but this makes extractPngChunks choke on the corrupt file)\n        const headers = imageFile; //.slice(0, 0x1000);\n        parsePromise = readFileAsArrayBuffer(headers)\n            .then((arrayBuffer) => {\n                const buffer = new Uint8Array(arrayBuffer);\n                const chunks = extractPngChunks(buffer);\n                for (const chunk of chunks) {\n                    if (chunk.name === \"pHYs\") {\n                        if (chunk.data.byteLength !== PHYS_HIDPI.length) return false;\n                        return chunk.data.every((val, i) => val === PHYS_HIDPI[i]);\n                    }\n                }\n                return false;\n            })\n            .catch((e) => {\n                console.error(\"Failed to parse PNG\", e);\n                return false;\n            });\n    }\n\n    const [hidpi] = await Promise.all([parsePromise, imgPromise]);\n    const width = hidpi ? img.width >> 1 : img.width;\n    const height = hidpi ? img.height >> 1 : img.height;\n    return { width, height, img };\n}\n\n// Minimum size for image files before we generate a thumbnail for them.\nconst IMAGE_SIZE_THRESHOLD_THUMBNAIL = 1 << 15; // 32KB\n// Minimum size improvement for image thumbnails, if both are not met then don't bother uploading thumbnail.\nconst IMAGE_THUMBNAIL_MIN_REDUCTION_SIZE = 1 << 16; // 1MB\nconst IMAGE_THUMBNAIL_MIN_REDUCTION_PERCENT = 0.1; // 10%\n// We don't apply these thresholds to video thumbnails as a poster image is always useful\n// and videos tend to be much larger.\n\n// Image mime types for which to always include a thumbnail for even if it is larger than the input for wider support.\nconst ALWAYS_INCLUDE_THUMBNAIL = [\"image/avif\", \"image/webp\", \"image/svg+xml\"];\n\n/**\n * Read the metadata for an image file and create and upload a thumbnail of the image.\n *\n * @param {MatrixClient} matrixClient A matrixClient to upload the thumbnail with.\n * @param {String} roomId The ID of the room the image will be uploaded in.\n * @param {File} imageFile The image to read and thumbnail.\n * @returns {Promise} A promise that resolves with the attachment info.\n */\nasync function infoForImageFile(matrixClient: MatrixClient, roomId: string, imageFile: File): Promise<ImageInfo> {\n    let thumbnailType = \"image/png\";\n    if (imageFile.type === \"image/jpeg\") {\n        thumbnailType = \"image/jpeg\";\n    }\n\n    // We don't await this immediately so it can happen in the background\n    const isAnimatedPromise = blobIsAnimated(imageFile);\n\n    const imageElement = await loadImageElement(imageFile);\n\n    const result = await createThumbnail(imageElement.img, imageElement.width, imageElement.height, thumbnailType);\n    const imageInfo = result.info;\n\n    const isAnimated = await isAnimatedPromise;\n    if (isAnimated !== undefined) {\n        imageInfo[\"org.matrix.msc4230.is_animated\"] = await isAnimatedPromise;\n    }\n\n    // For lesser supported image types, always include the thumbnail even if it is larger\n    if (!ALWAYS_INCLUDE_THUMBNAIL.includes(imageFile.type)) {\n        // we do all sizing checks here because we still rely on thumbnail generation for making a blurhash from.\n        const sizeDifference = imageFile.size - imageInfo.thumbnail_info!.size!;\n        if (\n            // image is small enough already\n            imageFile.size <= IMAGE_SIZE_THRESHOLD_THUMBNAIL ||\n            // thumbnail is not sufficiently smaller than original\n            (sizeDifference <= IMAGE_THUMBNAIL_MIN_REDUCTION_SIZE &&\n                sizeDifference <= imageFile.size * IMAGE_THUMBNAIL_MIN_REDUCTION_PERCENT)\n        ) {\n            delete imageInfo[\"thumbnail_info\"];\n            return imageInfo;\n        }\n    }\n\n    const uploadResult = await uploadFile(matrixClient, roomId, result.thumbnail);\n\n    imageInfo[\"thumbnail_url\"] = uploadResult.url;\n    imageInfo[\"thumbnail_file\"] = uploadResult.file;\n    return imageInfo;\n}\n\n/**\n * Load a file into a newly created audio element and load the metadata\n *\n * @param {File} audioFile The file to load in an audio element.\n * @returns {Promise} A promise that resolves with the audio element.\n */\nfunction loadAudioElement(audioFile: File): Promise<HTMLAudioElement> {\n    return new Promise((resolve, reject) => {\n        // Load the file into a html element\n        const audio = document.createElement(\"audio\");\n        audio.preload = \"metadata\";\n        audio.muted = true;\n\n        const reader = new FileReader();\n\n        reader.onload = function (ev): void {\n            audio.onloadedmetadata = async function (): Promise<void> {\n                resolve(audio);\n            };\n            audio.onerror = function (e): void {\n                reject(e);\n            };\n\n            audio.src = ev.target?.result as string;\n        };\n        reader.onerror = function (e): void {\n            reject(e);\n        };\n        reader.readAsDataURL(audioFile);\n    });\n}\n\n/**\n * Read the metadata for an audio file.\n *\n * @param {File} audioFile The audio to read.\n * @returns {Promise} A promise that resolves with the attachment info.\n */\nasync function infoForAudioFile(audioFile: File): Promise<AudioInfo> {\n    const audio = await loadAudioElement(audioFile);\n    return { duration: Math.ceil(audio.duration * 1000) };\n}\n\n/**\n * Load a file into a newly created video element and pull some strings\n * in an attempt to guarantee the first frame will be showing.\n *\n * @param {File} videoFile The file to load in a video element.\n * @returns {Promise} A promise that resolves with the video element.\n */\nfunction loadVideoElement(videoFile: File): Promise<HTMLVideoElement> {\n    return new Promise((resolve, reject) => {\n        // Load the file into a html element\n        const video = document.createElement(\"video\");\n        video.preload = \"metadata\";\n        video.playsInline = true;\n        video.muted = true;\n\n        const reader = new FileReader();\n\n        reader.onload = function (ev): void {\n            // Wait until we have enough data to thumbnail the first frame.\n            video.onloadeddata = async function (): Promise<void> {\n                resolve(video);\n                video.pause();\n            };\n            video.onerror = function (e): void {\n                reject(e);\n            };\n\n            let dataUrl = ev.target?.result as string;\n            // Chrome chokes on quicktime but likes mp4, and `file.type` is\n            // read only, so do this horrible hack to unbreak quicktime\n            if (dataUrl?.startsWith(\"data:video/quicktime;\")) {\n                dataUrl = dataUrl.replace(\"data:video/quicktime;\", \"data:video/mp4;\");\n            }\n\n            video.src = dataUrl;\n            video.load();\n            video.play();\n        };\n        reader.onerror = function (e): void {\n            reject(e);\n        };\n        reader.readAsDataURL(videoFile);\n    });\n}\n\n/**\n * Read the metadata for a video file and create and upload a thumbnail of the video.\n *\n * @param {MatrixClient} matrixClient A matrixClient to upload the thumbnail with.\n * @param {String} roomId The ID of the room the video will be uploaded to.\n * @param {File} videoFile The video to read and thumbnail.\n * @returns {Promise} A promise that resolves with the attachment info.\n */\nfunction infoForVideoFile(matrixClient: MatrixClient, roomId: string, videoFile: File): Promise<VideoInfo> {\n    const thumbnailType = \"image/jpeg\";\n\n    const videoInfo: VideoInfo = {};\n    return loadVideoElement(videoFile)\n        .then((video) => {\n            videoInfo.duration = Math.ceil(video.duration * 1000);\n            return createThumbnail(video, video.videoWidth, video.videoHeight, thumbnailType);\n        })\n        .then((result) => {\n            Object.assign(videoInfo, result.info);\n            return uploadFile(matrixClient, roomId, result.thumbnail);\n        })\n        .then((result) => {\n            videoInfo.thumbnail_url = result.url;\n            videoInfo.thumbnail_file = result.file;\n            return videoInfo;\n        });\n}\n\n/**\n * Read the file as an ArrayBuffer.\n * @param {File} file The file to read\n * @returns {Promise} A promise that resolves with an ArrayBuffer when the file\n *   is read.\n */\nfunction readFileAsArrayBuffer(file: File | Blob): Promise<ArrayBuffer> {\n    return new Promise((resolve, reject) => {\n        const reader = new FileReader();\n        reader.onload = function (e): void {\n            resolve(e.target?.result as ArrayBuffer);\n        };\n        reader.onerror = function (e): void {\n            reject(e);\n        };\n        reader.readAsArrayBuffer(file);\n    });\n}\n\n/**\n * Upload the file to the content repository.\n * If the room is encrypted then encrypt the file before uploading.\n *\n * @param {MatrixClient} matrixClient The matrix client to upload the file with.\n * @param {String} roomId The ID of the room being uploaded to.\n * @param {File} file The file to upload.\n * @param {Function?} progressHandler optional callback to be called when a chunk of\n *    data is uploaded.\n * @param {AbortController?} controller optional abortController to use for this upload.\n * @returns {Promise} A promise that resolves with an object.\n *  If the file is unencrypted then the object will have a \"url\" key.\n *  If the file is encrypted then the object will have a \"file\" key.\n */\nexport async function uploadFile(\n    matrixClient: MatrixClient,\n    roomId: string,\n    file: File | Blob,\n    progressHandler?: UploadOpts[\"progressHandler\"],\n    controller?: AbortController,\n): Promise<{ url?: string; file?: EncryptedFile }> {\n    const abortController = controller ?? new AbortController();\n\n    // If the room is encrypted then encrypt the file before uploading it.\n    if (await matrixClient.getCrypto()?.isEncryptionEnabledInRoom(roomId)) {\n        // First read the file into memory.\n        const data = await readFileAsArrayBuffer(file);\n        if (abortController.signal.aborted) throw new UploadCanceledError();\n\n        // Then encrypt the file.\n        const encryptResult = await encrypt.encryptAttachment(data);\n        if (abortController.signal.aborted) throw new UploadCanceledError();\n\n        // Pass the encrypted data as a Blob to the uploader.\n        const blob = new Blob([encryptResult.data]);\n\n        let url: string;\n        try {\n            ({ content_uri: url } = await matrixClient.uploadContent(blob, {\n                progressHandler,\n                abortController,\n                includeFilename: false,\n                type: \"application/octet-stream\",\n            }));\n        } catch (e) {\n            if (abortController.signal.aborted) throw new UploadCanceledError();\n            console.error(\"Failed to upload file\", e);\n            throw new UploadFailedError(e);\n        }\n        if (abortController.signal.aborted) throw new UploadCanceledError();\n\n        // If the attachment is encrypted then bundle the URL along with the information\n        // needed to decrypt the attachment and add it under a file key.\n        return {\n            file: {\n                ...encryptResult.info,\n                url,\n            } as EncryptedFile,\n        };\n    } else {\n        let url: string;\n        try {\n            ({ content_uri: url } = await matrixClient.uploadContent(file, { progressHandler, abortController }));\n        } catch (e) {\n            if (abortController.signal.aborted) throw new UploadCanceledError();\n            console.error(\"Failed to upload file\", e);\n            throw new UploadFailedError(e);\n        }\n        if (abortController.signal.aborted) throw new UploadCanceledError();\n        // If the attachment isn't encrypted then include the URL directly.\n        return { url };\n    }\n}\n\nexport default class ContentMessages {\n    private inprogress: RoomUpload[] = [];\n    private mediaConfig: IMediaConfig | null = null;\n\n    public sendStickerContentToRoom(\n        url: string,\n        roomId: string,\n        threadId: string | null,\n        info: ImageInfo,\n        text: string,\n        matrixClient: MatrixClient,\n    ): Promise<ISendEventResponse> {\n        return doMaybeLocalRoomAction(\n            roomId,\n            (actualRoomId: string) => matrixClient.sendStickerMessage(actualRoomId, threadId, url, info, text),\n            matrixClient,\n        ).catch((e) => {\n            logger.warn(`Failed to send content with URL ${url} to room ${roomId}`, e);\n            throw e;\n        });\n    }\n\n    public getUploadLimit(): number | null {\n        return this.mediaConfig?.[\"m.upload.size\"] ?? null;\n    }\n\n    /**\n     * Sends a list of files to a room.\n     * @param files - The files to send.\n     * @param roomId - The ID of the room to send the files to.\n     * @param relation - The relation to the event being replied to.\n     * @param replyToEvent - The event being replied to, if any.\n     * @param matrixClient - The Matrix client to use for sending the files.\n     * @param context - The context in which the files are being sent.\n     * @returns A promise that resolves when the files have been sent.\n     */\n    public async sendContentListToRoom(\n        files: File[],\n        roomId: string,\n        relation: IEventRelation | undefined,\n        replyToEvent: MatrixEvent | undefined,\n        matrixClient: MatrixClient,\n        context = TimelineRenderingType.Room,\n    ): Promise<void> {\n        if (matrixClient.isGuest()) {\n            dis.dispatch({ action: \"require_registration\" });\n            return;\n        }\n\n        if (!this.mediaConfig) {\n            // hot-path optimization to not flash a spinner if we don't need to\n            const modal = Modal.createDialog(Spinner, undefined, \"mx_Dialog_spinner\");\n            await Promise.race([this.ensureMediaConfigFetched(matrixClient), modal.finished]);\n            if (!this.mediaConfig) {\n                // User cancelled by clicking away on the spinner\n                return;\n            } else {\n                modal.close();\n            }\n        }\n\n        const tooBigFiles: File[] = [];\n        const okFiles: File[] = [];\n\n        for (const file of files) {\n            if (this.isFileSizeAcceptable(file)) {\n                okFiles.push(file);\n            } else {\n                tooBigFiles.push(file);\n            }\n        }\n\n        if (tooBigFiles.length > 0) {\n            const { finished } = Modal.createDialog(UploadFailureDialog, {\n                badFiles: tooBigFiles,\n                totalFiles: files.length,\n                contentMessages: this,\n            });\n            const [shouldContinue] = await finished;\n            if (!shouldContinue) return;\n        }\n\n        let uploadAll = false;\n        // Promise to complete before sending next file into room, used for synchronisation of file-sending\n        // to match the order the files were specified in\n        let promBefore: Promise<any> = Promise.resolve();\n        for (let i = 0; i < okFiles.length; ++i) {\n            const file = okFiles[i];\n            const loopPromiseBefore = promBefore;\n\n            if (!uploadAll) {\n                const { finished } = Modal.createDialog(UploadConfirmDialog, {\n                    file,\n                    currentIndex: i,\n                    totalFiles: okFiles.length,\n                });\n                const [shouldContinue, shouldUploadAll] = await finished;\n                if (!shouldContinue) break;\n                if (shouldUploadAll) {\n                    uploadAll = true;\n                }\n            }\n\n            promBefore = doMaybeLocalRoomAction(\n                roomId,\n                (actualRoomId) =>\n                    this.sendContentToRoom(\n                        file,\n                        actualRoomId,\n                        relation,\n                        matrixClient,\n                        replyToEvent ?? undefined,\n                        loopPromiseBefore,\n                    ),\n                matrixClient,\n            );\n        }\n\n        if (replyToEvent) {\n            // Clear event being replied to\n            dis.dispatch({\n                action: \"reply_to_event\",\n                event: null,\n                context,\n            });\n        }\n\n        // Focus the correct composer\n        dis.dispatch({\n            action: Action.FocusSendMessageComposer,\n            context,\n        });\n    }\n\n    public getCurrentUploads(relation?: IEventRelation): RoomUpload[] {\n        return this.inprogress.filter((roomUpload) => {\n            const noRelation = !relation && !roomUpload.relation;\n            const matchingRelation =\n                relation &&\n                roomUpload.relation &&\n                relation.rel_type === roomUpload.relation.rel_type &&\n                relation.event_id === roomUpload.relation.event_id;\n\n            return (noRelation || matchingRelation) && !roomUpload.cancelled;\n        });\n    }\n\n    public cancelUpload(upload: RoomUpload): void {\n        upload.abort();\n        dis.dispatch<UploadCanceledPayload>({ action: Action.UploadCanceled, upload });\n    }\n\n    public async sendContentToRoom(\n        file: File,\n        roomId: string,\n        relation: IEventRelation | undefined,\n        matrixClient: MatrixClient,\n        replyToEvent: MatrixEvent | undefined,\n        promBefore?: Promise<any>,\n    ): Promise<void> {\n        const fileName = file.name || _t(\"common|attachment\");\n        const content: Omit<MediaEventContent, \"info\"> & { info: Partial<MediaEventInfo> } = {\n            body: fileName,\n            info: {\n                size: file.size,\n            },\n            msgtype: MsgType.File, // set more specifically later\n        };\n\n        // Attach mentions, which really only applies if there's a replyToEvent.\n        attachMentions(matrixClient.getSafeUserId(), content, null, replyToEvent);\n        attachRelation(content, relation);\n        if (replyToEvent) {\n            addReplyToMessageContent(content, replyToEvent);\n        }\n\n        if (SettingsStore.getValue(\"Performance.addSendMessageTimingMetadata\")) {\n            decorateStartSendingTime(content);\n        }\n\n        // if we have a mime type for the file, add it to the message metadata\n        if (file.type) {\n            content.info.mimetype = file.type;\n        }\n\n        const upload = new RoomUpload(roomId, fileName, relation, file.size);\n        this.inprogress.push(upload);\n        dis.dispatch<UploadStartedPayload>({ action: Action.UploadStarted, upload });\n\n        function onProgress(progress: UploadProgress): void {\n            upload.onProgress(progress);\n            dis.dispatch<UploadProgressPayload>({ action: Action.UploadProgress, upload });\n        }\n\n        try {\n            if (file.type.startsWith(\"image/\")) {\n                content.msgtype = MsgType.Image;\n                try {\n                    const imageInfo = await infoForImageFile(matrixClient, roomId, file);\n                    Object.assign(content.info, imageInfo);\n                } catch (e) {\n                    if (e instanceof UploadFailedError) {\n                        // re-throw to main upload error handler\n                        throw e;\n                    }\n                    // Otherwise we failed to thumbnail, fall back to uploading an m.file\n                    logger.error(`Expected file of type \"${file.type}\" to be an image, but got`, e);\n                    content.msgtype = MsgType.File;\n                }\n            } else if (file.type.startsWith(\"audio/\")) {\n                content.msgtype = MsgType.Audio;\n                try {\n                    const audioInfo = await infoForAudioFile(file);\n                    Object.assign(content.info, audioInfo);\n                } catch (e) {\n                    // Failed to process audio file, fall back to uploading an m.file\n                    logger.error(e);\n                    content.msgtype = MsgType.File;\n                }\n            } else if (file.type.startsWith(\"video/\")) {\n                content.msgtype = MsgType.Video;\n                try {\n                    const videoInfo = await infoForVideoFile(matrixClient, roomId, file);\n                    Object.assign(content.info, videoInfo);\n                } catch (e) {\n                    // Failed to thumbnail, fall back to uploading an m.file\n                    logger.error(e);\n                    content.msgtype = MsgType.File;\n                }\n            } else {\n                content.msgtype = MsgType.File;\n            }\n\n            if (upload.cancelled) throw new UploadCanceledError();\n            const result = await uploadFile(matrixClient, roomId, file, onProgress, upload.abortController);\n            content.file = result.file;\n            content.url = result.url;\n\n            if (upload.cancelled) throw new UploadCanceledError();\n            // Await previous message being sent into the room\n            if (promBefore) await promBefore;\n\n            if (upload.cancelled) throw new UploadCanceledError();\n            const threadId = relation?.rel_type === THREAD_RELATION_TYPE.name ? relation.event_id : null;\n\n            const response = await matrixClient.sendMessage(roomId, threadId ?? null, content as MediaEventContent);\n\n            if (SettingsStore.getValue(\"Performance.addSendMessageTimingMetadata\")) {\n                sendRoundTripMetric(matrixClient, roomId, response.event_id);\n            }\n\n            dis.dispatch<UploadFinishedPayload>({ action: Action.UploadFinished, upload });\n            dis.dispatch({ action: \"message_sent\" });\n        } catch (error) {\n            // Unwrap UploadFailedError to get the underlying error\n            const unwrappedError = error instanceof UploadFailedError && error.cause ? error.cause : error;\n\n            // 413: File was too big or upset the server in some way:\n            // clear the media size limit so we fetch it again next time we try to upload\n            if (unwrappedError instanceof HTTPError && unwrappedError.httpStatus === 413) {\n                this.mediaConfig = null;\n            }\n\n            if (!upload.cancelled) {\n                let desc = _t(\"upload_failed_generic\", { fileName: upload.fileName });\n                if (unwrappedError instanceof HTTPError && unwrappedError.httpStatus === 413) {\n                    desc = _t(\"upload_failed_size\", {\n                        fileName: upload.fileName,\n                    });\n                }\n                Modal.createDialog(ErrorDialog, {\n                    title: _t(\"upload_failed_title\"),\n                    description: desc,\n                });\n                dis.dispatch<UploadErrorPayload>({ action: Action.UploadFailed, upload, error });\n            }\n        } finally {\n            removeElement(this.inprogress, (e) => e.promise === upload.promise);\n        }\n    }\n\n    private isFileSizeAcceptable(file: File): boolean {\n        if (this.mediaConfig?.[\"m.upload.size\"] !== undefined && file.size > this.mediaConfig[\"m.upload.size\"]) {\n            return false;\n        }\n        return true;\n    }\n\n    private ensureMediaConfigFetched(matrixClient: MatrixClient): Promise<void> {\n        if (this.mediaConfig !== null) return Promise.resolve();\n\n        logger.log(\"[Media Config] Fetching\");\n        return matrixClient\n            .getMediaConfig()\n            .then((config) => {\n                logger.log(\"[Media Config] Fetched config:\", config);\n                return config;\n            })\n            .catch(() => {\n                // Media repo can't or won't report limits, so provide an empty object (no limits).\n                logger.log(\"[Media Config] Could not fetch config, so not limiting uploads.\");\n                return {};\n            })\n            .then((config) => {\n                this.mediaConfig = config;\n            });\n    }\n\n    public static sharedInstance(): ContentMessages {\n        if (window.mxContentMessages === undefined) {\n            window.mxContentMessages = new ContentMessages();\n        }\n        return window.mxContentMessages;\n    }\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 Šimon Brandner <simon.bra.ag@gmail.com>\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport React, { type JSX } from \"react\";\n\nimport { ALTERNATE_KEY_NAME, KEY_ICON } from \"../../../accessibility/KeyboardShortcuts\";\nimport { type KeyCombo } from \"../../../KeyBindingsManager\";\nimport { IS_MAC, Key } from \"../../../Keyboard\";\nimport { _t } from \"../../../languageHandler\";\n\ninterface IKeyboardKeyProps {\n    name: string;\n    last?: boolean;\n}\n\nexport const KeyboardKey: React.FC<IKeyboardKeyProps> = ({ name, last }) => {\n    const icon = KEY_ICON[name];\n    const alternateName = ALTERNATE_KEY_NAME[name];\n\n    return (\n        <React.Fragment>\n            <kbd> {icon || (alternateName && _t(alternateName)) || name} </kbd>\n            {!last && \"+\"}\n        </React.Fragment>\n    );\n};\n\ninterface IKeyboardShortcutProps {\n    value: KeyCombo;\n    className?: string;\n}\n\nexport const KeyboardShortcut: React.FC<IKeyboardShortcutProps> = ({ value, className = \"mx_KeyboardShortcut\" }) => {\n    if (!value) return null;\n\n    const modifiersElement: JSX.Element[] = [];\n    if (value.ctrlOrCmdKey) {\n        modifiersElement.push(<KeyboardKey key=\"ctrlOrCmdKey\" name={IS_MAC ? Key.META : Key.CONTROL} />);\n    } else if (value.ctrlKey) {\n        modifiersElement.push(<KeyboardKey key=\"ctrlKey\" name={Key.CONTROL} />);\n    } else if (value.metaKey) {\n        modifiersElement.push(<KeyboardKey key=\"metaKey\" name={Key.META} />);\n    }\n    if (value.altKey) {\n        modifiersElement.push(<KeyboardKey key=\"altKey\" name={Key.ALT} />);\n    }\n    if (value.shiftKey) {\n        modifiersElement.push(<KeyboardKey key=\"shiftKey\" name={Key.SHIFT} />);\n    }\n\n    return (\n        <div className={className}>\n            {modifiersElement}\n            <KeyboardKey name={value.key} last />\n        </div>\n    );\n};\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { useState } from \"react\";\n\nexport default function useFocus(): [boolean, { onFocus: () => void; onBlur: () => void }] {\n    const [focused, setFocused] = useState(false);\n\n    const props = {\n        onFocus: () => setFocused(true),\n        onBlur: () => setFocused(false),\n    };\n\n    return [focused, props];\n}\n","/*\nCopyright 2024 New Vector Ltd.\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nSPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE files in the repository root for full details.\n*/\n\nimport { type IContent, type MatrixClient } from \"matrix-js-sdk/src/matrix\";\n\n/**\n * Decorates the given event content object with the \"send start time\". The\n * object will be modified in-place.\n * @param {object} content The event content.\n */\nexport function decorateStartSendingTime(content: IContent): void {\n    content[\"io.element.performance_metrics\"] = {\n        sendStartTs: Date.now(),\n    };\n}\n\n/**\n * Called when an event decorated with `decorateStartSendingTime()` has been sent\n * by the server (the client now knows the event ID).\n * @param {MatrixClient} client The client to send as.\n * @param {string} inRoomId The room ID where the original event was sent.\n * @param {string} forEventId The event ID for the decorated event.\n */\nexport function sendRoundTripMetric(client: MatrixClient, inRoomId: string, forEventId: string): void {\n    // noinspection JSIgnoredPromiseFromCall\n    client.sendEvent(inRoomId, \"io.element.performance_metric\", {\n        \"io.element.performance_metrics\": {\n            forEventId: forEventId,\n            responseTs: Date.now(),\n            kind: \"send_time\",\n        },\n    });\n}\n","import { forwardRef } from \"react\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction AttachmentIcon(props, ref) {\n  return /*#__PURE__*/_jsx(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"1em\",\n    height: \"1em\",\n    fill: \"currentColor\",\n    viewBox: \"0 0 24 24\",\n    ref: ref,\n    ...props,\n    children: /*#__PURE__*/_jsx(\"path\", {\n      d: \"M11.5 22q-2.3 0-3.9-1.6T6 16.5V6q0-1.65 1.175-2.825T10 2t2.825 1.175T14 6v9.5q0 1.05-.725 1.775T11.5 18t-1.775-.725T9 15.5V6.75A.73.73 0 0 1 9.75 6a.73.73 0 0 1 .75.75v8.75q0 .424.287.712.288.288.713.288.424 0 .713-.288a.97.97 0 0 0 .287-.712V6q0-1.05-.725-1.775T10 3.5t-1.775.725T7.5 6v10.5q0 1.65 1.175 2.825T11.5 20.5t2.825-1.175T15.5 16.5V6.75a.73.73 0 0 1 .75-.75.73.73 0 0 1 .75.75v9.75q0 2.3-1.6 3.9T11.5 22\"\n    })\n  });\n}\n;\nAttachmentIcon.displayName = \"AttachmentIcon\";\nexport default forwardRef(AttachmentIcon);","/*\n * Copyright 2026 Element Creations Ltd.\n *\n * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial\n * Please see LICENSE files in the repository root for full details.\n */\n\nimport {\n    _t,\n    BaseViewModel,\n    type UploadButtonViewActions,\n    type UploadButtonViewSnapshot,\n    useCreateAutoDisposedViewModel,\n} from \"@element-hq/web-shared-components\";\nimport { logger as rootLogger } from \"matrix-js-sdk/src/logger\";\nimport { AttachmentIcon } from \"@vector-im/compound-design-tokens/assets/web/icons\";\nimport React, {\n    type ChangeEventHandler,\n    createContext,\n    type ReactNode,\n    useCallback,\n    useContext,\n    useEffect,\n    useRef,\n} from \"react\";\nimport {\n    type MatrixClient,\n    type Room,\n    type IEventRelation,\n    type MatrixEvent,\n    RoomEvent,\n} from \"matrix-js-sdk/src/matrix\";\n\nimport type { ComposerApiFileUploadOption } from \"@element-hq/element-web-module-api\";\nimport { useScopedRoomContext } from \"../../contexts/ScopedRoomContext\";\nimport { useMatrixClientContext } from \"../../contexts/MatrixClientContext\";\nimport ContentMessages from \"../../ContentMessages\";\nimport { TimelineRenderingType } from \"../../contexts/RoomContext\";\nimport { chromeFileInputFix } from \"../../utils/BrowserWorkarounds\";\nimport type { MatrixDispatcher } from \"../../dispatcher/dispatcher\";\nimport defaultDispatcher from \"../../dispatcher/dispatcher\";\nimport { ModuleApi } from \"../../modules/Api\";\nimport { ModuleComposerApiEvents } from \"../../modules/ComposerApi\";\nimport { Action } from \"../../dispatcher/actions\";\nimport type { ComposerInsertFilesPayload } from \"../../dispatcher/payloads/ComposerInsertFilePayload\";\nimport { useDispatcher } from \"../../hooks/useDispatcher\";\nimport type { ActionPayload } from \"../../dispatcher/payloads\";\n\nconst logger = rootLogger.getChild(\"RoomUploadViewModel\");\n\ninterface RoomUploadViewSnapshot extends UploadButtonViewSnapshot {\n    mayDragAndDropFile: boolean;\n}\n\nexport class RoomUploadViewModel\n    extends BaseViewModel<RoomUploadViewSnapshot, Record<string, never>>\n    implements UploadButtonViewActions\n{\n    private readonly uploadSelectFns = new Map<string, ComposerApiFileUploadOption[\"onSelected\"]>();\n    public constructor(\n        private readonly room: Room,\n        private readonly client: MatrixClient,\n        private readonly timelineRenderingType: TimelineRenderingType,\n        private readonly dispatcher: MatrixDispatcher,\n        private replyToEvent: MatrixEvent | undefined,\n        private threadRelation: IEventRelation | undefined,\n        public readonly openUploadDialog: () => void,\n        private readonly moduleComposerApi = ModuleApi.instance.composer,\n    ) {\n        super(\n            {},\n            {\n                options: [],\n                mayDragAndDropFile: false,\n            },\n        );\n        // Initial check.\n        this.onRoomCurrentStateUpdated();\n        // Configure upload functions\n        for (const option of moduleComposerApi.fileUploadOptions) {\n            this.uploadSelectFns.set(option.type, option.onSelected);\n        }\n        this.uploadSelectFns.set(\"local\", this.openUploadDialog);\n        room.on(RoomEvent.CurrentStateUpdated, this.onRoomCurrentStateUpdated);\n        this.disposables.trackListener(room, RoomEvent.CurrentStateUpdated, this.onRoomCurrentStateUpdated);\n\n        moduleComposerApi.on(ModuleComposerApiEvents.UploaderOptionsChanged, this.onUploaderOptionsChanged);\n        this.disposables.trackListener(\n            moduleComposerApi,\n            ModuleComposerApiEvents.UploaderOptionsChanged,\n            // Types issue.\n            this.onUploaderOptionsChanged as any,\n        );\n    }\n\n    private onRoomCurrentStateUpdated = (): void => {\n        const maySendMessage = this.room.maySendMessage();\n        this.snapshot.merge({\n            mayDragAndDropFile: maySendMessage,\n            options: maySendMessage\n                ? [\n                      {\n                          type: \"local\",\n                          label: _t(\"common|attachment\"),\n                          icon: AttachmentIcon,\n                      },\n                      ...this.moduleComposerApi.fileUploadOptions.map((option) => ({\n                          type: option.type,\n                          label: option.label,\n                          icon: option.icon,\n                      })),\n                  ]\n                : [],\n        });\n    };\n\n    private readonly onUploaderOptionsChanged = (option: ComposerApiFileUploadOption): void => {\n        this.uploadSelectFns.set(option.type, option.onSelected);\n        this.snapshot.merge({\n            options: [\n                ...this.snapshot.current.options,\n                {\n                    type: option.type,\n                    label: option.label,\n                    icon: option.icon,\n                },\n            ],\n        });\n    };\n\n    public setReplyToEvent = (replyToEvent?: MatrixEvent): void => {\n        this.replyToEvent = replyToEvent;\n    };\n\n    public setThreadRelation = (threadRelation?: IEventRelation): void => {\n        this.threadRelation = threadRelation;\n    };\n\n    public initiateViaInputFiles = async (files: FileList | File[] | null): Promise<void> => {\n        if (!this.checkCanUpload()) {\n            return;\n        }\n        const { roomId } = this.room;\n        logger.info(\"initiateViaInputFiles for\", roomId);\n        if (!files?.length) return;\n\n        try {\n            await ContentMessages.sharedInstance().sendContentListToRoom(\n                Array.from(files),\n                roomId,\n                this.threadRelation,\n                this.replyToEvent,\n                this.client,\n                this.timelineRenderingType,\n            );\n        } catch (ex) {\n            logger.warn(\"Failed to handle file upload transfer\", ex);\n        }\n    };\n\n    public initiateViaDataTransfer = async (dataTransfer: DataTransfer): Promise<void> => {\n        if (!this.checkCanUpload()) {\n            return;\n        }\n        const { roomId } = this.room;\n        logger.info(\"initiateViaDataTransfer for\", roomId);\n        if (!dataTransfer.files?.length) return;\n\n        try {\n            await ContentMessages.sharedInstance().sendContentListToRoom(\n                Array.from(dataTransfer.files),\n                roomId,\n                this.threadRelation,\n                this.replyToEvent,\n                this.client,\n                this.timelineRenderingType,\n            );\n        } catch (ex) {\n            logger.warn(\"Failed to handle drag and drop data transfer\", ex);\n        }\n    };\n\n    public onUploadOptionSelected = (type: ComposerApiFileUploadOption[\"type\"]): void => {\n        const fn = this.uploadSelectFns.get(type);\n        if (!fn) {\n            throw new Error(\"Unexpectedly called onUploadOptionSelected with an unknown type\");\n        }\n        // At the point of this function being called, we should be in a state that is either rendering a room\n        // or timeline.\n        if (![TimelineRenderingType.Room, TimelineRenderingType.Thread].includes(this.timelineRenderingType)) {\n            throw new Error(\"TimelineRenderingType must be Room or Thread\");\n        }\n        fn(\n            this.room.roomId,\n            {\n                view: this.timelineRenderingType === TimelineRenderingType.Room ? \"room\" : \"thread\",\n            },\n            {\n                inReplyToEventId: this.replyToEvent?.getId(),\n                relType: this.threadRelation?.rel_type,\n            },\n        );\n    };\n\n    private checkCanUpload(): boolean {\n        if (this.client.isGuest()) {\n            this.dispatcher.dispatch({ action: \"require_registration\" });\n            return false;\n        }\n        return true;\n    }\n}\n\nexport const RoomUploadContext = createContext<RoomUploadViewModel | null>(null);\n\nexport function useRoomUploadViewModel(): RoomUploadViewModel {\n    const ctx = useContext(RoomUploadContext);\n    if (!ctx) {\n        throw new Error(\"RoomFileUploadProvider is not present\");\n    }\n    return ctx;\n}\n\nexport function RoomUploadContextProvider({\n    children,\n    threadRelation,\n}: {\n    children: ReactNode;\n    threadRelation?: IEventRelation;\n}): ReactNode {\n    const { room, timelineRenderingType, replyToEvent } = useScopedRoomContext(\n        \"room\",\n        \"timelineRenderingType\",\n        \"replyToEvent\",\n    );\n    const client = useMatrixClientContext();\n    const uploadInput = useRef<HTMLInputElement>(null);\n\n    const openFilePicker = useCallback((): void => {\n        if (!uploadInput.current) {\n            throw new Error(\"Input not ready\");\n        }\n        uploadInput.current.click();\n    }, [uploadInput]);\n\n    const vm = useCreateAutoDisposedViewModel(() => {\n        if (!room) {\n            throw new Error(\"RoomUploadContextProvider must have a room\");\n        }\n        return new RoomUploadViewModel(\n            room,\n            client,\n            // Checked earlier\n            timelineRenderingType,\n            defaultDispatcher,\n            replyToEvent,\n            threadRelation,\n            openFilePicker,\n        );\n    });\n\n    useEffect(() => {\n        vm.setReplyToEvent(replyToEvent);\n    }, [vm, replyToEvent]);\n\n    useEffect(() => {\n        vm.setThreadRelation(threadRelation);\n    }, [vm, threadRelation]);\n\n    const onInputChange: ChangeEventHandler<HTMLInputElement> = useCallback(\n        (ev) => {\n            void (async () => {\n                try {\n                    await vm.initiateViaInputFiles(ev.target.files);\n                } finally {\n                    // This is the onChange handler for a file form control, but we're\n                    // not keeping any state, so reset the value of the form control\n                    // to empty.\n                    // NB. we need to set 'value': the 'files' property is immutable.\n                    ev.target.value = \"\";\n                }\n            })();\n        },\n        [vm],\n    );\n\n    useDispatcher(defaultDispatcher, (payload: ActionPayload) => {\n        if (payload.action !== Action.ComposerFileInsert) {\n            return;\n        }\n        const fileInsert = payload as ComposerInsertFilesPayload;\n        if (fileInsert.timelineRenderingType === timelineRenderingType) {\n            logger.info(\n                `Got ComposerFileInsert with ${fileInsert.files.length} files`,\n                timelineRenderingType,\n                threadRelation,\n            );\n            vm.initiateViaInputFiles(fileInsert.files);\n        }\n    });\n\n    // Note, while this logic could be largely replaced with https://developer.mozilla.org/en-US/docs/Web/API/Window/showOpenFilePicker\n    // it does not enjoy support across all our target platforms.\n    // Therefore, we use the invisible input element trick.\n\n    return (\n        <RoomUploadContext.Provider value={vm}>\n            <>\n                {children}\n                <input\n                    ref={uploadInput}\n                    type=\"file\"\n                    data-testid=\"room-upload-context-input\"\n                    style={{ display: \"none\" }}\n                    multiple\n                    onClick={chromeFileInputFix}\n                    onChange={onInputChange}\n                />\n            </>\n        </RoomUploadContext.Provider>\n    );\n}\n","/* crc32.js (C) 2014-2015 SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\nvar CRC32;\n(function (factory) {\n\tif(typeof DO_NOT_EXPORT_CRC === 'undefined') {\n\t\tif('object' === typeof exports) {\n\t\t\tfactory(exports);\n\t\t} else if ('function' === typeof define && define.amd) {\n\t\t\tdefine(function () {\n\t\t\t\tvar module = {};\n\t\t\t\tfactory(module);\n\t\t\t\treturn module;\n\t\t\t});\n\t\t} else {\n\t\t  factory(CRC32 = {});\n\t\t}\n\t} else {\n\t\tfactory(CRC32 = {});\n\t}\n}(function(CRC32) {\nCRC32.version = '0.3.0';\n/* see perf/crc32table.js */\nfunction signed_crc_table() {\n\tvar c = 0, table = new Array(256);\n\n\tfor(var n =0; n != 256; ++n){\n\t\tc = n;\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\ttable[n] = c;\n\t}\n\n\treturn typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;\n}\n\nvar table = signed_crc_table();\n/* charCodeAt is the best approach for binary strings */\nvar use_buffer = typeof Buffer !== 'undefined';\nfunction crc32_bstr(bstr) {\n\tif(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr));\n\tvar crc = -1, L = bstr.length - 1;\n\tfor(var i = 0; i < L;) {\n\t\tcrc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);\n\t\tcrc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);\n\t}\n\tif(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF];\n\treturn crc ^ -1;\n}\n\nfunction crc32_buf(buf) {\n\tif(buf.length > 10000) return crc32_buf_8(buf);\n\tfor(var crc = -1, i = 0, L=buf.length-3; i < L;) {\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t}\n\twhile(i < L+3) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\treturn crc ^ -1;\n}\n\nfunction crc32_buf_8(buf) {\n\tfor(var crc = -1, i = 0, L=buf.length-7; i < L;) {\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t}\n\twhile(i < L+7) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\treturn crc ^ -1;\n}\n\n/* much much faster to intertwine utf8 and crc */\nfunction crc32_str(str) {\n\tfor(var crc = -1, i = 0, L=str.length, c, d; i < L;) {\n\t\tc = str.charCodeAt(i++);\n\t\tif(c < 0x80) {\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ c) & 0xFF];\n\t\t} else if(c < 0x800) {\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (192|((c>>6)&31))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF];\n\t\t} else if(c >= 0xD800 && c < 0xE000) {\n\t\t\tc = (c&1023)+64; d = str.charCodeAt(i++) & 1023;\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (240|((c>>8)&7))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|((c>>2)&63))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|((d>>6)&15)|(c&3))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|(d&63))) & 0xFF];\n\t\t} else {\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (224|((c>>12)&15))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|((c>>6)&63))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF];\n\t\t}\n\t}\n\treturn crc ^ -1;\n}\nCRC32.table = table;\nCRC32.bstr = crc32_bstr;\nCRC32.buf = crc32_buf;\nCRC32.str = crc32_str;\n}));\n","var crc32 = require('crc-32')\n\nmodule.exports = extractChunks\n\n// Used for fast-ish conversion between uint8s and uint32s/int32s.\n// Also required in order to remain agnostic for both Node Buffers and\n// Uint8Arrays.\nvar uint8 = new Uint8Array(4)\nvar int32 = new Int32Array(uint8.buffer)\nvar uint32 = new Uint32Array(uint8.buffer)\n\nfunction extractChunks (data) {\n  if (data[0] !== 0x89) throw new Error('Invalid .png file header')\n  if (data[1] !== 0x50) throw new Error('Invalid .png file header')\n  if (data[2] !== 0x4E) throw new Error('Invalid .png file header')\n  if (data[3] !== 0x47) throw new Error('Invalid .png file header')\n  if (data[4] !== 0x0D) throw new Error('Invalid .png file header: possibly caused by DOS-Unix line ending conversion?')\n  if (data[5] !== 0x0A) throw new Error('Invalid .png file header: possibly caused by DOS-Unix line ending conversion?')\n  if (data[6] !== 0x1A) throw new Error('Invalid .png file header')\n  if (data[7] !== 0x0A) throw new Error('Invalid .png file header: possibly caused by DOS-Unix line ending conversion?')\n\n  var ended = false\n  var chunks = []\n  var idx = 8\n\n  while (idx < data.length) {\n    // Read the length of the current chunk,\n    // which is stored as a Uint32.\n    uint8[3] = data[idx++]\n    uint8[2] = data[idx++]\n    uint8[1] = data[idx++]\n    uint8[0] = data[idx++]\n\n    // Chunk includes name/type for CRC check (see below).\n    var length = uint32[0] + 4\n    var chunk = new Uint8Array(length)\n    chunk[0] = data[idx++]\n    chunk[1] = data[idx++]\n    chunk[2] = data[idx++]\n    chunk[3] = data[idx++]\n\n    // Get the name in ASCII for identification.\n    var name = (\n      String.fromCharCode(chunk[0]) +\n      String.fromCharCode(chunk[1]) +\n      String.fromCharCode(chunk[2]) +\n      String.fromCharCode(chunk[3])\n    )\n\n    // The IHDR header MUST come first.\n    if (!chunks.length && name !== 'IHDR') {\n      throw new Error('IHDR header missing')\n    }\n\n    // The IEND header marks the end of the file,\n    // so on discovering it break out of the loop.\n    if (name === 'IEND') {\n      ended = true\n      chunks.push({\n        name: name,\n        data: new Uint8Array(0)\n      })\n\n      break\n    }\n\n    // Read the contents of the chunk out of the main buffer.\n    for (var i = 4; i < length; i++) {\n      chunk[i] = data[idx++]\n    }\n\n    // Read out the CRC value for comparison.\n    // It's stored as an Int32.\n    uint8[3] = data[idx++]\n    uint8[2] = data[idx++]\n    uint8[1] = data[idx++]\n    uint8[0] = data[idx++]\n\n    var crcActual = int32[0]\n    var crcExpect = crc32.buf(chunk)\n    if (crcExpect !== crcActual) {\n      throw new Error(\n        'CRC values for ' + name + ' header do not match, PNG file is likely corrupted'\n      )\n    }\n\n    // The chunk data is now copied to remove the 4 preceding\n    // bytes used for the chunk name/type.\n    var chunkData = new Uint8Array(chunk.buffer.slice(4))\n\n    chunks.push({\n      name: name,\n      data: chunkData\n    })\n  }\n\n  if (!ended) {\n    throw new Error('.png file ended prematurely: no IEND header was found')\n  }\n\n  return chunks\n}\n"],"names":["RoomUpload","constructor","roomId","fileName","relation","fileSize","_defineProperty","this","AbortController","onProgress","progress","uploaded","loaded","total","abort","abortController","cancelled","signal","aborted","UploadFailureDialog","React","args","super","props","onFinished","render","message","buttons","totalFiles","badFiles","length","_t","limit","contentMessages","getUploadLimit","sizeOfThisFile","size","b","sub","DialogButtons","primaryButton","hasCancel","onPrimaryButtonClick","onCancelClick","focus","howManyOthers","count","onUploadClick","cancelButton","onCancel","BaseDialog","className","title","contentId","id","PHYS_HIDPI","UploadCanceledError","Error","UploadFailedError","cause","ALWAYS_INCLUDE_THUMBNAIL","async","infoForImageFile","matrixClient","imageFile","thumbnailType","type","isAnimatedPromise","blobIsAnimated","imageElement","img","Image","objectUrl","URL","createObjectURL","imgPromise","Promise","resolve","reject","onload","revokeObjectURL","onerror","e","src","parsePromise","readFileAsArrayBuffer","then","arrayBuffer","buffer","Uint8Array","chunks","extractPngChunks","chunk","name","data","byteLength","every","val","i","catch","console","error","hidpi","all","width","height","loadImageElement","result","createThumbnail","imageInfo","info","undefined","includes","sizeDifference","thumbnail_info","uploadResult","uploadFile","thumbnail","url","file","infoForAudioFile","audioFile","audio","document","createElement","preload","muted","reader","FileReader","ev","_ev$target","onloadedmetadata","target","readAsDataURL","loadAudioElement","duration","Math","ceil","infoForVideoFile","videoFile","videoInfo","video","playsInline","_ev$target2","_dataUrl","onloadeddata","pause","dataUrl","startsWith","replace","load","play","loadVideoElement","videoWidth","videoHeight","Object","assign","thumbnail_url","thumbnail_file","_e$target","readAsArrayBuffer","progressHandler","controller","_matrixClient$getCryp","getCrypto","isEncryptionEnabledInRoom","encryptResult","encrypt","blob","Blob","content_uri","uploadContent","includeFilename","_objectSpread","ContentMessages","sendStickerContentToRoom","threadId","text","doMaybeLocalRoomAction","actualRoomId","sendStickerMessage","logger","warn","_this$mediaConfig$mU","_this$mediaConfig","mediaConfig","sendContentListToRoom","files","replyToEvent","context","TimelineRenderingType","Room","isGuest","dis","dispatch","action","modal","Modal","createDialog","Spinner","race","ensureMediaConfigFetched","finished","close","tooBigFiles","okFiles","isFileSizeAcceptable","push","shouldContinue","uploadAll","promBefore","loopPromiseBefore","UploadConfirmDialog","currentIndex","shouldUploadAll","sendContentToRoom","event","Action","FocusSendMessageComposer","getCurrentUploads","inprogress","filter","roomUpload","noRelation","matchingRelation","rel_type","event_id","cancelUpload","upload","UploadCanceled","content","body","msgtype","MsgType","File","attachMentions","getSafeUserId","attachRelation","addReplyToMessageContent","SettingsStore","getValue","decorateStartSendingTime","mimetype","UploadStarted","Audio","audioInfo","Video","UploadProgress","THREAD_RELATION_TYPE","response","sendMessage","sendRoundTripMetric","UploadFinished","unwrappedError","HTTPError","httpStatus","desc","ErrorDialog","description","UploadFailed","removeElement","promise","_this$mediaConfig2","log","getMediaConfig","config","sharedInstance","window","mxContentMessages","KeyboardKey","last","icon","KEY_ICON","alternateName","ALTERNATE_KEY_NAME","KeyboardShortcut","value","modifiersElement","ctrlOrCmdKey","key","IS_MAC","Key","META","CONTROL","ctrlKey","metaKey","altKey","ALT","shiftKey","SHIFT","useFocus","focused","setFocused","useState","onFocus","onBlur","sendStartTs","Date","now","client","inRoomId","forEventId","sendEvent","responseTs","kind","AttachmentIcon","ref","jsx_runtime","jsx","xmlns","fill","viewBox","children","d","displayName","attachment","react","forwardRef","rootLogger","getChild","RoomUploadViewModel","BaseViewModel","room","timelineRenderingType","dispatcher","threadRelation","openUploadDialog","moduleComposerApi","ModuleApi","instance","composer","options","mayDragAndDropFile","Map","maySendMessage","snapshot","merge","label","fileUploadOptions","map","option","uploadSelectFns","set","onSelected","current","checkCanUpload","Array","from","ex","_dataTransfer$files","dataTransfer","_this$replyToEvent","_this$threadRelation","fn","get","Thread","view","inReplyToEventId","getId","relType","onRoomCurrentStateUpdated","on","RoomEvent","CurrentStateUpdated","disposables","trackListener","ModuleComposerApiEvents","UploaderOptionsChanged","onUploaderOptionsChanged","RoomUploadContext","createContext","useRoomUploadViewModel","ctx","useContext","RoomUploadContextProvider","useScopedRoomContext","useMatrixClientContext","uploadInput","useRef","openFilePicker","useCallback","click","vm","useCreateAutoDisposedViewModel","defaultDispatcher","useEffect","setReplyToEvent","setThreadRelation","onInputChange","initiateViaInputFiles","useDispatcher","payload","ComposerFileInsert","fileInsert","Provider","style","display","multiple","onClick","chromeFileInputFix","onChange","factory","CRC32","version","table","c","n","Int32Array","signed_crc_table","use_buffer","Buffer","crc32_buf_8","buf","crc","L","bstr","charCodeAt","str","DO_NOT_EXPORT_CRC","exports","crc32","__webpack_require__","module","ended","idx","uint8","uint32","String","fromCharCode","crcActual","int32","chunkData","slice","Uint32Array"],"sourceRoot":""}