![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /opt/mattermost/client/ |
Upload File : |
{"version":3,"file":"11.88c2898b3db4047b1024.js","mappings":"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","sources":["webpack://mattermost-webapp/./src/components/file_info_preview/file_info_preview.tsx","webpack://mattermost-webapp/./src/components/file_info_preview/index.ts","webpack://mattermost-webapp/./src/components/archived_preview.tsx","webpack://mattermost-webapp/./src/components/audio_video_preview/audio_video_preview.tsx","webpack://mattermost-webapp/./src/components/audio_video_preview/index.ts","webpack://mattermost-webapp/./src/components/code_preview.tsx","webpack://mattermost-webapp/./src/components/file_preview_modal/file_preview_modal_info/file_preview_modal_info.tsx","webpack://mattermost-webapp/./src/components/file_preview_modal/types.ts","webpack://mattermost-webapp/./src/components/file_preview_modal/file_preview_modal_main_actions/file_preview_modal_main_actions.tsx","webpack://mattermost-webapp/./src/components/file_preview_modal/file_preview_modal_footer/file_preview_modal_footer.tsx","webpack://mattermost-webapp/./src/components/file_preview_modal/file_preview_modal_main_nav/file_preview_modal_main_nav.tsx","webpack://mattermost-webapp/./src/components/file_preview_modal/file_preview_modal_header/file_preview_modal_header.tsx","webpack://mattermost-webapp/./src/components/file_preview_modal/image_preview.tsx","webpack://mattermost-webapp/./src/components/file_preview_modal/popover_bar/popover_bar.tsx","webpack://mattermost-webapp/./src/components/file_preview_modal/popover_bar/index.ts","webpack://mattermost-webapp/./src/components/file_preview_modal/file_preview_modal.tsx"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport * as Utils from 'utils/utils';\n\ntype Props = {\n fileInfo: FileInfo;\n fileUrl: string;\n canDownloadFiles: boolean;\n};\n\nconst FileInfoPreview = ({\n fileInfo,\n fileUrl,\n canDownloadFiles,\n}: Props) => {\n const intl = useIntl();\n\n // non-image files include a section providing details about the file\n const infoParts = [];\n\n if (fileInfo.extension !== '') {\n infoParts.push(\n intl.formatMessage({id: 'file_info_preview.type', defaultMessage: 'File type '}) +\n fileInfo.extension.toUpperCase(),\n );\n }\n\n if (fileInfo.size) {\n infoParts.push(\n intl.formatMessage({id: 'file_info_preview.size', defaultMessage: 'Size '}) +\n Utils.fileSizeToString(fileInfo.size),\n );\n }\n\n const infoString = infoParts.join(', ');\n\n let preview = null;\n if (canDownloadFiles) {\n preview = (\n <a\n className='file-details__preview'\n href={fileUrl}\n >\n <span className='file-details__preview-helper'/>\n <img\n alt={'file preview'}\n src={Utils.getFileIconPath(fileInfo)}\n />\n </a>\n );\n } else {\n preview = (\n <span className='file-details__preview'>\n <span className='file-details__preview-helper'/>\n <img\n alt={'file preview'}\n src={Utils.getFileIconPath(fileInfo)}\n />\n </span>\n );\n }\n\n return (\n <div className='file-details__container'>\n {preview}\n <div className='file-details'>\n <div className='file-details__name'>{fileInfo.name}</div>\n <div className='file-details__info'>{infoString}</div>\n </div>\n </div>\n );\n};\n\nexport default React.memo(FileInfoPreview);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport {canDownloadFiles} from 'utils/file_utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport FileInfoPreview from './file_info_preview';\n\nfunction mapStateToProps(state: GlobalState) {\n const config = getConfig(state);\n\n return {\n canDownloadFiles: canDownloadFiles(config),\n };\n}\n\nexport default connect(mapStateToProps)(FileInfoPreview);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nimport {ArchiveOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {FileInfo} from '@mattermost/types/files';\n\ninterface Props {\n fileInfo: FileInfo;\n}\n\nexport default function FileInfoPreview(props: Props) {\n const intl = useIntl();\n\n const infoString = intl.formatMessage({\n id: 'workspace_limits.archived_file.archived',\n defaultMessage: 'This file is archived',\n });\n\n const preview = (\n <span className='file-details__preview file-details__preview--archived'>\n <ArchiveOutlineIcon\n size={80}\n color={'rgba(var(--center-channel-color-rgb), 0.48)'}\n data-testid='archived-file-icon'\n />\n </span>\n );\n\n return (\n <div className='file-details__container'>\n {preview}\n <div className='file-details'>\n <div className='file-details__name'>{props.fileInfo.name}</div>\n <div className='file-details__info'>{infoString}</div>\n </div>\n </div>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport FileInfoPreview from 'components/file_info_preview';\n\nimport Constants from 'utils/constants';\n\ntype Props = {\n fileInfo: FileInfo;\n fileUrl: string;\n isMobileView: boolean;\n}\n\ntype State = {\n canPlay: boolean;\n}\n\nexport default class AudioVideoPreview extends React.PureComponent<Props, State> {\n sourceRef = React.createRef<HTMLSourceElement>();\n videoRef = React.createRef<HTMLVideoElement>();\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n canPlay: true,\n };\n }\n\n componentDidMount() {\n this.handleFileInfoChanged();\n\n if (this.sourceRef.current) {\n this.sourceRef.current.addEventListener('error', this.handleLoadError, {once: true});\n }\n }\n\n componentDidUpdate(prevProps: Props) {\n if (this.props.fileUrl !== prevProps.fileUrl) {\n this.handleFileInfoChanged();\n }\n\n if (this.sourceRef.current) {\n this.sourceRef.current.addEventListener('error', this.handleLoadError, {once: true});\n }\n }\n\n handleFileInfoChanged = () => {\n let video = this.videoRef.current;\n if (!video) {\n video = document.createElement('video');\n }\n\n this.setState({\n canPlay: true,\n });\n };\n\n handleLoadError = () => {\n this.setState({\n canPlay: false,\n });\n };\n\n stop = () => {\n if (this.videoRef.current) {\n const video = this.videoRef.current;\n video.pause();\n video.currentTime = 0;\n }\n };\n\n render() {\n if (!this.state.canPlay) {\n return (\n <FileInfoPreview\n fileInfo={this.props.fileInfo}\n fileUrl={this.props.fileUrl}\n />\n );\n }\n\n let width = Constants.WEB_VIDEO_WIDTH;\n let height = Constants.WEB_VIDEO_HEIGHT;\n if (this.props.isMobileView) {\n width = Constants.MOBILE_VIDEO_WIDTH;\n height = Constants.MOBILE_VIDEO_HEIGHT;\n }\n\n // add a key to the video to prevent React from using an old video source while a new one is loading\n return (\n <video\n key={this.props.fileInfo.id}\n ref={this.videoRef}\n data-setup='{}'\n controls={true}\n width={width}\n height={height}\n >\n <source\n ref={this.sourceRef}\n src={this.props.fileUrl}\n />\n </video>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getIsMobileView} from 'selectors/views/browser';\n\nimport type {GlobalState} from 'types/store';\n\nimport AudioVideoPreview from './audio_video_preview';\n\nfunction mapStateToProps(state: GlobalState) {\n return {\n isMobileView: getIsMobileView(state),\n };\n}\n\nexport default connect(mapStateToProps)(AudioVideoPreview);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport FileInfoPreview from 'components/file_info_preview';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport Constants from 'utils/constants';\nimport * as SyntaxHighlighting from 'utils/syntax_highlighting';\n\nimport type {LinkInfo} from './file_preview_modal/types';\n\ntype Props = {\n fileInfo: FileInfo;\n fileUrl: string;\n className: string;\n getContent?: (code: string) => void;\n};\n\ntype State = {\n code: string;\n lang: string;\n highlighted: string;\n loading: boolean;\n success: boolean;\n prevFileUrl?: string;\n}\n\nexport default class CodePreview extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n code: '',\n lang: '',\n highlighted: '',\n loading: true,\n success: true,\n };\n }\n\n componentDidMount() {\n this.getCode();\n }\n\n static getDerivedStateFromProps(props: Props, state: State) {\n if (props.fileUrl !== state.prevFileUrl) {\n const usedLanguage = SyntaxHighlighting.getLanguageFromFileExtension(props.fileInfo.extension);\n\n if (!usedLanguage || props.fileInfo.size > Constants.CODE_PREVIEW_MAX_FILE_SIZE) {\n return {\n code: '',\n lang: '',\n loading: false,\n success: false,\n prevFileUrl: props.fileUrl,\n };\n }\n\n return {\n code: '',\n lang: usedLanguage,\n loading: true,\n prevFileUrl: props.fileUrl,\n };\n }\n return null;\n }\n\n componentDidUpdate(prevProps: Props) {\n if (this.props.fileUrl !== prevProps.fileUrl) {\n this.getCode();\n }\n }\n\n getCode = async () => {\n if (!this.state.lang || this.props.fileInfo.size > Constants.CODE_PREVIEW_MAX_FILE_SIZE) {\n return;\n }\n try {\n const data = await fetch(this.props.fileUrl);\n const text = await data.text();\n this.handleReceivedCode(text);\n } catch (e) {\n this.handleReceivedError();\n }\n };\n\n handleReceivedCode = async (data: string | Node) => {\n let code = data as string;\n const Data = data as Node;\n if (Data.nodeName === '#document') {\n code = new XMLSerializer().serializeToString(Data);\n }\n this.props.getContent?.(code);\n this.setState({\n code,\n highlighted: await SyntaxHighlighting.highlight(this.state.lang, code),\n loading: false,\n success: true,\n });\n };\n\n handleReceivedError = () => {\n this.setState({loading: false, success: false});\n };\n\n static supports(fileInfo: FileInfo | LinkInfo) {\n return Boolean(SyntaxHighlighting.getLanguageFromFileExtension(fileInfo.extension));\n }\n\n render() {\n if (this.state.loading) {\n return (\n <div className='view-image__loading'>\n <LoadingSpinner/>\n </div>\n );\n }\n\n if (!this.state.success) {\n return (\n <FileInfoPreview\n fileInfo={this.props.fileInfo}\n fileUrl={this.props.fileUrl}\n />\n );\n }\n\n const language = SyntaxHighlighting.getLanguageName(this.state.lang);\n\n return (\n <div className='post-code code-preview'>\n <span className='post-code__language'>\n {`${this.props.fileInfo.name} - ${language}`}\n </span>\n <div className='hljs'>\n <div className='post-code__line-numbers'>\n {SyntaxHighlighting.renderLineNumbers(this.state.code)}\n </div>\n <code dangerouslySetInnerHTML={{__html: this.state.highlighted}}/>\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {useSelector} from 'react-redux';\n\nimport type {Post} from '@mattermost/types/posts';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {makeGetChannel} from 'mattermost-redux/selectors/entities/channels';\nimport {\n getUser as selectUser,\n makeGetDisplayName,\n} from 'mattermost-redux/selectors/entities/users';\n\nimport Avatar from 'components/widgets/users/avatar/avatar';\n\nimport {imageURLForUser} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport './file_preview_modal_info.scss';\n\ninterface Props {\n showFileName: boolean;\n filename: string;\n post?: Post;\n}\n\nconst displayNameGetter = makeGetDisplayName();\n\nconst FilePreviewModalInfo: React.FC<Props> = (props: Props) => {\n const user = useSelector((state: GlobalState) => selectUser(state, props.post?.user_id ?? '')) as UserProfile | undefined;\n const channel = useSelector((state: GlobalState) => {\n const getChannel = makeGetChannel();\n return getChannel(state, props.post?.channel_id ?? '');\n });\n const name = useSelector((state: GlobalState) => displayNameGetter(state, props.post?.user_id ?? '', true));\n\n let info;\n const channelName = channel ? (\n <FormattedMessage\n id='file_preview_modal_info.shared_in'\n defaultMessage='Shared in ~{name}'\n values={{\n name: channel.display_name || channel.name,\n }}\n />\n ) : null;\n if (props.showFileName) {\n info = (\n <>\n <h5 className='file-preview-modal__file-name'>{props.filename}\n </h5>\n <span className='file-preview-modal__file-details'>\n <span className='file-preview-modal__file-details-user-name'>{name}</span>\n <span className='file-preview-modal__channel'>{channelName}</span>\n </span>\n </>\n );\n } else {\n info = (\n <>\n <h5 className='file-preview-modal__user-name'>{name}\n </h5>\n <span className='file-preview-modal__channel'>{channelName}\n </span>\n </>\n );\n }\n\n return (\n <div className='file-preview-modal__info'>\n {\n (props.post && Object.keys(props.post).length > 0) &&\n <Avatar\n size='lg'\n url={imageURLForUser(props.post.user_id, user?.last_picture_update)}\n className='file-preview-modal__avatar'\n />\n }\n\n <div className='file-preview-modal__info-details'>\n {info}\n </div>\n </div>\n );\n};\n\nexport default memo(FilePreviewModalInfo);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nexport type LinkInfo = {\n has_preview_image: boolean;\n link: string;\n extension: string;\n name: string;\n}\n\nexport function isFileInfo(info: FileInfo | LinkInfo): info is FileInfo {\n return Boolean((info as FileInfo).id);\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useEffect, useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getFilePublicLink} from 'mattermost-redux/actions/files';\nimport {getFilePublicLink as selectFilePublicLink} from 'mattermost-redux/selectors/entities/files';\n\nimport CopyButton from 'components/copy_button';\nimport ExternalLink from 'components/external_link';\nimport WithTooltip from 'components/with_tooltip';\n\nimport {FileTypes} from 'utils/constants';\nimport {copyToClipboard, getFileType} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport {isFileInfo} from '../types';\nimport type {LinkInfo} from '../types';\n\nimport './file_preview_modal_main_actions.scss';\n\nconst COPIED_TOOLTIP_DURATION = 2000;\n\ninterface Props {\n showOnlyClose?: boolean;\n showClose?: boolean;\n showPublicLink?: boolean;\n filename: string;\n fileURL: string;\n fileInfo: FileInfo | LinkInfo;\n enablePublicLink: boolean;\n canDownloadFiles: boolean;\n canCopyContent: boolean;\n handleModalClose: () => void;\n content: string;\n}\n\nconst FilePreviewModalMainActions: React.FC<Props> = (props: Props) => {\n const intl = useIntl();\n\n const selectedFilePublicLink = useSelector((state: GlobalState) => selectFilePublicLink(state)?.link);\n const dispatch = useDispatch();\n const [publicLinkCopied, setPublicLinkCopied] = useState(false);\n\n useEffect(() => {\n if (isFileInfo(props.fileInfo) && props.enablePublicLink) {\n dispatch(getFilePublicLink(props.fileInfo.id));\n }\n }, [props.fileInfo, props.enablePublicLink]);\n\n useEffect(() => {\n if (publicLinkCopied) {\n setTimeout(() => {\n setPublicLinkCopied(false);\n }, COPIED_TOOLTIP_DURATION);\n }\n }, [publicLinkCopied]);\n\n const copyPublicLink = () => {\n copyToClipboard(selectedFilePublicLink ?? '');\n setPublicLinkCopied(true);\n };\n\n const closeMessage = intl.formatMessage({\n id: 'full_screen_modal.close',\n defaultMessage: 'Close',\n });\n const closeButton = (\n <WithTooltip\n title={closeMessage}\n key='publicLink'\n >\n <button\n className='file-preview-modal-main-actions__action-item'\n onClick={props.handleModalClose}\n aria-label={closeMessage}\n >\n <i className='icon icon-close'/>\n </button>\n </WithTooltip>\n );\n\n let publicTooltipMessage;\n if (publicLinkCopied) {\n publicTooltipMessage = intl.formatMessage({\n id: 'file_preview_modal_main_actions.public_link-copied',\n defaultMessage: 'Public link copied',\n });\n } else {\n publicTooltipMessage = intl.formatMessage({\n id: 'view_image_popover.publicLink',\n defaultMessage: 'Get a public link',\n });\n }\n const publicLink = (\n <WithTooltip\n key='filePreviewPublicLink'\n title={publicTooltipMessage}\n >\n <a\n href='#'\n className='file-preview-modal-main-actions__action-item'\n onClick={copyPublicLink}\n aria-label={publicTooltipMessage}\n >\n <i className='icon icon-link-variant'/>\n </a>\n </WithTooltip>\n );\n\n const downloadMessage = intl.formatMessage({\n id: 'view_image_popover.download',\n defaultMessage: 'Download',\n });\n const download = (\n <WithTooltip\n key='download'\n title={downloadMessage}\n >\n <ExternalLink\n href={props.fileURL}\n className='file-preview-modal-main-actions__action-item'\n location='file_preview_modal_main_actions'\n download={props.filename}\n aria-label={downloadMessage}\n >\n <i className='icon icon-download-outline'/>\n </ExternalLink>\n </WithTooltip>\n );\n\n const copy = (\n <CopyButton\n className='file-preview-modal-main-actions__action-item'\n isForText={getFileType(props.fileInfo.extension) === FileTypes.TEXT}\n content={props.content}\n />\n );\n return (\n <div className='file-preview-modal-main-actions__actions'>\n {!props.showOnlyClose && props.canCopyContent && copy}\n {!props.showOnlyClose && props.enablePublicLink && props.showPublicLink && publicLink}\n {!props.showOnlyClose && props.canDownloadFiles && download}\n {props.showClose && closeButton}\n </div>\n );\n};\n\nFilePreviewModalMainActions.defaultProps = {\n showOnlyClose: false,\n showClose: true,\n showPublicLink: true,\n};\n\nexport default memo(FilePreviewModalMainActions);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport type {FileInfo} from '@mattermost/types/files';\nimport type {Post} from '@mattermost/types/posts';\n\nimport FilePreviewModalInfo from '../file_preview_modal_info/file_preview_modal_info';\nimport FilePreviewModalMainActions from '../file_preview_modal_main_actions/file_preview_modal_main_actions';\nimport type {LinkInfo} from '../types';\n\nimport './file_preview_modal_footer.scss';\n\ninterface Props {\n fileInfo: FileInfo | LinkInfo;\n filename: string;\n post?: Post;\n fileURL: string;\n showPublicLink?: boolean;\n enablePublicLink: boolean;\n canDownloadFiles: boolean;\n isExternalFile: boolean;\n handleModalClose: () => void;\n canCopyContent: boolean;\n content: string;\n}\n\nconst FilePreviewModalFooter: React.FC<Props> = ({post, ...actionProps}: Props) => {\n return (\n <div className='file-preview-modal-footer'>\n <FilePreviewModalInfo\n showFileName={false}\n post={post}\n filename={actionProps.filename}\n />\n <FilePreviewModalMainActions\n {...actionProps}\n showClose={false}\n showOnlyClose={false}\n />\n </div>\n );\n};\nexport default memo(FilePreviewModalFooter);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport './file_preview_modal_main_nav.scss';\n\nimport WithTooltip from 'components/with_tooltip';\n\ninterface Props {\n fileIndex: number;\n totalFiles: number;\n handlePrev: () => void;\n handleNext: () => void;\n}\n\nconst FilePreviewModalMainNav: React.FC<Props> = (props: Props) => {\n const leftArrow = (\n <WithTooltip\n key='previewArrowLeft'\n title={\n <FormattedMessage\n id='generic.close'\n defaultMessage='Close'\n />\n }\n >\n <button\n id='previewArrowLeft'\n className='file_preview_modal_main_nav__prev'\n onClick={props.handlePrev}\n >\n <i className='icon icon-chevron-left'/>\n </button>\n </WithTooltip>\n );\n\n const rightArrow = (\n <WithTooltip\n key='publicLink'\n title={\n <FormattedMessage\n id='generic.next'\n defaultMessage='Next'\n />\n }\n >\n <button\n id='previewArrowRight'\n className='file_preview_modal_main_nav__next'\n onClick={props.handleNext}\n >\n <i className='icon icon-chevron-right'/>\n </button>\n </WithTooltip>\n );\n return (\n <div className='file_preview_modal_main_nav'>\n {leftArrow}\n <span className='modal-bar-file-count'>\n <FormattedMessage\n id='file_preview_modal_main_nav.file'\n defaultMessage='{count, number} of {total, number}'\n values={{\n count: (props.fileIndex + 1),\n total: props.totalFiles,\n }}\n />\n </span>\n {rightArrow}\n </div>\n );\n};\n\nexport default memo(FilePreviewModalMainNav);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\n\nimport type {FileInfo} from '@mattermost/types/files';\nimport type {Post} from '@mattermost/types/posts';\n\nimport FilePreviewModalInfo from '../file_preview_modal_info/file_preview_modal_info';\nimport FilePreviewModalMainActions from '../file_preview_modal_main_actions/file_preview_modal_main_actions';\nimport FilePreviewModalMainNav from '../file_preview_modal_main_nav/file_preview_modal_main_nav';\nimport type {LinkInfo} from '../types';\n\nimport './file_preview_modal_header.scss';\n\ninterface Props {\n isMobileView: boolean;\n fileIndex: number;\n fileInfo: FileInfo | LinkInfo;\n totalFiles: number;\n filename: string;\n post: Post;\n fileURL: string;\n showPublicLink?: boolean;\n enablePublicLink: boolean;\n canDownloadFiles: boolean;\n canCopyContent: boolean;\n isExternalFile: boolean;\n handlePrev: () => void;\n handleNext: () => void;\n handleModalClose: () => void;\n content: string;\n}\n\nconst FilePreviewModalHeader: React.FC<Props> = ({post, totalFiles, fileIndex, ...actionProps}: Props) => {\n let mainActions = (<div/>);\n if (totalFiles > 1) {\n mainActions = (\n <FilePreviewModalMainNav\n totalFiles={totalFiles}\n fileIndex={fileIndex}\n handlePrev={actionProps.handlePrev}\n handleNext={actionProps.handleNext}\n />\n );\n }\n const actions = (\n <FilePreviewModalMainActions\n {...actionProps}\n showOnlyClose={actionProps.isMobileView}\n />);\n return (\n <div className='file-preview-modal-header'>\n {actionProps.isMobileView && actions}\n {!actionProps.isMobileView &&\n <FilePreviewModalInfo\n showFileName={true}\n post={post}\n filename={actionProps.filename}\n />\n }\n {mainActions}\n {!actionProps.isMobileView && actions}\n </div>\n );\n};\n\nexport default memo(FilePreviewModalHeader);\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getFilePreviewUrl, getFileDownloadUrl} from 'mattermost-redux/utils/file_utils';\n\nimport {FileTypes} from 'utils/constants';\nimport {getFileType} from 'utils/utils';\n\nimport './image_preview.scss';\n\ninterface Props {\n fileInfo: FileInfo;\n canDownloadFiles: boolean;\n}\n\nexport default function ImagePreview({fileInfo, canDownloadFiles}: Props) {\n const isExternalFile = !fileInfo.id;\n\n let fileUrl;\n let previewUrl;\n if (isExternalFile) {\n fileUrl = fileInfo.link;\n previewUrl = fileInfo.link;\n } else {\n fileUrl = getFileDownloadUrl(fileInfo.id);\n previewUrl = fileInfo.has_preview_image ? getFilePreviewUrl(fileInfo.id) : fileUrl;\n }\n\n if (!canDownloadFiles) {\n return <img src={previewUrl}/>;\n }\n\n let conditionalSVGStyleAttribute;\n if (getFileType(fileInfo.extension) === FileTypes.SVG) {\n conditionalSVGStyleAttribute = {\n width: fileInfo.width,\n height: 'auto',\n };\n }\n\n return (\n <a\n className='image_preview'\n href='#'\n >\n <img\n className='image_preview__image'\n loading='lazy'\n data-testid='imagePreview'\n alt={'preview url image'}\n src={previewUrl}\n style={conditionalSVGStyleAttribute}\n />\n </a>\n );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport debounce from 'lodash/debounce';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport WithTooltip from 'components/with_tooltip';\n\nimport {ZoomSettings} from 'utils/constants';\n\nexport interface Props {\n scale?: number;\n showZoomControls?: boolean;\n handleZoomIn?: () => void;\n handleZoomOut?: () => void;\n handleZoomReset?: () => void;\n}\n\nexport default class PopoverBar extends React.PureComponent<Props> {\n render() {\n const zoomControls: React.ReactNode[] = [];\n let wrappedZoomControls: React.ReactNode = null;\n if (this.props.showZoomControls) {\n let zoomResetButton;\n let zoomOutButton;\n let zoomInButton;\n\n if (this.props.scale && this.props.scale > ZoomSettings.MIN_SCALE) {\n zoomOutButton = (\n <span className='modal-zoom-btn'>\n <a onClick={this.props.handleZoomOut && debounce(this.props.handleZoomOut, 300, {maxWait: 300})}>\n <i className='icon icon-minus'/>\n </a>\n </span>\n );\n } else {\n zoomOutButton = (\n <span className='btn-inactive'>\n <i className='icon icon-minus'/>\n </span>\n );\n }\n zoomControls.push(\n <WithTooltip\n key='zoomOut'\n title={\n <FormattedMessage\n id='view_image.zoom_out'\n defaultMessage='Zoom Out'\n />\n }\n >\n {zoomOutButton}\n </WithTooltip>,\n );\n\n if (this.props.scale && this.props.scale > ZoomSettings.DEFAULT_SCALE) {\n zoomResetButton = (\n <span className='modal-zoom-btn'>\n <a onClick={this.props.handleZoomReset}>\n <i className='icon icon-magnify-minus'/>\n </a>\n </span>\n );\n } else if (this.props.scale && this.props.scale < ZoomSettings.DEFAULT_SCALE) {\n zoomResetButton = (\n <span className='modal-zoom-btn'>\n <a onClick={this.props.handleZoomReset}>\n <i className='icon icon-magnify-plus'/>\n </a>\n </span>\n );\n } else {\n zoomResetButton = (\n <span className='btn-inactive'>\n <i className='icon icon-magnify-minus'/>\n </span>\n );\n }\n zoomControls.push(\n <WithTooltip\n key='zoomReset'\n title={\n <FormattedMessage\n id='view_image.zoom_reset'\n defaultMessage='Reset Zoom'\n />\n }\n >\n {zoomResetButton}\n </WithTooltip>,\n );\n\n if (this.props.scale && this.props.scale < ZoomSettings.MAX_SCALE) {\n zoomInButton = (\n <span className='modal-zoom-btn'>\n <a onClick={this.props.handleZoomIn && debounce(this.props.handleZoomIn, 300, {maxWait: 300})}>\n <i className='icon icon-plus'/>\n </a>\n </span>\n\n );\n } else {\n zoomInButton = (\n <span className='btn-inactive'>\n <i className='icon icon-plus'/>\n </span>\n );\n }\n zoomControls.push(\n <WithTooltip\n key='zoomIn'\n title={\n <FormattedMessage\n id='view_image.zoom_in'\n defaultMessage='Zoom In'\n />\n }\n >\n {zoomInButton}\n </WithTooltip>,\n );\n\n wrappedZoomControls = (\n <div className='modal-column'>\n {zoomControls}\n </div>\n );\n }\n\n return (\n <div\n data-testid='fileCountFooter'\n className='modal-button-bar file-preview-modal__zoom-bar'\n >\n {wrappedZoomControls}\n </div>\n );\n }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport PopoverBar from './popover_bar';\n\nexport default PopoverBar;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {Modal} from 'react-bootstrap';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {FileInfo} from '@mattermost/types/files';\nimport type {Post} from '@mattermost/types/posts';\n\nimport {getFileDownloadUrl, getFilePreviewUrl, getFileUrl} from 'mattermost-redux/utils/file_utils';\n\nimport ArchivedPreview from 'components/archived_preview';\nimport AudioVideoPreview from 'components/audio_video_preview';\nimport CodePreview from 'components/code_preview';\nimport FileInfoPreview from 'components/file_info_preview';\nimport LoadingImagePreview from 'components/loading_image_preview';\nimport type {Props as PDFPreviewComponentProps} from 'components/pdf_preview';\n\nimport Constants, {FileTypes, ZoomSettings} from 'utils/constants';\nimport * as Keyboard from 'utils/keyboard';\nimport * as Utils from 'utils/utils';\n\nimport type {FilePreviewComponent} from 'types/store/plugins';\n\nimport FilePreviewModalFooter from './file_preview_modal_footer/file_preview_modal_footer';\nimport FilePreviewModalHeader from './file_preview_modal_header/file_preview_modal_header';\nimport ImagePreview from './image_preview';\nimport PopoverBar from './popover_bar';\nimport {isFileInfo} from './types';\nimport type {LinkInfo} from './types';\n\nimport './file_preview_modal.scss';\n\nconst PDFPreview = React.lazy<React.ComponentType<PDFPreviewComponentProps>>(() => import('components/pdf_preview'));\n\nconst KeyCodes = Constants.KeyCodes;\n\nexport type Props = {\n canDownloadFiles: boolean;\n enablePublicLink: boolean;\n\n /**\n * List of FileInfo to view\n **/\n fileInfos: Array<FileInfo | LinkInfo>;\n\n isMobileView: boolean;\n pluginFilePreviewComponents: FilePreviewComponent[];\n onExited: () => void;\n\n /**\n * The id of the post the files are attached to\n */\n postId?: string;\n\n /**\n * The post the files are attached to\n * Either postId or post can be passed to FilePreviewModal\n */\n post?: Post;\n\n /**\n * The index number of starting image\n **/\n startIndex: number;\n}\n\ntype State = {\n show: boolean;\n imageIndex: number;\n imageHeight: number | string;\n loaded: Record<number, boolean>;\n prevFileInfosCount: number;\n progress: Record<number, number>;\n showCloseBtn: boolean;\n showZoomControls: boolean;\n scale: Record<number, number>;\n content: string;\n}\n\nexport default class FilePreviewModal extends React.PureComponent<Props, State> {\n static defaultProps = {\n fileInfos: [],\n startIndex: 0,\n pluginFilePreviewComponents: [],\n };\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n show: true,\n imageIndex: this.props.startIndex,\n imageHeight: '100%',\n loaded: Utils.fillRecord(false, this.props.fileInfos.length),\n prevFileInfosCount: 0,\n progress: Utils.fillRecord(0, this.props.fileInfos.length),\n showCloseBtn: false,\n showZoomControls: false,\n scale: Utils.fillRecord(ZoomSettings.DEFAULT_SCALE, this.props.fileInfos.length),\n content: '',\n };\n }\n\n handleNext = () => {\n let id = this.state.imageIndex + 1;\n if (id > this.props.fileInfos.length - 1) {\n id = 0;\n }\n this.showImage(id);\n };\n\n handlePrev = () => {\n let id = this.state.imageIndex - 1;\n if (id < 0) {\n id = this.props.fileInfos.length - 1;\n }\n this.showImage(id);\n };\n\n handleKeyPress = (e: KeyboardEvent) => {\n if (Keyboard.isKeyPressed(e, KeyCodes.RIGHT)) {\n this.handleNext();\n } else if (Keyboard.isKeyPressed(e, KeyCodes.LEFT)) {\n this.handlePrev();\n }\n };\n\n componentDidMount() {\n document.addEventListener('keyup', this.handleKeyPress);\n\n this.showImage(this.props.startIndex);\n }\n\n componentWillUnmount() {\n document.removeEventListener('keyup', this.handleKeyPress);\n }\n\n static getDerivedStateFromProps(props: Props, state: State) {\n const updatedState: Partial<State> = {};\n if (props.fileInfos[state.imageIndex] && props.fileInfos[state.imageIndex].extension === FileTypes.PDF) {\n updatedState.showZoomControls = true;\n } else {\n updatedState.showZoomControls = false;\n }\n if (props.fileInfos.length !== state.prevFileInfosCount) {\n updatedState.loaded = Utils.fillRecord(false, props.fileInfos.length);\n updatedState.progress = Utils.fillRecord(0, props.fileInfos.length);\n updatedState.prevFileInfosCount = props.fileInfos.length;\n }\n return Object.keys(updatedState).length ? updatedState : null;\n }\n\n showImage = (id: number) => {\n this.setState({imageIndex: id});\n\n const imageHeight = window.innerHeight - 100;\n this.setState({imageHeight});\n\n if (!this.state.loaded[id]) {\n this.loadImage(id);\n }\n };\n\n loadImage = (index: number) => {\n const fileInfo = this.props.fileInfos[index];\n if (isFileInfo(fileInfo) && fileInfo.archived) {\n this.handleImageLoaded(index);\n return;\n }\n const fileType = Utils.getFileType(fileInfo.extension);\n\n if (fileType === FileTypes.IMAGE && isFileInfo(fileInfo)) {\n let previewUrl;\n if (fileInfo.has_preview_image) {\n previewUrl = getFilePreviewUrl(fileInfo.id);\n } else {\n // some images (eg animated gifs) just show the file itself and not a preview\n previewUrl = getFileUrl(fileInfo.id);\n }\n\n Utils.loadImage(\n previewUrl,\n () => this.handleImageLoaded(index),\n (completedPercentage) => this.handleImageProgress(index, completedPercentage),\n );\n } else {\n // there's nothing to load for non-image files\n this.handleImageLoaded(index);\n }\n };\n\n handleImageLoaded = (index: number) => {\n this.setState((prevState) => {\n return {\n loaded: {\n ...prevState.loaded,\n [index]: true,\n },\n };\n });\n };\n\n handleImageProgress = (index: number, completedPercentage: number) => {\n this.setState((prevState) => {\n return {\n progress: {\n ...prevState.progress,\n [index]: completedPercentage,\n },\n };\n });\n };\n\n onMouseEnterImage = () => {\n this.setState({showCloseBtn: true});\n };\n\n onMouseLeaveImage = () => {\n this.setState({showCloseBtn: false});\n };\n\n setScale = (index: number, scale: number) => {\n this.setState((prevState) => {\n return {\n scale: {\n ...prevState.scale,\n [index]: scale,\n },\n };\n });\n };\n\n handleZoomIn = () => {\n let newScale = this.state.scale[this.state.imageIndex];\n newScale = Math.min(newScale + ZoomSettings.SCALE_DELTA, ZoomSettings.MAX_SCALE);\n this.setScale(this.state.imageIndex, newScale);\n };\n\n handleZoomOut = () => {\n let newScale = this.state.scale[this.state.imageIndex];\n newScale = Math.max(newScale - ZoomSettings.SCALE_DELTA, ZoomSettings.MIN_SCALE);\n this.setScale(this.state.imageIndex, newScale);\n };\n\n handleZoomReset = () => {\n this.setScale(this.state.imageIndex, ZoomSettings.DEFAULT_SCALE);\n };\n\n handleModalClose = () => {\n this.setState({show: false});\n };\n\n getContent = (content: string) => {\n this.setState({content});\n };\n\n handleBgClose = (e: React.MouseEvent) => {\n if (e.currentTarget === e.target) {\n this.handleModalClose();\n }\n };\n\n render() {\n if (this.props.fileInfos.length < 1 || this.props.fileInfos.length - 1 < this.state.imageIndex) {\n return null;\n }\n\n const fileInfo = this.props.fileInfos[this.state.imageIndex];\n const fileType = Utils.getFileType(fileInfo.extension);\n\n let showPublicLink;\n let fileName;\n let fileUrl;\n let fileDownloadUrl;\n let isExternalFile;\n let canCopyContent = false;\n if (isFileInfo(fileInfo)) {\n showPublicLink = true;\n fileName = fileInfo.name;\n fileUrl = getFileUrl(fileInfo.id);\n fileDownloadUrl = getFileDownloadUrl(fileInfo.id);\n isExternalFile = false;\n } else {\n showPublicLink = false;\n fileName = fileInfo.name || fileInfo.link;\n fileUrl = fileInfo.link;\n fileDownloadUrl = fileInfo.link;\n isExternalFile = true;\n }\n\n let dialogClassName = 'a11y__modal modal-image file-preview-modal';\n\n let content;\n let zoomBar;\n\n if (isFileInfo(fileInfo) && fileInfo.archived) {\n content = (\n <ArchivedPreview\n fileInfo={fileInfo}\n />\n );\n }\n\n if (!isFileInfo(fileInfo) || !fileInfo.archived) {\n if (this.state.loaded[this.state.imageIndex]) {\n if (fileType === FileTypes.IMAGE || fileType === FileTypes.SVG) {\n content = (\n <ImagePreview\n fileInfo={fileInfo as FileInfo}\n canDownloadFiles={this.props.canDownloadFiles}\n />\n );\n } else if (fileType === FileTypes.VIDEO || fileType === FileTypes.AUDIO) {\n content = (\n <AudioVideoPreview\n fileInfo={fileInfo as FileInfo}\n fileUrl={fileUrl}\n />\n );\n } else if (fileType === FileTypes.PDF) {\n content = (\n <div\n className='file-preview-modal__scrollable'\n onClick={this.handleBgClose}\n >\n <React.Suspense fallback={null}>\n <PDFPreview\n fileInfo={fileInfo as FileInfo}\n fileUrl={fileUrl}\n scale={this.state.scale[this.state.imageIndex]}\n handleBgClose={this.handleBgClose}\n />\n </React.Suspense>\n </div>\n );\n zoomBar = (\n <PopoverBar\n scale={this.state.scale[this.state.imageIndex]}\n showZoomControls={this.state.showZoomControls}\n handleZoomIn={this.handleZoomIn}\n handleZoomOut={this.handleZoomOut}\n handleZoomReset={this.handleZoomReset}\n />\n );\n } else if (CodePreview.supports(fileInfo)) {\n dialogClassName += ' modal-code';\n canCopyContent = true;\n content = (\n <CodePreview\n fileInfo={fileInfo as FileInfo}\n fileUrl={fileUrl}\n getContent={this.getContent}\n className='file-preview-modal__code-preview'\n />\n );\n } else {\n content = (\n <FileInfoPreview\n fileInfo={fileInfo as FileInfo}\n fileUrl={fileUrl}\n />\n );\n }\n } else {\n // display a progress indicator when the preview for an image is still loading\n const progress = Math.floor(this.state.progress[this.state.imageIndex]);\n\n content = (\n <LoadingImagePreview\n loading={\n <FormattedMessage\n id='view_image.loading'\n defaultMessage='Loading'\n />\n }\n progress={progress}\n />\n );\n }\n }\n\n if (isFileInfo(fileInfo) && !fileInfo.archived) {\n for (const preview of this.props.pluginFilePreviewComponents) {\n if (preview.override(fileInfo, this.props.post)) {\n content = (\n <preview.component\n fileInfo={fileInfo}\n post={this.props.post}\n onModalDismissed={this.handleModalClose}\n />\n );\n break;\n }\n }\n }\n\n return (\n <Modal\n show={this.state.show}\n onHide={this.handleModalClose}\n onExited={this.props.onExited}\n className='modal-image file-preview-modal'\n dialogClassName={dialogClassName}\n animation={true}\n backdrop={false}\n role='none'\n style={{paddingLeft: 0}}\n aria-labelledby='viewImageModalLabel'\n >\n <Modal.Body className='file-preview-modal__body'>\n <div\n className={'modal-image__wrapper'}\n onClick={this.handleModalClose}\n >\n <div\n className='file-preview-modal__main-ctr'\n onMouseEnter={this.onMouseEnterImage}\n onMouseLeave={this.onMouseLeaveImage}\n onClick={(e) => e.stopPropagation()}\n >\n <Modal.Title\n componentClass='div'\n id='viewImageModalLabel'\n className='file-preview-modal__title'\n >\n <FilePreviewModalHeader\n isMobileView={this.props.isMobileView}\n post={this.props.post!}\n showPublicLink={showPublicLink}\n fileIndex={this.state.imageIndex}\n totalFiles={this.props.fileInfos?.length}\n filename={fileName}\n fileURL={fileDownloadUrl}\n fileInfo={fileInfo}\n enablePublicLink={this.props.enablePublicLink}\n canDownloadFiles={this.props.canDownloadFiles}\n canCopyContent={canCopyContent}\n isExternalFile={isExternalFile}\n handlePrev={this.handlePrev}\n handleNext={this.handleNext}\n handleModalClose={this.handleModalClose}\n content={this.state.content}\n />\n {zoomBar}\n </Modal.Title>\n <div\n className={classNames(\n 'file-preview-modal__content',\n {\n 'file-preview-modal__content-scrollable': (!isFileInfo(fileInfo) || !fileInfo.archived) && this.state.loaded[this.state.imageIndex] && (fileType === FileTypes.PDF),\n },\n )}\n onClick={this.handleBgClose}\n >\n {content}\n </div>\n { this.props.isMobileView &&\n <FilePreviewModalFooter\n post={this.props.post}\n showPublicLink={showPublicLink}\n filename={fileName}\n fileURL={fileDownloadUrl}\n fileInfo={fileInfo}\n enablePublicLink={this.props.enablePublicLink}\n canDownloadFiles={this.props.canDownloadFiles}\n canCopyContent={canCopyContent}\n isExternalFile={isExternalFile}\n handleModalClose={this.handleModalClose}\n content={this.state.content}\n />\n }\n </div>\n </div>\n </Modal.Body>\n </Modal>\n );\n }\n}\n"],"names":["FileInfoPreview","_ref","fileInfo","fileUrl","canDownloadFiles","intl","useIntl","infoParts","extension","push","formatMessage","id","defaultMessage","toUpperCase","size","Utils","infoString","join","preview","React","className","href","alt","src","name","propTypes","_pt","isRequired","connect","state","config","getConfig","props","ArchiveOutlineIcon","color","AudioVideoPreview","constructor","super","_defineProperty","video","this","videoRef","current","document","createElement","setState","canPlay","pause","currentTime","componentDidMount","handleFileInfoChanged","sourceRef","addEventListener","handleLoadError","once","componentDidUpdate","prevProps","render","width","Constants","WEB_VIDEO_WIDTH","height","WEB_VIDEO_HEIGHT","isMobileView","MOBILE_VIDEO_WIDTH","MOBILE_VIDEO_HEIGHT","key","ref","controls","getIsMobileView","CodePreview","async","lang","CODE_PREVIEW_MAX_FILE_SIZE","data","fetch","text","handleReceivedCode","e","handleReceivedError","_this$props$getConten","_this$props","code","Data","nodeName","XMLSerializer","serializeToString","getContent","call","highlighted","SyntaxHighlighting","loading","success","getCode","getDerivedStateFromProps","prevFileUrl","usedLanguage","supports","Boolean","LoadingSpinner","language","concat","dangerouslySetInnerHTML","__html","displayNameGetter","makeGetDisplayName","FilePreviewModalInfo","user","useSelector","_props$post$user_id","_props$post","selectUser","post","user_id","channel","_props$post$channel_i","_props$post2","makeGetChannel","getChannel","channel_id","_props$post$user_id2","_props$post3","info","channelName","FormattedMessage","values","display_name","showFileName","filename","Object","keys","length","Avatar","url","imageURLForUser","last_picture_update","memo","isFileInfo","FilePreviewModalMainActions","selectedFilePublicLink","_selectFilePublicLink","selectFilePublicLink","link","dispatch","useDispatch","publicLinkCopied","setPublicLinkCopied","useState","useEffect","enablePublicLink","getFilePublicLink","setTimeout","closeMessage","closeButton","WithTooltip","title","onClick","handleModalClose","publicTooltipMessage","publicLink","copyPublicLink","copyToClipboard","downloadMessage","download","ExternalLink","fileURL","location","copy","CopyButton","isForText","getFileType","FileTypes","TEXT","content","showOnlyClose","canCopyContent","showPublicLink","showClose","defaultProps","FilePreviewModalFooter","actionProps","_objectWithoutProperties","_excluded","assign","isExternalFile","FilePreviewModalMainNav","leftArrow","handlePrev","rightArrow","handleNext","count","fileIndex","total","totalFiles","FilePreviewModalHeader","mainActions","actions","ImagePreview","previewUrl","conditionalSVGStyleAttribute","getFileDownloadUrl","has_preview_image","getFilePreviewUrl","SVG","style","PopoverBar","zoomControls","wrappedZoomControls","showZoomControls","zoomResetButton","zoomOutButton","zoomInButton","scale","ZoomSettings","MIN_SCALE","handleZoomOut","debounce","maxWait","DEFAULT_SCALE","handleZoomReset","MAX_SCALE","handleZoomIn","PDFPreview","KeyCodes","FilePreviewModal","imageIndex","fileInfos","showImage","Keyboard","RIGHT","LEFT","imageHeight","window","innerHeight","loaded","loadImage","index","archived","handleImageLoaded","IMAGE","getFileUrl","completedPercentage","handleImageProgress","prevState","_objectSpread","progress","showCloseBtn","newScale","Math","min","SCALE_DELTA","setScale","max","show","currentTarget","target","startIndex","prevFileInfosCount","handleKeyPress","componentWillUnmount","removeEventListener","updatedState","PDF","_this$props$fileInfos","fileType","fileName","fileDownloadUrl","zoomBar","dialogClassName","ArchivedPreview","VIDEO","AUDIO","handleBgClose","fallback","floor","LoadingImagePreview","pluginFilePreviewComponents","override","component","onModalDismissed","Modal","onHide","onExited","animation","backdrop","role","paddingLeft","Body","onMouseEnter","onMouseEnterImage","onMouseLeave","onMouseLeaveImage","stopPropagation","Title","componentClass","classNames","postId"],"sourceRoot":""}